# FAQ (/faq)
All of our projects are listed on our website at [pixeldreamstudios.net](https://pixeldreamstudios.net).
Each project has a linked issues page on its [CurseForge](https://www.curseforge.com/members/pixeldreamstudios/projects) or [Modrinth](https://modrinth.com/organization/pixel-dream-studios) page.
You can also report bugs or suggest features in the corresponding channels on our [Discord server](https://discord.pixeldreamstudios.net/).
Check out our [server hosting guide](/server-hosting-guide) for step-by-step instructions on self-hosting.
Alternatively, you can use [BisectHosting](https://www.bisecthosting.com/PixelDream?r=WikiFaqHosting) with code `PIXELDREAM` for 25% off your first month.
Some of our modpacks have official servers. Check the wiki page for each modpack for details.
We do **not** recommend the Essentials mod, due to its [closed nature and privacy concerns](https://youtu.be/Ax1bGF5G5MM).
For multiplayer, we recommend [self-hosting a server](/server-hosting-guide). If that's not an option, [e4mc](https://www.curseforge.com/minecraft/mc-mods/e4mc) is an alternative.
No. Our modpacks are **not compatible** with Aternos.
We recommend using [BisectHosting](https://www.bisecthosting.com/PixelDream?r=WikiFaqAternos) or [self-hosting](/server-hosting-guide) instead.
# Home (/)
Welcome to the official documentation for Pixel Dream Studios. Here you'll find guides, tutorials, and detailed information about all our Minecraft mods and modpacks.
## Getting Started [#getting-started]
## Modpacks [#modpacks]
## Mods [#mods]
## Community [#community]
# Server Hosting Guide (/server-hosting-guide)
You can host a pre-configured server from
[BisectHosting](https://www.bisecthosting.com/PixelDream?r=WikiHostingGuide) for **25% off** using
the code `PIXELDREAM`.
## Install Java [#install-java]
**Pick the right Java version for your modpack.**
| Minecraft version | Java version |
| ----------------- | ---------------- |
| 1.17 and newer | Java 17 or newer |
| 1.16.5 and older | Java 8 |
Always check your modpack's own requirements as well — they take priority over
the table above.
**Download and install it.** We recommend
[Eclipse Temurin](https://adoptium.net/en-GB/), though
[OpenJDK](https://jdk.java.net/) also works. Both are free and fully compatible
with Minecraft.
**Verify the installation** by running the following in your terminal:
```bash
java -version
```
## Set Up the Server [#set-up-the-server]
**Download the server pack** for your modpack. It's usually under "Additional
Files" or "Server Files" on the modpack's download page.
**Extract the archive** using [7-Zip](https://www.7-zip.org/download.html) or an
equivalent tool.
**Start the server** using the instructions for your operating system.
1. Run **Windows PowerShell** as administrator.
2. Enter `Set-ExecutionPolicy RemoteSigned`, then type `Y` to accept.
3. Close the administrator window and open PowerShell normally.
4. Navigate to your server directory: `cd path\to\server`
5. Unblock the start script: `Unblock-File -Path .\start.ps1`
6. Run it: `.\start.ps1`
Ignore the Windows steps entirely. Instead, make `start.sh` executable and run
it from your terminal:
```bash
chmod +x start.sh
./start.sh
```
**Accept the Minecraft EULA** by entering `I agree` when prompted, or by editing
`eula.txt` manually.
**Wait for initialization to finish**, then follow the connection steps below.
Always shut down with the `stop` command. Closing the window or killing the
process can corrupt your world.
## Configure Your Server [#configure-your-server]
Edit `server.properties` to change how your server behaves:
| Setting | What it controls |
| --------------- | --------------------------------------------------- |
| `server-ip` | Your local IP address |
| `server-port` | The port players connect to (default `25565`) |
| `max-players` | How many players can be online at once |
| `difficulty` | `peaceful`, `easy`, `normal`, or `hard` |
| `gamemode` | `survival`, `creative`, `adventure`, or `spectator` |
| `motd` | The server description shown in the server list |
| `pvp` | Whether players can damage each other |
| `view-distance` | Render distance in chunks (8–16 recommended) |
| `white-list` | Whether the whitelist is enforced |
Restart the server after changing `server.properties`. Edits made while it's
running are overwritten on shutdown.
## Connect to Your Server [#connect-to-your-server]
### On the same network (LAN) [#on-the-same-network-lan]
1. In Minecraft, click **Multiplayer → Add Server**.
2. For the server address, use `localhost` or your local IP address.
### Over the internet (WAN) [#over-the-internet-wan]
1. Find your public IP address by searching "what is my IP" online.
2. In Minecraft, click **Multiplayer → Add Server**.
3. For the server address, use `your.public.ip:25565`.
### Port forwarding [#port-forwarding]
Required for players connecting from a different network:
1. Open your router's admin panel.
2. Find the port forwarding settings.
3. Create a new rule:
* **Protocol:** TCP/UDP
* **External port:** 25565
* **Internal port:** 25565
* **Internal IP:** your server's local IP
## Performance Tips [#performance-tips]
* Allocate an appropriate amount of RAM in your start script.
* Keep `view-distance` between 8 and 12 chunks.
* Keep `entity-broadcast-range-percentage` at 100 or lower.
* Monitor TPS (ticks per second) to gauge server health.
## Troubleshooting [#troubleshooting]
* Verify the server is actually running.
* Check that port forwarding is set up correctly.
* Confirm your firewall isn't blocking the port.
* Check how much RAM is allocated in the start script.
* Reduce the view distance.
* Monitor system resources on the host machine.
* Ensure every player has the exact same modpack version.
* Verify the modpack is compatible with your server pack.
# Advancement Portals (/mods/advancement-portals)
## Overview [#overview]
Advancement Portals gates player travel to configured dimensions behind Minecraft advancements.
A gate contains:
1. A destination dimension.
2. A matching mode.
3. One or more advancement requirements.
When a player tries to travel to that destination, Advancement Portals checks the player's completed advancements.
* If the gate is complete, travel continues normally.
* If the gate is incomplete, travel is canceled and the player is shown what is still required.
* If no gate exists for the destination, Advancement Portals does nothing.
The mod can use:
* Vanilla advancements.
* Modded advancements.
* Datapack advancements.
* Visible advancements.
* Hidden advancements.
* Dedicated pack-progression advancements.
Advancement Portals does not create the advancements themselves. It reads advancements already loaded by Minecraft, a mod, or a datapack.
### Supported environment [#supported-environment]
* Minecraft `1.20.1`
* Forge `47.x`
* Java `17`
* FTB Teams is optional
* Mod ID: `advancement_portals`
## Requirements and installation [#requirements-and-installation]
Place the Advancement Portals jar in the `mods` folder for the Forge instance.
For a normal modpack installation, include it in both the client and server mod lists. The gate logic is server-authoritative, but matching client and server mod lists are the safest supported distribution.
FTB Teams is not required. When it is absent:
* Dimension gates continue to work.
* The FTB Teams config section is safely ignored.
* No team progress is shared.
When using FTB Teams advancement sharing, use a compatible Forge 1.20.1 FTB Teams release.
## How dimension gating works [#how-dimension-gating-works]
Advancement Portals listens for player dimension-travel attempts.
Only destinations listed in `dimensionRequirements` are gated. The source dimension does not matter.
For example:
```toml
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
]
```
This means:
* Travel to `minecraft:the_end` is gated.
* A player must have completed `minecraft:nether/obtain_ancient_debris`.
* Travel to the Nether, Overworld, or any unlisted modded dimension is unaffected.
* Returning from the End to another unlisted destination is unaffected.
The event applies to server players. Non-player entities are not checked by this gate handler.
The system is based on the destination dimension rather than one specific portal block. Any travel method that fires Forge's normal player dimension-travel event can be evaluated by the gate.
## Configuration location [#configuration-location]
The common/server config is generated at:
```text
config/advancement_portals-common.toml
```
The complete default structure is:
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/enchant_item, minecraft:story/mine_diamond",
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
]
[dimensionGating]
enabled = true
creativePlayersBypassGates = true
spectatorPlayersBypassGates = true
operatorsBypassGates = true
operatorBypassPermissionLevel = 2
warningCooldownSeconds = 2
blockedPortalRetryDelayTicks = 20
showAdvancementDescriptions = true
showDimensionUnlockMessages = true
[ftbTeams]
shareAdvancementsWithTeam = true
shareOnlyPortalAdvancements = false
shareRecipeAdvancements = false
syncTeamAdvancementsOnLogin = true
notifySharedAdvancements = true
```
### Applying config changes [#applying-config-changes]
The gate parser detects changes to the `dimensionRequirements` list when the config value is read again. However, startup validation runs when the server starts.
For the most reliable result after editing the common config:
1. Stop the server.
2. Edit the config.
3. Start the server.
4. Review the validation messages in the server log.
## Creating dimension gates [#creating-dimension-gates]
The recommended syntax is:
```text
dimension | ALL/ANY | advancement, advancement
```
A TOML entry must be inside quotation marks:
```toml
"namespace:dimension_path | ALL | namespace:advancement_path"
```
### One advancement [#one-advancement]
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond"
]
```
### Multiple advancements [#multiple-advancements]
```toml
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris, minecraft:nether/summon_wither"
]
```
### Multiple dimensions [#multiple-dimensions]
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond",
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris",
"twilightforest:twilight_forest | ANY | mypack:quests/twilight_key, mypack:bosses/defeat_lich"
]
```
### Spacing [#spacing]
Spaces around `|` and commas are recommended for readability, but IDs are trimmed by the parser.
This is readable:
```toml
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
```
This can also parse:
```toml
"minecraft:the_end|ALL|minecraft:nether/obtain_ancient_debris"
```
### Duplicate advancement IDs [#duplicate-advancement-ids]
Repeated advancement IDs inside one gate are automatically reduced to one requirement.
Example:
```toml
"minecraft:the_end | ALL | minecraft:story/mine_diamond, minecraft:story/mine_diamond"
```
This behaves as though the advancement were listed once.
### Duplicate destination IDs [#duplicate-destination-ids]
Only one gate is stored per destination.
If the config contains:
```toml
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:story/mine_diamond",
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
]
```
The final valid `minecraft:the_end` entry replaces the earlier entry. A warning is written to the log.
Combine the requirements into a single entry instead:
```toml
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:story/mine_diamond, minecraft:nether/obtain_ancient_debris"
]
```
## `ALL` and `ANY` modes [#all-and-any-modes]
### `ALL` [#all]
`ALL` requires every listed advancement.
```toml
"minecraft:the_end | ALL | mypack:chapter_two, mypack:defeat_wither"
```
The player must complete both `mypack:chapter_two` and `mypack:defeat_wither`.
A locked-travel message lists the requirements that remain incomplete.
The unlock message appears when the final requirement is completed.
### `ANY` [#any]
`ANY` requires at least one listed advancement.
```toml
"minecraft:the_end | ANY | minecraft:nether/summon_wither, mypack:quests/end_pass"
```
The player can unlock the End by either:
* Summoning the Wither, or
* Completing the custom End Pass advancement.
While the gate remains locked, all configured options are incomplete, so the warning lists each available route.
The unlock message appears when the first qualifying advancement is completed.
### What is not currently supported [#what-is-not-currently-supported]
Version 3.1 uses one flat mode per destination. It does not currently support grouped expressions such as:
```text
(A AND B) OR C
```
A dedicated advancement can represent more complex logic. Create a datapack advancement whose criteria and requirements match the progression expression, then use that advancement as the portal requirement.
## Legacy configuration support [#legacy-configuration-support]
The 3.0.x syntax remains accepted:
```toml
"minecraft:the_end=[minecraft:end/kill_dragon]"
```
Multiple requirements are also supported:
```toml
"minecraft:the_end=[minecraft:story/mine_diamond,minecraft:nether/obtain_ancient_debris]"
```
Legacy entries always behave as `ALL`.
The brackets are optional to the internal parser, but keeping the original format unchanged is recommended until converting to the new syntax.
Recommended replacement:
```toml
"minecraft:the_end | ALL | minecraft:end/kill_dragon"
```
## Complete configuration reference [#complete-configuration-reference]
### `dimensionRequirements` [#dimensionrequirements]
Type: list of strings
Defines every dimension gate.
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond"
]
```
An empty list disables all individual gates even when the master switch remains enabled:
```toml
dimensionRequirements = []
```
### `[dimensionGating]` [#dimensiongating]
#### `enabled` [#enabled]
Type: boolean\
Default: `true`
Master switch for all dimension gating.
```toml
enabled = true
```
When `false`, players may travel without Advancement Portals evaluating configured gates.
#### `creativePlayersBypassGates` [#creativeplayersbypassgates]
Type: boolean\
Default: `true`
Allows Creative-mode players to ignore all gates.
```toml
creativePlayersBypassGates = true
```
Set to `false` when Creative players should be tested against the same advancement requirements.
#### `spectatorPlayersBypassGates` [#spectatorplayersbypassgates]
Type: boolean\
Default: `true`
Allows Spectator-mode players to ignore all gates.
```toml
spectatorPlayersBypassGates = true
```
#### `operatorsBypassGates` [#operatorsbypassgates]
Type: boolean\
Default: `true`
Allows operators with the configured permission level to ignore all gates.
```toml
operatorsBypassGates = true
```
#### `operatorBypassPermissionLevel` [#operatorbypasspermissionlevel]
Type: integer\
Default: `2`\
Allowed range: `1` through `4`
Controls the permission level required by `operatorsBypassGates`.
```toml
operatorBypassPermissionLevel = 2
```
This setting has no effect when `operatorsBypassGates = false`.
#### `warningCooldownSeconds` [#warningcooldownseconds]
Type: integer\
Default: `2`\
Allowed range: `0` through `60`
Controls how often the full locked-travel message may be sent while a player repeatedly triggers the gate.
```toml
warningCooldownSeconds = 2
```
Set to `0` to allow a warning on every blocked event. This can produce chat spam while a player remains in a portal.
#### `blockedPortalRetryDelayTicks` [#blockedportalretrydelayticks]
Type: integer\
Default: `20`\
Allowed range: `0` through `200`
Applies a short portal cooldown after blocked travel.
Twenty ticks is approximately one second:
```toml
blockedPortalRetryDelayTicks = 20
```
This is separate from `warningCooldownSeconds`.
* The retry delay reduces repeated travel events.
* The warning cooldown reduces repeated chat messages.
Set to `0` to disable the added retry delay.
#### `showAdvancementDescriptions` [#showadvancementdescriptions]
Type: boolean\
Default: `true`
Shows the advancement description below its title in the locked-travel message.
```toml
showAdvancementDescriptions = true
```
Set to `false` for a shorter message.
Advancements without display data use their resource ID instead of a title and description.
#### `showDimensionUnlockMessages` [#showdimensionunlockmessages]
Type: boolean\
Default: `true`
Shows a chat and action-bar notification when an earned advancement finishes a gate.
```toml
showDimensionUnlockMessages = true
```
This setting does not affect the actual unlock. It controls only the notification.
### `[ftbTeams]` [#ftbteams]
#### `shareAdvancementsWithTeam` [#shareadvancementswithteam]
Type: boolean\
Default: `true`
Master switch for FTB Teams advancement sharing.
```toml
shareAdvancementsWithTeam = true
```
The option is ignored safely when FTB Teams is not installed.
Dimension gating itself does not require FTB Teams.
#### `shareOnlyPortalAdvancements` [#shareonlyportaladvancements]
Type: boolean\
Default: `false`
Controls the scope of newly earned advancement sharing.
```toml
shareOnlyPortalAdvancements = false
```
When `false`:
* Newly earned eligible non-recipe advancements can be shared.
* Portal requirements are also synchronized from existing progress.
When `true`:
* Only advancement IDs referenced by `dimensionRequirements` are shared.
* This is the recommended option when team sharing exists specifically to support gated dimensions.
#### `shareRecipeAdvancements` [#sharerecipeadvancements]
Type: boolean\
Default: `false`
Controls sharing for advancements whose path is inside a recipe folder.
```toml
shareRecipeAdvancements = false
```
Recipe advancement paths are detected when the path begins with `recipes/` or contains `/recipes/`.
Recipe advancements can be extremely numerous and are often invisible, so they are disabled by default.
An advancement explicitly used by a dimension gate remains shareable even when this option is `false`. This prevents a recipe-based gate from breaking team progression.
#### `syncTeamAdvancementsOnLogin` [#syncteamadvancementsonlogin]
Type: boolean\
Default: `true`
Synchronizes stored team advancement progress when a player joins.
```toml
syncTeamAdvancementsOnLogin = true
```
This is what allows an offline teammate to receive progress after returning.
When disabled, newly earned progress can still be shared immediately to online teammates, and gate-scoped synchronization can still occur during a portal attempt.
#### `notifySharedAdvancements` [#notifysharedadvancements]
Type: boolean\
Default: `true`
Shows a small system message when a player receives an advancement through team sharing.
```toml
notifySharedAdvancements = true
```
Set to `false` to share silently.
## FTB Teams advancement sharing [#ftb-teams-advancement-sharing]
### The problem it solves [#the-problem-it-solves]
Vanilla advancements are normally tracked per player.
In a cooperative boss fight, only one player may satisfy the exact trigger. For example, one teammate may land the final hit on a boss while the rest of the party participated in the fight.
Without sharing:
* One player receives the advancement.
* That player can enter the gated dimension.
* Other teammates may remain locked out.
* The party may need to repeat the milestone solely to satisfy individual advancement tracking.
Advancement Portals can share eligible advancement completion with the other members of the same FTB Teams party.
### Immediate online sharing [#immediate-online-sharing]
When a player earns an eligible advancement:
1. Advancement Portals finds the player's current FTB Teams party.
2. The advancement is recorded for the party member UUIDs.
3. Online teammates are granted their remaining criteria for that advancement.
4. A notification is shown when enabled.
Players outside the party do not receive the advancement.
A player without an FTB Teams party is treated as an individual, so no sharing occurs.
### Offline sharing [#offline-sharing]
Team advancement knowledge is saved in the world using Minecraft `SavedData`.
When a teammate is offline:
1. The earned advancement is recorded for that teammate's UUID.
2. The world saves the record.
3. The teammate logs in later.
4. Login synchronization grants eligible stored advancements.
The data file uses the name:
```text
advancement_portals_team_advancements
```
The physical save format and location are managed by Minecraft's world data storage.
### Gate-scoped portal synchronization [#gate-scoped-portal-synchronization]
Before evaluating a gated destination, the mod performs a small synchronization limited to that gate's advancement IDs.
This has two benefits:
* A player is not incorrectly blocked when the current team already has the required stored progress.
* The portal check does not scan every advancement stored by a large modpack.
### Existing worlds [#existing-worlds]
When a world upgrades to 3.1, the persistent team-sharing file does not yet know all advancement progress earned before the update.
To help existing worlds:
* Login synchronization examines the configured portal requirements completed by online teammates.
* Portal synchronization examines the requirements for the destination being attempted.
* Completed portal requirements found on an online teammate are recorded for the current party and can be applied to the player.
This discovery is intentionally focused on portal requirements. The mod does not scan every advancement ever completed by every player.
### New team members [#new-team-members]
During synchronization, stored advancement knowledge from the current party members is merged and recorded for the current member UUIDs.
This means a new party member can inherit eligible progress already recorded by the team.
### Team membership changes [#team-membership-changes]
Stored sharing history is associated with player UUIDs, while synchronization uses the player's current FTB Teams membership.
As a result, a player may carry previously recorded advancement knowledge when joining another team, and that stored knowledge can become part of the new team's merged progress during synchronization.
Pack authors who require strict team-bound progression should account for this behavior. A future team-identity-based storage mode would be needed to make shared history permanently belong to one specific FTB team rather than its members.
### Advancement rewards [#advancement-rewards]
The mod grants the remaining normal criteria for the advancement. It does not create a separate fake access flag.
Therefore, normal advancement completion behavior may run for the receiving teammate, including:
* Experience rewards.
* Recipe rewards.
* Loot rewards.
* Functions.
* Parent or child advancement visibility changes.
* Other mods reacting to advancement completion.
This is standard Minecraft advancement behavior.
For controlled progression, consider creating dedicated advancements that:
* Have no experience reward.
* Have no loot reward.
* Have no function reward.
* Exist only as pack progression flags.
* Use hidden display settings when players do not need to see them.
### Preventing recursive sharing [#preventing-recursive-sharing]
Granting an advancement to a teammate can fire another advancement-earned event. Advancement Portals uses an active-grant guard for each player and advancement combination to prevent the same share operation from looping recursively.
Already completed advancements are not granted again.
### When sharing is unavailable [#when-sharing-is-unavailable]
Team sharing is skipped when:
* `shareAdvancementsWithTeam = false`.
* FTB Teams is not installed.
* The player has no party.
* The FTB Teams API cannot be resolved.
* The advancement is filtered by the sharing settings.
* The target player already completed the advancement.
If FTB Teams cannot be integrated, normal dimension gating continues.
## Finding dimension and advancement IDs [#finding-dimension-and-advancement-ids]
### Resource location format [#resource-location-format]
Minecraft IDs use:
```text
namespace:path
```
Examples:
```text
minecraft:the_end
minecraft:end/kill_dragon
twilightforest:twilight_forest
mypack:quests/end_access
```
Use lowercase IDs unless the providing mod or datapack explicitly defines otherwise. Standard resource locations do not allow spaces.
### Finding advancement IDs [#finding-advancement-ids]
Useful methods include:
* Inspecting the advancement JSON file in a mod jar or datapack.
* Using the `/advancement` command with command suggestions.
* Reviewing the providing mod's documentation.
* Checking a KubeJS or datapack advancement script.
* Searching the server log or generated data.
* Temporarily enabling command suggestions as an operator.
A visible advancement's translated title is not its ID.
For example:
```text
Title: Free the End
ID: minecraft:end/kill_dragon
```
### Finding dimension IDs [#finding-dimension-ids]
Useful methods include:
* Reviewing the dimension mod's documentation.
* Inspecting datapack dimension JSON paths.
* Using commands that provide dimension suggestions.
* Checking the mod's source or registry dump.
* Reviewing teleport or dimension configuration from the providing mod.
A dimension's displayed name is not always its registry ID.
### Validate before release [#validate-before-release]
Start a test server and review the Advancement Portals validation summary.
An advancement ID can be syntactically valid but still unknown because:
* The mod providing it is missing.
* A datapack failed to load.
* The ID changed between mod versions.
* The path contains a typo.
* The advancement is generated only under certain conditions.
* The server and client pack contents differ.
## Player messages and unlock notifications [#player-messages-and-unlock-notifications]
### Locked destination header [#locked-destination-header]
A blocked player receives a header similar to:
```text
Travel locked: The End
```
### Requirement instruction [#requirement-instruction]
For `ALL`:
```text
Complete all of the following advancements:
```
For `ANY`:
```text
Complete any one of the following advancements:
```
### Advancement display [#advancement-display]
When the advancement has display information, the mod uses its readable title and frame color.
When `showAdvancementDescriptions = true`, the description is shown below the title.
When an advancement has no display information, its resource ID is shown.
When the advancement cannot be found, the player sees:
```text
Unknown advancement: namespace:path
```
### Action-bar reminder [#action-bar-reminder]
A short action-bar message states that the destination remains locked.
### Unlock message [#unlock-message]
When enabled, completing the gate shows:
```text
Dimension unlocked: The End
```
The action bar also confirms that the player can now enter.
For a custom dimension, the path is converted into a readable name by replacing slashes, underscores, and hyphens with spaces and capitalizing each word.
Example:
```text
mydimensions:ancient_sky/upper-realm
```
Displays approximately as:
```text
Ancient Sky Upper Realm
```
The namespace is not included in the friendly name.
## Bypasses and permissions [#bypasses-and-permissions]
Bypass checks occur before gate evaluation.
### Creative bypass [#creative-bypass]
```toml
creativePlayersBypassGates = true
```
A Creative player passes every gate.
### Spectator bypass [#spectator-bypass]
```toml
spectatorPlayersBypassGates = true
```
A Spectator player passes every gate.
### Operator bypass [#operator-bypass]
```toml
operatorsBypassGates = true
operatorBypassPermissionLevel = 2
```
A player at or above the configured permission level passes every gate.
To test gates as an operator, use one of these approaches:
* Temporarily set `operatorsBypassGates = false`.
* Temporarily remove operator status.
* Use a separate non-operator test account.
Being in Creative and being an operator are separate bypass conditions.
## Validation and error handling [#validation-and-error-handling]
At server startup, Advancement Portals parses the config and validates the resulting gates.
### Invalid resource IDs [#invalid-resource-ids]
An invalid dimension or advancement ID is logged and skipped.
Example of an invalid ID:
```text
Minecraft The End
```
Correct form:
```text
minecraft:the_end
```
### Invalid mode [#invalid-mode]
Only `ALL` and `ANY` are valid.
Invalid:
```toml
"minecraft:the_end | BOTH | minecraft:end/kill_dragon"
```
Valid:
```toml
"minecraft:the_end | ALL | minecraft:end/kill_dragon"
```
Mode parsing is case-insensitive, but uppercase is recommended.
### Empty requirement list [#empty-requirement-list]
A gate with no valid advancement IDs is ignored.
Invalid:
```toml
"minecraft:the_end | ALL | "
```
### Unknown advancement [#unknown-advancement]
A syntactically valid but unloaded advancement is retained as a requirement and remains incomplete.
This is intentional. A typo should not silently open a protected dimension.
Correct the ID or restore the mod/datapack that provides it.
### Missing dimension [#missing-dimension]
A gate targeting a dimension that is not currently loaded is reported as a warning.
The gate can still remain in the parsed config. This is useful when a dependency or datapack is temporarily missing, but it should be corrected before release.
### Validation summary [#validation-summary]
The startup log reports:
* Number of loaded gates.
* Number of unique advancement requirements.
* Number of detected issues.
Always review this summary after editing the config or changing modpack versions.
## Examples [#examples]
### Unlock the Nether after obtaining diamonds [#unlock-the-nether-after-obtaining-diamonds]
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond"
]
```
### Unlock the Nether after enchanting and obtaining diamonds [#unlock-the-nether-after-enchanting-and-obtaining-diamonds]
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond, minecraft:story/enchant_item"
]
```
### Unlock the End after obtaining Ancient Debris [#unlock-the-end-after-obtaining-ancient-debris]
```toml
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
]
```
### Two valid ways to unlock the End [#two-valid-ways-to-unlock-the-end]
```toml
dimensionRequirements = [
"minecraft:the_end | ANY | mypack:bosses/defeat_wither, mypack:quests/end_pass"
]
```
### Gate a modded dimension [#gate-a-modded-dimension]
```toml
dimensionRequirements = [
"twilightforest:twilight_forest | ALL | mypack:quests/complete_overworld_chapter"
]
```
Replace the IDs with those used by the installed dimension mod and progression datapack.
### Gate several progression stages [#gate-several-progression-stages]
```toml
dimensionRequirements = [
"minecraft:the_nether | ALL | mypack:chapters/overworld_complete",
"twilightforest:twilight_forest | ALL | mypack:chapters/nether_complete",
"minecraft:the_end | ALL | mypack:chapters/twilight_complete"
]
```
### Share only progression advancements with FTB Teams [#share-only-progression-advancements-with-ftb-teams]
```toml
[ftbTeams]
shareAdvancementsWithTeam = true
shareOnlyPortalAdvancements = true
shareRecipeAdvancements = false
syncTeamAdvancementsOnLogin = true
notifySharedAdvancements = true
```
### Disable all team sharing [#disable-all-team-sharing]
```toml
[ftbTeams]
shareAdvancementsWithTeam = false
```
### Require operators to obey progression [#require-operators-to-obey-progression]
```toml
[dimensionGating]
operatorsBypassGates = false
```
### Shorter locked messages [#shorter-locked-messages]
```toml
[dimensionGating]
showAdvancementDescriptions = false
```
### Disable unlock announcements [#disable-unlock-announcements]
```toml
[dimensionGating]
showDimensionUnlockMessages = false
```
## Updating from 3.0.x [#updating-from-30x]
Version 3.1 keeps the original `dimensionRequirements` key and legacy entry syntax.
An existing entry such as:
```toml
"minecraft:the_end=[minecraft:end/kill_dragon]"
```
continues to work as an `ALL` gate.
### Recommended update process [#recommended-update-process]
1. Back up the world and config.
2. Replace the old mod jar with version 3.1.0.
3. Start the server.
4. Allow the expanded config sections to generate.
5. Stop the server.
6. Review `[dimensionGating]` and `[ftbTeams]`.
7. Decide whether team advancement sharing should be enabled.
8. Convert legacy entries to the new syntax when convenient.
9. Restart the server.
10. Review validation output.
11. Test each destination with a normal player.
12. Test both online and offline team sharing.
### Existing team progress [#existing-team-progress]
Progress earned before installing 3.1 is not automatically present in the new SavedData history.
The mod can discover configured portal advancements from online teammates during login and portal synchronization.
For best upgrade results:
1. Have established team members join the server.
2. Allow login synchronization to run.
3. Attempt the relevant gated portal with another teammate.
4. Confirm that the gate advancement is shared.
5. Check logs if it is not.
## Troubleshooting [#troubleshooting]
### The portal blocks me but does not show a message [#the-portal-blocks-me-but-does-not-show-a-message]
Check:
* `enabled = true`.
* The player is not seeing a client chat filter issue.
* `warningCooldownSeconds` is not causing a recent warning to be suppressed.
* The correct version of the mod is installed.
* The server log does not show an exception.
* The attempted destination is the dimension you think it is.
Version 3.1 fixes a previous warning-order bug that could cancel travel before displaying the explanation.
### The portal does not block an operator [#the-portal-does-not-block-an-operator]
By default:
```toml
operatorsBypassGates = true
operatorBypassPermissionLevel = 2
```
Disable operator bypass while testing:
```toml
operatorsBypassGates = false
```
Also check Creative and Spectator bypass settings.
### The portal never unlocks [#the-portal-never-unlocks]
Check the server log for an unknown advancement.
Confirm:
* The advancement ID is correct.
* The advancement exists on the server.
* The advancement is fully complete, not partially progressed.
* The gate uses the intended `ALL` or `ANY` mode.
* The destination has only one final gate entry.
* The providing mod or datapack loaded successfully.
A syntactically valid but missing advancement intentionally remains blocking.
### One of my duplicate gates is ignored [#one-of-my-duplicate-gates-is-ignored]
The final valid entry for a destination replaces earlier entries.
Combine the requirements into one gate.
### An `ANY` gate acts like `ALL` [#an-any-gate-acts-like-all]
Confirm the entry has three pipe-separated sections:
```toml
"minecraft:the_end | ANY | advancement:a, advancement:b"
```
Legacy `dimension=[...]` entries are always `ALL`.
### Team sharing does not work [#team-sharing-does-not-work]
Confirm:
* FTB Teams is installed on the server.
* Both players are members of the same FTB Teams party.
* `shareAdvancementsWithTeam = true`.
* The advancement passes the portal-only and recipe filters.
* The target player does not already have the advancement.
* The FTB Teams version matches the expected Forge 1.20.1 API.
* The server log says the FTB Teams integration is ready.
* Login synchronization is enabled for offline testing.
### Only portal advancements are sharing [#only-portal-advancements-are-sharing]
Check:
```toml
shareOnlyPortalAdvancements = true
```
Set it to `false` to share other eligible newly earned advancements.
### Recipe advancements are not sharing [#recipe-advancements-are-not-sharing]
This is the default:
```toml
shareRecipeAdvancements = false
```
Set it to `true` to share recipe advancements.
A recipe advancement explicitly used as a portal requirement remains shareable even while the option is false.
### An offline teammate did not receive an old advancement [#an-offline-teammate-did-not-receive-an-old-advancement]
Offline storage records progress earned while the sharing system is active.
For progress earned before 3.1, the mod discovers configured portal requirements from online teammates. It does not reconstruct every historical non-portal advancement.
Have a teammate with the portal advancement join, then allow login or portal synchronization to run.
### A shared advancement gave extra rewards [#a-shared-advancement-gave-extra-rewards]
That is expected Minecraft behavior. The mod completes the normal advancement criteria.
Use dedicated reward-free progression advancements or restrict sharing to portal advancements.
### A player changed teams and brought progress with them [#a-player-changed-teams-and-brought-progress-with-them]
Shared history is stored by player UUID and merged according to current team membership during synchronization.
Strict team-isolated history is not part of version 3.1.
### The config looks correct, but a modded portal bypasses the gate [#the-config-looks-correct-but-a-modded-portal-bypasses-the-gate]
The travel method must fire Forge's normal `EntityTravelToDimensionEvent` for a server player.
A mod that moves players through a custom mechanism without that event may bypass this handler. Report the travel mod and exact method used so compatibility can be investigated.
### The dimension name in the message is imperfect [#the-dimension-name-in-the-message-is-imperfect]
Vanilla dimensions have special friendly names. Custom dimensions are formatted from the path of their ID.
Version 3.1 does not yet have per-gate custom display names.
## Frequently asked questions [#frequently-asked-questions]
No. Only dimensions listed in `dimensionRequirements` are affected.
A gate can target `minecraft:overworld`, but test the behavior carefully. Normal login and respawn mechanics are not the same as ordinary portal travel, and blocking every route into a primary dimension may create an unusable progression state.
Yes. Hidden or display-less advancements can be used as requirements. Display-less advancements appear by resource ID in the locked message.
Yes, when the quest mod or datapack grants an advancement for that quest. Use that advancement ID as the requirement.
No. A requirement counts only when the advancement progress reports complete.
No. At least one configured advancement must be fully complete.
Not directly in 3.1. Use a custom datapack advancement to represent the grouped logic.
Only for team advancement sharing. Normal gating works without it.
No. Newly earned eligible progress is stored for offline party members.
The mod awards all remaining criteria for the shared advancement until it becomes complete.
Yes. Use that advancement in a gate and enable portal-only sharing:
```toml
dimensionRequirements = [
"yourmod:next_dimension | ALL | minecraft:end/kill_dragon"
]
[ftbTeams]
shareAdvancementsWithTeam = true
shareOnlyPortalAdvancements = true
```
Not by default. Recipe advancements are filtered unless enabled or explicitly required by a gate.
No. The gate handler checks server players.
Yes.
Yes, at permission level 2 or higher.
Yes:
```toml
showAdvancementDescriptions = false
```
Yes:
```toml
enabled = false
```
Yes. Existing 3.0.x entries remain supported.
## Technical behavior and limitations [#technical-behavior-and-limitations]
### Gate cache [#gate-cache]
Parsed gates are cached. The cache is rebuilt when the raw `dimensionRequirements` list changes.
### One gate per destination [#one-gate-per-destination]
The internal gate map uses the destination ID as its key. The last valid duplicate entry wins.
### Unknown advancement behavior [#unknown-advancement-behavior]
Unknown advancement IDs are kept in a gate's requirement list and evaluated as missing. This is a fail-closed design.
### Advancement completion [#advancement-completion]
The mod uses Minecraft's completed advancement progress. It does not treat individual completed criteria as a completed gate unless the advancement itself is done.
### Unlock notifications [#unlock-notifications]
Unlock notifications listen for the server-side advancement-earned event.
For `ALL`, the event that completes the final required advancement triggers the message.
For `ANY`, the message is suppressed when another qualifying advancement already completed the gate earlier.
### Warning memory [#warning-memory]
The mod tracks the last warning tick for connected player UUIDs. The entry is removed when the player logs out.
### Portal retry delay [#portal-retry-delay]
Blocked travel applies the configured portal cooldown to reduce rapid repeated dimension-travel events. It does not grant Fire Resistance or other effects.
### Optional FTB Teams integration [#optional-ftb-teams-integration]
The integration uses reflection so FTB Teams is not a hard code dependency.
If the expected API cannot be resolved, an error is logged once and team sharing is skipped while normal gating remains active.
### Persistent sharing data [#persistent-sharing-data]
Stored advancement knowledge is saved per player UUID in the Overworld data storage.
It is not permanently keyed to an FTB team ID in version 3.1.
### No administrative commands [#no-administrative-commands]
Version 3.1 does not currently include commands such as:
```text
/advancementportals reload
/advancementportals validate
/advancementportals check
```
Restarting the server remains the recommended way to ensure validation runs after configuration changes.
### No per-gate custom text [#no-per-gate-custom-text]
Version 3.1 automatically formats dimension names and uses advancement display data. Per-gate custom names, icons, locked messages, and unlock messages are not yet configurable.
## Recommended pack-author practices [#recommended-pack-author-practices]
### Use dedicated progression advancements [#use-dedicated-progression-advancements]
For important gates, create a dedicated advancement that represents exactly the milestone needed for access.
Benefits:
* Stable ID under your pack namespace.
* Clear control over criteria.
* No accidental dependency on a mod changing its advancement path.
* No unwanted advancement rewards during team sharing.
* Easy replacement of complex progression logic.
Example ID:
```text
mypack:progression/unlock_the_end
```
### Avoid reward-bearing shared advancements [#avoid-reward-bearing-shared-advancements]
When FTB Teams sharing is enabled, prefer advancements without XP, loot, recipes, or functions.
### Use portal-only sharing for focused co-op progression [#use-portal-only-sharing-for-focused-co-op-progression]
Recommended:
```toml
shareOnlyPortalAdvancements = true
```
This prevents unrelated advancements from spreading across the party.
### Test as a non-operator Survival player [#test-as-a-non-operator-survival-player]
Creative, Spectator, and operator bypasses can hide configuration mistakes.
### Review logs after every pack update [#review-logs-after-every-pack-update]
Advancement IDs and dimension IDs can change when mods or datapacks update.
### Keep one destination entry [#keep-one-destination-entry]
Combine requirements into one gate rather than adding multiple lines for the same dimension.
### Use `ANY` for alternate progression paths [#use-any-for-alternate-progression-paths]
`ANY` is useful when players may choose between:
* Combat and exploration.
* Two different bosses.
* A quest route and a crafting route.
* Vanilla progression and a modded equivalent.
### Back up before changing progression [#back-up-before-changing-progression]
Changing a gate or team-sharing scope can affect player access and advancement rewards. Back up the world before deploying major progression changes.
# Alshanex's Familiars (/mods/alshanex-familiars)
## Familiars [#familiars]
Familiars can be tamed using Arcane Essence by default, though you can change the required item via datapack with the `familiar_tamming` tag.
Right-click a familiar with a stick to make it hold its position — it will stay still and won't attack.
Tamed familiars can be summoned and unsummoned from the selection menu. Open the menu with its keybind, select the familiar you want, then use the summon/unsummon keybind.
Once you earn the **Learn Necromancy** advancement, familiars avoid death at the cost of mana. If you run out of mana, they will die.
### Lightning Mage Familiar [#lightning-mage-familiar]
* **Battle:** specialized in lightning magic, casting spells that hit multiple targets at the same time.
* **Abilities:**
* **Charge Owner:** has the ability to charge the owner for some time, giving him increased speed and strength.
* **Charge Creeper:** everytime he finds a creeper, he will follow him to charge it.
* **Spawn:** can be found wandering around in mountains, searching for a good spot to attract lightnings.

### Archmage Familiar [#archmage-familiar]
* **Battle:** specialized in basic magic from different schools.
* **Abilities:**
* **Transmutation:** has the ability to convert spell scrolls in a pedestal into other random scroll of the same rarity, and there's a little chance to get a higher rarity scroll.
* **Enderman's Nightmare:** enderman are scared of him, and will run away when seeing him.
* **Shulker Protection:** has the ability to counter shulker bullets.
* **Spawn:** can be found studying in his improvised laboratory, located in the end.

### Necromancer Familiar [#necromancer-familiar]
* **Battle:** specialized in blood magic, including necromancy abilities to summon undeads.
* **Abilities:**
* **Undead Chaos:** has the ability to make undead entities around go in a rampage, attacking nearby entities in confusion.
* **Witherify:** has the ability to turn nearby skeletons into wither skeletons.
* **Spawn:** can be found studying the death in graveyards all over the Soul Sand Valleys.

### Summoner Familiar [#summoner-familiar]
* **Battle:** specialized in eldrith magic and unknown arts, being able to summon creatures born in the shadows.
* **Abilities:**
* **True Vision:** has the ability to give night vision to the owner, in addition to making him immune to blindness and darkness effects.
* **Dark Ritual:** has the ability to deactivate sculk shriekers, hiding the owner from the warden.
* **Spawn:** can be found studying dark arts in his laboratory, located in the Ancient City.

### Hunter Familiar [#hunter-familiar]
* **Battle:** specialized in attacking enemies with arrows, combined with swift moves.
* **Abilities:**
* **Watcher:** has the ability to protect the owner from enemies aiming at him, even if the owner has not noticed them.
* **Smelling Loot:** the owner can right click him with any item to make him search for entities around that can drop them, marking them for the owner to see.
* **Spawn:** can be found living in campsites all over forest biomes.

### Druid Familiar [#druid-familiar]
* **Battle:** specialized in using nature magic to control enemies.
* **Abilities:**
* **Overgrowth:** has the ability to bonemeal nearby crops.
* **Nature's Blessing:** has the ability to breed nearby animals.
* **Spawn:** can be found protecting the forsts of the world.

### Illusionist Familiar [#illusionist-familiar]
* **Battle:** specialized in evocation magic, controlling enemies confusing them.
* **Abilities:**
* **Magic Trick:** when the owner has low health, illusionist will perform a magic trick that will hide his owner from the enemies.
* **Decoy:** when he's low health, he will disappear leaving behind an explosive copy of him, taunting enemies around into attacking it.
* **Pickpocket:** when no one's watching and there are gold nuggets or emeralds on the floor, this little trickester will take them for himself.
* **Spawn:** illusionist spawn naturally disguised as other overworld familiars, use the Mirror of Truth to make them reveal themselves.

### Plague Doctor Familiar [#plague-doctor-familiar]
* **Battle:** specialized in poison magic, poisoning enemies to make them suffer a slow death.
* **Abilities:**
* **Poison Blood:** his owner and himself deal increased damage to poisoned entities, and when a plague doctor familiar gets hit, they throw a poison potion as countermeasure.
* **Spawn:** to get him, you will need to craft a poison vial and give it to a tamed druid familiar.

### Scorcher Familiar [#scorcher-familiar]
* **Battle:** specialized in fire magic, burning his enemies to death.
* **Abilities:**
* **Molten Heart:** upon getting hit, he will set attackers on fire for some time.
* **Heatproof:** grants his owner and himself fire immunity.
* **Spawn:** can be found wandering around in hot places in the nether.

### Cleric Familiar [#cleric-familiar]
* **Battle:** specialized in holy magic, his main role is supporting but he can also cast powerful holy spells to purify enemies.
* **Abilities:**
* **Salvation:** he will attack undeads on sight, but if he sees a zombified villager, he will use his holy power to cure him and grant him the salvation.
* **Spawn:** to get a cleric familiar, you will need to cast the cleanse spell near an untamed necromancer familiar.

### Bard Familiar [#bard-familiar]
* **Battle:** specialized in sound magic, attacking his enemies with powerful melodies, but also supporting his friends with supporting melodies.
* **Abilities:**
* **Musical Nature:** he will play melodies to make adventures much nicer.
* **Spawn:** to get him, you will need to cast a sound spell with the harp near an untamed familiar, making them interest in music.

### Frostling Familiar [#frostling-familiar]
* **Battle:** specialized in ice magic, having a good balance between attack, defense and mobility, and decent controlling abilities.
* **Abilities:**
* **Frozen Feet:** he and his owner will be able to freeze water bellow them to walk without problems.
* **Ice Heart:** he and his owner will be immune to freezing, including powder snow freezing.
* **Spawn:** can be found wandering around in icy biomes.

### Dragoon Familiar [#dragoon-familiar]
* **Battle:** specialized in ender magic and focused on meelee combat.
* **Abilities:**
* **Dragon Breath:** he can fill glass bottles with dragon breath.
* **Dragon Heart:** his dragon heart allows him to recover health naturally.
* **Protector:** when an allied familiar gets attacked in meelee range, he will swap positions with him and target the attacker.
* **Spawn:** spawns in the outer end islands.
## Structures [#structures]
### Origin Island [#origin-island]
A long lost island found in the vast oceans, holding the secrets of familiars' existence. Its only inhabitants are little lost souls, very early forms of the familiars that never got to their final form. These creatures can be bottled using empty bottles, and then can be used in the new rituals.
Rituals are performed in the center of the island, using the pedestals, refer to the Rituals section to know more about them.
To locate this island, you first need a Sniffer, which sometimes will find Crystal Berries. These berries can be used to feed your tamed familiars, which will make them vaguely remember things about their past and how they were born, which will condensate into Memory Fragments. Memory Fragments can be used the same way as Ender Eyes to locate the Origin Island.

### Hunters' Campsite [#hunters-campsite]
Hunters live in groups, so they built campsite all along their principal hunting spots, mainly forests where abundant preys wander around.
These campsites can also be found with a Furled Map obtained in the Origin Island.
### Graveyard [#graveyard]
This new structure belongs to the Soul Sand Valleys, a place where death rules. Necromancers are naturally attracted to these places, so you will surely find them here.
### Summoner's Lab [#summoners-lab]
Summoners' curiosity towards sculk made them stay in Ancient Cities for very long time, so they built their own laboratory in the city to make better use of their study time.
### Archmage's Settlement [#archmages-settlement]
Archmages travelled to the End dimension to study the secrets of the infinite void, so they needed a place to stay meanwhile. That's when they decided to build temporal homes all around the End, a place where they can study and make discoverings.
## Items [#items]
### Familiar Trinkets [#familiar-trinkets]
Familiar Trinkets are curios that can be equipped in the trinket slot, and provide different effects.
* **Magic Leaf:** increases power of the spells casted by druid familiars. Found in jungle temples.
* **Chain of the Hunter:** increases power of the spells casted by hunter familiars. Found in evoker forts or hunter campsites.
* **Insignia of the Lich:** increases power of the spells casted by necromancer familiars. Found in graveyards.
* **Forgotten Crown:** increases power of the spells casted by summoner familiars. Found in Ancient Cities.
* **Shiny Crown:** increases power of the spells casted by archmage familiars. Found in Archmage Laboratories.
* **Golden Bell:** increases power of the spells casted by illusionist familiars. Found in Woodland Mansion.
* **Conjurer's Candlestick:** increases power of the spells casted by scorcher familiars. Found in Pyromancer Towers.
* **Blessed Calyx:** increases power of the spells casted by cleric familiars. Found in Priest Houses.
* **Emblem of Electricity:** increases power of the spells casted by lightning mage familiars. Found in Mountain Towers.
* **Contaminated Cheese:** increases power of the spells casted by plague doctor familiars. Found in Impaled Icebreakers.
* **Lost Melody:** increases power of the spells casted by bard familiars. Obtained with Mysterious Orb.
* **Frostbloom:** increases power of the spells casted by frostling familiars. Found in Ice Spiders Den.
* **Dragon Tear:** increases power of the spells casted by dragoon familiars. Dropped by Ender Dragon.
* **Pandora's Box:** allows to summon/unsummon up to 10 familiars at the same time. Crafted.
### Ring Curios [#ring-curios]
* **Holy Water Grail:** +5% mana regen, constantly heals tamed familiars at the cost of your own mana, found in Priest Towers.
* **Invisibility Robes:** +50 max mana, when equipped tamed familiars that fall below 25% health willl get invisibility effect, crafted.
* **Statue of Willpower:** +5% spell resist, when equipped tamed familiars that fall below half health will get oakskin effect, crafted.
* **Heart of Ender:** +15% cast time reduction, when equipped familiars that fall below 25% health will get evasion effect on intervals, found in End Cities.
### Consumables [#consumables]
* **Life Fruits:** health consumable to boost familiar health, has 3 tiers with a limit for each tier, obtained through alchemist cauldron.
* **Armor Plates:** armor consumable to boost familiar armor, has 3 tiers with a limit for each tier, obtained through shrinking.
* **Magic Essences:** consumables for spell power and spell resist, each has 3 tiers with a limit for each tier, obtained through:
* **Power:** dropped by magic creatures, upgraded through rituals.
* \*\*Resist:\*\*obtained through shrinking, upgraded through rituals.
* **Tiny Shield:** right click into a tamed familiar to allow him to block attacks with a low chance, limit 1 per familiar, obtained through shrinking.
* **Strange Mushroom:** right click into a tamed familiar to give him a stack of enraged (when getting hit, has a chance to consume a stack of enraged to gain heartstop for some seconds), limit 10 per familiar, dropped from Mooshrooms and from shearing bogged.
### Other items [#other-items]
* **Magic Eye:** used to keep track of the magic consumables progress of a familiar.
### Shards [#shards]
Shards are obtained via rituals in the Origin Island, using the pedestals in the central structure. There is a shard for each naturally spawning familiar that spawns in the overworld except the Illusionist one. To know the recipes check JEI or the "ritual\_recipes" folder inside the data folder of the mod inside the recipe folder.
### Spellbooks and Staffs [#spellbooks-and-staffs]
* **Harp (Staff):** staff from the sound school, obtained from the Mysterious Orb.
* **Symphonic Grimoire (Spellbook):** spellbook for the sound school, crafted.
* **Familiar Tome of Alignment (Spellbook):** when equipped, all tamed familiars will share the magic attributes of their owner, sharing equal amount based on the amount of the familiars summoned (if there are 10 summoned, each gets 10% of the owner's attributes, if there are 2, they get 50% of the owner's attributes), crafted.
### Other Items [#other-items-1]
* **Crystal Berry:** obtained by the Sniffer, can be feed to your Familiars to get Memory Fragments.
* **Memory Fragments:** remnants of familiars' forgotten past, they lead you to what familiars treat as home.
* **Bottle of Spirit:** the core material to conjure familiars into the world. This item is obtained by catching Lost Souls from the origin Island with empty bottles. Bottled souls can be released back into the wild.
* **Mirror of Truth:** used to make disguised illusionist familiars reveal themselves, can be obtained via ritual.
* **Venomous Spider Fang:** used to craft poison vials and heal plague doctor familiars, dropped from Cave Spiders.
* **Mysterious Orb:** when right clicking it you will get the Harp and the Lost Melody trinket, obtained through island ritual. To be able to use the Mysterious Orb, you will need to complete the taming advancements for the elemental familiars (all of them except the bard familiar).
* **Tiny Totem:** can be bound to a familiar, and a familiar can only be bound to 1 totem at a time. When the familiar dies and you have no mana to revive him, the bound totem will be consumed to allow the bound familiar to revive, and the totem will be consumed.
## Sound School [#sound-school]
Has its own spellbook, staff and armor. Staff and spellbook were mentioned in the correspondant section, and the armor is the Bard set.
The school also contains the following spells:
* **Clef:** shoots a simple note towards the enemy.
* **Chord Blast:** performs a simple melody that hurts the enemy, and when someone hears this melody he can't evade it anymore.
* **Crescendo:** performs a rumbling melody that hurts and stuns the enemy.
* **Grand Finale:** performs an outrageous melody that traps the enemies and annihilates them with an explosive melody.
* **Celestial Chant:** calls the angels to play an angelic melody that will heal and protect yourself and your allies.
* **Rhapsody:** summons little birds that will cheer yourself and your allies, giving you a little boost for some time.
* **Sonata:** starts playing a fast-paced song for everyone to hear, an harmonious melody to hurt your enemies.
* **Serenade:** starts playing a slow-paced song for everyone to hear, an harmonious melody to make your enemies sleepy.
## Blocks [#blocks]
### Familiar Bed [#familiar-bed]
Familiar beds are blocks tht familiars use to sleep and recover health. Familiars will search for nearby beds when they need to heal.
### Familiar Storage [#familiar-storage]
Familiar storage is a block that allows to save up to 10 familiars. Familiars inside the storage will be invulnerable, but they also won't attack other mobs with some exceptions.
Familiar storage has 2 modes:
* **Store mode:** Allows the player to freely move familiars between his familiars and the storage familiars.
* **Wander mode:** Allows stored familiars to wander around until a configurable distance. It also allows you to enable or disable familiars abilities while they are wandering.
Familiar storage blocks can only be broken by the owner and only when it's in storage mode and there are no familiars inside.
**Important:** only 1 familiar storage block can be used in a 16 blocks radius.
## Dev Section [#dev-section]
### Rituals [#rituals]
Rituals are completely data driven and shown in JEI, allowing devs to make their own ritual recipes only by adding a datapack. Recipes have the following structure:
```json
{
"type": "alshanex_familiars:ritual_recipe",
"central_item": {
"item": "alshanex_familiars:pet_soul"
},
"inputs": [
{
"ingredient": {
"item": "irons_spellbooks:legendary_ink"
},
"count": 1,
"consume": true
},
{
"ingredient": {
"item": "irons_spellbooks:arcane_essence"
},
"count": 1,
"consume": true
},
{
"ingredient": {
"item": "irons_spellbooks:arcane_rune"
},
"count": 1,
"consume": true
},
{
"ingredient": {
"item": "irons_spellbooks:magic_cloth"
},
"count": 1,
"consume": true
}
],
"result": {
"id": "alshanex_familiars:archmage_shard"
},
"particle_type": "minecraft:end_rod"
}
```
* **central\_item:** the item that will be set in the center pedestal of the ritual.
* **inputs:** the items that will be used in the ritual. The amount of items must be 4.
* **item:** the id of the item.
* **count:** the amount of the item required, should be always 1 for now since pedestals only allow that.
* **consume:** specifies if the item should be consumed in the ritual, can be either "true" or "false".
* **result:** the item that will result from the ritual completing.
* **particle\_type:** optional particles that will be used in the ritual. Invalid particle or no particle will default to enchant particles.
All recipe files should be added to the route **"data > alshanex\_familiars > recipe > ritual\_recipes"**.
### Shrinking [#shrinking]
Players can now craft the Shrinkinator, a workstation that shrinks some items to make them avaliable for the familiars.
The main use is to shrink food items, which can be given to any familiar to heal them.
Apart from food, there are also some recipes to make other items like the armor consumables or the tiny shield.
This block is also allows for automation with hoppers.
Shrinking recipes are also data driven and shown in JEI, allowing devs to make their own following this structure:
```json
{
"type": "alshanex_familiars:shrinking_recipe",
"input": {
"item": "alshanex_familiars:armor_plate_tier_1"
},
"result": {
"id": "alshanex_familiars:armor_plate_tier_1",
"count": 1,
"components": {
"familiarslib:familiar_consumable": {
"type": "armor",
"tier": 1
}
}
}
}
```
* **input:** the input item for the shrinkinator.
* **result:** the output item obtained from the shrinking process (components are optional, in this case is included to show how the consumable component can be set to items).
All recipe files should be added to the route **"data > alshanex\_familiars > recipe > shrinking"**.
### Consumables System [#consumables-system]
The new consumables system now uses components to set if they are consumables or not:
```json
"components": {
"familiarslib:familiar_consumable": {
"type": "armor",
"tier": 1
}
}
```
There are currently 6 types of consumables:
* **armor:** increases the familiar armor points, goes from tier 1 to tier 3.
* **health:** increases the familiar health, goes from tier 1 to tier 3.
* **spell\_power:** increases familiar spell power attribute, goes from tier 1 to tier 3.
* **spell\_resist:** increases familiar spell power attribute, goes from tier 1 to tier 3.
* **enraged:** adds 1 enraged stack to the familiar, only has tier 1.
* **blocking:** unlocks the ability to block attacks for the familiar, only has tier 1.
### Modify familiars spell roaster [#modify-familiars-spell-roaster]
**Works only 1.21.1, once ISS support spell tags in 1.20.1 it will work there too**
Anyone can modify which spells each familiar can cast simply by making a datapack to edit some tags.
The route to access the tags is **"data > alshanex\_familiars > tags > irons\_spellbooks > spells"**.
Inside this directory people will find a directory for each one of the familiars. Inside each familiar directory, there are a series of tags:
* **attack**
* **defense**
* **movement**
* **support**
* **buffing (cleric only)**
* **healing (cleric only)**
Anyone is free to add or remove any spells from these tags.
### Create your own familiar and familiar blocks [#create-your-own-familiar-and-familiar-blocks]
Yes, you heard right. For neoforge 1.21.1 i made the FamiliarsLib mod specifically to allow anyone to make their own familiars, and obviously compatible with all the features included in Alshanex Familiars mod.
FamiliarLib also allows to add your own Familiar Houses and Familiar Beds too by just extending a simple class.
#### Getting started [#getting-started]
First of all, you need to add the Curse Maven Snippet of the FamiliarsLib version you want to use into your dependencies inside the "build.gradle". It should look like this:
**implementation "curse.maven:familiarslib-1316458:7415920"**
#### Creating your own familiar [#creating-your-own-familiar]
To create your own familiar you need a couple things before getting into coding:
* **Familiar's model:** a ".geo.json" file that you can get by exporting in your geckolib blockbench project.
* **Familiar's texture:** can be saved from your blockbench project.
* **A couple animations saved as json files:**
* **idle (loop animation to play when idel)**
* **interact (animation that plays when right clicking the familiar)**
* **long\_cast (animation that plays when the familiar casts long casting time spells)**
* **skill (animation that plays when familiar casts instant or short casting time spells)**
* **walk (loop animation to play when walking)**
* **spawn (animation that plays when the familiar spawns in the world)**
* **sleep (animation that plays when the familiar sleeps in a familiar bed)**
* **continuous (loop animation to play when casting continuous cast spells)**
Once you have all these files, you have to add them inside these routes:
* **familiar\_model.geo.json:** this one goes in "resources > assets > your\_mod\_id > geo", inside the "geo" directory.
* **familiar\_texture.png:** this one goes in "resources > assets > your\_mod\_id > textures > entity", inside the "entity" directory.
* **familiar\_animations.animation.json:** you need to put all the different animations mentioned before, mantaining the exact names stated before, in a single animation file. This file goes in "resources > assets > your\_mod\_id > animations", inside the "animations" directory.
Once all the files are in their correct locations, you can create your familiar entity class. If you want to make a flying familiar you can extend the "AbstractFlyingSpellCastingPet" class, if you want to make a terrestrian familiar you can extend the "AbstractTerrestrianSpellCastingPet" class. Here's an example familiar basic class:
```java
public class ExamlpeFamiliarEntity extends AbstractFlyingSpellCastingPet {
public static final ResourceLocation textureResource = ResourceLocation.fromNamespaceAndPath(YourMainClass.MODID, "textures/entity/familiar_texture.png");
public ExamlpeFamiliarEntity(EntityType extends AbstractFlyingSpellCastingPet> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
@Override
protected void registerGoals() {
super.registerGoals();
initializeAttackGoal(2);
//Any other goal specific to this
}
@Override
protected FamiliarGoals.FamiliarWizardAttackGoal createAttackGoal(float min, float max) {
//Here is where you set the spells you want the familiar to use. I recommend using spell tags for easier management and flexibility.
List attackSpells = HelperMethods.getSpellsFromTag(YourModTags.ARCHMAGE_ATTACK_SPELLS);
List defenseSpells = HelperMethods.getSpellsFromTag(YourModTags.ARCHMAGE_DEFENSE_SPELLS);
List movementSpells = HelperMethods.getSpellsFromTag(YourModTags.ARCHMAGE_MOVEMENT_SPELLS);
List supportSpells = HelperMethods.getSpellsFromTag(YourModTags.ARCHMAGE_SUPPORT_SPELLS);
//Only return one of these goals
//If it's a flying familiar
return new FamiliarGoals.FlyingWizardAttackGoal(this, 1f, 30, 40)
.setSpells(
attackSpells,
defenseSpells,
movementSpells,
supportSpells
)
.setIsFlying()
.setAllowFleeing(true)
.setSpellQuality(min, max);
//If it's a terrestrian familiar
return new WizardAttackGoal(this, 1.25f, 40, 50)
.setSpells(
attackSpells,
defenseSpells,
movementSpells,
supportSpells
)
.setAllowFleeing(true)
.setSpellQuality(min, max);
}
//Set the attributes you like here, be careful since some attributes change between terrestrian, meelee and flying familiars
public static AttributeSupplier.Builder prepareAttributes() {
return LivingEntity.createLivingAttributes()
.add(Attributes.ATTACK_DAMAGE, 3.0)
.add(Attributes.ATTACK_KNOCKBACK, 0.0)
.add(Attributes.MAX_HEALTH, 30.0)
.add(Attributes.FOLLOW_RANGE, 24.0)
.add(Attributes.FLYING_SPEED, .1F)
.add(Attributes.MOVEMENT_SPEED, .2);
}
@Override
protected void defineSynchedData(SynchedEntityData.Builder pBuilder) {
super.defineSynchedData(pBuilder);
}
@Override
public void addAdditionalSaveData(CompoundTag pCompound) {
super.addAdditionalSaveData(pCompound);
}
@Override
public void readAdditionalSaveData(CompoundTag pCompound) {
super.readAdditionalSaveData(pCompound);
}
}
```
With the entity class done, you now need to add the entity model class. Here's an example class:
```java
public class ExamlpeFamiliarModel extends DefaultedEntityGeoModel {
public static final ResourceLocation MODEL = new ResourceLocation(AlshanexFamiliarsMod.MODID, "geo/familiar_model.geo.json");
public static final ResourceLocation ANIMATIONS = new ResourceLocation(AlshanexFamiliarsMod.MODID, "animations/familiar_animations.animation.json");
public ExamlpeFamiliarModel() {
super(new ResourceLocation(YourMainClass.MODID, "example_familiar"));
}
protected TransformStack transformStack = new TransformStack();
@Override
public ResourceLocation getModelResource(ExamlpeFamiliarEntity object) {
return MODEL;
}
@Override
public ResourceLocation getAnimationResource(ExamlpeFamiliarEntity animatable) {
return ANIMATIONS;
}
@Override
public void setCustomAnimations(ExamlpeFamiliarEntity entity, long instanceId, AnimationState animationState) {
super.setCustomAnimations(entity, instanceId, animationState);
if (Minecraft.getInstance().isPaused() || !entity.shouldBeExtraAnimated())
return;
transformStack.popStack();
}
}
```
And last but not least, the entity renderer class. Here's an example class:
```java
public class ExampleFamiliarRenderer extends HumanoidRenderer {
public ExampleFamiliarRenderer(EntityRendererProvider.Context renderManager, ExampleFamiliarModel model) {
super(renderManager, model);
addRenderLayer(new AutoGlowingGeoLayer<>(this));
}
@Override
public ResourceLocation getTextureLocation(ExampleFamiliarEntity entity) {
return ExampleFamiliarEntity.textureResource;
}
@Override
public void render(ExampleFamiliarEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) {
super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight);
SpellRenderingHelper.renderSpellHelper(ClientMagicData.getSyncedSpellData(animatable), animatable, poseStack, bufferSource, partialTick);
}
@Override
public RenderType getRenderType(ExampleFamiliarEntity animatable, ResourceLocation texture, @Nullable MultiBufferSource bufferSource, float partialTick) {
return animatable.isInvisible() ? RenderType.entityTranslucent(texture) : super.getRenderType(animatable, texture, bufferSource, partialTick);
}
}
```
After you have all this, you can now proceed with the rest of the entity registration process as any other modded entity and you will have your familiar complete!
#### Creating your own familiar house [#creating-your-own-familiar-house]
Creating your own familiar storage block is very simple, you just need to extend a couple base classes from FamiliarsLib and the rest is still the same.
For the block class you need to extend the "AbstractFamiliarStorageBlock" class:
```java
public class FamiliarHouseExampleBlock extends AbstractFamiliarStorageBlock {
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
private static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D);
public static final MapCodec CODEC = simpleCodec(FamiliarHouseExampleBlock::new);
public FamiliarHouseExampleBlock(Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any()
.setValue(FACING, Direction.NORTH));
}
@Override
public MapCodec codec() {
return CODEC;
}
@Nullable
@Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new FamiliarHouseExampleBlockEntity(pos, state);
}
//This states the amount of familiar house blocks per chunk allowed
@Override
protected int getAmountPerChunk() {
return 2;
}
@Nullable
@Override
public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType blockEntityType) {
return level.isClientSide ? null : createTickerHelper(blockEntityType, BlockEntityRegistry.FAMILIAR_HOUSE_EXAMPLE.get(), AbstractFamiliarStorageBlockEntity::serverTick);
}
//Rest of the implementation...
}
```
For the block entity class is basically the same as making a normal modded block entity but extending the class "AbstractFamiliarStorageBlockEntity".
#### Creating your own familiar bed [#creating-your-own-familiar-bed]
The process here is the same as creating a normal modded block and block entity but extending different classes.
For the custom bed block you just need to extend the "AbstractFamiliarBedBlock" class and implement it as a normal modded block.
For the custom bed block entity you just need to extend the "AbstractFamiliarBedBlockEntity" class and implement it as a normal modded block entity.
# Create Mining Laser (/mods/create-mining-laser)
This mod is **data-driven**: tiers, recipes, models, and textures can be added or replaced from a resource/data pack (or another mod).
This guide shows:
* how to **add a new Tier** (data file),
* how to **add recipes** for that tier (data file),
* where to put the **model & textures** for the laser head,
* and what each field means.
> Examples below use ``. Adjust namespaces as needed.
## Directory layout [#directory-layout]
```
/
├── data/
│ └── /
│ ├── drill_tiers/
│ │ └── t10.json <-- TierDef (data-driven)
│ └── recipes/
│ └── drill_core/
│ └── t10_ores.json <-- DrillCore recipe(s)
└── assets/
└── /
├── models/
│ └── block/
│ └── laser_head_t10.json <-- Head model (inherits from base)
└── textures/
└── block/
└── laser_head_t10.png <-- Head texture (same UV layout as base)
```
## 1) Add a new Tier (data-driven) [#1-add-a-new-tier-data-driven]
A **tier** defines: which **core item** activates it, its **RPM gate**, its **stress at 128 RPM**, and which **laser head model** to render.
Create a file at:
```
data//drill_tiers/.json
```
### Tier JSON schema [#tier-json-schema]
```jsonc
{
// (optional) if omitted, the id is inferred from the filename
"id": ":t10",
// sort order in JEI/tooltips (lower = earlier)
"order": 10,
// the item that must be inserted into the controller to activate this tier
"core_item": ":drill_core_t10",
// base stress draw at min_rpm (scaled by the config suScale)
// e.g. 32.0 with suScale=1000 => 32,000 SU shown/consumed at min_rpm
"stress_at_minRPM": 32.0,
// RPM gate for this tier; the drill does nothing below this
"min_rpm": 128,
// (optional) used only to clamp the x2 speed bonus in code; UI pitch/volume scales up to this
"max_rpm": 256,
// the partial model to render as the head (block model ResourceLocation, without "models/")
// this file will be under assets/create_mininglaser/models/block/...
"head_partial": ":block/laser_head_t10"
}
```
### Notes [#notes]
* **`stress_at_minRPM`** is interpreted at the tier's **`min_rpm`** (default 128). The config multiplier `suScale` is applied on top (see "Config" below).
* **`core_item`** can be **any existing item** (from your mod or others). You do **not** need a special item class—just reference it here.
* **`head_partial`** must point to a **block model** (see next section).
## 2) Laser head model & texture [#2-laser-head-model--texture]
Every tier points to a **partial block model** via `head_partial`. New heads should **inherit** from the base head so you only swap textures.
Place files here:
* Model: `assets//models/block/laser_head_t10.json`
* Texture: `assets//textures/block/laser_head_t10.png`
> Keep your texture's resolution and UV layout compatible with the base (the base uses a 64×64 sheet). If you change UVs, you'll need a full model edit.
### Base model to inherit from [#base-model-to-inherit-from]
The mod ships a base head model (e.g. `laser_head_t1.json`). Your custom models should inherit from it.
### Minimal inheriting model [#minimal-inheriting-model]
```json
{
"parent": "create_mininglaser:block/laser_head_t1",
"textures": {
"1": ":block/laser_head_t10r",
"particle": "create_mininglaser:block/drill_casing"
}
}
```
> If you exported a full model from Blockbench, you can still simplify it to a `parent` + `textures` override as above—this keeps everything consistent with Create's partials.
## 3) Add recipes for a tier [#3-add-recipes-for-a-tier]
Recipes tell the drill **what to roll** while the specified tier is active. They also support **dimension/biome filters** so you can restrict outputs (e.g., quartz only in Nether).
Create files at:
```
data//recipes/drill_core/.json
```
### Recipe JSON schema [#recipe-json-schema]
```jsonc
{
"type": "create_mininglaser:drill_core",
// link to your tier by id (the file name or "id" field of your TierDef)
"tier": ":t10",
// base duration in ticks (20 ticks = 1 second) @ 1× speed
// effective time is divided by speed multiplier (up to 2× at max_rpm)
"duration": 200,
// ordered drop table; the first successful roll returns
"drops": [
{
"item": "minecraft:iron_ore",
"chance": 0.35, // 35% per completion
"min": 1,
"max": 2,
// optional environment filter
"env": {
// only allow in these dimensions (resource locations)
"dimensions": ["minecraft:overworld"],
// biomes: either explicit ids...
// "biomes": ["minecraft:old_growth_pine_taiga"]
// ...or tags prefixed with '#'
"biomes":
[
"#minecraft:is_overworld",
"minecraft:plains"
]
}
},
// Try next entry if previous didn't roll
{
"item": "minecraft:copper_ore",
"chance": 0.25,
"min": 1,
"max": 3
}
]
}
```
#### Environment filter details [#environment-filter-details]
* `dimensions`: array of resource locations. Only matches when the controller is in one of these dimensions.
* `biomes`: array of **biome ids** (`"minecraft:desert"`) and/or **biome tags** (prefix with `"#"`, e.g. `"#minecraft:is_nether"`).
If **any** tag matches, the filter passes.
> If neither `dimensions` nor `biomes` is provided, the drop is allowed everywhere.
## 4) How it behaves in-game [#4-how-it-behaves-in-game]
* **RPM gate:** The drill **does nothing** below `min_rpm` for the active tier.
* **Speed multiplier:** At `min_rpm` you get **1×** speed; it scales linearly up to **2×** at `max_rpm` (clamped).
* **Stress draw:** At `min_rpm` the drill draws `stress_at_minRPM × suScale` SU.
The mod reports **impact per RPM** to Create so the network sees the correct load.
* **JEI:** Displays the tier's core item, duration, stress (with config scale), and filters as friendly text.
## 5) Config (server config) [#5-config-server-config]
`create_mininglaser-common.toml`:
* `suScale` — global multiplier applied to all tiers' `stress_at_minRPM`.
Example: `1000.0` means a tier value of `32.0` renders/consumes **32,000 SU** at `min_rpm`.
## 6) Troubleshooting [#6-troubleshooting]
* **Recipe not showing / not rolling**
* File path must be `data//recipes/drill_core/*.json`.
* `"type"` must be exactly `"create_mininglaser:drill_core"`.
* `"tier"` must match the tier's **id** (from your tier JSON file name or `"id"` field).
* Check logs on `/reload` for JSON or registry errors.
* **Tier not activating**
* Make sure the **core item** in your tier JSON (`core_item`) exists and is the item you insert.
* Ensure `min_rpm` is reachable by your Create network.
* **Head model not rendering**
* `head_partial` must point to an existing block model JSON in `assets//models/block/...`
* If you inherit, verify `"parent": "create_mininglaser:block/laser_head_t1"`.
* Texture paths must exist under `assets//textures/block/`.
* **Texture looks scrambled**
* Use the **same UV layout** as the base. Keep your texture **64×64** to match the base head unless you replicated all UVs.
## 7) Complete minimal examples [#7-complete-minimal-examples]
### Tier: `t10` [#tier-t10]
`data/rose_quartz_drills/drill_tiers/t10.json`
```json
{
"id": "rose_quartz_drills:t10",
"order": 10,
"core_item": "rose_quartz_drills:rose_quartz_laser_t10",
"stress_at_minRPM": 32.0,
"min_rpm": 128,
"max_rpm": 256,
"head_partial": "rose_quartz_drills:block/laser_head_rose_quartz"
}
```
### Head model inheriting from base [#head-model-inheriting-from-base]
`assets/rose_quartz_drills/models/block/laser_head_rose_quartz.json`
```json
{
"parent": "create_mininglaser:block/laser_head_t1",
"textures": {
"1": "rose_quartz_drills:block/laser_head_rose_quartz",
"particle": "create_mininglaser:block/drill_casing"
}
}
```
`assets/rose_quartz_drills/textures/block/laser_head_rose_quartz.png`
(64×64 PNG matching the base UVs)
### Recipe for that tier [#recipe-for-that-tier]
`data/rose_quartz_drills/recipes/drill_core/rose_quartz_laser_ores.json`
```json
{
"type": "create_mininglaser:drill_core",
"tier": "rose_quartz_drills:t10",
"duration": 200,
"drops": [
{
"item": "minecraft:quartz_ore",
"chance": 0.35,
"min": 1,
"max": 3,
"env": { "dimensions": ["minecraft:the_nether"] }
},
{
"item": "minecraft:iron_ore",
"chance": 0.30,
"min": 1,
"max": 2,
"env": { "biomes": ["#minecraft:is_overworld"] }
}
]
}
```
## 8) Developer notes [#8-developer-notes]
* Tiers are looked up at runtime from the datapack registry (`TierDefs`).
If you really need to hard-register tiers in code, you can still call `TierDefs.register(new TierDef(...))` during common setup, but prefer datapacks so pack makers can extend your mod.
* The renderer reads `head_partial` directly; no extra Java registration is required.
## 9) License & contributions [#9-license--contributions]
Feel free to open issues/PRs with new example tiers and recipes. Include your datapack folder so others can test quickly.
If anything in this guide doesn't match your build (field names or paths), check your log on `/reload` - the mod will print where it expects tier and recipe files, and any JSON parse errors.
# Magic Realms (/mods/magic-realms)
Magic Realms is an [Iron's Spells and Spellbooks](https://www.curseforge.com/minecraft/mc-mods/irons-spells-n-spellbooks) addon for **Minecraft NeoForge 1.21.1** that aims to expand the amount of spellcasting mobs in the world, with a strong focus on hireable mercenary NPCs that earn titles, develop personalities, and fight alongside the player.
# Player guide [#player-guide]
## Mercenaries [#mercenaries]
Mercenaries are spellcasting humans that wander the world and can be hired to fight alongside you. Each Mercenary has one of five playstyles with it's own spell list:
* **Mage** - Ranged spellcaster, can wield a Staff and Spellbook. Has inate Spell Power in one to four Schools of Magic. Avaliable Schools and Spells are set via Datapack through Tags.
* **Warrior** - Melee fighter, can wield Swords. Gains bonus Armor from their Class and Star Level.
* **Tank** - Melee fighter who can wield a Shield in addition to Swords.
* **Archer** - Ranged fighter wielding a bow. Can use modded bows, and if any bow doesn't natively work you can add it to the "bows" tag from Magic Realms.
* **Assassin** - Melee skirmisher with high Crit Chance and a chance to Dodge attacks.
Mercenaries earn **Titles** through their deeds - see [Titles](#titles) below.
Mercenaries can become immortal by giving them a **Hell's Pass**, which is dropped from the Dead King and Tyros. Mercenaries with a Hell's Pass who run out of Health will get Stunned for a few seconds (configurable in `magic_realms-common.toml`).
Each mercenary spawns with:
* A **Gender** (male / female), which influences their Name and Appearance.
* A randomly generated **Name** drawn from a configurable list (`magic_realms-common.toml` `maleNames` / `femaleNames`).
* A **Personality** - an Archetype, a Hobby, a Hometown, and zero to three Quirks. (See [Custom archetypes](#custom-archetypes) below.)
* A unique **Appearance** - either a randomly generated combination of skin / clothes / eyes / hair textures, or a complete preset skin (with about a 10% chance to roll a preset).
Players in Creative Mode can use the **Skin Customizer** to customize the Appearance of randomly generated Mercenaries.
## Hiring Mercenaries - Taverns and Tavernkeepers [#hiring-mercenaries---taverns-and-tavernkeepers]
Mercenaries hang out in **Taverns**, structures that generate naturally in plains biomes. Each tavern is staffed by one **Tavernkeeper**, who sells useful items.
Interacting with a Mercenary will tell you who they are and how long contract lasts.
To hire a Mercenary, simply right-click them with a Contract item.
From the Tavernkeeper you can buy:
* **Contracts**, which are needed to hire Mercenaries. There are two kinds: a **Temporary Contract** (hires for a fixed stretch of time and can be used again to extend) and a **Permanent Contract** (binds a Mercenary to you for good, but only once they've served you long enough).
* **Maps to structures from Iron's Spells & Spellbooks**
* **Food and drink**
* **A Room for the night**, you can buy a Sleeping Pass to sleep in one of the Tavern's beds. Sleeping in the Tavern grants you Absorption and Resistance effects
Players can also interact with the Tavernkeeper giving him an emerald to get either useful information or some chit chat.
## Working with a contracted Mercenary [#working-with-a-contracted-mercenary]
Once a Mercenary is contracted to you, interacting with them will tell you how much longer they will remain contracted for and triggers some chit chatting related to their Personality.
When shift + right clicking them a menu will pop up, and inside it you can:
* **Change their equipment** - armor, weapons, off-hand items. Mercenaries can use spells from their equipment if they are on their Class' spell list.
* **View their combat stats** - full Attribute breakdown (HP, armor, spell power per school, resistances, vanilla stats) plus their Personality traits.
* **See their inventory** - what they've picked up off the ground, plus what they're carrying for you.
* **Give Orders** - there's a button to switch between Following you and Patrolling the area.
* **Choose their displayed Title** - a selector showing every Title they've earned. Pick one to display above their name, or none at all.
Mercenaries also react to other Mercenaries you've contracted nearby. Hired Mercenaries interact with eahch other acording to their their Personalities, which will apply a temporary buff to them based on their Archetypes (rivals, friends, etc.). **archetype interactions** can be configured via Datapack: see [Custom archetype interactions](#custom-archetype-interactions).
A Mercenary's Quirks also drive in-world behavior, for example: a Mercenary with the `cant_swim` Quirk will not be able to swim in water, a Mercenary with the `animal_friend` Quirk receives Stat Bonuses when around Animals, a Mercenary who is `afraid_of_the_dark` becomes weaker and slower in dark places, and so on.
## Titles [#titles]
Instead of levelling, Mercenaries earn **Titles** for the things they actually do. Killing two hundred skeletons, walking into an Ancient City, surviving ten thousand points of damage, or simply staying under contract long enough will each earn something.
Every Title carries its own rewards. Some are straightforward Attribute boosts; others are more characterful - extra damage against a particular type of monsters, a passive effect, a chance to inflict something on hit, immunity to a status effect, or a bonus that only applies while wielding a certain kind of weapon.
Titles are permanent once earned, and a Mercenary can hold as many as they qualify for. Their effects all apply at once, so a well-travelled veteran ends up meaningfully tougher than a fresh hire - but only in the ways they earned.
When a contracted Mercenary earns a Title you'll be told about it. One Title at a time is displayed above their name, and as their contractor you choose which one from the contract screen. By default the most prestigious one is shown.
Titles are entirely **datapack-driven**, so packs can add, retune, or replace the whole set - see [Custom titles](#custom-titles).
## Other Mobs [#other-mobs]
Magic Realms adds several magic Mobs to spice up the world:
* **Chuchu** - Slimes who absorb Magic. Whichever school it absorbs first determines its element going forward, and they can grow absorbing magic. They rarely drop the "Slime Rain" Spell.
* **Fizzles** - Sharply dressed Creepers in wizard hats. They don't explode like normal Creepers - instead they cast spells. Be careful: a well-dressed creeper is a dangerous one.
* **Endermages** - a conclave of enlightened Endermen living in the Outer End Islands. They have learned magic and use it to teleport across the End freely, no longer bound by the limits of their kin.
* **Tim** - a familiar undead lurks in the depths of the Overworld. There are some who call him… Tim.
There's also a small roster of **exclusive mercenaries** - handcrafted named characters with unique behavior, dialogue, titles, and sometimes special quirks (Eden, Aliana, Amadeus, Catas, Jara, Lilac, Alshanex, GojoMojo). These can appear in Taverns, like normal Mercenaries, identified by their unique skin and name. They are unique to a world: once Amadeus is hired in your save, no other mercenary will ever be Amadeus. They also can't be permanently contracted, they like freedom.
## Built-in compatibility [#built-in-compatibility]
Magic Realms has built-in compatibility for a growing list of other Mods.
### Spell Compatability [#spell-compatability]
Spells from these addons are integrated into Mercenary spell lists and can be cast by Fizzles:
* Tunes 'n Tomes: a Bard's Journey
* Ender's Spells and Stuff: Requiem
* Discerning the Eldritch
* Magic From The East
* SnackPirate's Aeromancy Additions
* Cataclysm: Spellbooks
As both Mercenary spell lists and Fizzle spell lists are handled via tag, additional spell compat can be added via Datapack.
### Tavern integration [#tavern-integration]
Taverns can include blocks and items from these other mods:
* Farmer's Delight
* Brewin' & Chewin'
* Hearth and Harvest
* My Nether's Delight
* Supplementaries
* Handcrafted
* Create
The kitchen, bar, and table jigsaw pools dynamically swap to mod-specific variants when those mods are detected.
The Tavernkeep will sell food and drink items from these mods, should they be installed.
# Developer guide [#developer-guide]
This section is for **modpack authors, datapack authors, and other modders** who want to extend Magic Realms' mercenaries with their own personalities, skins, or named characters.
Almost everything personality and appearance-related in Magic Realms is **datapack-driven**.
Also includes all the config options and what are they for.
## Config options [#config-options]
Magic Realms ships with a single common config file at `config/magic_realms-common.toml`, generated automatically on first run.
### Contracts [#contracts]
Controls the timing of the contract / hire system.
| Key | Default | Range | Purpose |
| ----------------------- | ------- | ----- | -------------------------------------------------------------------------------------------------- |
| `minutesPerContract` | `10` | 1 – ∞ | How long a single contract lasts before it expires and the mercenary returns to neutral. |
| `minutesUntilPermanent` | `200` | 1 – ∞ | Total contracted time (across renewals) needed before a mercenary can accept a permanent contract. |
### Spawning and population [#spawning-and-population]
| Key | Default | Range | Purpose |
| ------------------------ | ------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `customTextureChance` | `0.1` | 0.0 – 1.0 | Probability that a newly spawned mercenary uses a complete skin preset instead of compositing skin parts. `0.1` = 10%. Set to `0.0` to disable presets, `1.0` to make every mercenary use one (requires enough presets in the catalog or some will share). |
| `maxMercenariesInRadius` | `8` | 1 – ∞ | Limits how many mercenaries can occupy chairs / bar stools inside a 20-block radius. Prevents tavern overcrowding inside taverns. |
### Behavior tuning [#behavior-tuning]
| Key | Default | Range | Purpose |
| ------------------------------- | ------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `immortalStunDuration` | `10` | 1 – 60 | Seconds an immortal entity (e.g. a Mercenary with a Hell's Pass) stays stunned after being knocked out, before recovering. |
| `attemptCastUnclassifiedSpells` | `false` | bool | If `true`, Mercenaries will try to cast spells from addons that haven't been categorized into Magic Realms' class spell tags (`classes/mage/*`, `classes/warrior/*`, `classes/archer/*`, `classes/assassin/*`). **Set at your own risk** - uncategorized spells may not work as expected, may target nothing useful, or may break combat AI. |
### Name, hometown, and tip lists [#name-hometown-and-tip-lists]
These string lists are fully editable in the config - you can replace, add to, or trim them without writing a datapack. Translation keys in `tavernTips` need matching language entries in any active resource pack.
| Key | Type | Default size | Purpose |
| ------------- | --------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `maleNames` | list of strings | \~140 entries | Pool used to name male mercenaries when no name comes from a fixed personality or skin preset. |
| `femaleNames` | list of strings | \~120 entries | Same, for female mercenaries. |
| `hometowns` | list of strings | 35 entries | Pool used to roll a hometown string for the personality panel ("Westhollow", "Stormkeep", etc.). Picked once per mercenary at spawn. |
| `tavernTips` | list of strings | 5 entries | Translation keys the Tavernkeeper picks from when offering advice (`message.magic_realms.tavernkeep_tip.1` through `…tip.5` by default). Each entry must be a *key*, not the literal text - extend your language file in parallel to add new tips. |
## Datapack folder layout [#datapack-folder-layout]
All of the following live under `data/magic_realms/`:
```
data/magic_realms/
├── mercenaries/
│ ├── personality/
│ │ ├── archetypes/ # one .json per archetype
│ │ ├── fixed_personalities/ # one .json per named character
│ │ ├── hobbies/ # one .json per hobby
│ │ └── archetype_interactions/ # one .json per archetype pair relationship
│ ├── skin_parts/ # one .json per skin / clothes / eyes / hair piece
│ ├── skin_presets/ # one .json per complete preset texture
│ ├── titles/ # one .json per earnable title
│ └── bandit_profiles/ # one .json per bandit (hostile mercenary) preset
├── tags/
│ └── … (spell tags, item tags, biome tags, etc.)
└── … and, outside the mercenaries tree:
data//
└── neoforge/
└── biome_modifier/ # one .json per bandit spawn rule
```
Every catalog is loaded via a vanilla `SimpleJsonResourceReloadListener`, so `/reload` will pick up changes without restarting the server (with the caveat that already-spawned mercenaries keep whatever they originally rolled - only newly spawned mercenaries see the updated catalog).
## Custom archetypes [#custom-archetypes]
An **archetype** is a personality bucket like "stoic", "jovial", "ruthless", and so on. Every mercenary has exactly one archetype. The archetype:
* Drives a mercenary's chat tone (combined with their hobby).
* Pairs with other archetypes via archetype interactions to apply attribute buffs / debuffs.
* Biases the random class roll: archetypes can favor mages, warriors, or rogues.
### File location [#file-location]
```
data/magic_realms/mercenaries/personality/archetypes/.json
```
The file's path is the archetype's stable identifier. The catalog also indexes archetypes by **the value inside the JSON's `id` field**, which is what every other JSON file in the mod (`fixed_personalities`, `archetype_interactions`) refers to. Keep both in sync to avoid confusion.
### Schema [#schema]
| Field | Type | Default | Notes |
| ---------------- | ------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | string | - | **Required.** Short id used by every other file referring to this archetype (e.g. `"stoic"`). |
| `display_key` | string | - | **Required.** Translation key for the human-readable name (e.g. `"archetype.magic_realms.stoic"`). |
| `class_weights` | object: string→int | `{}` | Per-class weight bonus on top of `base_weight`. Keys must be lower-case class names: `"mage"`, `"warrior"`, `"rogue"`. |
| `base_weight` | int | `10` | Base weight before class bonus. |
| `in_random_pool` | bool | `true` | If `false`, this archetype is *only* selectable through fixed personalities and is never rolled by a normal mercenary spawn. Useful for archetypes that only make sense on named characters. |
The probability of an archetype being rolled is `max(0, base_weight + class_weights[entity_class])`.
### Example [#example]
A "stoic" archetype that's slightly more common on warriors and mages, slightly less common on rogues:
```json
{
"id": "stoic",
"display_key": "archetype.magic_realms.stoic",
"base_weight": 10,
"class_weights": {
"mage": 2,
"warrior": 4,
"rogue": -2
},
"in_random_pool": true
}
```
A "lone\_wolf" archetype that exists only as a reference for an exclusive named character - never rolled randomly:
```json
{
"id": "lone_wolf",
"display_key": "archetype.magic_realms.lone_wolf",
"base_weight": 0,
"in_random_pool": false
}
```
Don't forget to add the matching `archetype.magic_realms.stoic` (or whatever) entry to your language file.
## Custom fixed personalities [#custom-fixed-personalities]
A **fixed personality** is a pre-rolled set of personality traits - archetype, hobby, hometown, quirks, optional override name - that can be stamped onto a mercenary instead of doing a fresh random roll.
There are three ways a fixed personality reaches a mercenary:
1. **Exclusive mercenary override** - entities like Amadeus and Catas declare their personality directly in code via `getFixedPersonality()`. They reference a fixed personality id from the catalog with `FixedPersonality.fromCatalog("magic_realms:amadeus")`.
2. **Skin preset locking** - a skin preset's JSON can specify `fixed_personality_id`. Whenever that preset is rolled for a mercenary, the linked personality is also stamped on. Useful for characters whose identity is "this exact skin and this exact personality, always together".
3. **Random pool roll** - when a mercenary spawns, there's a flat 10% chance (`FIXED_POOL_ROLL_CHANCE`) that they roll from the fixed-personality random pool instead of doing a normal random personality roll.
### File location [#file-location-1]
```
data/magic_realms/mercenaries/personality/fixed_personalities/.json
```
### Schema [#schema-1]
| Field | Type | Default | Notes |
| ---------------------- | ------------ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `archetype` | string | - | **Required.** Short id of an archetype in the catalog (e.g. `"stoic"`). |
| `hobby` | string | `""` (none) | Short id of a hobby. May be omitted. |
| `hometown` | string | `""` (none) | Free-form text shown in the personality panel. May be omitted. |
| `quirks` | string array | `[]` | List of [quirk ids](#quirks-reference). |
| `override_entity_name` | string | absent | If present and non-empty, the mercenary is renamed to this when the personality is applied. |
| `in_random_pool` | bool | `true` | Whether this entry can be rolled by the random-pool roll. Set to `false` for preset-locked characters who should only appear on their matching skin. |
| `weight` | int (≥ 1) | `1` | Weight inside the random pool. |
| `unique` | bool | `true` | If `true`, once this id has been assigned to *any* mercenary in the world (even one that has since died), no other mercenary can ever roll it. Used for one-of-a-kind named characters. |
### Example: a generic random-pool entry [#example-a-generic-random-pool-entry]
A friendly bookworm tinker named "Old Marek" who can show up on any mercenary:
```json
{
"archetype": "jovial",
"hobby": "tinkering",
"hometown": "Eastfield",
"quirks": ["bookworm", "early_riser"],
"override_entity_name": "Old Marek",
"in_random_pool": true,
"weight": 1,
"unique": true
}
```
### Example: a preset-locked named character [#example-a-preset-locked-named-character]
A unique character "Vex" who only appears when their dedicated skin preset rolls - never as a random personality:
```json
{
"archetype": "ruthless",
"hobby": "swordplay",
"hometown": "the Hollow Reach",
"quirks": ["claustrophobic"],
"override_entity_name": "Vex",
"in_random_pool": false,
"unique": true
}
```
You'd then point a skin preset's `fixed_personality_id` at this entry. (See [Custom skin presets](#custom-skin-presets).)
## Custom hobbies [#custom-hobbies]
A **hobby** is a chat reaction package. When a player types a message near a contracted mercenary, the mercenary checks their hobby's keyword list and may respond from a hobby- and archetype-specific pool.
### File location [#file-location-2]
```
data/magic_realms/mercenaries/personality/hobbies/.json
```
### Schema [#schema-2]
| Field | Type | Default | Notes |
| ---------------- | --------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | string | - | **Required.** Short id used by `fixed_personalities` JSONs (e.g. `"bookworm"`). |
| `display_key` | string | - | **Required.** Translation key for the hobby's human-readable name. |
| `responses` | object: string→string array | - | **Required.** Map of archetype id → list of translation keys. The special key `"default"` is used when no matching archetype-specific pool exists. |
| `in_random_pool` | bool | `true` | Whether this hobby can be picked by the random hobby roll. |
When a mercenary speaks, the resolver looks up `responses[archetypeId]` first; if the archetype isn't in the map (or its list is empty), it falls back to `responses["default"]`. If neither exists, the mercenary stays silent.
This is the mechanism that lets a "Bookworm Stoic" sound different from a "Bookworm Jovial" while still sharing the same hobby.
### Example [#example-1]
A "tinkering" hobby with a default voice plus dedicated lines for stoic and jovial mercenaries:
```json
{
"id": "tinkering",
"display_key": "hobby.magic_realms.tinkering",
"in_random_pool": true,
"responses": {
"default": [
"speech.my_pack.tinkering.default.1",
"speech.my_pack.tinkering.default.2"
],
"stoic": [
"speech.my_pack.tinkering.stoic.1",
"speech.my_pack.tinkering.stoic.2"
],
"jovial": [
"speech.my_pack.tinkering.jovial.1",
"speech.my_pack.tinkering.jovial.2"
]
}
}
```
The translation keys (`speech.my_pack.tinkering.stoic.1`, etc.) need matching entries in your language file. Each entry is the actual line the mercenary will say, with `%s` available for the speaker's name (the formatter splices it in colored).
## Custom archetype interactions [#custom-archetype-interactions]
An **archetype interaction** defines what happens when **two contracted mercenaries with a specific pair of archetypes are near each other while both contracted by the same player**. The most common use is rivalry / friendship buffs and debuffs.
The pair is **unordered**: `archetype_a = "stoic"`, `archetype_b = "jovial"` matches *both* a stoic-near-jovial and a jovial-near-stoic.
### File location [#file-location-3]
```
data/magic_realms/mercenaries/personality/archetype_interactions/.json
```
The file's full ResourceLocation becomes the interaction's id.
### Schema [#schema-3]
| Field | Type | Default | Notes |
| --------------------- | ---------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `archetype_a` | string | - | **Required.** Short id of the first archetype. |
| `archetype_b` | string | - | **Required.** Short id of the second archetype. May be the same as `archetype_a` (a self-pair). |
| `attribute_modifiers` | array of entries | `[]` | List of attribute modifiers applied to *both* mercenaries while in range. See structure below. |
| `radius` | double | `12.0` | Search radius in blocks. Capped at `64.0`. |
| `kind` | string | `""` | Optional tag (e.g. `"rival"`, `"friend"`) read by chat banter code. Purely informational; the `attribute_modifiers` list is the source of truth for stat effects. |
Each entry in `attribute_modifiers` is:
```json
{
"attribute": "minecraft:generic.movement_speed",
"id": "magic_realms:stoic_jovial.movespeed",
"amount": -0.1,
"operation": "add_multiplied_total"
}
```
`operation` accepts the vanilla values: `add_value`, `add_multiplied_base`, `add_multiplied_total`. The `id` field on each entry is purely an authoring label - at runtime, the tick handler synthesizes a stable per-mercenary modifier ResourceLocation from the interaction id and the entry's index, so collisions with other modifiers are impossible.
### Example: stoic vs. jovial rivalry [#example-stoic-vs-jovial-rivalry]
The two are on the same team but don't get along - both lose 10% movement speed and 5% damage while standing near each other:
```json
{
"archetype_a": "stoic",
"archetype_b": "jovial",
"kind": "rival",
"radius": 8.0,
"attribute_modifiers": [
{
"attribute": "minecraft:generic.movement_speed",
"id": "magic_realms:stoic_jovial.movespeed",
"amount": -0.1,
"operation": "add_multiplied_total"
},
{
"attribute": "minecraft:generic.attack_damage",
"id": "magic_realms:stoic_jovial.damage",
"amount": -0.05,
"operation": "add_multiplied_total"
}
]
}
```
### Example: stoic-stoic synergy [#example-stoic-stoic-synergy]
Two stoics near each other inspire calm - both gain 10% knockback resistance:
```json
{
"archetype_a": "stoic",
"archetype_b": "stoic",
"kind": "friend",
"radius": 12.0,
"attribute_modifiers": [
{
"attribute": "minecraft:generic.knockback_resistance",
"id": "magic_realms:stoic_self.kbr",
"amount": 0.1,
"operation": "add_value"
}
]
}
```
Modifiers are applied as **transient** modifiers: when the mercenaries move out of range, when one of them is unloaded, when their contract ends, or when the datapack is reloaded, the modifiers come off.
## Quirks reference [#quirks-reference]
Quirks are *not* datapack-driven - they're a hardcoded enum because each one has a corresponding piece of behavior code (a goal, a mood reaction, a dialogue hook). You can't add new quirks, but you can reference any of these in your `fixed_personalities`:
| Quirk id | Effect summary |
| -------------------- | --------------------------------------------------------------------- |
| `afraid_of_the_dark` | Becomes weaker at dark places. |
| `hates_rain` | Becomes weaker when rainy. |
| `cant_swim` | Can't swim in water. |
| `claustrophobic` | Becomes weaker at narrow spaces. |
| `night_owl` | Active and happy at night. Mutually exclusive with `early_riser`. |
| `early_riser` | Active and happy in the morning. Mutually exclusive with `night_owl`. |
| `heat_intolerant` | Weaker in hot biomes. Mutually exclusive with `cold_intolerant`. |
| `cold_intolerant` | Weaker in cold biomes. Mutually exclusive with `heat_intolerant`. |
| `height_scared` | Weaker at high altitude. |
| `animal_friend` | Stronger when surrounded by animals. |
| `bookworm` | Stronger when carrying books in the inventory. |
| `glutton` | Stronger when carrying food in the inventory. |
A random mercenary rolls 0 to 3 quirks at spawn (15% / 40% / 35% / 10% odds), filtered to remove conflicting pairs. A fixed personality can declare any subset (the conflict filter is *not* applied to fixed personalities - author beware).
## Custom skin parts [#custom-skin-parts]
Mercenaries that don't roll a preset are built up from four texture layers stacked on top of one another:
* **`skin`** - base skin tone (face, hands, neutral body).
* **`clothes`** - outfit, armor visuals, robes, etc.
* **`eyes`** - overlaid eye texture.
* **`hair`** - overlaid hair texture.
Each layer is a **skin part** loaded from a JSON file. At spawn, Magic Realms picks one part of each category, weighted, filtered by the mercenary's gender and entity class.
### File location [#file-location-4]
```
data/magic_realms/mercenaries/skin_parts/.json
```
The texture itself goes in `assets/magic_realms/textures/...` (or wherever you point `texture` to).
### Schema [#schema-4]
| Field | Type | Default | Notes |
| -------------- | --------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `texture` | string | - | **Required.** ResourceLocation of the texture (e.g. `"my_pack:textures/entity/human/skin/dark.png"`). |
| `category` | string | - | **Required.** One of `"skin"`, `"clothes"`, `"eyes"`, `"hair"`. |
| `gender` | string | `"any"` | One of `"any"`, `"male"`, `"female"`. |
| `entity_class` | string | `"any"` | One of `"any"`, `"common"`, `"mage"`, `"rogue"`, `"warrior"`. `"common"` is also a wildcard (eligible for every class) but is conventionally used to mark "neutral" pieces like plain shirts. |
| `weight` | int (≥ 1) | `1` | Weight inside its category pool. Higher = more common. |
### Example: a female-only mage robe [#example-a-female-only-mage-robe]
```json
{
"texture": "my_pack:textures/entity/human/clothes/violet_robes.png",
"category": "clothes",
"gender": "female",
"entity_class": "mage",
"weight": 2
}
```
### Example: a generic skin tone usable everywhere [#example-a-generic-skin-tone-usable-everywhere]
```json
{
"texture": "my_pack:textures/entity/human/skin/freckled.png",
"category": "skin",
"weight": 1
}
```
(Both `gender` and `entity_class` default to `"any"`, so they don't need to be listed.)
When the catalog has no matching parts for a given (category, gender, class) combination, the mercenary spawns with that layer missing - Magic Realms logs a warning and continues. So if you're filtering aggressively, make sure each `(category, gender, class)` triple still has *something* eligible (or rely on `"any"` fallbacks).
## Custom skin presets [#custom-skin-presets]
A **skin preset** is a single complete texture used as-is, instead of compositing the four-layer skin parts. They're meant for handcrafted / iconic looks where you want every pixel to be exactly right.
When a mercenary spawns, there's a chance (configurable via `customTextureChance`, default \~15%) that a preset is rolled instead of building from parts. If the preset specifies `fixed_personality_id`, the linked fixed personality is also stamped on the mercenary, so identity (look + behavior) stays welded together.
### File location [#file-location-5]
```
data/magic_realms/mercenaries/skin_presets/.json
```
### Schema [#schema-5]
| Field | Type | Default | Notes |
| ---------------------- | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------- |
| `texture` | string | - | **Required.** ResourceLocation of the full preset texture. |
| `display_name` | string | absent | Optional. If set, the mercenary is named this. |
| `gender` | string | `"any"` | One of `"any"`, `"male"`, `"female"`. Used to filter the pool by the mercenary's gender. |
| `weight` | int (≥ 1) | `1` | Weight inside the preset pool. |
| `fixed_personality_id` | string | absent | Optional. Full ResourceLocation of a fixed personality to lock to this preset (e.g. `"my_pack:vex"`). |
| `added_to_pool` | boolean | `true` | Optional. When `false`, the preset is loaded but excluded from the random roll pool. Useful for future bandit profiles. |
If both `display_name` and the linked fixed personality's `override_entity_name` are present, the **preset's `display_name` wins**. If only the personality has an override name, that override is used as the mercenary's display name.
### Example: a generic preset [#example-a-generic-preset]
A finely-detailed female ranger that can roll on any random mercenary:
```json
{
"texture": "my_pack:textures/entity/human/preset/ranger_alia.png",
"display_name": "Alia",
"gender": "female",
"weight": 3
}
```
### Example: an identity-locked preset [#example-an-identity-locked-preset]
A preset for the named character "Vex" defined earlier - appearing only when this preset rolls, and bringing their full personality with them:
```json
{
"texture": "my_pack:textures/entity/human/preset/vex.png",
"gender": "female",
"weight": 1,
"fixed_personality_id": "my_pack:vex"
}
```
Notice we don't need `display_name` here - the override name comes from the linked fixed personality.
## Custom titles [#custom-titles]
A **title** is an award a mercenary earns for something they did - a kill count, a place they visited, a stretch of service, a beating they survived.
Titles apply to **all mercenaries**, contracted or hostile. Bandits can be given titles outright through a [bandit profile](#custom-bandit-profiles), and can also earn them through play like anyone else.
### File location [#file-location-6]
```
data/magic_realms/mercenaries/titles/.json
```
The file's path is the title's stable identifier (e.g. `data/magic_realms/mercenaries/titles/dragonslayer.json` becomes `magic_realms:dragonslayer`).
### Schema [#schema-6]
| Field | Type | Default | Notes |
| ------------------ | ----------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `display_key` | string | *required* | Translation key for the title's name. Needs a matching entry in your language file. |
| `description_key` | string | `""` | Translation key for the tooltip line shown under the name in the title selector. |
| `color` | string | gold | `"#RRGGBB"` or a vanilla colour name (`"gold"`, `"dark_aqua"`…). Colours the nameplate text. |
| `priority` | int | `0` | Higher wins the automatic nameplate pick when a mercenary holds several. Also the sort order in the selector. |
| `requirements` | list | `[]` | Conditions to earn it. **An empty list means the title can never be earned naturally** - see [Unobtainable titles](#unobtainable-titles). |
| `requirement_mode` | `"all"` / `"any"` | `"all"` | Whether every requirement must be met, or just one. |
| `rewards` | object | `{}` | What holding the title grants. See below. |
| `announce` | bool | `true` | Whether the contractor gets a chat message when it's earned. |
| `hidden` | bool | `false` | If `true`, the title still applies its rewards but never appears in the selector and is never auto-displayed. Useful for gating chains and for secrets. |
### Requirement types [#requirement-types]
Each entry in `requirements` is `{ "type": …, "target": …, "amount": … }`. `target` and `amount` are optional and mean different things per type.
| `type` | `target` | `amount` |
| --------------------- | ---------------------------------- | -------------------------------------------- |
| `total_kills` | - | kills of any hostile mob |
| `boss_kills` | - | kills of mobs in the Magic Realms bosses tag |
| `kill_entity` | entity type id | kills of that type |
| `kill_entity_tag` | entity type tag id | kills summed across the tag |
| `visit_structure` | structure id | separate visits |
| `visit_structure_tag` | structure tag id | visits summed across the tag |
| `contract_minutes` | - | cumulative minutes under contract |
| `damage_dealt` | - | cumulative damage points dealt |
| `damage_taken` | - | cumulative damage points taken |
| `star_level` | - | minimum star level |
| `entity_class` | `"mage"` / `"warrior"` / `"rogue"` | - |
| `has_title` | another title's id | - |
A leading `#` on a tag id is accepted and ignored, so `"minecraft:undead"` and `"#minecraft:undead"` both work.
Structure visits count the **entry**, not the time spent - standing in a fortress doesn't inflate the counter, but leaving and returning does.
### Reward types [#reward-types]
Everything in `rewards` is optional. A purely cosmetic title just leaves it out.
| Field | Type | Notes |
| ---------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `attribute_modifiers` | list | Standard `AttributeModifier` entries. Same format as [bandit attribute boosts](#attribute-boost-format). |
| `passive_effects` | list | `{ "effect", "amplifier", "show_particles" }` - kept permanently refreshed on the mercenary. |
| `immune_effects` | list of effect ids | The mercenary cannot receive these effects from any source, and any already active are cleared. |
| `on_hit_effects` | list | `{ "effect", "duration", "amplifier", "chance" }` - rolled onto the victim on each hit. |
| `bonus_damage` | double | Flat damage added to every attack. |
| `damage_bonus_vs` | list | `{ "entity_tag", "multiplier" }` - Bane-of-Arthropods style scaling against a family of mobs. |
| `weapon_bonus` | list | `{ "item", "item_tag", "multiplier", "bonus" }` - scaling that applies while holding a matching mainhand item. Covers ranged attacks, since an arrow's damage belongs to the shooter. |
| `incoming_damage_multiplier` | double | `0.9` = 10% less damage taken. Applied before armor. |
| `natural_regen` | bool | Grants out-of-combat health regeneration. |
For `weapon_bonus`, set `item`, `item_tag`, or both - matching either is enough. Keep them in one entry rather than two, or a weapon matching both gets the multiplier applied twice.
### How rewards stack [#how-rewards-stack]
A mercenary holding several titles gets all of their rewards at once, and multipliers **multiply**:
* `incoming_damage_multiplier` compounds downward, so five titles at `0.9` give `0.59` (41% reduction), not 50%. This is self-limiting - each title takes a share of what's left - so stacking approaches immunity without reaching it.
* `damage_bonus_vs` and `weapon_bonus` multipliers compound **upward**, and this is where over-tuning bites. A title at `1.5×` against undead, plus another at `3×`, plus a `1.3×` axe bonus, is `5.85×` against a zombie holding an axe.
Flat values (`bonus_damage`, `add_value` attribute modifiers) simply sum. As a rule of thumb, keep early titles flat and save multiplicative rewards for capstones.
### Example: a kill milestone [#example-a-kill-milestone]
The simplest useful shape - one requirement, one flat reward.
```json
{
"display_key": "title.magic_realms.veteran",
"description_key": "title.magic_realms.veteran.desc",
"color": "gold",
"priority": 40,
"requirements": [
{ "type": "total_kills", "amount": 1000 }
],
"rewards": {
"attribute_modifiers": [
{
"attribute": "minecraft:generic.armor",
"id": "magic_realms:veteran_armor",
"amount": 3.0,
"operation": "add_value"
}
],
"incoming_damage_multiplier": 0.95
}
}
```
### Example: a class-locked weapon specialist [#example-a-class-locked-weapon-specialist]
Two requirements in `"all"` mode, rewarding a fighting style rather than raw stats.
```json
{
"display_key": "title.magic_realms.axemaster",
"description_key": "title.magic_realms.axemaster.desc",
"color": "#C97B4A",
"priority": 65,
"requirement_mode": "all",
"requirements": [
{ "type": "entity_class", "target": "warrior" },
{ "type": "total_kills", "amount": 400 }
],
"rewards": {
"weapon_bonus": [
{ "item_tag": "c:tools/axe", "multiplier": 1.3, "bonus": 1.0 },
{ "item": "minecraft:netherite_axe", "bonus": 2.0 }
]
}
}
```
The netherite axe matches both entries, so it picks up the tag bonus *and* its own - that's the intended way to give one item extra weight on top of a family.
### Example: exploration, with two routes to the same reward [#example-exploration-with-two-routes-to-the-same-reward]
`"any"` mode, plus a status immunity and a passive effect.
```json
{
"display_key": "title.magic_realms.unclouded",
"description_key": "title.magic_realms.unclouded.desc",
"color": "#A8D8E8",
"priority": 60,
"requirement_mode": "any",
"requirements": [
{ "type": "visit_structure", "target": "minecraft:ancient_city" },
{ "type": "damage_taken", "amount": 4000 }
],
"rewards": {
"immune_effects": [
"minecraft:blindness",
"minecraft:darkness",
"minecraft:nausea"
],
"passive_effects": [
{ "effect": "minecraft:night_vision", "show_particles": false }
]
}
}
```
### Example: a title chain [#example-a-title-chain]
`has_title` lets a capstone require others first. Because evaluation cascades within a single pass, a chain resolves the moment its last prerequisite is met.
```json
{
"display_key": "title.magic_realms.living_legend",
"description_key": "title.magic_realms.living_legend.desc",
"color": "#FFE066",
"priority": 200,
"requirement_mode": "all",
"requirements": [
{ "type": "has_title", "target": "magic_realms:veteran" },
{ "type": "has_title", "target": "magic_realms:sworn_sword" },
{ "type": "boss_kills", "amount": 10 }
],
"rewards": {
"attribute_modifiers": [
{
"attribute": "minecraft:generic.attack_damage",
"id": "magic_realms:legend_damage",
"amount": 0.15,
"operation": "add_multiplied_total"
}
],
"natural_regen": true
}
}
```
### Unobtainable titles [#unobtainable-titles]
A title with **no requirements** is never earned naturally. It can only be granted deliberately - by command, by a bandit profile, or by code. This is the shape to use for story rewards, signature titles belonging to a named character, or anything you want to hand out on your own terms.
```json
{
"display_key": "title.magic_realms.mace_lord",
"description_key": "title.magic_realms.mace_lord.desc",
"color": "#B08D57",
"priority": 150,
"announce": false,
"requirements": [],
"rewards": {
"weapon_bonus": [
{ "item": "minecraft:mace", "item_tag": "c:tools/mace", "multiplier": 1.5 }
]
}
}
```
Set `"hidden": true` as well if the title should apply its rewards without ever appearing on the nameplate or in the selector.
### Managing titles in game [#managing-titles-in-game]
```
/human title list
/human title progress
/human title grant
/human title revoke
/human title display
/human title clear
```
`progress` is the useful one while authoring: it lists every unearned title with a completion percentage and a per-requirement breakdown, so you can see exactly how far off a mercenary is. `grant` bypasses requirements entirely, which is how you test a title without grinding for it.
## Custom bandit profiles [#custom-bandit-profiles]
A **bandit profile** is a preset stamped onto a hostile mercenary (bandit) at spawn time, customizing its class, titles, gear, scale, and so on. Profiles let you build varied bandit encounters - a giant brute leading a raid, a fire-mage miniboss in a tower, a hooded archer ambush - and everything data driven.
Bandit profiles are applied to **hostile mercenaries only** (`HostileRandomHumanEntity`), the bandit / evil-mercenary variant. Regular contracted mercenaries are unaffected. Each field of a profile is **optional**: anything you leave out falls back to the random-roll behavior an unprofiled bandit would have, so a profile only constrains what it explicitly sets.
### File location [#file-location-7]
```
data/magic_realms/mercenaries/bandit_profiles/.json
```
The file's path is the profile's stable identifier (e.g. `data/magic_realms/mercenaries/bandit_profiles/giant_warrior.json` becomes `magic_realms:giant_warrior`).
### Schema [#schema-7]
| Field | Type | Default | Notes |
| ----------------------- | ---------------------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `weight` | int | `1` | Weighted-random selection weight, used when calling `pickRandomFiltered`. |
| `entity_class` | `"mage"` / `"warrior"` / `"rogue"` | random | Pins the class. Without this, the class is rolled normally. |
| `gender` | `"male"` / `"female"` | random | Pins the gender. |
| `has_shield` | bool | random | If you pined warrior, this sets if it should have shield. |
| `is_archer` | bool | random | If you pined rogue, this sets if it should be an archer or an assassin. |
| `star_level` | int 1–3 | random | Stat tier, affects the starting attributes. |
| `titles` | list of resource locations | `[]` | Titles granted outright at spawn, bypassing their normal requirements. All of their rewards apply exactly as if earned. Unknown ids are skipped with a warning. |
| `displayed_title` | resource location | - | Which of the granted `titles` shows above the bandit's name. Must be one of them. If omitted, the highest-priority non-hidden granted title is used. |
| `entity_scale` | float | `1.0` | Resizes the bandit, useful for tiny or giant bandits. `1.5` = 50% bigger. |
| `override_name` | string | - | Replaces the rolled name (e.g. `"Hulking Brute"`). |
| `skin_preset` | resource location | - | Id of an entry in your `skin_presets/` catalog (the resource location of its JSON file, e.g. `"magic_realms:vex"` for `data/magic_realms/mercenaries/skin_presets/vex.json`). The full preset is applied - texture, optional display name, and optional `fixed_personality_id` binding all carry over. Unknown ids log a warning and fall back to layered random skin. |
| `magic_schools` | list of resource locations | `[]` | Mage-only. Explicit list of schools. |
| `magic_schools_tag` | resource location | - | Mage-only. Pulls schools from a tag (used if `magic_schools` is empty). |
| `explicit_spells` | list of resource locations | `[]` | Exact spells the bandit casts. Highest priority. |
| `spells_tag` | resource location | - | Pull spells from a tag (used if `explicit_spells` is empty). |
| `spells_tag_pick_count` | int | full tag size | When `spells_tag` is set, randomly pick this many spells from the tag instead of taking all. |
| `equipment` | object: slot→item id | `{}` | Slot keys: `"mainhand"`, `"offhand"`, `"head"`, `"chest"`, `"legs"`, `"feet"`. |
| `attribute_boosts` | list | `[]` | Flat attribute modifiers applied at the end of init, on top of class and level scaling. See below. |
| `loot_table` | resource location | - | Overrides the bandit's loot table on death (e.g. `"magic_realms:entities/chuchu"`). |
| `is_mini_boss` | bool | `false` | Marker flag readable as `profile.isMiniBoss()` for possible features (boss bar, drops, etc.). |
| `immortal` | bool | `false` | Sets the immortal flag - bandit will be stunned instead of dying. |
| `fixed_personality_id` | string | - | References an entry from your `fixed_personalities` catalog. Replaces the random archetype roll. |
| `in_random_pool` | bool | `true` | If `false`, the profile can only be invoked by id (commands, structures, code) and never selected by random pickers. |
Difficulty is expressed through `star_level`, `attribute_boosts`, `equipment` and `titles` rather than a level range. Granting titles is usually the better lever of the two: the buff shows up on the bandit's nameplate, so a player who sees *Unbroken* floating over a raid leader understands why it isn't dying, instead of running into an invisible stat multiplier.
The spell rules in priority order: `explicit_spells` first, then `spells_tag` (with optional `spells_tag_pick_count`), then fall through to the regular class-driven generator.
### Attribute boost format [#attribute-boost-format]
Each boost uses Mojang's standard `AttributeModifier` codec. The `id` must be unique per boost - convention is to namespace it under your pack and the profile id:
```json
{
"attribute": "minecraft:generic.max_health",
"id": "magic_realms:bandit/giant_warrior/health",
"amount": 0.5,
"operation": "add_multiplied_base"
}
```
Operations: `add_value` (flat), `add_multiplied_base` (% of base), `add_multiplied_total` (% of post-modifier total). Boosts apply *after* class/level attribute scaling, so `add_multiplied_base` of `0.5` on `generic.max_health` cleanly adds 50% on top of whatever the entity would normally have at its level.
### Example: a giant warrior raid leader [#example-a-giant-warrior-raid-leader]
A warrior bandit scaled up 1.5×, with full iron armor, 50% more HP, 50% knockback resistance, +3 attack damage, and two granted titles doing further work:
```json
{
"weight": 5,
"entity_class": "warrior",
"has_shield": false,
"titles": [
"magic_realms:veteran",
"magic_realms:unbroken"
],
"displayed_title": "magic_realms:unbroken",
"entity_scale": 1.5,
"override_name": "Hulking Brute",
"equipment": {
"mainhand": "minecraft:netherite_axe",
"head": "minecraft:iron_helmet",
"chest": "minecraft:iron_chestplate",
"legs": "minecraft:iron_leggings",
"feet": "minecraft:iron_boots"
},
"attribute_boosts": [
{
"attribute": "minecraft:generic.max_health",
"id": "magic_realms:bandit/giant_warrior/health",
"amount": 0.5,
"operation": "add_multiplied_base"
},
{
"attribute": "minecraft:generic.knockback_resistance",
"id": "magic_realms:bandit/giant_warrior/kb_resist",
"amount": 0.5,
"operation": "add_value"
},
{
"attribute": "minecraft:generic.attack_damage",
"id": "magic_realms:bandit/giant_warrior/damage",
"amount": 3.0,
"operation": "add_value"
}
],
"loot_table": "magic_realms:entities/giant_warrior",
"is_mini_boss": true
}
```
### Example: a fire-mage miniboss [#example-a-fire-mage-miniboss]
A three-star mage bandit casting a hand-picked fire and lightning kit, in netherite mage armor with a blaze manual spellbook in the offhand, plus double base health:
```json
{
"weight": 2,
"entity_class": "mage",
"star_level": 3,
"titles": [
"magic_realms:archmage"
],
"override_name": "Pyromancer Initiate",
"magic_schools": [
"irons_spellbooks:fire",
"irons_spellbooks:lightning"
],
"explicit_spells": [
"irons_spellbooks:fireball",
"irons_spellbooks:firebolt",
"irons_spellbooks:lightning_bolt",
"irons_spellbooks:teleport",
"irons_spellbooks:ball_lightning"
],
"equipment": {
"head": "irons_spellbooks:netherite_mage_helmet",
"chest": "irons_spellbooks:netherite_mage_chestplate",
"legs": "irons_spellbooks:netherite_mage_leggings",
"feet": "irons_spellbooks:netherite_mage_boots",
"offhand": "irons_spellbooks:blaze_spell_book"
},
"attribute_boosts": [
{
"attribute": "minecraft:generic.max_health",
"id": "magic_realms:bandit/mage_miniboss/health",
"amount": 1.0,
"operation": "add_multiplied_base"
}
],
"is_mini_boss": true
}
```
### Spawning bandits with a profile [#spawning-bandits-with-a-profile]
**Command** - right now it's only available via commands for testing around:
```
/bandit summon "magic_realms:giant_warrior"
/bandit summon "magic_realms:mage_miniboss" 100 64 -200
/bandit list
```
## Custom bandit spawns [#custom-bandit-spawns]
Bandit profiles describe *what* a bandit is. This describes *where they come from*: `magic_realms:add_bandit_spawns` is a custom NeoForge **biome modifier** that adds natural bandit spawns to a set of biomes, and optionally pins those spawns to a weighted pool of profiles.
The entity type is implicit - this modifier only ever spawns bandits, so there's no `entity` field to get wrong.
### File location [#file-location-8]
Biome modifiers are a NeoForge datapack registry, so they don't live under `mercenaries/` with the rest:
```
data//neoforge/biome_modifier/.json
```
### Schema [#schema-8]
| Field | Type | Default | Notes |
| ---------- | ---------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `type` | string | *required* | Always `"magic_realms:add_bandit_spawns"`. |
| `biomes` | biome id, list, or tag | *required* | Which biomes gain the spawn entry. A tag reference needs the leading `#`. |
| `weight` | int ≥ 0 | *required* | Spawn weight, relative to every other entry in the monster category for that biome. Vanilla overworld zombies sit around `95`, skeletons `100`, so a value in the tens makes bandits uncommon but not rare. `0` disables the entry. |
| `minCount` | int ≥ 1 | `1` | Minimum group size per spawn attempt. |
| `maxCount` | int ≥ 1 | `1` | Maximum group size. Must be ≥ `minCount` - the codec rejects the file otherwise, with an error naming both values. |
| `profiles` | list | `[]` | Weighted pool of bandit profiles to pin spawns to. Omit it and bandits spawned here roll from the normal random pool instead. |
Each entry in `profiles` is:
| Field | Type | Default | Notes |
| -------- | ----------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------ |
| `id` | resource location | *required* | A profile id from your `bandit_profiles/` catalog. Unknown ids log a warning and the bandit falls back to a random roll. |
| `weight` | int ≥ 1 | `1` | Relative weight within this modifier's pool only. |
### How a profile gets chosen [#how-a-profile-gets-chosen]
Worth understanding, because it explains why `weight` does double duty.
Vanilla's spawner doesn't record *which* biome modifier produced a given spawn - it merges every entry into one weighted list and rolls once. So when a bandit spawns, Magic Realms reconstructs the choice in two steps:
1. **Which modifier?** Every `add_bandit_spawns` modifier that has a non-empty profile pool *and* covers the bandit's biome becomes a candidate, weighted by its own `weight`. This means two modifiers overlapping the same biome divide spawns in proportion to their spawn weights, which is what you'd intuitively expect.
2. **Which profile?** A second weighted roll inside that modifier's `profiles` list.
### Example: plain spawns, no profiles [#example-plain-spawns-no-profiles]
Bandits appear in the biomes in your tag, in groups of one to three, using the normal random profile pool.
```json
{
"type": "magic_realms:add_bandit_spawns",
"biomes": "#magic_realms:bandit_spawns_in",
"weight": 15,
"minCount": 1,
"maxCount": 3
}
```
### Example: a weighted profile pool [#example-a-weighted-profile-pool]
Highwaymen are common, the captain is a rare escort. With these weights the captain is one spawn in six.
```json
{
"type": "magic_realms:add_bandit_spawns",
"biomes": "#magic_realms:bandit_spawns_in",
"weight": 20,
"minCount": 2,
"maxCount": 4,
"profiles": [
{ "id": "magic_realms:highwayman", "weight": 5 },
{ "id": "magic_realms:bandit_captain", "weight": 1 }
]
}
```
### Example: biome-specific flavour [#example-biome-specific-flavour]
Targeting a small set of biomes directly rather than through a tag, to give the desert its own bandit type:
```json
{
"type": "magic_realms:add_bandit_spawns",
"biomes": [
"minecraft:desert",
"minecraft:badlands"
],
"weight": 10,
"minCount": 1,
"maxCount": 2,
"profiles": [
{ "id": "magic_realms:sand_raider", "weight": 1 }
]
}
```
### Targeting biomes that might not exist [#targeting-biomes-that-might-not-exist]
Referencing an unregistered biome id directly **crashes on world load**. If you want to target a biome from a mod that may not be installed, put it in a biome tag as an optional entry and point `biomes` at the tag:
```json
{
"replace": false,
"values": [
"minecraft:plains",
{ "id": "biomesoplenty:lavender_field", "required": false }
]
}
```
### Turning spawns off [#turning-spawns-off]
Because biome modifiers are a datapack registry, a pack can override any of Magic Realms' spawn modifiers by placing a file at the **same path and name** with NeoForge's no-op type:
```json
{
"type": "neoforge:none"
}
```
Setting `"weight": 0` on your own modifier achieves the same thing for files you control.
# Mobs of Mythology (/mods/mobs-of-mythology)
## Automatons [#automatons]
* **Crafting**: Automatons are crafted similarly to Iron Golems, but with Bronze Blocks instead of Iron Blocks.
* **Bronze Blocks**: Crafted using Bronze Ingots.
* **Generated Structures**: Ready-to-spawn Automatons can be found in specific generated structures.
* **Taming**: Automatons can be tamed by right-clicking them with Gears immediately after they spawn.
* **Gears**: Crafted from Bronze Ingots.
## Kobolds [#kobolds]
* **Description**: Kobolds are mischievous creatures that steal items from players.
* **Kobold Warriors**: These are more aggressive Kobolds willing to sacrifice themselves to eliminate players.
* **Habitats**: Kobolds are typically found in wet biomes, such as jungles and swamps.
## Drakes [#drakes]
* **Description**: Drakes are gentle monsters.
* **Taming**: They can be tamed using Cooked Chupacabra Meat.
* **Habitats**: Drakes are found in Badlands biomes.
## Basilisks (*1.21.1 New Mob!*) [#basilisks-1211-new-mob]
* **Description**: Basilisks are powerful, rideable creatures that attack nearby hostile monsters. They will avoid attacking Creepers.
* **Taming**: Basilisks are tamed similarly to horses. Repeatedly mount the Basilisk until it accepts you as its owner.
* **Riding**: Once tamed, equip the Basilisk with a Saddle to control it while riding.
* **Feeding**: Basilisks can be fed any type of meat. Feeding an injured Basilisk restores 4 health.
* **Habitats**: Basilisks are found in Badlands biomes alongside Drakes.
## Chupacabra [#chupacabra]
* **Description**: The Chupacabra is a hostile creature that targets livestock.
* **Drops**: Its meat is not ideal for consumption but may be liked by certain mobs.
* **Habitats**: The Chupacabra spawns in temperate biomes.
## Sporelings [#sporelings]
* **Description**: Sporelings are cute creatures that always have something to say.
* **Interaction**: Right-click Sporelings to read their messages.
* **Habitats**: They spawn in mushroom biomes.
# Oathbound Relics (/mods/oathbound_relics)
## At a Glance [#at-a-glance]
**Oathbound Relics** is a dark fantasy progression mod built around **burden, sacrifice, forbidden power, exploration, and attunement**.
The mod is built around one central rule:
> **Power is never free.**
Most relics are **not crafted**. They are found in themed loot sources. A smaller set of progression items are forged through specific recipes. The strongest weapons and relic tiers are tied to **Branded Progress**, **rare loot**, **boss trophies**, **forging**, and **late-game attunement**.
This page reflects the current **1.8.0** progression for **NeoForge and Fabric 1.21.1**, including repeatable acquisition routes for Dormant Titan's Remnants and the fourth Sin Weapon, **Wrath: Ruinwake**.
## Quick Navigation [#quick-navigation]
* [Core Progression](#core-progression)
* [The Oathbound Relic](#the-oathbound-relic)
* [Branded Progress](#branded-progress)
* [Oathbound Codex](#oathbound-codex)
* [Loot Philosophy](#loot-philosophy)
* [Main Loot Sources](#main-loot-sources)
* [Boss and Creature Loot](#boss-and-creature-loot)
* [Rare Progression Materials](#rare-progression-materials)
* [Aredrite Armor](#aredrite-armor)
* [Brandkeeper's Mercy](#brandkeepers-mercy)
* [Advanced Bearer Relics](#advanced-bearer-relics)
* [Titan's Remnants](#titans-remnants)
* [Rings](#rings)
* [Sin Weapons](#sin-weapons)
* [Rite of Severance](#rite-of-severance)
## Core Progression [#core-progression]
```text
START
|
v
Obtain / receive the Oathbound Relic
|
v
Become Branded
|
v
Explore themed structures for relics and rare progression items
|
+--> Find combat and survival relics
+--> Find Oblivion Stones
+--> Find Tablets and other late components
|
v
Hunt major creatures for Dormant Titan's Remnants
|
+--> Wither, Ender Dragon, Elder Guardian, Warden
+--> Phantoms and Shulkers
|
v
Craft ring line and other progression tools
Gold Ring -> Cyan Ring -> Nebula Ring
|
v
Farm End progression materials
Aredrite + Void Ashes
|
v
Craft idols, armor, and late-game components
|
v
Raise Branded Progress through active play
|
+--> Find Sin Tablet -> Craft Idol -> Forge Sin Weapon
|
v
Unlock Sin Weapons, advanced relic thresholds, and Remnant Apex power
```
## The Oathbound Relic [#the-oathbound-relic]
The **Oathbound Relic** is the center of the mod.
#### What it does [#what-it-does]
* Brands the player
* Unlocks Oathbound progression
* Applies the core curse package
* Grants blessings for enduring the burden
* Gates stronger relics, higher Remnant stages, and Sin Weapons
#### Important notes [#important-notes]
* The Oathbound Relic is **not normal structure loot**
* It may be granted on first join if that config is enabled
* It is intended to feel like a covenant item, not random treasure
## Branded Progress [#branded-progress]
Some of the mod's strongest rewards depend on **Branded Progress**.
#### Current direction [#current-direction]
* Branded Progress is tied to **active play**, not passive idling
* Movement, combat, mining, survival, and actual play beneath the Oath are what matter
* Standing still or going AFK is not intended to meaningfully satisfy the burden
* The current high threshold used by multiple end-game systems is **99.5% attunement**
#### What uses Branded Progress [#what-uses-branded-progress]
* Sin Weapon activation
* Titan's Remnant Apex access
* Brandkeeper's Mercy
* Other high-tier Oathbound systems
#### Branded Time Checker [#branded-time-checker]
The **Branded Time Checker** is a general attunement tool. It shows:
* Current Branded Progress
* Current attunement ratio
* Whether the bearer meets the current high threshold
It is crafted shapelessly from:
```text
Book + Gold Ring -> Branded Time Checker
```
## Oathbound Codex [#oathbound-codex]
The **Oathbound Codex** is the in-game Patchouli guide for the mod.
It is crafted shapelessly from:
```text
Book + Oblivion Stone -> Oathbound Codex
```
The Codex includes the Remnant upgrade path, Dormant Remnant acquisition routes, materials, relics, Sin Weapons, and the Rite of Severance.
## Loot Philosophy [#loot-philosophy]
The mod does **not** use one giant random relic pool.
Instead, relics are placed in **themed loot sources** so players can learn where to search for different kinds of power.
#### Loot rules [#loot-rules]
* Most relics are **loot-only**
* Rings are one of the main crafted progression lines
* Oblivion Stones are rare and valuable
* Sin Tablets are loot-only
* Idols are crafted
* Finished Sin Weapons are **not** normal structure loot
* Dormant Titan's Remnants now have dedicated boss, creature, and structure routes
## Main Loot Sources [#main-loot-sources]
### Ancient City [#ancient-city]
**Theme:** forbidden sight, dread, sleepless revelation
**Main finds**
* Hollow Eye
* Shroud of the Forsaken
* Eye of the Sleepless Witness
* Tablets
* Oblivion Stone, rarely
### Strongholds [#strongholds]
**Theme:** ritual knowledge, vows, prayer, support relics
**Main finds**
* Censer of Hollow Prayer
* Eye of the Sleepless Witness
* Oathbound Reliquary
* Gravebell Locket
* Mourner's Thread
* Brandkeeper's Mercy in selected support or late pools
* Tablets and rare progression pieces
* Dormant Nebula Lens, rarely
### Nether Fortress and Bastion [#nether-fortress-and-bastion]
**Theme:** ash, punishment, martyrdom, violent relic work
**Main finds**
* Ashen Nail
* Censer of Ash
* Torch of Gravesong
* Relic of the Last Breath
* Chain of the Penitent
* Nail of the First Martyr
* Oblivion Stone, rarely
* **Tablet of Vengeance** in Bastion Treasure, rare weight 1
### Woodland Mansion and Trial Rewards [#woodland-mansion-and-trial-rewards]
**Theme:** dominance, vanity, elite combat, judgment
**Main finds**
* Hunter's Sigil
* Thornbound Carapace
* Executioner's Coin
* Tablets
* Brandkeeper's Mercy in selected high-end pools
* Oblivion Stone, rarely
* Dormant Skybrand Feather in Woodland Mansion loot, rarely
* **Tablet of Vengeance** in Ominous Trial Chamber rare rewards, rare weight 1
### End City [#end-city]
**Theme:** void, ascension, unreachable power
**Main finds**
* Voidstep Band
* Oathbound Reliquary
* Brandkeeper's Mercy
* Tablets
* Oblivion Stone, rarely
* Dormant Skybrand Feather, rarely
* Dormant Void Pearl, rarely
### Desert Pyramid, Trail Ruins, and Jungle Temple [#desert-pyramid-trail-ruins-and-jungle-temple]
**Theme:** wandering, scavenging, worn survival relics, hidden relic caches
**Main finds**
* Pilgrim's Thorn
* Vulture Charm
* Mourner's Thread
* Executioner's Coin
* Selected Tablets and relic materials depending on the structure
* Oblivion Stone in selected better pools
## Boss and Creature Loot [#boss-and-creature-loot]
The current loot injections provide repeatable routes for Dormant Titan's Remnants and related materials.
| Source | Drop |
| -------------- | ---------------------------------------- |
| Wither | **Dormant Colossus Heart**, guaranteed |
| Ender Dragon | **Dormant Ember Seed**, guaranteed |
| Elder Guardian | **Dormant Tide Pearl**, guaranteed |
| Warden | **Dormant Nebula Lens**, guaranteed |
| Phantom | **Dormant Skybrand Feather**, 10% chance |
| Shulker | **Dormant Void Pearl**, 5% chance |
The Wither, Ender Dragon, Elder Guardian, and Warden also each have a separate **50% chance** to drop an **Oblivion Stone**.
Shulkers also drop **4–7 Void Ashes** through the current injected loot table.
## Rare Progression Materials [#rare-progression-materials]
### Oblivion Stone [#oblivion-stone]
**Purpose**
* Ring progression
* Late-game crafting
* Idol crafting
* Dormant-to-Latent Remnant upgrades
* Higher relic works
**How to get it**
* Extremely rare loot in selected structure pools
* 50% additional drop chance from the Wither
* 50% additional drop chance from the Ender Dragon
* 50% additional drop chance from an Elder Guardian
* 50% additional drop chance from the Warden
### Aredrite Gem [#aredrite-gem]
**Source**
* Mined from **Aredrite Ore** in the **End**
**Use**
* Aredrite armor
* Higher-end forging
### Void Ashes [#void-ashes]
**Source**
* Shulkers drop **4–7 Void Ashes**
**Use**
* Late weapon forging
* Latent-to-Awakened Remnant upgrades
* Higher Oathbound rites
### Tablet of Vengeance [#tablet-of-vengeance]
The **Tablet of Vengeance** is the loot-only Sin Tablet associated with Wrath.
**Sources**
* Bastion Treasure loot, rare weight 1
* Ominous Trial Chamber rare rewards, rare weight 1
It cannot be crafted.
### Grudgebound Idol [#grudgebound-idol]
The **Grudgebound Idol** is the crafted focus used to forge Ruinwake.
```text
E C E
O N O
S B S
```
* `E` — Echo Shard
* `C` — Crying Obsidian
* `O` — Obsidian
* `N` — Oblivion Stone
* `S` — Soul Sand
* `B` — Netherite Sword
## Aredrite Armor [#aredrite-armor]
Aredrite is the mod's current late-game End armor line.
### Piece identity [#piece-identity]
* **Helmet** — strips Blindness and Darkness
* **Chestplate** — grants warding at low health, stronger while Branded
* **Leggings** — grants movement speed, stronger in the End and while Branded
* **Boots** — negate fall damage in the End and greatly reduce it elsewhere
### Set bonuses [#set-bonuses]
* **2 Pieces — Witnessed:** the armor hardens when hostiles are nearby
* **3 Pieces — Hollow Pressure:** crowded enemies are weakened and slowed while the wearer gains recovery
* **4 Pieces — Last Horizon:** while Branded, a lethal blow can be denied and turned into a powerful survival burst
Aredrite is meant to feel like End-forged survival armor, not simple ore gear.
## Brandkeeper's Mercy [#brandkeepers-mercy]
**Brandkeeper's Mercy** is a late-game bearer charm tied to high Branded attunement.
#### What it does [#what-it-does-1]
* Suppresses the **Provocation** curse once active
* Requires the bearer to be **Branded**
* Requires **99.5% Branded attunement** before it fully answers
It represents a rare softening of the Oath rather than a complete removal of burden.
## Advanced Bearer Relics [#advanced-bearer-relics]
These are heavier, more identity-defining curios with stronger passives and sharper roles.
#### Oathbound Reliquary [#oathbound-reliquary]
Defensive support, absorption, renewal, and burden scaling.
#### Chain of the Penitent [#chain-of-the-penitent]
Stores damage taken as **Penance** and turns that stored suffering into a stronger melee answer.
#### Eye of the Sleepless Witness [#eye-of-the-sleepless-witness]
A relic of watchfulness rather than raw scouting.
* Grants night vision
* While grounded and steady, grants an Oakskin-like resistance effect
* While moving near hostiles, sharpens the bearer instead of marking enemies with glow
#### Censer of Hollow Prayer [#censer-of-hollow-prayer]
Nearby monsters are slowed and weakened, while the bearer gains renewal and defensive support in crowds.
#### Nail of the First Martyr [#nail-of-the-first-martyr]
Repeated strikes build **Martyr's Claim**, which can become **Judged** and reward the kill with haste and absorption.
## Titan's Remnants [#titans-remnants]
Titan's Remnants are their own late-game progression lane. Newly acquired Remnants begin in their **Dormant** state and retain their stored stage as they evolve.
Each Remnant can rise through:
```text
Dormant -> Latent -> Awakened -> Ascended -> Transcendent -> Apex
```
### Finding Dormant Remnants [#finding-dormant-remnants]
| Remnant | Primary source | Additional source |
| ---------------- | -------------------------- | -------------------------------------------- |
| Colossus Heart | Wither, guaranteed | None currently listed |
| Ember Seed | Ender Dragon, guaranteed | None currently listed |
| Tide Pearl | Elder Guardian, guaranteed | None currently listed |
| Nebula Lens | Warden, guaranteed | Stronghold loot, rare |
| Skybrand Feather | Phantom, 10% chance | Woodland Mansion and End City treasure, rare |
| Void Pearl | Shulker, 5% chance | End City treasure, rare |
### Upgrade flow [#upgrade-flow]
To upgrade a Remnant:
1. Hold the Remnant in your **main hand**.
2. Hold the required catalyst in your **offhand**.
3. Use the Remnant to advance it.
### Current catalyst path [#current-catalyst-path]
| Upgrade | Catalyst |
| ------------------------ | ---------------- |
| Dormant -> Latent | Oblivion Stone |
| Latent -> Awakened | Void Ashes |
| Awakened -> Ascended | Mirrorsteel Idol |
| Ascended -> Transcendent | Nether Star |
| Transcendent -> Apex | Soul Gem |
### Stage rules [#stage-rules]
* **Dormant, Latent, and Awakened** do not require the bearer to be Branded
* **Ascended and Transcendent** require the Oathbound Relic
* **Apex** requires the Oathbound Relic and **99.5% Branded attunement**
### Remnant identities [#remnant-identities]
#### Colossus Heart [#colossus-heart]
Weight, punishment, Tremor, and violent retaliation.
#### Ember Seed [#ember-seed]
Fire, attrition, heat buildup, and momentum.
#### Tide Pearl [#tide-pearl]
Drowning pressure, underwater control, and punishing battlefield flow.
#### Skybrand Feather [#skybrand-feather]
Descent, evasion, aerial control, and punishing landings.
#### Nebula Lens [#nebula-lens]
Distortion, blink retaliation, anti-magic defense, and unstable spatial reactions.
#### Void Pearl [#void-pearl]
Darkness, decay, survival against death, and void authority in low light.
## Rings [#rings]
The ring line is one of the main crafted progressions in the mod.
```text
Gold Ring
|
v
Cyan Ring
|
v
Nebula Ring
```
### Ring summary [#ring-summary]
| Ring | Effect | Notes |
| ----------- | -------------------------- | ---------------------------------------- |
| Gold Ring | +1 Armor | Starter crafted ring |
| Cyan Ring | +2 Armor | Upgraded crafted ring |
| Nebula Ring | +3 Armor and extra utility | Late crafted ring and Ruinwake component |
## Sin Weapons [#sin-weapons]
The current Sin Weapon line contains four forbidden weapons:
* **Sloth — Lethargic Greatsword**
* **Pride — Vanity's Edge**
* **Envy — Covetfang**
* **Wrath — Ruinwake**
The line is tied to:
* Loot-only Sin Tablets
* Crafted Idols
* Void Ashes and late-game materials
* Advanced Rings
* The Branded state
* The configured late-game Sin Weapon threshold, currently **99.5% attunement**
### Sloth [#sloth]
Burden, exhaustion, crushing force, and punishing failed kills.
### Pride [#pride]
Superiority, offensive pressure, costly dominance, and refusal to rely on others.
### Envy [#envy]
Jealousy, claim mechanics, theft of strength, and power taken from stronger targets.
### Wrath: Ruinwake [#wrath-ruinwake]
Ruinwake is a heavy, two-handed claymore that stores injury as **Grudge** and releases it as a **Ruinous Wake**.
#### Requirements [#requirements]
* Ruinwake must be enabled in the server config
* The bearer must be **Branded**
* The bearer must meet the configured late-game Sin Weapon threshold
* The default/current threshold is **99.5% Branded attunement**
#### Base weapon values [#base-weapon-values]
| Stat | Value |
| ---------------------- | -------------------: |
| Attack damage | 55 |
| Attack-speed modifier | -2.7 |
| Durability | 2,400 |
| Better Combat category | Claymore, two-handed |
#### Grudge [#grudge]
* Dealing direct melee damage with Ruinwake in the main hand builds **1 Grudge**
* Taking damage while holding Ruinwake in the main hand builds **1 Grudge**
* Grudge holds up to **5 stacks** by default
* Each stack increases direct melee damage by **8%**
* After combat, one stack decays every **10 seconds**
* Grudge is cleared when the player no longer possesses Ruinwake
#### Ruinous Wake [#ruinous-wake]
Right-clicking Ruinwake consumes every stored Grudge stack and releases a soul-flame shockwave.
* Radius: **6 blocks**
* Cooldown: **12 seconds**
* Damages nearby non-allied living targets
* Applies **Weakness II** for **8 seconds**
* Knocks targets away from the bearer
* The damage scales with the bearer's attack damage and consumed Grudge
* The default shockwave multiplier is `0.45 + 0.17 per consumed stack`
* Tamed creatures owned by the bearer and allied targets are excluded
If the shockwave kills nothing, the stored wrath turns inward:
* The bearer loses **1 health point per consumed stack**
* This failure damage cannot reduce the bearer below **1 health point**
### Forging Ruinwake [#forging-ruinwake]
First craft the **Grudgebound Idol** using the recipe shown in the Rare Progression Materials section.
Then forge Ruinwake:
```text
V V V
T I T
V N V
```
* `V` — Void Ashes
* `T` — Tablet of Vengeance
* `I` — Grudgebound Idol
* `N` — Nebula Ring
This follows the established Sin Weapon structure: **rare Tablet + crafted Idol + Void Ashes + advanced Ring**.
## Rite of Severance [#rite-of-severance]
The **Rite of Severance** is the path for destroying the Oathbound Relic and clearing the Branded state.
#### Requirements [#requirements-1]
* The Oathbound Relic equipped
* The Rite of Severance altar
* Activation at **night** or in **The End**
* Required ritual materials
#### On success [#on-success]
* The Relic is destroyed
* The Branded state is removed
* The player receives **Fractured Relic Ash**
The Rite is meant to feel costly, dangerous, and deliberate.
# Reskillable Reimagined (/mods/reskillable-reimagined)
Reskillable Reimagined is an RPG-style progression mod that adds a **skill-based locking and leveling system** to Minecraft.
Players spend experience to level skills, unlock equipment, meet progression requirements, gain configurable perks, and access stronger content.
The current system is designed with modpacks in mind and supports both built-in and custom progression paths.
> **1.21.1 Loader Support**
>
> Reskillable Reimagined is available for **NeoForge and Fabric**.
>
> The Fabric version requires **Fabric Loader**, **Fabric API**, and **Java 21**. Core skills, configs, locks, gates, commands, custom skills, and built-in skill customization are kept aligned with the 1.21.1 NeoForge version.
>
> On Fabric, **EMI** is the supported recipe-viewer integration. **Jade** is optional. Loader-specific integrations for NeoForge-only APIs are not automatically available on Fabric.
## Core Features [#core-features]
Reskillable includes:
* A full **XP-based skill leveling system**
* **Item and block requirements**
* **Entity attack requirements**
* **Crafting requirements**
* Configurable **skill progression gates**
* Up to **8 custom skills**
* Fully editable **built-in skills**
* Configurable skill IDs, names, icons, perks, and attributes
* Multiple configurable perk attributes per skill
* A configurable **global skill-level cap**
* Bonus health based on total progression
* Requirement tooltips with pass/fail coloring
* Optional **Jade** integration
* **EMI** screen compatibility on Fabric
* Automatic mod item scanning
* JSON-based modpack configuration
***
## Skill System [#skill-system]
Each player has skills that can be leveled by spending experience.
### Default Built-In Skills [#default-built-in-skills]
| Skill | Purpose |
| ------------- | ----------------------------------------------------- |
| **Attack** | Weapon usage, combat progression, and offensive perks |
| **Defense** | Armor usage and defensive progression |
| **Mining** | Mining-tool progression and mining bonuses |
| **Gathering** | Gathering tools such as axes and shovels |
| **Farming** | Farming tools and crop-related progression |
| **Building** | Building-related progression and interaction reach |
| **Agility** | Movement and mobility progression |
| **Magic** | Magical equipment and configurable magic attributes |
These eight skills are no longer permanently fixed in the GUI.
***
## Editing Built-In Skills [#editing-built-in-skills]
Built-in skills are configured in:
```text
config/reskillable/built_in_skills.json
```
This file allows a modpack to **rename, reorder, customize, or disable** the original skills without changing the internal save-data hooks used by Reskillable.
Example using the original built-in perk:
```json
{
"skill": "attack",
"id": "combat",
"displayName": "Combat",
"enabled": true,
"icon": "yourpack:textures/gui/skills/combat.png",
"perkAttributes": null,
"perkOperation": null,
"perkAmountPerStep": null,
"perkStep": 5
}
```
`perkAttributes: null` is intentional. For a built-in skill, it means **keep the original Reskillable perk behavior**.
Example replacing the original perk with multiple attributes:
```json
{
"skill": "gathering",
"id": "slayer",
"displayName": "Slayer",
"enabled": true,
"icon": "born_in_chaos_v1:textures/item/shattered_skull.png",
"perkAttributes": [
{
"attribute": "attributeslib:experience_gained",
"operation": "MULTIPLY_BASE",
"amountPerStep": 0.05,
"perkStep": 5
},
{
"attribute": "minecraft:generic.movement_speed",
"operation": "MULTIPLY_BASE",
"amountPerStep": 0.02,
"perkStep": 10
}
]
}
```
In this example, the original Gathering bonus-XP-orb perk is replaced. The first configured attribute gains +5% of its base value every 5 skill levels, while the second gains +2% of its base value every 10 skill levels.
### Built-In Skill Fields [#built-in-skill-fields]
| Field | Description |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `skill` | Fixed internal behavior/save-data hook. Keep this tied to the original skill. |
| `id` | Public ID used by locks, gates, commands, and the UI. This can be renamed. |
| `displayName` | Custom literal name shown to the player. Blank keeps the normal translated name. |
| `enabled` | Set to `false` to disable the skill. |
| `icon` | Optional replacement icon texture. Blank keeps the default icon. |
| `perkAttributes` | Preferred multi-attribute perk format. `null` keeps the original built-in perk, `[]` removes the perk, and one or more entries replace the original perk. |
| `perkAttribute` | Legacy single-attribute override. Still supported for existing configs. |
| `perkOperation` | Legacy operation used with `perkAttribute`. |
| `perkAmountPerStep` | Legacy amount used with `perkAttribute`. |
| `perkStep` | Legacy/default milestone step. Multi-attribute entries can each define their own `perkStep`. |
Each object inside `perkAttributes` supports:
| Field | Description |
| --------------- | ---------------------------------------------------------------------------- |
| `attribute` | Registry ID of the attribute to modify. |
| `operation` | Modifier operation such as `ADDITION`, `MULTIPLY_BASE`, or `MULTIPLY_TOTAL`. |
| `amountPerStep` | Amount granted at each milestone. |
| `perkStep` | Number of skill levels between milestones for this specific attribute. |
### Built-In Perk Override Rules [#built-in-perk-override-rules]
For built-in skills, `perkAttributes` has three distinct states:
```json
"perkAttributes": null
```
Keeps the original Reskillable perk.
```json
"perkAttributes": []
```
Explicitly disables that skill's perk.
```json
"perkAttributes": [
{
"attribute": "modid:attribute",
"operation": "ADDITION",
"amountPerStep": 1.0,
"perkStep": 5
}
]
```
Replaces the original built-in perk with the configured attribute perk or perks.
This replacement behavior also applies to built-ins with special non-attribute legacy effects. For example:
* overriding **Mining** stops its original mining-speed perk
* overriding **Gathering** stops its original bonus-XP-orb perk
* overriding **Farming** stops its original crop-growth perk
The legacy singular `perkAttribute`, `perkOperation`, `perkAmountPerStep`, and `perkStep` format remains supported. A configured legacy `perkAttribute` is treated as a single replacement perk. If the newer `perkAttributes` array is present, use that format instead.
### Important Built-In Skill Notes [#important-built-in-skill-notes]
* The `skill` field is the permanent internal mapping.
* The `id` field is the public-facing config ID.
* The original skill IDs remain accepted as compatibility aliases.
* Renaming `attack` to `combat`, for example, does **not** invalidate older lock configs that still use `attack`.
* Built-in levels remain stored under their original internal keys.
* Reordering the JSON entries changes their order on the built-in skill page.
* Disabling or reordering a built-in skill does not shift another skill into its save-data slot.
* A disabled built-in skill is excluded from normal leveling, UI display, totals, gates, and perks.
* Deleting a built-in entry also causes that built-in skill to be treated as disabled.
* Each configured attribute can use a different operation, amount, and milestone step.
* `/skills reload` reloads perk definitions and cleans up Reskillable modifiers that were removed or changed.
* On multiplayer, current skill definitions are synchronized from the server to the client so the perk page reflects the server configuration.
This makes it possible to heavily theme the system for a modpack while keeping existing player progression safe.
***
## Custom Skills [#custom-skills]
Reskillable supports up to **8 additional custom skills**.
Custom skills are defined in:
```text
config/reskillable/custom_skills.json
```
Example using the preferred multi-attribute format:
```json
{
"id": "swimming",
"displayName": "Swimming",
"enabled": true,
"icon": "reskillable:textures/gui/custom_skills/swimming.png",
"perkAttributes": [
{
"attribute": "minecraft:generic.water_movement_efficiency",
"operation": "ADDITION",
"amountPerStep": 0.1,
"perkStep": 5
}
]
}
```
Custom skills can also grant multiple attributes:
```json
{
"id": "adventuring",
"displayName": "Adventuring",
"enabled": true,
"icon": "",
"perkAttributes": [
{
"attribute": "minecraft:generic.movement_speed",
"operation": "MULTIPLY_BASE",
"amountPerStep": 0.02,
"perkStep": 5
},
{
"attribute": "minecraft:generic.max_health",
"operation": "ADDITION",
"amountPerStep": 1.0,
"perkStep": 10
}
]
}
```
> Attribute registry IDs can change between Minecraft versions and loaders. Always use an attribute ID that exists in the exact version and loader used by your pack.
### Custom Skill Fields [#custom-skill-fields]
| Field | Description |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | Internal/public skill ID used by commands, locks, and gates |
| `displayName` | Name shown in the skill screen and requirement tooltips |
| `enabled` | Enables or temporarily disables the custom skill |
| `icon` | Texture path used for the skill icon |
| `perkAttributes` | Preferred array of attribute perks. Use multiple entries to grant multiple attributes. An empty array gives the custom skill no perk. |
| `perkAttribute` | Legacy single-attribute format. Still supported for existing configs. |
| `perkOperation` | Legacy operation used with `perkAttribute`. |
| `perkAmountPerStep` | Legacy amount used with `perkAttribute`. |
| `perkStep` | Legacy/default milestone step. Multi-attribute entries can each define their own step. |
### Custom Skill Notes [#custom-skill-notes]
* IDs should use lowercase letters, numbers, and underscores.
* IDs should be unique.
* Custom skills start at **level 1**.
* Disabled custom skills keep their stored player level.
* A custom skill can be referenced by:
* item and block locks
* crafting locks
* entity requirements
* skill level gates
* commands
* A configured perk allows a custom skill to participate in the perk system.
* Custom skills support the same `attribute`, `operation`, `amountPerStep`, and `perkStep` fields inside each `perkAttributes` entry.
* The old singular perk fields remain supported so existing custom-skill configs do not need to be rewritten immediately.
### Using Custom Skills in Locks [#using-custom-skills-in-locks]
```json
{
"skillLocks": {
"minecraft:trident": ["swimming:10"]
}
}
```
### Using Custom Skills in Gates [#using-custom-skills-in-gates]
```toml
skill_level_gates = [
"SWIMMING:10:TOTAL=25"
]
```
***
## Skill Pages & GUI Customization [#skill-pages--gui-customization]
The main skill screen supports separate pages for built-in and custom skills.
Useful options include:
```toml
enableSecondSkillPage = true
subpageNavPosition = "BOTTOM"
showSubpageTitles = true
```
### `enableSecondSkillPage` [#enablesecondskillpage]
Controls whether the custom-skill page is available.
### `subpageNavPosition` [#subpagenavposition]
Controls where the built-in/custom page navigation arrows are placed.
Supported values:
* `TOP`
* `BOTTOM`
* `LEFT`
* `RIGHT`
### `showSubpageTitles` [#showsubpagetitles]
Controls whether the Built-In / Custom page title is shown.
### Inventory / Skills Tab Position [#inventory--skills-tab-position]
The inventory-side Skills tab position is stored in:
```text
config/reskillable/reskillable_tabs.json
```
Example:
```json
{
"x": -28,
"y": 7
}
```
This allows the tab position to remain configurable rather than being permanently fixed to one inventory layout.
***
## Leveling & XP [#leveling--xp]
Players spend Minecraft XP to increase skill levels.
XP cost is calculated using Reskillable's progression curve and can be globally scaled.
Important options include:
```text
xpScalingMultiplier
maximumLevel
maxTotalSpentLevels
```
### `maximumLevel` [#maximumlevel]
Controls the maximum level an individual skill can reach.
### `xpScalingMultiplier` [#xpscalingmultiplier]
Changes the XP cost of skill progression.
### `maxTotalSpentLevels` [#maxtotalspentlevels]
Limits how many total skill levels a player may invest across all enabled skills.
```toml
maxTotalSpentLevels = -1
```
`-1` means unlimited.
This can be used to create character-build systems where players must specialize instead of eventually maxing every skill.
***
## Skill Progression Gates [#skill-progression-gates]
Skill gates can stop a player from leveling a skill past a configured point until other progression requirements are met.
Gates do **not** stop the player from earning XP. They prevent the skill upgrade itself until the requirements are satisfied.
Configured with:
```toml
skill_level_gates = []
```
### Gate Format [#gate-format]
```text
SKILL:MIN_CURRENT_LEVEL:REQUIREMENTS
```
Supported requirement tokens include:
```text
TOTAL=
OTHER_SKILL=
ADV=
```
All requirements on the same rule must be satisfied.
### Require an Advancement [#require-an-advancement]
```toml
skill_level_gates = [
"ATTACK:15:ADV=minecraft:story/mine_diamond"
]
```
Attack can be leveled normally until level 15.
After that, the player must complete the configured advancement.
Custom advancements can also be used, making this useful for quest systems and modpack progression.
### Require Total Skill Levels [#require-total-skill-levels]
```toml
skill_level_gates = [
"ATTACK:10:TOTAL=30"
]
```
Attack can be leveled normally through level 10.
Further progression requires at least 30 total skill levels.
### Require Multiple Conditions [#require-multiple-conditions]
```toml
skill_level_gates = [
"ATTACK:15:TOTAL=40,MINING=10,DEFENSE=10"
]
```
Attack progression beyond the gate requires:
* 40 total skill levels
* Mining 10
* Defense 10
### Multiple Gates [#multiple-gates]
```toml
skill_level_gates = [
"ATTACK:10:TOTAL=25",
"ATTACK:20:TOTAL=50",
"MAGIC:15:ATTACK=10"
]
```
This allows one skill to have multiple progression checkpoints.
***
## Perks & Attribute Bonuses [#perks--attribute-bonuses]
Skills can use their original Reskillable perk or one or more configurable attribute perks.
The preferred format is:
```json
"perkAttributes": [
{
"attribute": "modid:attribute",
"operation": "ADDITION",
"amountPerStep": 1.0,
"perkStep": 5
}
]
```
A skill may contain multiple entries, and every entry can use a different `operation`, `amountPerStep`, and `perkStep`.
For example, one attribute can trigger every 5 levels while another triggers every 10 levels.
### Built-In vs. Custom Perk Behavior [#built-in-vs-custom-perk-behavior]
For **built-in skills**:
* `perkAttributes: null` keeps the original Reskillable perk.
* `perkAttributes: []` disables the perk.
* `perkAttributes: [ ... ]` replaces the original perk with the configured attribute list.
* The legacy singular `perkAttribute` format is still supported and also acts as a replacement when configured.
For **custom skills**:
* `perkAttributes: []` means the skill has no attribute perk.
* `perkAttributes: [ ... ]` grants every configured attribute perk.
* The legacy singular format remains supported for backward compatibility.
A custom attribute override does **not** stack with special built-in behavior such as Mining speed, Gathering bonus XP orbs, or Farming crop-growth chance. Supplying an override replaces that original perk.
### Modifier Operations [#modifier-operations]
Common operation names include:
```text
ADDITION
MULTIPLY_BASE
MULTIPLY_TOTAL
```
`ADDITION` adds the configured amount directly at each milestone.
`MULTIPLY_BASE` uses the amount as a fraction of the attribute's base value. For example, `0.05` represents +5% of the base value per milestone.
### Perk Page Names [#perk-page-names]
When a built-in skill is using its original perk, Reskillable uses its normal legacy perk description.
When a skill is using a configured attribute override, the perk page displays the configured attribute's translated name. For third-party attributes, that translated name is normally supplied by the mod that owns the attribute.
For example, changing Reskillable's legacy:
```text
tooltip.rereskillable.bonus_xp_orbs
```
changes the name used by the **original Gathering perk**. It does not rename a third-party attribute such as `attributeslib:experience_gained`.
### Default Skill Bonus Types [#default-skill-bonus-types]
| Skill | Typical Original Bonus |
| ------------- | ---------------------------- |
| **Attack** | Attack damage |
| **Defense** | Armor / defensive attribute |
| **Agility** | Movement speed |
| **Magic** | Configurable magic attribute |
| **Building** | Block interaction reach |
| **Gathering** | Bonus XP gain |
| **Mining** | Mining speed |
| **Farming** | Crop growth chance |
These defaults remain active when `perkAttributes` is `null`. Supplying a configured attribute override replaces the corresponding original perk.
***
## Health Scaling [#health-scaling]
Reskillable can grant bonus health based on total skill progression.
Controlled by:
```text
HealthBonus
levelsPerHeart
healthPerHeart
```
For example, a pack can grant additional health every 10 combined skill levels.
Disabled skills are not intended to contribute to normal progression totals.
***
## Skill Locking [#skill-locking]
Reskillable can restrict:
* Item usage
* Block interaction
* Block breaking
* Entity attacks
* Crafting
Requirements may use built-in or custom skill IDs.
***
## Item & Block Requirements [#item--block-requirements]
Configured through:
```text
config/reskillable/skill_locks.json
```
Example:
```json
{
"skillLocks": {
"minecraft:diamond_sword": ["attack:15"],
"minecraft:netherite_chestplate": ["defense:30"]
}
}
```
Multiple requirements may be added to the same entry:
```json
{
"skillLocks": {
"examplemod:ancient_blade": [
"attack:20",
"agility:10"
]
}
}
```
The player must satisfy all configured requirements.
Built-in skill IDs can use either the configured public ID or the original compatibility alias.
***
## Wildcard Item Locks [#wildcard-item-locks]
Item requirement configs support prefix wildcards.
The wildcard must appear at the **end** of the item path.
Example:
```json
{
"skillLocks": {
"examplemod:steel_*": [
"attack:10"
]
}
}
```
This expands against registered items whose paths begin with `steel_`.
Wildcards are useful for large content mods where many items share a naming prefix.
***
## Entity Attack Requirements [#entity-attack-requirements]
Entity attack requirements are configured in:
```text
config/reskillable/attack_skill_locks.json
```
Example:
```json
{
"attackSkillLocks": {
"minecraft:warden": ["attack:25"]
}
}
```
This lets modpacks gate stronger enemies behind character progression.
***
## Crafting Requirements [#crafting-requirements]
Crafting restrictions are configured in:
```text
config/reskillable/craft_skill_locks.json
```
Example:
```json
{
"craftSkillLocks": {
"minecraft:diamond_sword": [
"attack:15",
"mining:10"
]
}
}
```
This allows crafting progression to be stricter or different from normal item-use requirements.
***
## Requirement Tooltips [#requirement-tooltips]
Restricted items display their requirements directly in the item tooltip.
The tooltip includes:
* A **Requirements:** heading
* The configured skill name
* Required level
* **Green** text when the player meets the requirement
* **Red** text when the player does not meet the requirement
Configured built-in display names and custom skill display names are respected.
This means renaming `attack` to `Combat` in `built_in_skills.json` also updates the name shown to players in requirement tooltips.
***
## Jade Integration [#jade-integration]
**Jade is optional.**
When Jade is installed, Reskillable can display matching requirements directly in Jade tooltips while looking at blocks and supported entities/item entities.
Requirement entries use the same pass/fail coloring as normal item tooltips.
This makes progression requirements visible without forcing the player to first pick up or open an item.
***
## Fabric Integration [#fabric-integration]
The Fabric 1.21.1 port keeps the core Reskillable systems aligned with NeoForge.
### Requirements [#requirements]
Fabric builds require:
* Fabric Loader
* Fabric API
* Minecraft 1.21.1
* Java 21
### EMI [#emi]
**EMI** is the supported recipe-viewer integration on Fabric.
The integration registers Reskillable's Skills tab and Skill Screen as exclusion areas so EMI sidebars do not cover the custom GUI.
There is no JEI hook/dependency in the Fabric build.
### Jade [#jade]
Jade remains optional on Fabric.
### Loader-Specific Mod Integrations [#loader-specific-mod-integrations]
Some integrations rely on APIs that are specific to NeoForge builds.
The Fabric port does not hard-link NeoForge-only integrations such as:
* Curios APIs
* Iron's Spells event APIs
* TaCZ event APIs
Core Reskillable functionality does not depend on those integrations.
Where possible, generic registry/NBT-based behavior may still work without linking directly against another mod's API.
***
## Main Config [#main-config]
The main config contains global Reskillable behavior.
On current Fabric 1.21.1 builds, it is stored at:
```text
config/reskillable-common.toml
```
The JSON progression files remain under:
```text
config/reskillable/
```
### Important Main Config Options [#important-main-config-options]
| Config | Description |
| ----------------------- | ---------------------------------------------------- |
| `disableWoolDrops` | Controls Reskillable's wool-drop restriction |
| `deathSkillReset` | Resets skills on player death |
| `HealthBonus` | Enables total-level health scaling |
| `showTabButtons` | Shows the Inventory / Skills tab buttons |
| `xpScalingMultiplier` | Global XP cost multiplier |
| `maximumLevel` | Maximum level per skill |
| `enableSkillLeveling` | Enables or disables normal GUI leveling |
| `enableSkillUpMessage` | Shows skill-up chat messages |
| `skillAliases` | Additional accepted names for configured skills |
| `skill_level_gates` | Skill progression gate rules |
| `enableSecondSkillPage` | Enables the custom-skill page |
| `subpageNavPosition` | Position of the built-in/custom page arrows |
| `showSubpageTitles` | Shows or hides the skill subpage titles |
| `maxTotalSpentLevels` | Maximum combined spendable levels; `-1` is unlimited |
| `levelsPerHeart` | Total skill levels required per health milestone |
| `healthPerHeart` | Health granted per milestone |
| `attackAttribute` | Attribute used by the default Attack perk |
| `attackOperation` | Modifier operation for Attack |
| `attackDamageBonus` | Attack perk amount |
| `defenseAttribute` | Attribute used by Defense |
| `defenseOperation` | Modifier operation for Defense |
| `agilityAttribute` | Attribute used by Agility |
| `agilityOperation` | Modifier operation for Agility |
| `magicAttribute` | Attribute used by Magic |
| `magicOperation` | Modifier operation for Magic |
| `buildingAttribute` | Attribute used by Building |
| `buildingOperation` | Modifier operation for Building |
| `miningSpeedMultiplier` | Mining bonus scaling |
Some legacy bonus option names retain their original capitalization/spaces for compatibility. Per-skill values can also be overridden through `built_in_skills.json`.
***
## Configuration Files [#configuration-files]
Reskillable automatically creates or uses the following files:
| File | Purpose |
| -------------------------------------------- | ----------------------------- |
| `config/reskillable-common.toml` | Main/global configuration |
| `config/reskillable/skill_locks.json` | Item and block requirements |
| `config/reskillable/attack_skill_locks.json` | Entity attack requirements |
| `config/reskillable/craft_skill_locks.json` | Crafting requirements |
| `config/reskillable/built_in_skills.json` | Built-in skill definitions |
| `config/reskillable/custom_skills.json` | Additional custom skills |
| `config/reskillable/reskillable_tabs.json` | Inventory/Skills tab position |
***
## Commands [#commands]
Reskillable provides administration and modpack-development commands under:
```mcfunction
/skills
```
Most administrative commands require operator/game-master permission.
### Get Skill Levels [#get-skill-levels]
```mcfunction
/skills get
```
Checks player skill levels.
### Set a Skill [#set-a-skill]
```mcfunction
/skills set
```
Sets a built-in or enabled custom skill.
### Set All Skills [#set-all-skills]
```mcfunction
/skills set all
```
Sets all enabled built-in and custom skills.
### Add Skill Levels [#add-skill-levels]
```mcfunction
/skills add
```
Levels can also be added to all enabled skills.
### Respec a Player [#respec-a-player]
```mcfunction
/skills respec
```
Resets progression and refunds stored/spent XP according to the command's respec behavior.
### Reload Configs [#reload-configs]
```mcfunction
/skills reload
```
Reloads Reskillable's current configuration and JSON data without requiring a normal full game restart.
### Scan a Mod [#scan-a-mod]
```mcfunction
/skills scanmod
```
Scans registered items belonging to a mod and adds generated entries to `skill_locks.json`.
Existing entries are preserved.
Generated requirement values should be treated as **starting points** and reviewed by the modpack author before release.
***
## Mod Item Scanning [#mod-item-scanning]
The scan command can save a large amount of manual configuration work.
```mcfunction
/skills scanmod examplemod
```
Reskillable checks registered items in that namespace and generates suggested skill-lock entries.
The generated values can use item properties such as:
* Armor defense
* Armor toughness
* Tool type
* Weapon/tool progression
The scanner does not overwrite entries that already exist.
***
## Skill IDs & Aliases [#skill-ids--aliases]
There are three useful concepts when identifying a skill:
### Internal Built-In Mapping [#internal-built-in-mapping]
The `skill` value in `built_in_skills.json`.
Example:
```json
"skill": "attack"
```
This should not be repurposed because it identifies the original behavior/save-data slot.
### Public Skill ID [#public-skill-id]
The configurable `id`.
Example:
```json
"id": "combat"
```
This can be used in new locks, gates, and commands.
### Compatibility Alias [#compatibility-alias]
The original built-in ID remains recognized.
That means both of these can continue to resolve to the same built-in skill after renaming:
```text
combat
attack
```
Additional aliases may also be configured with `skillAliases`.
***
## Modpack Design Examples [#modpack-design-examples]
### Rename Attack to Combat [#rename-attack-to-combat]
`built_in_skills.json`:
```json
{
"skill": "attack",
"id": "combat",
"displayName": "Combat",
"enabled": true,
"icon": "",
"perkAttributes": null,
"perkOperation": null,
"perkAmountPerStep": null,
"perkStep": 5
}
```
New configs can then use:
```json
"examplemod:greatsword": ["combat:20"]
```
Older configs using:
```json
"examplemod:greatsword": ["attack:20"]
```
remain compatible.
### Remove Magic From a Non-Magic Pack [#remove-magic-from-a-non-magic-pack]
```json
{
"skill": "magic",
"id": "magic",
"displayName": "",
"enabled": false,
"icon": "",
"perkAttributes": null,
"perkOperation": null,
"perkAmountPerStep": null,
"perkStep": 5
}
```
This removes Magic from normal progression without shifting another built-in skill into its internal data slot.
### Replace Gathering With a Slayer Perk [#replace-gathering-with-a-slayer-perk]
```json
{
"skill": "gathering",
"id": "slayer",
"displayName": "Slayer",
"enabled": true,
"icon": "born_in_chaos_v1:textures/item/shattered_skull.png",
"perkAttributes": [
{
"attribute": "attributeslib:experience_gained",
"operation": "MULTIPLY_BASE",
"amountPerStep": 0.05,
"perkStep": 5
}
]
}
```
Because `perkAttributes` contains an override, the original Gathering bonus-XP-orb perk is disabled for this skill. The configured AttributesLib perk is used instead.
### Give One Skill Multiple Attribute Perks [#give-one-skill-multiple-attribute-perks]
```json
{
"skill": "attack",
"id": "warrior",
"displayName": "Warrior",
"enabled": true,
"icon": "",
"perkAttributes": [
{
"attribute": "minecraft:generic.attack_damage",
"operation": "ADDITION",
"amountPerStep": 0.5,
"perkStep": 5
},
{
"attribute": "minecraft:generic.max_health",
"operation": "ADDITION",
"amountPerStep": 1.0,
"perkStep": 10
}
]
}
```
This grants the attack-damage bonus every 5 levels and the max-health bonus every 10 levels.
### Create a Specialization System [#create-a-specialization-system]
```toml
maxTotalSpentLevels = 80
```
Then combine the cap with skill gates to force meaningful build choices instead of allowing every player to max every skill.
***
## Loader-Specific Compatibility [#loader-specific-compatibility]
The main skill system is intended to remain consistent across supported loaders, but integrations that depend on another mod's loader-specific API may differ.
### NeoForge [#neoforge]
NeoForge builds can contain integrations for APIs/mods such as Curios, Iron's Spells, TaCZ, or other NeoForge-side systems depending on the Minecraft version.
### Fabric 1.21.1 [#fabric-1211]
Fabric focuses on the shared Reskillable systems and native Fabric integrations:
* Fabric API
* EMI
* Optional Jade
Do not assume a NeoForge-only compatibility hook exists on Fabric simply because the base mod is available on both loaders.
***
## Who Should Use Reskillable? [#who-should-use-reskillable]
Reskillable is designed for:
* RPG modpacks
* Progression-based survival packs
* Hardcore packs
* Adventure packs
* Class or specialization systems
* Magic or combat progression packs
* Servers with advancement-based progression
* Packs using quest systems to gate character growth
***
## FAQ [#faq]
Yes. Reskillable Reimagined has a **Fabric 1.21.1** version.
The Fabric build requires Fabric Loader and Fabric API.
No. The Fabric 1.21.1 build uses **EMI** for recipe-viewer integration.
No. Jade support is optional.
When installed, Jade can display Reskillable requirement information directly in world tooltips.
Yes.
Change the public `id` and/or `displayName` in `built_in_skills.json`.
Keep the `skill` field tied to its original built-in behavior.
Yes.
Set:
```json
"enabled": false
```
The skill is removed from normal progression without changing another built-in skill's save-data slot.
Yes.
Custom skills also support:
```json
"enabled": false
```
This hides/disables the skill while preserving its configured definition and stored player level.
Yes.
Use the `perkAttributes` array:
```json
"perkAttributes": [
{
"attribute": "minecraft:generic.attack_damage",
"operation": "ADDITION",
"amountPerStep": 0.5,
"perkStep": 5
},
{
"attribute": "minecraft:generic.max_health",
"operation": "ADDITION",
"amountPerStep": 1.0,
"perkStep": 10
}
]
```
Built-in and custom skills both support multiple entries.
For a built-in skill:
* `perkAttributes: null` keeps the original Reskillable perk.
* `perkAttributes: []` disables the perk.
* `perkAttributes: [ ... ]` replaces the original perk with the listed attributes.
For a custom skill, an empty array means the skill has no attribute perk.
No.
When a built-in skill has a configured attribute override, that override replaces its original perk. This includes special built-in effects such as Mining speed, Gathering bonus XP orbs, and Farming crop-growth chance.
The old singular `perkAttribute` format is still supported and is also treated as a replacement.
Configured attribute perks use the attribute's translated name on the perk page.
If the attribute belongs to another mod, its display name normally comes from that mod's language file. Reskillable's legacy perk keys, such as `tooltip.rereskillable.bonus_xp_orbs`, only rename the corresponding original Reskillable perk.
Yes.
```toml
enableSkillLeveling = false
```
Skill levels can then be managed through commands or other progression systems.
Yes.
Use the item's registry ID:
```text
modid:itemid
```
You can also use supported prefix wildcards for groups of items.
Yes.
Custom skill IDs can be used alongside built-in skills in requirements and progression gates.
Yes.
Use:
```toml
maxTotalSpentLevels = 80
```
Set it to `-1` for unlimited progression.
The original built-in IDs remain recognized as compatibility aliases.
For example, if Attack is renamed to Combat, existing requirements using `attack` can still resolve to the original Attack skill.
Creative-mode players and administrative commands can bypass or directly modify normal progression restrictions.
Automation fake-player handling is also designed so machine interactions are not blocked like normal player progression.
# RPG Battlegear (/mods/rpg-battlegear)
## Infusion Altar & Data-Driven Recipes [#infusion-altar--data-driven-recipes]
RPG Battle Gear introduces the **Infusion Altar**, a custom crafting station that allows players and pack creators to define advanced item combinations using a fully data-driven recipe system.
This page explains:
* How to craft the Infusion Altar
* How Infusion recipes work
* File structure and locations
* How to create your own Infusion recipe
* Example recipe definitions
## Infusion Altar [#infusion-altar]
The Infusion Altar is a custom crafting block used to combine two ingredients into a new item.
### Crafting the Infusion Altar [#crafting-the-infusion-altar]
Create the altar using the following shaped recipe:
```json
{
"type": "minecraft:crafting_shaped",
"pattern": [
"SSS",
"O O",
"OOO"
],
"key": {
"S": {
"item": "minecraft:stone"
},
"O": {
"item": "minecraft:obsidian"
}
},
"result": {
"id": "rpg_battle_gear:infusion_altar",
"count": 1
}
}
```
## Infusion Recipes [#infusion-recipes]
Infusion recipes are fully data-driven. They are defined in JSON and loaded through Minecraft’s native recipe system.
### Features [#features]
* Compatible with JEI and EMI
* Reloadable using `/reload`
* Ingredient order does not matter
## Infusion Recipe Structure [#infusion-recipe-structure]
Infusion recipes combine two ingredients into a single result.
### Required Fields [#required-fields]
| Field | Description |
| ------------- | ---------------------------------- |
| `type` | Must be `rpg_battle_gear:infusion` |
| `ingredient1` | First input ingredient |
| `count1` | Required amount of ingredient1 |
| `ingredient2` | Second input ingredient |
| `count2` | Required amount of ingredient2 |
| `result` | Output item and count |
## Example Infusion Recipe [#example-infusion-recipe]
Example: Creating an `ancient_core` using a Diamond and Netherite Ingot.
```json
{
"type": "rpg_battle_gear:infusion",
"id": "rpg_battle_gear:infusion/ancient_core",
"ingredient1": { "item": "minecraft:diamond" },
"count1": 1,
"ingredient2": { "item": "minecraft:netherite_ingot" },
"count2": 1,
"result": { "id": "rpg_battle_gear:ancient_core", "count": 1 }
}
```
## File Location [#file-location]
`data/rpg_battle_gear/recipe/infusion/ancient_core.json`
### Creating Your Own Infusion Recipe [#creating-your-own-infusion-recipe]
To create a new Infusion recipe:
#### 1. Create a JSON File [#1-create-a-json-file]
Place a new JSON file inside:
`data/rpg_battle_gear/recipe/infusion/`
Example:
`data/rpg_battle_gear/recipe/infusion/my_custom_recipe.json`
#### 2. Define the Recipe [#2-define-the-recipe]
Example custom recipe:
```json
{
"type": "rpg_battle_gear:infusion",
"id": "rpg_battle_gear:infusion/mystic_blade",
"ingredient1": { "item": "minecraft:diamond_sword" },
"count1": 1,
"ingredient2": { "item": "minecraft:nether_star" },
"count2": 1,
"result": { "id": "rpg_battle_gear:mystic_blade", "count": 1 }
}
```
# Runes of Power (/mods/runes-of-power)

**Runes of Power** adds a set of runes to Minecraft, each granting its own abilities.
## The Runes [#the-runes]

### Features [#features]
🔮 New Rune System
* Added upgradable runes with **4 tiers (I–IV).**
* Blood Rune and Storm Rune can be socketed into a weapon! ( **1.21.1 feature only** )
* Runes can now be upgraded by sneak + right-clicking while holding another copy in your offhand.
* Each tier improves power, duration, or cooldown depending on the rune.
* New tier info + stats are displayed directly on rune tooltips.
* New Loot system with Config. Check below for current loot integration.
⛏️ Rune of Burrowing
* Added Burrowing Rune for fast terrain clearing.
* Breaks nearby soft blocks (dirt, sand, gravel, soul sand, etc.).
* Higher tiers increase radius and reduce cooldown.
🌊 Rune of Tides (Water)
* Grants water breathing.
* Upgrades now increase duration and reduce cooldown.
🌑 Shadow Rune (Black Out)
* Teleports you back to your spawn point.
* Now includes tiered cooldown improvements.
* Applies confusion + blindness on use for balance.
🕊️ Rune of Ascension (Flight)
* Grants creative-style flight.
* Higher tiers greatly increase flight duration and reduce reuse cooldown. -Includes safe landing effects after teleport or landing.
🔥 Inferno Rune (Fire Resistance)
* Grants Fire Resistance and Lava Vision.
* Higher tiers increase duration for both effects.
* Cooldown decreases as rune is upgraded.
🥷 Veil Rune (Stealth)
Makes you completely undetectable to sculk systems.
Prevents:
* Warden summoning
* Sculk shriek trigger
* Sculk vibration detection -Higher tiers extend stealth duration and lower cooldown.
🌌 Rune of Passage (Teleport)
Teleports you to your configured dimension safely. Now finds a safe landing spot on terrain instead of spawning you in the void.
Higher tiers:
* Reduce cooldown
* Add Slow Falling + Resistance after teleport
⚡ Storm Rune (Chain Lightning) 1.21.1
The Storm Rune calls down arcing bolts of chain lightning, striking multiple nearby enemies in rapid succession.
Effects:
* Fires chain lightning that jumps between nearby targets
* Deals magic-based damage
* Applies a brief burst of speed to the caster
* Scales with rune tier
Higher tiers:
* Increase number of chain targets
* Increase lightning damage
* Increase range
* Reduce cooldown
**Socketing this rune into a weapon lets you cast Chain Lightning directly from your blade.**
🩸 Blood Rune (Life Drain) 1.21.1
The Blood Rune drains life from nearby foes, dealing necrotic damage in an area and converting a portion of it into healing.
Effects:
* Damages multiple nearby enemies
* Heals the caster based on damage dealt
* Applies brief regeneration
* Scales with rune tier
Higher tiers:
* Increase number of drained targets
* Increase damage per target
* Increase healing percentage
* Reduce cooldown
**Can also be socketed into weapons, allowing you to trigger a life-drain effect on demand.**
## Loot Tables & Rune Drops [#loot-tables--rune-drops]
*currently only 1.21.1, crafting is still available for the mean time*
### Easy Loot [#easy-loot]
**Tables:**
* `minecraft:chests/simple_dungeon`
* `minecraft:chests/abandoned_mineshaft`
* `minecraft:chests/village/village_temple`
**Current Drops:**
* Empty Rune
* Water Rune
* Burrow Rune
* Fire Resistance Rune
### Medium Loot [#medium-loot]
**Tables:**
* `minecraft:chests/jungle_temple`
* `minecraft:chests/desert_pyramid`
* `minecraft:chests/pillager_outpost`
* `minecraft:chests/abandoned_mineshaft`
* `minecraft:chests/simple_dungeon`
**Current Drops:**
* Empty Rune
* Water Rune
* Black Out Rune
* Blood Rune
* Storm Rune
* Fire Resistance Rune
### Hard Loot [#hard-loot]
**Tables:**
* `minecraft:chests/stronghold_corridor`
* `minecraft:chests/nether_bridge`
* `minecraft:chests/bastion_treasure`
**Current Drops:**
* Stealth Rune
* Burrow Rune
* Teleport Rune
* Blood Rune
* Storm Rune
### Endgame Loot [#endgame-loot]
**Tables:**
* `minecraft:chests/end_city_treasure`
* `minecraft:chests/ancient_city`
* `minecraft:chests/bastion_treasure`
**Current Drops:**
* Cure Insomnia Rune
* Stealth Rune
* Burrow Rune
* Creative Flight Rune
* Teleport Rune
* Blood Rune
* Storm Rune
# Too Many Bows (/mods/too-many-bows)

This page documents the **38 bows** currently registered in **Too Many Bows** for Minecraft **26.1.2**, including their abilities, firing requirements, accessories, repair material, loot configuration, and compact per-bow configs.
Unless noted otherwise, a bow uses standard arrows. Some special bows replace
arrows with another resource, while Aurora's Grace and Dusk Reaper require
both arrows and their special material.
## Bow Abilities & Requirements [#bow-abilities--requirements]
| Bow | Ability / Effect | Ammo / Resource |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------- |
| **Aether's Call** | Impact creates an Aether Burst that levitates nearby enemies and grants the wielder Slow Falling. | Standard arrows |
| **Ancient Sage Bow** | Pierces **33% of armor defenses** by default. | Standard arrows |
| **Arc of the Heavens** | Calls down lightning when its arrow strikes an entity or lands in a block. | Standard arrows |
| **Arcane Bow** | Fires **3 arrows** in a configurable spread. | Standard arrows |
| **Astral Bound** | Arrows ricochet from blocks; the Ricochet enchantment increases the effect. | Standard arrows |
| **Aurora's Grace** | Celestial arrows open a damaging rift on entity or block impact. | **Arrow + Rift Shard** |
| **Beacon Beam Bow** | Direct hits release linking beacon energy that damages nearby enemies. | Standard arrows |
| **Burnt Relic** | Ancient high-velocity bow with infinite-arrow behavior and enhanced damage. | Standard arrow catalyst |
| **Crimson Nexus** | Consumes health to fire, then briefly drains nearby enemies and heals the wielder. | **Player health** |
| **Cyroheart Bow** | Fires icicle javelins that heavily slow targets and create ice effects on impact. | Standard arrows |
| **Dark Bow** | Fires a powerful Warden-like sonic projectile with heavy damage and knockback. | Standard arrows |
| **Demon's Grasp** | A configurable standard bow with no signature supernatural ability currently active. | Standard arrows |
| **Dragon's Breath** | Creates Dragon's Breath damage and an area cloud on impact. | Standard arrows |
| **Dusk Reaper** | Marks and debuffs enemies, creates spectral damage zones, and can cause marked enemies to explode on death. | **Arrow + Soul Fragment** |
| **Emerald Sage Bow** | Awards bonus experience on a killing blow by default; this can be configured to reward on hit. | Standard arrows |
| **Ethereal Hunter** | Creates its own ethereal arrow and consumes hunger instead of inventory arrows. | **1 hunger point** |
| **Frostbite** | Creates a frost burst that heavily slows the direct target and nearby enemies. | Standard arrows |
| **Gravewire Bow** | Fires twin arrows that curse targets, lash nearby enemies with necrotic chains, and create a grave bloom on kills. | Standard arrows |
| **Hunter's Bow** | Improves drops from supported passive mobs when it lands the killing blow. | Standard arrows |
| **Ironclad Bow** | Creates a magnetic vacuum on impact that pulls nearby entities toward the arrow. The owner is excluded by default. | Standard arrows |
| **Necro Flame Bow** | Applies Cursed Flame, blocks regeneration, resists extinguishing, burns targets, and deals damage over time. | Standard arrows |
| **Pyre's Embrace** | Ignites targets and creates a fiery burst that burns nearby enemies. | Standard arrows |
| **Radiance** | Creates a radiant damage burst, excludes allies, and deals increased damage to undead targets. | **5 experience points** |
| **Scatter Shot** | Fires **8 configurable pellets** in a wide cone while consuming only one arrow. | Standard arrows |
| **Sentinel's Wrath** | Deals increased damage to raid mobs such as pillagers, vindicators, and evokers. | Standard arrows |
| **Shulker's Blast** | Fires a homing shulker projectile that applies Levitation. | Standard arrows |
| **Solar Flare** | Impact creates a fiery solar tornado that burns and damages nearby enemies. | Standard arrows |
| **Soulhoard** | Stores souls from kills; fully charged shots spend stored souls to unleash empowered homing skulls. | Standard arrows |
| **Spectral Whisper** | Phases through the first block layer by default; the Spectral enchantment allows additional phases. | Standard arrows |
| **Tidal Bow** | Travels through water without normal arrow slowdown and applies strong water-binding Slowness. | Standard arrows |
| **Torchbearer** | Emits light while held, ignites entities, and places standing or wall torches on block impact. | Standard arrows |
| **Twin Shadows** | Fires two arrows together: one light arrow and one stronger dark arrow. | Standard arrows |
| **Vaultpiercer Bow** | Marks a target and opens arcane portals around it that fire follow-up homing arrows. | Standard arrows |
| **Verdant Vigor** | Grants a health boost while held and periodically regenerates nearby allies. | Standard arrows |
| **Verdant Viper** | Poisons direct targets and creates a poisonous area burst. | Standard arrows |
| **Vitality Weaver** | Heals the shooter for a configurable percentage of damage dealt. | Standard arrows |
| **Webstring** | Fires a five-arrow wide volley that slows targets while consuming one arrow. | Standard arrows |
| **Wind Bow** | Impact releases a gust that knocks enemies away and deals magic damage; nearby use grants Speed II and Slow Falling to the wielder. | Standard arrows |
## Special Firing Resources [#special-firing-resources]
| Bow | Requirement | Uses inventory arrows? |
| ------------------- | --------------------------------------------- | ---------------------- |
| **Aurora's Grace** | 1 Rift Shard per shot | Yes |
| **Dusk Reaper** | 1 Soul Fragment per shot | Yes |
| **Radiance** | 5 experience points per shot | No |
| **Crimson Nexus** | 2 health by default; cannot fire when too low | No |
| **Ethereal Hunter** | 1 hunger point per shot | No |
Creative-mode players bypass these resource costs.
## Attributes [#attributes]
Too Many Bows registers custom attributes that allow equipment and addon content to modify bow performance.
| Attribute | Description |
| --------------------------- | ---------------------------------------------------------------- |
| **Bow Draw Speed** | Higher values reduce the time required to fully draw bows. |
| **Bow Damage** | Multiplies projectile damage. |
| **Bow Critical Hit Chance** | Adds a chance for a projectile to receive bonus critical damage. |
## Trinkets and Curios [#trinkets-and-curios]
Fabric uses **Trinkets Continued** and NeoForge uses **Curios**.

| Accessory | Effect |
| ---------------------- | ------------------------------------------------------------------------------------------------- |
| **Dead Eyes Pendant** | Adds critical-hit chance. |
| **Windwoven Gloves** | Adds bow draw speed. |
| **Fletchers Talisman** | Gives bows a chance to avoid durability loss. |
| **Sharpshot Ring** | Adds bow damage. |
| **Stormbound Signet** | Adds a stronger bow-damage bonus. |
| **Soul Lantern** | Adds Gravewire damage, emits light, and greatly empowers Soulhoard's capacity and released souls. |
| **Cursed Lantern** | Adds Necro Flame damage and emits light. |
The five attribute accessories are included in the default loot configuration. The Soul Lantern and Cursed Lantern are registered equippable items, but they are not included in the default loot-item lists in this source build.
## Configuration Layout [#configuration-layout]
All configuration files are generated on first use.
| Config type | Path |
| ---------------------------- | ------------------------------------------------ |
| **Loot and global settings** | `config/too_many_bows.json` |
| **Individual bow configs** | `config/too_many_bows/bows/.json` |
| **Accessories and lanterns** | `config/too_many_bows/bows/all_accessories.json` |
There is one compact config for each of the **38 bows**. Most filenames match their item ID. Notable filename differences include:
* `necro_flame.json`
* `ironclad.json`
* `radiant.json`
* `sentinel_wrath.json`
* `soulhoard_bow.json`
### Compact bow configs [#compact-bow-configs]
The 26.1.2 configs intentionally expose gameplay-management settings rather than every technical implementation detail. Depending on the bow, configurable values may include:
* Base or direct-hit damage
* Projectile count, spread, velocity, or ricochet count
* Ability radius, target count, duration, and strength
* Status-effect duration and amplifier
* Healing, lifesteal, soul storage, chains, portals, or follow-up damage
Particle internals, sound pitch, entity lifetime, rendering details, and similar implementation settings remain internal.
> Existing oversized bow files are rewritten into the current compact schema when loaded. Make a manual backup before first launch if old expert-level values matter to you. The mod does not currently create timestamped migration backups automatically.
### Example: `aethers_call.json` [#example-aethers_calljson]
```json
{
"base_damage": 6.0,
"burst_radius": 4.0,
"owner_slow_falling_duration_ticks": 100,
"target_levitation_duration_ticks": 40,
"target_levitation_amplifier": 0
}
```
## Loot and Global Config [#loot-and-global-config]
The main config is:
```text
config/too_many_bows.json
```
It preserves the original **Easy**, **Medium**, **Hard**, and **Endgame** loot tiers. Each tier has:
* An enabled switch
* A drop chance
* A list of loot-table IDs
* A list of eligible item IDs
| Field | Default | Description |
| ---------------------------------------- | ------: | ---------------------------------------------------------------------------------- |
| `easyLootEnabled` | `true` | Enables Easy-tier injection. |
| `easyLootDropChance` | `0.5` | Easy-tier chance from `0.0` to `1.0`. |
| `mediumLootEnabled` | `true` | Enables Medium-tier injection. |
| `mediumLootDropChance` | `0.4` | Medium-tier chance from `0.0` to `1.0`. |
| `hardLootEnabled` | `true` | Enables Hard-tier injection. |
| `hardLootDropChance` | `0.3` | Hard-tier chance from `0.0` to `1.0`. |
| `endgameLootEnabled` | `true` | Enables Endgame-tier injection. |
| `endgameLootDropChance` | `0.2` | Endgame-tier chance from `0.0` to `1.0`. |
| `globalBowPullSpeed` | `16.0` | Base full-draw time in ticks. Lower values draw faster; higher values draw slower. |
| `globalBowPowerMultiplier` | `1.0` | Global damage multiplier applied in addition to individual bow configs. |
| `easyLootTables` / `easyLootItems` | Lists | Easy-tier chest sources and eligible items. |
| `mediumLootTables` / `mediumLootItems` | Lists | Medium-tier chest sources and eligible items. |
| `hardLootTables` / `hardLootItems` | Lists | Hard-tier chest sources and eligible items. |
| `endgameLootTables` / `endgameLootItems` | Lists | Endgame-tier chest sources and eligible items. |
### Default chest sources [#default-chest-sources]
| Tier | Chest sources |
| ----------- | -------------------------------------------------------------------- |
| **Easy** | Simple Dungeon, Abandoned Mineshaft |
| **Medium** | Jungle Temple, Pillager Outpost, Abandoned Mineshaft, Simple Dungeon |
| **Hard** | Stronghold Corridor, Nether Fortress, Bastion Treasure |
| **Endgame** | End City Treasure, Nether Fortress, Bastion Treasure |
Drop chances are clamped to the `0.0–1.0` range when the loot config is loaded.
## Accessories Config [#accessories-config]
The accessory config is:
```text
config/too_many_bows/bows/all_accessories.json
```
| Field | Default | Effect |
| --------------------------------- | ------: | -------------------------- |
| `deadEyesPendantCritBonus` | `0.08` | Critical-hit chance bonus |
| `drawSpeedGloveBonus` | `0.75` | Bow draw-speed bonus |
| `sharpshotRingBonus` | `0.15` | Bow-damage bonus |
| `stormboundSignetBonus` | `0.30` | Stronger bow-damage bonus |
| `soulLanternGravewireDamageBonus` | `6.0` | Gravewire damage bonus |
| `cursedLanternNecroDamageBonus` | `6.0` | Necro Flame damage bonus |
| `soulLanternLightLevel` | `12` | Soul Lantern light level |
| `cursedLanternLightLevel` | `12` | Cursed Lantern light level |
The Fletchers Talisman uses its built-in durability-saving behavior and has no numeric config entry.
## Reload Commands [#reload-commands]
These commands require game-master/operator permission.
| Command | Description |
| ------------------------- | ------------------------------------------------ |
| `/tmb reload` | Reloads bows, loot, and accessories. |
| `/tmb reload all` | Alias for reloading everything. |
| `/tmb reload bows` | Reloads all 38 bow configs. |
| `/tmb reload loot` | Reloads `config/too_many_bows.json`. |
| `/tmb reload accessories` | Reloads the Trinkets or Curios accessory config. |
A game restart is not required after running the relevant reload command.
## Power Crystal Repair [#power-crystal-repair]
The **Power Crystal** repairs Too Many Bows weapons.

1. Open an anvil.
2. Place the damaged bow in the first slot.
3. Place a Power Crystal in the second slot.
4. Take the repaired bow from the output slot.

## Special Items [#special-items]
| Item | Purpose |
| ------------------ | ------------------------------------------ |
| **Rift Shard** | Fuels Aurora's Grace. |
| **Soul Fragment** | Fuels Dusk Reaper. |
| **Power Crystal** | Repairs bows in an anvil. |
| **Cursed Stone** | Used for Necro Flame progression/crafting. |
| **Soul Lantern** | Gravewire and Soulhoard accessory. |
| **Cursed Lantern** | Necro Flame accessory. |
## Notes [#notes]
* Demon’s Grasp still intentionally has a minimal, lore-style tooltip and no signature ability.
* Bow behavior and balance values may differ when server owners edit the generated configs.
* Fabric requires Trinkets Continued; NeoForge requires Curios.
# VeroxLib (/mods/veroxlib)





**VeroxLib** is a **Architectury-based** library for Minecraft mods that introduces a fully extensible **Sanity System**.
It provides developers with an easy-to-use API for managing player mental states, triggering madness effects, and integrating sanity-related gameplay mechanics across **Fabric** and **NeoForge**.
## Overview [#overview]
VeroxLib allows mods to simulate psychological mechanics such as fear, corruption, hallucinations, or insanity without reinventing infrastructure.
## Features [#features]
### Global Sanity System [#global-sanity-system]
* Every player has a sanity value from `0.0` to `100.0`
* Sanity Loss in specific biome with the tag: `is_horror_biome`
### Modular Madness Effects [#modular-madness-effects]
* Register effects triggered by sanity thresholds
* Client or server execution support
### Custom Attributes [#custom-attributes]
VeroxLib automatically registers:
* `veroxlib:corruption`
* `veroxlib:sanity_resistance`
* `veroxlib:sanity_regen`
### Cross-Platform Support [#cross-platform-support]
Works on:
* Fabric
* NeoForge
via Architectury.
### Cultist System [#cultist-system]
Built-in support for **Cultist players**:
* Immune to sanity effects
* Ideal for factions, classes, or lore systems
## Installation [#installation]
### CurseMaven Setup [#cursemaven-setup]
Add the CurseMaven repository to your `build.gradle`.
```gradle
repositories {
maven {
url "https://www.cursemaven.com"
content {
includeGroup "curse.maven"
}
}
}
```
Add the dependency:
```gradle
dependencies {
modApi "curse.maven:PROJECT_ID:FILE_ID"
}
```
## Quick Start [#quick-start]
### Reading Player Sanity [#reading-player-sanity]
```java
float sanity = SanityAPI.getSanity(player);
```
### Modifying Sanity [#modifying-sanity]
```java
SanityAPI.modifySanity(player, -5.0f);
```
### Checking Cultist State [#checking-cultist-state]
```java
if (SanityAPI.isCultist(player)) {
}
```
## Developer Guide [#developer-guide]
### Creating Custom Sanity Effects [#creating-custom-sanity-effects]
Implement `ISanityEffect`.
Example: Door Creak hallucination.
```java
public class DoorCreakEffect implements ISanityEffect {
@Override
public float getThreshold() {
return 40.0f;
}
@Override
public void apply(Player player, float currentSanity) {
if (player.getRandom().nextFloat() < 0.05f) {
Vec3 pos = player.position().add(
(player.getRandom().nextDouble() - 0.5) * 10,
0,
(player.getRandom().nextDouble() - 0.5) * 10
);
player.level().playLocalSound(
pos.x,
pos.y,
pos.z,
SoundEvents.WOODEN_DOOR_OPEN,
SoundSource.AMBIENT,
0.4f,
0.5f + player.getRandom().nextFloat() * 0.3f,
false
);
}
}
@Override
public boolean isClientSide() {
return true;
}
}
```
### Adding Sanity Modifiers to Items [#adding-sanity-modifiers-to-items]
Items can influence sanity loss by implementing `ISanityModifier`.
```java
public class SanityCharmItem extends Item implements ISanityModifier {
@Override
public float getSanityResistance(ItemStack stack) {
return 0.5f;
}
}
```
## Attributes [#attributes]
| Attribute | Description |
| ---------------------------- | ------------------------------------------------- |
| `veroxlib:corruption` | Increases sanity loss speed |
| `veroxlib:sanity_resistance` | Controlls sanity loss (`1.0 = 100% resistance`) |
| `veroxlib:sanity_regen` | Controll sanity regen (`1.0 = 100% regeneration`) |
## Example Use Cases [#example-use-cases]
* Horror mods
* Psychological survival gameplay
* Lovecraftian mechanics
* Magic corruption systems
* RPG classes & factions
* Hallucination systems
## Compatibility [#compatibility]
| Loader | Supported |
| -------- | ----------- |
| Fabric | Yes |
| NeoForge | Yes |
| Forge | not planned |
| Quilt | Untested |
## Version Matrix [#version-matrix]
| Minecraft | VeroxLib |
| --------- | --------- |
| 1.21.1 | Supported |
| 1.21+ | Planned |
## Contributing [#contributing]
Contributions are welcome.
Recommended workflow:
1. Fork repository
2. Create feature branch
3. Implement changes
4. Submit Pull Request
Please keep API stability in mind.
## License [#license]
Licensed under the **MIT License**.
You may freely:
* Use in mods
* Include in modpacks
Attribution appreciated but not required.
## Support [#support]
If you encounter issues:
* Open a GitHub Issue
* Provide logs
* Include loader + Minecraft version
# Additional Origins (/modpacks/arcadia/additional-origins)
This guide covers the origins added by the custom **Lightweaver and RPG Origins datapack**. It follows the same format as the Medieval Origins Revival guide and is based on the origin, power, and function files contained in the datapack.
## Before You Choose [#before-you-choose]
* **Impact 1 — Low:** Easy to understand and close to normal Minecraft gameplay.
* **Impact 2 — Medium:** Noticeable strengths and weaknesses that affect everyday play.
* **Impact 3 — High:** A specialized or difficult playstyle that can substantially change survival.
* Active abilities normally use **Primary Active** or **Secondary Active**. Check **Options → Controls → Origins** and bind both keys before playing.
* Several RPG origins include bonuses for **Iron's Spells 'n Spellbooks**, **Too Many Bows**, **Alshanex's Familiars**, or **FamiliarsLib**. Those bonuses only work when the matching mod and attributes are available.
* These RPG origins are added directly to the normal origin-selection layer. Choosing one therefore takes the place of another normal origin unless a separate addon moves them into their own class or path layer.
## Playable Origins [#playable-origins]
| Origin | Impact | General Playstyle |
| --------------------------- | ------ | --------------------------------------------------------- |
| [Lightweaver](#lightweaver) | Medium | Mobile healing, support, and light magic |
| [Archer](#archer) | Medium | High ranged damage and arrow management |
| [Bard](#bard) | Medium | Group buffs, music, and spell support |
| [Brute](#brute) | High | Unarmed utility, natural defense, and target-based damage |
| [Cleric](#cleric) | Low | Healing, potions, villages, and support |
| [Knight](#knight) | Low | Reliable melee damage and damage reduction |
| [Mage](#mage) | Medium | Spellcasting, fireballs, and magical utility |
| [Thief](#thief) | High | Speed, invisibility, theft, and risky survival |
## Lightweaver [#lightweaver]
> **Impact:** Medium\
> **Best for:** Players who enjoy healing allies, supporting a group, and controlling an area with light magic.
Once human, the Lightweaver has become a divine being touched by holy light. Lightweavers have excellent vision and powerful healing abilities, but fewer hearts and an inability to wear Netherite armor.
### Abilities [#abilities]
* **Beacon of Light:** Press **Primary Active** to launch a shimmering orb in the direction you are facing. The orb can travel roughly 17 blocks. When it reaches an obstruction, it becomes a healing beacon for roughly 10 seconds; if it reaches its maximum distance without settling, it expires.
* The active beacon repeatedly grants **Regeneration II** to nearby players and non-hostile creatures within approximately 10 blocks.
* When the beacon settles, nearby entities receive **Night Vision** and **Glowing** for approximately 30 seconds.
* The orb's activation cooldown is **20 seconds**, and another orb cannot be created while one is active.
* The beacon creates particles and status effects rather than placing permanent light blocks.
* **Life Link:** Press **Secondary Active** to heal nearby players and owned creatures within 7 blocks.
* Each affected target is healed for **6 health**, equal to 3 hearts.
* The Lightweaver sacrifices **2 health**, equal to 1 heart, for every target healed.
* After using the ability, the Lightweaver receives **Speed I** for 5 seconds.
* The cooldown is **5 seconds**.
* **Blessed Vision:** Permanent full-strength night vision makes dark areas much easier to see.
* **Refraction:** Netherite helmets, chestplates, leggings, and boots cannot be equipped.
* **Weaker Constitution:** Maximum health is reduced by 4 health, leaving the Lightweaver with **8 hearts** before other modifiers.
* **Divine Presence:** The Lightweaver occasionally creates amethyst-like sounds and electric spark particles while standing still or walking. This is cosmetic.
### Common Questions [#common-questions]
Bind **Primary Active**, look where you want the orb to travel, and press the key. Aim it toward a wall, floor, or other obstruction so it can settle into a stationary healing area before reaching its maximum range.
No. It visually lights the area with particles and grants Night Vision, but it does not permanently alter block light levels.
Its repeated Regeneration effect is limited to players and non-hostile creatures. However, all nearby entities can receive the Glowing and Night Vision effects when the beacon settles. Because all players are valid healing targets, it can also heal enemy players during PvP.
The sacrifice is applied once for every valid target in range. Healing three nearby allies costs 3 hearts, while healing six costs 6 hearts. Check your health and the number of nearby players or pets before activating it.
The power data does not include a minimum-health safeguard. Using it around many targets while at low health can be dangerous.
Refraction directly blocks all four Netherite armor pieces. Other armor materials are allowed.
## Archer [#archer]
> **Impact:** Medium\
> **Best for:** Players who prefer bows, crossbows, ranged combat, and keeping specialized ammunition.
Archers deal exceptional projectile damage and have a personal quiver, but they have fewer hearts and perform poorly with attacks that are not fired as arrows.
### Abilities [#abilities-1]
* **Marksman:** Projectile attacks gain an additional 125% of their base damage before other modifiers, making arrows dramatically stronger than normal.
* **Too Many Bows Bonuses:** Bows from **Too Many Bows** receive +0.05 bow critical chance and +0.2 bow damage through that mod's attributes.
* **Inexperienced:** Damage that is not dealt by a Minecraft arrow is reduced by 50%.
* **Untrained:** Maximum health is reduced by 30% of the normal base value, leaving the Archer with **7 hearts** before other modifiers.
* **Resourceful:** When a fletching table is within 3 blocks, the normal arrow recipe produces **8 arrows instead of 4**.
* **Quiver:** The Archer has a recoverable five-slot hopper-style inventory named **Quiver**.
* Arrows, spectral arrows, and tipped arrows remain stored after death.
* Other items placed in the quiver are dropped on death.
### Common Questions [#common-questions-1]
Open the Origins power screen and use the key assigned to the Quiver inventory power. The exact key can vary with the installed Origins version and control configuration.
Standard crossbow shots use arrow projectiles and should benefit from the ranged powers. Custom bows or projectiles may behave differently if they do not use Minecraft's arrow projectile type.
Inexperienced halves non-arrow damage. The Archer is intentionally built around ranged combat rather than melee weapons.
A fletching table must be within a 3-block spherical radius when the arrow recipe is crafted.
You can, but non-arrow items are dropped when you die. Treat it as ammunition storage rather than a protected backpack.
## Bard [#bard]
> **Impact:** Medium\
> **Best for:** Players who enjoy buffing groups, using goat horns, supporting spellcasters, and staying mobile.
Bards use music to grant powerful area effects. They also support Sound and Nature spellcasting, but gain less experience and consume hunger more quickly.
### Abilities [#abilities-2]
* **Musical Talent:** Playing different goat horn instruments creates a different effect cloud for nearby entities.
* **Ponder:** Strength I for 25 seconds in a 10-block area. Cooldown: 50 seconds.
* **Sing:** Speed II for 37.5 seconds in a 10-block area. Cooldown: 87.5 seconds.
* **Feel:** Regeneration II for 62.5 seconds in a 10-block area. Cooldown: 50 seconds.
* **Admire:** Invisibility for 37.5 seconds in a 10-block area. Cooldown: 87.5 seconds.
* **Call:** Haste I for 62.5 seconds in a 10-block area. Cooldown: 87.5 seconds.
* **Dream:** Night Vision for 62.5 seconds in a 20-block area. Cooldown: 87.5 seconds.
* **Seek:** Glowing for 62.5 seconds in a 10-block area. Cooldown: 50 seconds.
* **Yearn:** Changes the weather to rain or thunder. The data gives rain a 75% chance and thunder a 25% chance. Cooldown: 125 seconds.
* **Musical Past:** Starts with a **Ponder Goat Horn** in the offhand.
* **Charismatic:** A support aura that is enabled by default and toggled with **Primary Active**.
* While active, other players between 1 and 20 blocks away continuously receive Speed I and Regeneration I.
* The aura does not target the Bard themself.
* **Decoy:** While at 5 health or less, equal to 2.5 hearts, the Bard gains Speed I.
* **Primordial Harmony:** Grants bonuses for compatible spell mods:
* +1 Sound spell power.
* +1 Nature spell power.
* +150 maximum mana.
* +30% total spell power.
* +15% mana regeneration.
* **Not the Smartest:** Experience gain is reduced by 35%.
* **More Exhaustion:** Hunger drains faster than normal.
### Common Questions [#common-questions-2]
Use the matching goat horn normally. The instrument stored in the horn's data determines which Bard effect activates.
Each vanilla goat horn instrument is assigned its own Bard power. The sound variant matters, not merely the item name.
No. The aura targets other players from 1 to 20 blocks away and excludes the Bard.
Press **Primary Active**. The toggle remembers its state.
Not the Smartest reduces all XP gains by 35%.
No. Those attributes require the matching spell and familiar libraries. Missing required attributes can also create datapack loading errors depending on the installed mod set.
## Brute [#brute]
> **Impact:** High\
> **Best for:** Players who enjoy aggressive melee combat, unusual healing rules, and fighting large monsters.
Brutes are built to overpower durable enemies. They are especially effective against creatures with very high maximum health, but struggle against small targets and cannot rely on normal passive regeneration while standing still.
### Abilities [#abilities-3]
* **Select Targets — Large Enemies:** Damage is doubled against targets with at least **50 maximum health**.
* **Select Targets — Small Enemies:** Damage is reduced by 65% against targets with less than **15 maximum health**.
* **No Time to Rest:** Natural health regeneration is disabled unless the Brute is sprinting.
* **Strong Arms:** The origin references powers that allow Brutes to break stone with their fists and improve unarmed block breaking.
* **Natural Armor:** The origin references a built-in armor bonus that provides protection without equipment.
* **No Shield:** Brutes cannot use shields.
### Common Questions [#common-questions-3]
The check uses the target's maximum health, not its current health. Anything with 50 maximum health or more receives the Brute's doubled damage.
Targets with less than 15 maximum health receive 65% less damage from the Brute. Targets from 15 through 49 maximum health receive neither modifier.
No Time to Rest disables natural regeneration whenever you are not sprinting. Sprint while sufficiently fed to allow natural healing.
Yes. The restriction applies to natural regeneration, not direct healing from potions, commands, or support abilities.
Those power IDs are referenced by the Brute origin but their JSON files are not contained in this archive. They are expected to be supplied by the installed base version of RPG Origins. See [Datapack Integration Notes](#datapack-integration-notes).
## Cleric [#cleric]
> **Impact:** Low\
> **Best for:** Players who enjoy villages, potion effects, healing groups, and avoiding direct combat.
Clerics are dedicated support characters. Villagers favor them, helpful potion effects last longer, and they can create a healing pool, but they have fewer hearts and cannot naturally regenerate in the Nether.
### Abilities [#abilities-4]
* **Village Friendly:** Permanently receives Hero of the Village I, granting the normal reputation and trading benefits associated with that effect.
* **Brewer:** Speed, Regeneration, Jump Boost, and Strength effects last **50% longer**.
* **Heal Pool:** Press **Primary Active** to create a 5-block regeneration cloud.
* The cloud applies **Regeneration III** to any mob that enters it.
* Its radius shrinks by 0.5 block when used.
* Cooldown: **50 seconds**.
* **Forgivable:** Immune to Bad Omen and therefore unable to start raids through the normal Bad Omen method.
* **Pure:** Natural regeneration is disabled while in the Nether. The Cleric's model also changes color and shakes while corrupted by the dimension.
* **One With the World:** Direct sunlight rapidly reduces accumulated insomnia, helping prevent Phantom spawns.
* **Untrained:** Maximum health is reduced to **7 hearts** before other modifiers.
### Common Questions [#common-questions-4]
No. The power has no ally or hostility filter and can grant Regeneration to any mob that enters the cloud, including hostile creatures.
Only Speed, Regeneration, Jump Boost, and Strength are modified by Brewer.
Pure disables natural regeneration for the entire time the Cleric is in the Nether. Direct healing and regeneration effects can still work.
Not through the normal Bad Omen effect, because Forgivable makes the Cleric immune to it.
Untrained reduces the standard 20 health to 14 health, equal to 7 hearts.
## Knight [#knight]
> **Impact:** Low\
> **Best for:** Players who want straightforward melee bonuses, reliable defense, and familiar Minecraft combat.
Knights are durable front-line fighters. Their abilities are simple and dependable, though their increased exhaustion requires them to carry more food.
### Abilities [#abilities-5]
* **Durable:** Every incoming hit is reduced by 1 damage, equal to half a heart, before later combat calculations.
* **Trained:** All outgoing damage is increased by 10%.
* **Prepared:** Starts with a shield equipped in the offhand.
* **More Exhaustion:** Hunger drains faster than normal.
### Common Questions [#common-questions-5]
No. It subtracts a flat 1 damage from each hit. It is especially noticeable against frequent low-damage attacks.
The modifier applies to damage dealt generally and is not limited to swords or melee attacks.
Prepared is starting equipment, not an automatically replenished item. Whether it is restored after changing origins or respawning depends on the Origins implementation and server rules.
The Knight inherits the standard More Exhaustion drawback from Origins.
## Mage [#mage]
> **Impact:** Medium\
> **Best for:** Players who want strong spell statistics, magical utility, and a ranged explosive ability.
Mages are powerful spellcasters with extra mana and spell power. They resist several harmful effects and can walk on water with a special focus item, but have low health and reduced conventional damage.
### Abilities [#abilities-6]
* **Spell Power:** Grants compatible Iron's Spells 'n Spellbooks bonuses:
* +250 maximum mana.
* +40% total spell power.
* +25% mana regeneration.
* +1 Holy spell power.
* +1 Ice spell power.
* +1 Evocation spell power.
* **Evocation:** Adds another +1 Evocation spell power, for **+2 Evocation spell power in total** when both Mage powers load.
* **Fireball:** Press **Primary Active** to launch a fireball with explosion power 2. Cooldown: **75 seconds**.
* **Fast Cure:** Immune to Poison, Weakness, and Slowness.
* **Water Walk:** Hold a **Heart of the Sea in the main hand** to stand and walk on water.
* **Unwieldly:** All ordinary damage dealt is reduced by 25%.
* **Untrained:** Maximum health is reduced to **7 hearts** before other modifiers.
### Common Questions [#common-questions-6]
Bind and press **Primary Active** while facing the intended direction. The fireball can damage terrain if explosions and mob-griefing rules allow it.
The Heart of the Sea must be held in the **main hand**. Holding it in the offhand does not satisfy the power condition.
It modifies damage dealt generally, while the spell attributes separately increase compatible spell power. The final result can depend on how the spell mod calculates its damage source.
The origin includes Evocation in the main Spell Power group and also adds a second standalone Evocation modifier.
No. The referenced attributes must exist for the powers to load and function correctly.
## Thief [#thief]
> **Impact:** High\
> **Best for:** Players who enjoy stealth, permanent speed, risky escape tools, and morally questionable village interactions.
Thieves are fast and difficult to detect while crouching, but their stealth prevents effective attacks, their health is reduced, and healing becomes weaker when they are critically injured.
### Abilities [#abilities-7]
* **Speedy:** Permanently receives Speed I.
* **Stealthy:** Becomes invisible while crouching. Worn armor is also hidden.
* **Stealth Attack Restriction:** While crouching, the Thief receives an extreme Weakness effect. It remains for approximately 3 seconds after the Thief stops crouching, preventing immediate attacks from invisibility.
* **Better Unnoticed:** Maximum health is reduced by 20%, leaving the Thief with **8 hearts** before other modifiers.
* **No Shield:** Shields cannot be used.
* **Thefty:** Killing a villager grants 3 emeralds. Cooldown: **100 seconds**.
* **Uneasy Alliance:** Killing an iron golem is intended to apply Bad Omen and start a raid when the kill occurs in a valid village.
* **Weak:** Healing received while below 6 health, equal to 3 hearts, is reduced by 50%.
### Common Questions [#common-questions-7]
The Weakness effect lasts for approximately 3 seconds after crouching ends. This is an intentional delay that prevents easy invisible ambushes.
The invisibility power is intended to hide the Thief from players and mobs. Some modded creatures, boss mechanics, particles, held items, or external detection systems may still reveal the player.
It has a 100-second cooldown. Villager kills during that cooldown do not grant another set of 3 emeralds.
Below 3 hearts, Weak cuts incoming healing in half. Escape before attempting to recover whenever possible.
No. The origin references the standard No Shield power.
## General FAQ [#general-faq]
### Which controls should players bind? [#which-controls-should-players-bind]
At minimum, bind **Primary Active** and **Secondary Active** under the Origins control category. Lightweaver uses both; Bard uses Primary Active for Charismatic; Cleric and Mage use Primary Active for Heal Pool and Fireball.
### Why does an origin appear with a missing or invalid icon? [#why-does-an-origin-appear-with-a-missing-or-invalid-icon]
Some icons use modded items:
* Archer uses `too_many_bows:arcane_bow`.
* Bard uses `alshanex_familiars:bard_harp`.
* Mage uses `irons_spellbooks:necronomicon_spell_book`.
If the corresponding item is not registered, the origin file may fail to load rather than simply displaying a missing texture.
### Can these origins be used without the listed content mods? [#can-these-origins-be-used-without-the-listed-content-mods]
Lightweaver's core files are self-contained apart from Origins/Apoli and Pehkui commands used by the beacon setup. The modified RPG origins include attributes and icons from other mods, so they should be used with the same mod set for which the datapack was created.
### Why does an ability description differ from its actual value? [#why-does-an-ability-description-differ-from-its-actual-value]
This guide uses the values in the JSON rather than relying only on the display text. For example, the Brute's small-target threshold is less than 15 maximum health in this datapack, and the Mage receives two separate Evocation bonuses.
### Do cooldowns continue while an ability is inactive? [#do-cooldowns-continue-while-an-ability-is-inactive]
Yes. Normal Origins cooldown resources refill over time. Cooldown bars may only appear while the relevant power is selected or recently used, depending on the HUD configuration.
## Datapack Integration Notes [#datapack-integration-notes]
The archive directly adds all eight origins to the normal `origins:origin` selection layer with `replace: false`, meaning they are added alongside origins supplied by other installed packs.
The following referenced RPG power files are **not present inside this archive**:
* `rpg_origins:charismatic_switch_effect`
* `rpg_origins:charismatic_hunger`
* `rpg_origins:no_shield`
* `rpg_origins:strong_arms`
* `rpg_origins:strong_arms_break_speed`
* `rpg_origins:natural_armor`
These are expected to come from the installed base RPG Origins addon or another datapack using the same namespace. Without that supporting content, the game may report **unregistered power** errors, and the affected Bard, Brute, or Thief features may not work.
The Lightweaver setup file also contains placeholder commands named `COMMANDHERE`. Invalid placeholder commands may create log warnings when the origin is added or removed, even though the visible Lightweaver powers can still be present.
# Common Questions (/modpacks/arcadia/common_questions)
## FTB Ultimine [#ftb-ultimine]
The **Vein Mining enchantment has been removed** and replaced with **FTB
Ultimine**. You no longer need an enchantment to mine multiple connected
blocks.
## How to Use Ultimine [#how-to-use-ultimine]
1. Equip the correct tool for the block you want to break.
2. Hold the **Grave/Backtick key**: `` ` ``
3. Break the block while continuing to hold the key.
The default Ultimine key is located directly below `Esc` and to the left of the `1` key on most keyboards.
Blocks selected by Ultimine will be outlined before you break them, allowing you to preview what will be mined.
You must keep holding the Ultimine key while breaking the block.
## Changing the Keybind [#changing-the-keybind]
The Ultimine key can be changed through Minecraft's controls menu:
1. Open **Options**.
2. Select **Controls**.
3. Select **Key Binds**.
4. Search for `Ultimine`.
5. Change the key to your preferred button.
Check for conflicting keybinds if Ultimine does not activate.
## Selecting an Ultimine Shape [#selecting-an-ultimine-shape]
FTB Ultimine includes several mining shapes for different situations.
To change shapes:
1. Hold the Ultimine key.
2. Hold **Shift** to sneak.
3. Scroll with the mouse wheel.
The currently selected shape will appear in the Ultimine panel.
### Available Shapes [#available-shapes]
| Shape | Description |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Shapeless** | Selects connected matching or compatible blocks. This is the best option for ores, trees, and most vein-mining situations. |
| **Small Tunnel** | Mines a straight 1-block-wide tunnel. |
| **Large Tunnel** | Mines a straight 3×3 tunnel. |
| **Small Square** | Mines a 3×3 area. |
| **Mining Tunnel** | Mines downward in a staircase pattern. |
| **Escape Tunnel** | Mines upward in a staircase pattern. |
For normal vein mining, make sure **Shapeless** is selected.
## What Can Ultimine Do? [#what-can-ultimine-do]
Ultimine is useful for more than mining ores.
### Mining [#mining]
Hold the Ultimine key while breaking connected blocks such as:
* Ore veins
* Stone
* Dirt
* Sand
* Gravel
* Other compatible blocks
### Chopping Trees [#chopping-trees]
Hold the Ultimine key while breaking a log with an axe to cut connected logs.
Be careful around buildings or decorations made from logs, since connected logs may also be selected.
### Harvesting Crops [#harvesting-crops]
Hold the Ultimine key and **right-click a mature crop** to harvest multiple crops.
This can also work with crops such as:
* Wheat
* Carrots
* Potatoes
* Beetroot
* Cocoa Beans
* Sweet Berries
* Compatible modded crops
### Tilling Farmland [#tilling-farmland]
Hold the Ultimine key while using a hoe on dirt or grass to till multiple blocks at once.
### Creating Paths [#creating-paths]
Hold the Ultimine key while using a shovel on dirt or grass to create multiple path blocks.
### Stripping Logs and Scraping Copper [#stripping-logs-and-scraping-copper]
Ultimine can also apply certain axe actions to multiple blocks, including:
* Stripping connected logs
* Scraping oxidation from copper
* Removing wax from copper
## Limits and Tool Durability [#limits-and-tool-durability]
By default, Ultimine can affect up to **64 blocks in one operation**.
Ultimine does not make your tools indestructible. Mining many blocks at once can consume a large amount of durability, so watch the durability of your tool carefully.
Using Ultimine with a nearly broken tool may result in fewer blocks being mined than expected.
## Why Isn't Ultimine Working? [#why-isnt-ultimine-working]
### Nothing Happens When I Hold the Key [#nothing-happens-when-i-hold-the-key]
Check the following:
* Make sure the Ultimine key is not conflicting with another keybind.
* Confirm that you are holding the key while breaking the block.
* Try changing the key under **Options → Controls → Key Binds**.
* Make sure you have the correct tool equipped.
### Only One Block Is Selected [#only-one-block-is-selected]
Make sure the selected shape is **Shapeless**.
Also check that:
* The blocks are connected.
* The blocks are considered the same or compatible block type.
* Your tool can correctly mine the selected blocks.
* Your tool has enough durability remaining.
### The Wrong Area Is Selected [#the-wrong-area-is-selected]
Stop before breaking the block and check the white selection outline.
Change to a different shape by holding:
* The Ultimine key
* `Shift`
* The mouse wheel
### Ultimine Selects Part of My Building [#ultimine-selects-part-of-my-building]
Ultimine can select connected blocks used in structures, especially logs, stone, dirt, or other repeated materials.
Always inspect the selection outline before breaking anything near your base.
## Version 3.6.0 Change [#version-360-change]
Beginning with modpack version **3.6.0**:
* The **Vein Mining enchantment was removed**.
* **FTB Ultimine was added**.
* Vein mining is now available through the Ultimine keybind.
* No enchantment is required.
* The default Ultimine settings are being used.
Hold the `` ` `` key while mining to get started.
# Enigmatic Legacy (/modpacks/arcadia/enigmatic_legacy)
**Enigmatic Legacy** is a magic, relic, and progression-focused mod that expands Minecraft with powerful artifacts, mysterious accessories, and dungeon loot. It introduces rare relics with both incredible power and severe consequences.
## Core Features [#core-features]
### Relics & Ancient Artifacts [#relics--ancient-artifacts]
Enigmatic Legacy introduces rare relic items found through exploration, boss fights, or dangerous locations. These artifacts provide strong passive or active effects, often balanced by risk, rarity, or curses.
Some relics may:
* Boost combat capabilities
* Change movement behavior
* Modify damage resistance
* Provide offensive or defensive magic abilities
### Accessories & Curios [#accessories--curios]
The mod integrates with the **Curios API**, adding wearable accessories such as:
* Rings
* Amulets
* Spellstones
* Charms
* Relics
Each accessory can greatly alter your playstyle, allowing for specialized combat builds such as:
* Spell-focused builds
* Tank builds
* Agile or mobility builds
* Risk–reward cursed builds
Some Curio slots unlock dynamically or require progression.
### Magic & Spellstones [#magic--spellstones]
Enigmatic Legacy introduces magical stones known as **Spellstones**, which grant powerful passive or conditional abilities. These typically work only when equipped and may have cooldowns, conditions, or special triggers.
Spellstones often provide:
* Defensive effects
* Utility buffs
* Unique mechanics (teleportation, shielding, damage conversion, etc.)
### Exploration & Dungeon Loot [#exploration--dungeon-loot]
The mod heavily encourages exploration by adding high-tier items primarily through dungeon loot rather than simple crafting.
You’ll find rare relics in:
* Strongholds
* Bastions
* End Cities
* Custom structures
* Boss encounters
* High-risk environments
Many of the mod’s best items *cannot* be crafted easily.
### The Acknowledgment (In-Game Guidebook) [#the-acknowledgment-in-game-guidebook]
The mod provides an in-game guide called **The Acknowledgment**, which keeps track of:
* Discovered items
* Relic lore
* Crafting knowledge
* Unlockable progression
As you obtain new items or discover content, more information becomes available in the book.
## The Ring of Seven Curses [#the-ring-of-seven-curses]
The **Ring of Seven Curses** is one of the most infamous and powerful relics in Enigmatic Legacy.
It represents the mod’s core philosophy: **power through sacrifice**.
This ring is a Hidden Quest item you would want to grab at the start of your adventure to begin a Hardcore run. ( See Starter Quest Chapter )
Once equipped, the player is afflicted with **seven powerful curses**, each weakening or restricting them in dangerous ways.
In exchange, the wearer gains an overwhelming power boost, the ring CAN NOT be removed!

### Warning to Players [#warning-to-players]
⚠️ **This ring is not for beginners.**\
Equipping it without proper preparation or gear may lead to repeated deaths, resource loss, and brutal combat difficulty.
# Arcadia (/modpacks/arcadia)

Arcadia is an RPG adventure modpack: choose an origin, level your skills, and work through the quest acts and the bosses each one requires.
## Guides [#guides]
## Playing With Friends [#playing-with-friends]
Arcadia has an official server hosted by Valhalla. You can join at `arc.valhallamc.io`.
To host your own multiplayer server, see the [Server Hosting Guide](/server-hosting-guide).
Alternatively, you can play with others by adding them as Friends from the in-game Multiplayer tab, then hitting Open to Friends in the pause menu while inside a world.
# Leveling Guide (/modpacks/arcadia/leveling_guide)
## Skill Level Gates – Progression Overview [#skill-level-gates--progression-overview]
Some skill levels are **locked behind progression milestones**.\
To advance past these levels, you must complete the listed **advancements**.
If a level is not listed, it has **no special progression requirement**.
## Attack Skill Gates [#attack-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | ----------------------------------- |
| **5** | minecraft:story/smelt\_iron |
| **10** | minecraft:story/upgrade\_tools |
| **15** | minecraft:nether/root |
| **25** | minecraft:nether/obtain\_blaze\_rod |
| **30** | minecraft:story/enter\_the\_end |
| **35** | minecraft:end/kill\_dragon |
| **49** | cataclysm:kill\_all\_bosses |
## Defense Skill Gates [#defense-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | --------------------------------- |
| **10** | minecraft:story/enchant\_item |
| **25** | minecraft:nether/netherite\_armor |
## Mining Skill Gates [#mining-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | ----------------------------------------------------------------------- |
| **5** | minecraft:story/upgrade\_tools |
| **40** | minecraft:story/mine\_diamond, minecraft:nether/obtain\_ancient\_debris |
## Building Skill Gates [#building-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | ----------------------------- |
| **5** | minecraft:story/smelt\_iron |
| **10** | minecraft:story/enchant\_item |
| **15** | minecraft:adventure/trade |
| **25** | minecraft:end/find\_end\_city |
| **30** | minecraft:end/elytra |
## Farming Skill Gates [#farming-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | ------------------------------- |
| **5** | minecraft:husbandry/plant\_seed |
| **30** | minecraft:end/dragon\_breath |
## Gathering Skill Gates [#gathering-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | -------------------------------- |
| **5** | minecraft:adventure/kill\_a\_mob |
| **10** | minecraft:adventure/shoot\_arrow |
## Agility Skill Gates [#agility-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | --------------------------------------------- |
| **10** | paraglider:paraglider |
| **30** | too\_many\_bows:necro\_bow |
| **40** | minecraft:adventure/fall\_from\_world\_height |
## Magic Skill Gates [#magic-skill-gates]
| Target Level | Advancement Requirement |
| ------------ | --------------------------------------------------------------------- |
| **10** | irons\_spellbooks:make\_inscription\_table |
| **15** | irons\_spellbooks:make\_arcane\_anvil |
| **20** | minecraft:nether/obtain\_blaze\_rod |
| **25** | paraglider:pray\_to\_the\_goddess |
| **30** | minecraft:end/kill\_dragon, irons\_spellbooks:spell\_book\_dead\_king |
| **49** | darkdoppelganger:kill |
# Medieval Origins Revival (/modpacks/arcadia/medieval-origins)
This guide covers the origins included in **Medieval Origins Revival 6.7.8 for Forge 1.20.1**. It is based on the powers and English descriptions contained in the mod files. Arcadia RPG does not change or alter any origins.
## Before You Choose [#before-you-choose]
* **Impact 1 — Low:** Easy to understand and close to normal Minecraft gameplay.
* **Impact 2 — Medium:** Noticeable strengths and weaknesses that affect everyday play.
* **Impact 3 — High:** A specialized or difficult playstyle that may substantially change survival.
* Active abilities use the **Primary Active**, **Secondary Active**, or **Medieval Origins: Tertiary Active** keybinds. Check **Options → Controls** and bind all three before playing.
* Some abilities activate through normal actions such as sneaking, jumping, right-clicking, holding a specific item, drawing a bow, entering water, or standing in a certain biome.
* A cooldown bar near the HUD shows when many active abilities are ready again.
## Important Enchantments [#important-enchantments]
### Featherweight [#featherweight]
Featherweight can be applied to heavy armor to prevent movement penalties for **Alfiq, Arachnae, Elves, and winged origins**. It does not remove every material-specific restriction; for example, Fae still cannot tolerate iron or silver armor.
### Mirroring [#mirroring]
Mirroring is a helmet enchantment that protects the wearer from a **Gorgon's Petrifying Gaze**. It also prevents **Dwarf sunlight blindness**.
## Playable Origins [#playable-origins]
| Origin | Impact | General Playstyle |
| ------------------------------- | ------ | ----------------------------------------------------- |
| [Alfiq](#alfiq) | Low | Agile, unarmed, feline rogue |
| [Arachnae](#arachnae) | Medium | Climbing, poison, and crowd control |
| [Banshee](#banshee) | High | Phasing, disruption, and cursed equipment |
| [Dwarf](#dwarf) | Medium | Mining and underground survival |
| [Fae](#fae) | High | Support magic, farming, and hovering |
| [Goblin](#goblin) | Low | Gold equipment, luck, and speed |
| [Gorgon](#gorgon) | High | Petrification, poison, and revenge damage |
| [High Elf](#high-elf) | Medium | Item-channelled magic and mana |
| [Incubus](#incubus) | Medium | Fire, Nether bonuses, and risky damage buffs |
| [Moon Elf](#moon-elf) | High | Darkness, stealth, dodging, and daggers |
| [Ogre](#ogre) | High | Axes, durability, size, and rage |
| [Pixie](#pixie) | Medium | Tiny size, unusual flight, luck, and mischief |
| [Plague Victim](#plague-victim) | High | Passive disease damage and survival through suffering |
| [Revenant](#revenant) | High | Undead summons, life siphoning, and necromancy |
| [Siren](#siren) | Medium | Aquatic survival, regeneration, and control |
| [Valkyrie](#valkyrie) | Medium | Flight, healing, and anti-undead combat |
| [Wood Elf](#wood-elf) | Low | Archery, mobility, and forest stealth |
| [Yeti](#yeti) | Medium | Ice control, high health, and cold-biome bonuses |
## Alfiq [#alfiq]
> **Impact:** Low\
> **Best for:** Players who enjoy speed, unarmed combat, sneaking, and unusual movement.
Alfiq are agile anthropomorphic felines. They are strongest when fighting with empty hands and moving lightly, but handled weapons, tools, and heavy armor are less effective for them.
### Abilities [#abilities]
* **Clawed:** Empty-handed attacks deal additional damage. Claws also allow wall climbing and clinging to steep surfaces. Wall climbing can be toggled with **Secondary Active**.
* **Poor Grip:** Tools break blocks more slowly, and handled weapons such as swords and axes deal reduced damage.
* **Agile Preference:** Light armor is preferred. Heavy armor causes a penalty unless it has **Featherweight**.
* **On Your Feet:** Look directly downward while landing to completely avoid fall damage.
* **Crepuscular:** Movement and attack speed increase near sunrise and sunset. Alfiq are slightly slower during the rest of the day and night.
* **Pickpocket:** Sneak behind a villager with empty hands and right-click to attempt to steal emeralds. The attempt can fail and may have consequences. Player pickpocketing is also supported by the power data.
* **Pounce:** Sneak briefly to charge the meter, then jump to leap forward. Hitting an enemy during the pounce deals bonus damage.
* **Carnivore:** Alfiq require meat-based food.
* **Velvet Paws:** Footsteps do not create normal step vibrations.
* **Scare Creepers:** Creepers are frightened by Alfiq.
* **Meow:** Press **Primary Active** to meow.
### Common Questions [#common-questions]
Press **Secondary Active** to toggle the climbing portion of Clawed, then move against a wall.
Poor Grip intentionally reduces damage with handled weapons. Empty-handed claw attacks are the origin's intended melee option.
Remain crouched until the charge meter is almost full, then jump. The meter drains when you stop sneaking.
Yes, but it causes a penalty unless the armor has the **Featherweight** enchantment.
## Arachnae [#arachnae]
> **Impact:** Medium\
> **Best for:** Players who enjoy wall climbing, poison, dark environments, and trapping enemies.
Arachnae combine humanoid weapon use with spider-like movement and venom. Their combat control is strong, but they eat more, have reduced health, and struggle with heavy armor.
### Abilities [#abilities-1]
* **Climber:** Climb walls using the fine bristles on your legs. Toggle climbing with **Secondary Active**.
* **Many Eyes:** Gain excellent low-light vision. Toggle it with **Medieval Origins: Tertiary Active**.
* **Venomous Bite:** Attacks have a chance to inflict Poison.
* **Web Slinger:** Press **Primary Active** to immobilize nearby opponents in webs. The base cooldown is approximately 30 seconds.
* **Bottomless Stomach:** Hunger drains more quickly than it does for humans.
* **Brittle:** Armor heavier than iron hinders movement. **Featherweight** prevents this penalty.
* **Fragile:** Maximum health is slightly lower than a human's.
* **Carnivore:** Only meat-based foods provide proper nourishment.
* **Master of Webs:** Cobwebs do not hinder Arachnae in the same way they hinder ordinary creatures.
* **Arthropod:** Arachnae count as arthropods and are vulnerable to effects intended for that creature group, including Bane of Arthropods.
### Common Questions [#common-questions-1]
Bind **Medieval Origins: Tertiary Active** in the controls menu. Many players have Primary and Secondary bound but forget the mod's third active key.
Treat it as normal crowd control rather than a boss-disable ability. Bosses and specially tagged creatures may resist control effects.
Armor above iron weight triggers Brittle. Apply **Featherweight** or return to lighter armor.
Yes. Bottomless Stomach increases exhaustion, and Carnivore limits useful food choices.
## Banshee [#banshee]
> **Impact:** High\
> **Best for:** Players who want phasing, area disruption, cursed equipment, and a radically different hunger system.
Banshees are fragile spirits that draw energy from moonlight rather than food. Their ability to become spectral is powerful, but they have only half normal health and cannot tolerate suppressive metals.
### Abilities [#abilities-2]
* **Spectral:** Press **Secondary Active** to become intangible. While spectral, you can move through the physical world but cannot interact normally. It consumes substantial energy and cannot be activated while your hunger resource is too low. The base cooldown is approximately 45 seconds.
* **Preemptive Elegy:** Press **Primary Active** to unleash a shriek that pushes nearby entities away, creates a protective circle, and disorients directly hit targets. The base cooldown is approximately 40 seconds.
* **Lunar Nexus:** Food does not restore hunger. Direct moonlight restores your energy instead. You cannot die from starvation.
* **Dimeritium Shackles:** Iron, silver, and other magically suppressive metals are intolerable as equipment.
* **Hexed:** Attackers have a small chance to receive a deadly curse when they hit you.
* **Immaterial:** Maximum health is half that of a normal human.
* **Cursed Sigil:** Cursed weapons deal increased damage in your hands.
* **Cursed Ward:** Each piece of cursed armor increases your damage resistance.
* **Sleepless:** When the corresponding survival compatibility is active, Banshees do not need or cannot use normal sleep mechanics.
### Common Questions [#common-questions-2]
That is Lunar Nexus. Stand where the night sky and moonlight can reach you. A roof, cave, or daytime sky will not provide the same energy.
No. Spectral is primarily for movement, escape, scouting, and passing through obstacles. Interaction is intentionally restricted while intangible.
Dimeritium Shackles rejects magically suppressive metals. This is a material restriction, not merely a heavy-armor penalty.
Immaterial halves normal health. Cursed armor can offset some of that weakness through Cursed Ward.
## Dwarf [#dwarf]
> **Impact:** Medium\
> **Best for:** Miners, cave builders, and players who spend most of their time underground.
Dwarves mine quickly, see in darkness, and fit into very small tunnels. They are poorly suited to sunlight and water.
### Abilities [#abilities-3]
* **Dwarven Tech:** Mine stone without a pickaxe and mine blocks faster than ordinary players.
* **Stocky:** Your short, broad body can fit inside one-block-high tunnels.
* **Nocturnal Eyes:** Press **Secondary Active** to toggle vision in complete darkness.
* **Darkness Dweller:** Direct sunlight temporarily blinds you. A gold helmet or a helmet enchanted with **Mirroring** prevents this.
* **Dense:** You sink rapidly in water and cannot swim normally.
* **Potent Brew:** Press **Primary Active** to drink a restorative brew and fully recover health. The base cooldown is approximately three minutes.
* **Mythril Resonance:** Powerful compatible metals associated with Dwarven crafting may provide additional strength. This is implemented as a hidden supporting power and depends on available tagged equipment.
### Common Questions [#common-questions-3]
Wear a gold helmet or any helmet with **Mirroring**.
Dense makes Dwarves sink. Use boats, ladders, water elevators designed around the restriction, or avoid deep water.
No. It lets you mine stone without a pickaxe and improves mining speed, but proper tools are still needed for many drops and specialized blocks.
No. It has a long cooldown of roughly three minutes.
## Fae [#fae]
> **Impact:** High\
> **Best for:** Support players, farmers, healers, and players who prefer mobility over durability.
Fae are small magical woodland beings. They can hover, heal allies, fertilize plants, and resist magic, but have low health and attract attention from far away.
### Abilities [#abilities-4]
* **Wings:** Press **Primary Active** to toggle levitation or hovering. ( Disabled in Arcadia RPG)
* **Nature's Blessing:** Press **Medieval Origins: Tertiary Active** to channel life energy for a short period. While active, you automatically plant seeds on stepped-on farmland and repeatedly heal and cleanse nearby allies. The base cooldown is approximately 45 seconds.
* **Nourishment:** Press **Secondary Active** to fertilize plants in a wide area around you. The base cooldown is approximately 15 seconds.
* **Forest Kin:** Regenerate health more effectively while inside forest biomes.
* **Nature's Ward:** Immune to Poison and Nausea and resistant to magical damage.
* **Allure:** Hostile and neutral mobs can notice and pursue you from farther away.
* **Diminutive:** Fae are much shorter than humans.
* **Magical Suppression:** Iron and silver equipment suppress Fae magic and cannot be worn comfortably.
* **Fragile Frame:** Maximum health is lower than a human's.
### Common Questions [#common-questions-4]
Allure greatly increases the range from which mobs can target a Fae. Use height, hovering, forests, and allies to compensate.
Bind and press **Medieval Origins: Tertiary Active** for Nature's Blessing. Secondary Active is the plant-fertilizing burst.
Its healing pulse checks allied relationships. It is intended to support you and your allies rather than every nearby entity.
Featherweight can address weight penalties, but Magical Suppression is a separate material aversion. Iron and silver remain unsuitable.
## Goblin [#goblin]
> **Impact:** Low\
> **Best for:** Loot-focused players who enjoy gold equipment, speed, and a small character model.
Goblins turn normally fragile gold equipment into a practical playstyle. They are quick and lucky but physically frail.
### Abilities [#abilities-5]
* **Greedy:** Golden weapons, tools, and armor provide special bonuses.
* **Careful Hoarder:** Gold equipment loses durability much more slowly in a Goblin's hands.
* **Cunning:** Increased Luck improves the chance of finding rare loot in systems that use the Luck attribute.
* **Nimble:** Increased movement speed.
* **Stunted:** Goblins are less than half normal human height.
* **Frail:** Reduced maximum health and increased vulnerability to damage.
### Common Questions [#common-questions-5]
Yes. Greedy and Careful Hoarder are specifically designed to make gold gear stronger and more durable for this origin.
No. It increases Luck, but only loot tables and systems that read the Luck attribute are affected.
Frail reduces survivability, and vanilla gold armor is not naturally very protective. Goblin bonuses help, but positioning and speed remain important.
## Gorgon [#gorgon]
> **Impact:** High\
> **Best for:** Players who enjoy dangerous crowd control, poison retaliation, caves, and high-risk combat.
Gorgons can petrify creatures that meet their gaze and become stronger near death. Water, sunlight, iron, and silver create major survival problems.
### Abilities [#abilities-6]
* **Petrifying Gaze:** Press **Primary Active** to affect visible creatures within approximately 12 blocks that are facing you. Normal mobs are frozen briefly; players receive extreme Slowness, Weakness, and Mining Fatigue for a shorter period. Bosses are immune. The base cooldown is approximately 25 seconds.
* **Revenge:** Damage increases significantly while your health is low.
* **Hydrophobe:** Water damages you on contact.
* **To Stone:** Direct daylight petrifies you until night unless you are wearing a helmet.
* **Silver Aversion:** Silver gear cannot be worn, and holding silver damages you. The mod also treats iron as silver for this weakness.
* **Poisoned Blood:** Immune to Poison. When struck, you may splash nearby enemies with poisonous blood.
* **Thirst Resistance:** If the matching environmental compatibility mod is installed, Gorgons receive its thirst-resistance trait.
### Common Questions [#common-questions-6]
The target must be in range, visible, facing you, not tagged as a boss, and not protected by a **Mirroring** helmet.
Yes, but players receive severe debuffs rather than having their AI disabled like a normal mob.
Wear a helmet before entering direct daylight. Unlike Dwarf blindness, the Gorgon's daylight restriction only checks that a helmet is equipped.
Yes. The origin's data explicitly treats iron as silver for Silver Aversion.
## High Elf [#high-elf]
> **Impact:** Medium\
> **Best for:** Magic-focused players who enjoy combining held items with contextual abilities.
High Elves deal and resist additional magic damage, possess increased mana in supported magic systems, and can channel the essence of ordinary items into specialized powers. They are physically fragile and perform poorly in heavy armor.
### Abilities [#abilities-7]
* **Draw Essence:** The **Primary Active** key performs a different action depending on the item held:
* **Ice block:** Gain a Frost Walker-like Glacial Step across water.
* **Obsidian:** Walk safely across lava through Extrusive Movement.
* **Golden apple:** Right-click a zombie villager to cure it directly without first applying Weakness.
* **Ender pearl:** Press Primary Active to teleport toward the point you are looking at, up to approximately 50 blocks.
* **Coal:** Press Primary Active to cast a weak cone of flame.
* **Blaze powder:** Press Primary Active to cast a stronger cone of flame.
* **Bottled dragon's breath:** Press Primary Active to cast a strong magical flame cone that scales with Fire and Arcane/Ender spell power.
* **Mystic Affinity:** Deal more magical damage and take less magical damage.
* **Highborne:** Gain additional mana in supported magic systems. **Secondary Active** channels rapid mana regeneration, with a long base cooldown of approximately two and a half minutes.
* **Towering:** Slightly taller and more slender than a human.
* **Elegant:** Heavy armor slows you unless it has **Featherweight**. Maximum health is also reduced.
* **Fragile:** Physical attacks deal increased damage to you, and your health pool is lower.
### Elemental Specializations [#elemental-specializations]
The mod's language and origin-layer data define three High Elf specializations:
* **Arcanist:** +1 Arcane Spell Power; intended starting equipment is an Arcane Wand and 16 Arcane Runes.
* **Pyromancer:** +1 Fire Spell Power; intended starting equipment is a Fire Wand and 16 Fire Runes.
* **Cryomancer:** +1 Frost Spell Power; intended starting equipment is a Frost Wand and 16 Frost Runes.
In the uploaded 6.7.8 archive, the subclass layer references these
specializations, but their individual origin JSON files are not present. They
may not appear or function unless another datapack supplies the missing files.
### Common Questions [#common-questions-7]
Draw Essence is contextual. The item in either hand determines which spell or utility effect is selected.
With Draw Essence, an Ender Pearl can fuel Void Warp. Aim at a valid destination and press Primary Active.
The mod contains separate compatibility versions for different mana systems. Normally only the version matching the installed magic mods should apply.
High Elves are designed around magic. Fragile increases physical vulnerability, while Mystic Affinity rewards spell-based combat.
## Incubus [#incubus]
> **Impact:** Medium\
> **Best for:** Fire-magic players who intend to live in the Nether or frequently travel there.
Incubi are immune to fire and become much stronger in the Nether, but water, holy effects, and the Overworld are dangerous.
### Abilities [#abilities-8]
* **Demon Fire:** Press **Secondary Active** to release a burst or cone of flame. Damage scales with Fire Spell Power.
* **Hellborne:** Immune to fire. Standing in fire also restores hunger.
* **Carnivore:** Only animal flesh is suitable food.
* **Unholy Deal:** Press **Primary Active** to sacrifice some life force for a temporary power increase. The base cooldown is approximately 90 seconds.
* **Hydrophobe:** Water damages you on contact.
* **Impure:** Smite and holy effects deal additional damage. Healing and Harming effects are reversed as they are for undead creatures.
* **Realm Advantage:** Weaker in dimensions with sunlight, especially the Overworld, but considerably stronger in the Nether.
* **Nether Spawn:** Begin in the Nether when the inherited Origins power is active.
* **Environmental Compatibility:** With supported temperature or survival mods, Incubi gain heat resistance or immunity, may drink lava, and may become vulnerable to cold.
### Common Questions [#common-questions-8]
Fire immunity and hidden lava-swimming support are built into the origin, while some lava-drinking behavior depends on compatibility mods. Water remains dangerous.
Impure reverses Healing and Harming effects. Harming can heal you, while Healing can damage you.
The Nether. Realm Advantage intentionally makes the Incubus weaker in the Overworld and stronger in its home dimension.
It spends health to grant power, so using it carelessly at low health is dangerous even if the activation itself is restricted by available health.
## Moon Elf [#moon-elf]
> **Impact:** High\
> **Best for:** Stealth players who use daggers, darkness, and hit-and-run tactics.
Moon Elves can disappear by crouching in darkness and deal devastating opening attacks. They are fragile, cannot sleep normally in the Overworld, and dislike heavy armor.
### Abilities [#abilities-9]
* **Moonlight Rogue:** Daggers and knives deal increased damage.
* **To the Shadows:** Sneak in darkness to become invisible. Moving while invisible consumes a stealth meter. Your first attack from stealth deals bonus damage, gains an even larger bonus with a dagger, and ends invisibility.
* **Ethereal:** Your appearance is thin, slightly translucent, and blue-tinted.
* **Foreign World:** Cannot sleep in the Overworld.
* **Elegant:** Heavy armor slows you unless it has **Featherweight**.
* **Nimble:** A small chance to dodge incoming attacks entirely.
* **Fragile:** Reduced maximum health and increased physical damage taken.
* **Towering:** Slightly taller than humans.
* **Sleepless Compatibility:** Supported survival mods may formally remove sleep requirements.
### Common Questions [#common-questions-9]
Enter a sufficiently dark area and crouch. There is no separate activation key.
Attacking ends stealth, bright conditions prevent it, and moving consumes the stealth meter. After a stealth strike, a short cooldown must expire before it can trigger again.
A weapon recognized by the mod's dagger tag or dagger compatibility check.
No. Featherweight removes the heavy-armor slowdown; it does not remove Fragile or increase maximum health.
## Ogre [#ogre]
> **Impact:** High\
> **Best for:** Players who want enormous size, high durability, axes, and short bursts of overwhelming melee power.
Ogres are extremely large and durable. Their size makes buildings difficult to navigate, their hunger drains quickly, and their movement is slower than normal.
### Abilities [#abilities-10]
* **Gargantuan:** Enormous size prevents fitting through doors and many ordinary structures.
* **Bloodlust:** Press **Primary Active** while healthy enough to enter a short rage with major Speed and Haste, limited vision, and a health cost. The base cooldown is approximately 30 seconds.
* **Ravager:** Axes deal increased damage.
* **Lead Belly:** Immune to Poison and Hunger effects.
* **Stocky:** Increased health and physical durability.
* **Ravenous:** Hunger drains much faster, requiring frequent meals.
* **Sluggish:** Reduced movement speed outside Bloodlust.
* **Unwieldy:** Hidden supporting restrictions prevent certain items from working comfortably with the Ogre's enormous body.
* **Illness Resistance:** Supported survival mods may grant resistance to illness.
### Common Questions [#common-questions-10]
The power requires more than approximately six hearts of health because activating it damages the Ogre.
Gargantuan changes the player's dimensions. Build wider and taller entrances instead of relying on standard doors.
No. It protects against the Hunger status effect and Poison, while Ravenous still increases normal food consumption.
Axes receive the origin's direct damage bonus through Ravager.
## Pixie [#pixie]
> **Impact:** Medium\
> **Best for:** Players who enjoy technical movement, tiny size, exploration, and chaotic utility.
Pixies are tiny, immune to fall damage, and capable of a unique resource-based flight system. Villagers distrust them, and water interferes with their movement.
### Abilities [#abilities-11]
* **On the Dusts:** Pixies can glide, hover, and dash by spending **Flight Power (FP)**.
* Pixie jumps are approximately two blocks high.
* Press **Jump** in the air to glide. Gliding uses no FP.
* Quickly tap **Jump twice** to begin hovering. Hovering slowly drains FP.
* Quickly press **Medieval Origins: Tertiary Active twice** to dash forward.
* Quickly press **Tertiary Active**, then **Jump**, to dash upward.
* FP regenerates primarily while grounded. Glow Berries and Dragon's Breath restore FP, and defeating the Ender Dragon improves its regeneration.
* Sneak and press the vanilla **Load Toolbar Activator** key to toggle flight sounds and particles.
* **Feather Footed:** Completely immune to fall damage.
* **Shortcut:** Right-click another player with empty hands to sit on their head.
* **Good Fortunes:** Mining ordinary stone can occasionally produce valuable bonus loot.
* **Mischief Maketh Man:** Press **Secondary Active** to trigger one of several random pranks or disruptive effects. The base cooldown is approximately 30 seconds.
* **Troublemaker:** Villagers refuse to trade with you.
* **Bitesize:** Pixies are extremely small. This is implemented through hidden size-supporting powers.
* **Soaked:** Water slows Pixies and interferes with flight.
* **Curse of Flight:** Chest armor is limited to leather-level protection, and alternative wing systems cannot replace Pixie flight.
### Common Questions [#common-questions-11]
Hovering requires a quick double-tap of Jump and sufficient FP. Gliding needs only one press while airborne and costs no FP.
Bind **Medieval Origins: Tertiary Active**, then press it twice quickly. Dashing while gliding costs more FP than a normal dash.
Land and remain grounded. Glow Berries and Dragon's Breath also restore FP.
No. Troublemaker causes villagers to refuse trading.
## Plague Victim [#plague-victim]
> **Impact:** High\
> **Best for:** Experienced players who want passive area damage and an intentionally punishing survival challenge.
Plague Victims spread disease merely by existing. They cannot wear armor, cannot sleep, have low health and speed, and terrify villagers. In return, they resist disease effects and periodically refuse to die.
### Abilities [#abilities-12]
* **Foul Aura:** Continuously damages living creatures near you over time.
* **Plague Immunity:** Immune to Poison and Wither.
* **Contagious Hex:** Attacks have a chance to infect the target with a harmful effect.
* **Contagious:** Villagers refuse to trade with you.
* **Insomniac:** Cannot sleep.
* **Sensitive Skin:** Cannot wear armor.
* **Skin and Bones:** Reduced maximum health and movement speed.
* **Eternal Suffering:** Once every five minutes, fatal damage is prevented and you are kept alive instead.
* **Undead Nature:** Hidden origin data classifies the Plague Victim as undead for compatible effects.
* **Illness Resistance:** Supported survival mods may provide additional resistance to illness.
### Common Questions [#common-questions-12]
It targets nearby living creatures. Avoid standing close to creatures you want to keep safe unless your pack's team/alliance rules prevent the effect.
Sensitive Skin is a direct armor restriction. Featherweight does not remove it.
No. It prevents one death only when its five-minute cooldown is ready. You can die normally while it is recharging.
No. Insomniac blocks normal sleep.
## Revenant [#revenant]
> **Impact:** High\
> **Best for:** Players who enjoy pet management, summoning, item preparation, and complex undead mechanics.
Revenants summon and command undead servants, consume undead materials to empower future summons, and siphon life from enemies. They cannot trade with villagers, cannot farm normally, and take increased damage from many mobs.
### Abilities [#abilities-13]
* **Revenance:** Press **Primary Active** while holding the required materials to create an undead servant. Up to five combat summons can be sustained at once.
* **Skeleton:** 4 Bones in the main hand; lasts 10 minutes.
* **Skeleton Horse:** 12 Bones in the main hand and a Saddle in the offhand; permanent.
* **Wither Skeleton:** 12 Bones in the main hand and a Wither Skeleton Skull in the offhand; lasts 30 minutes.
* **Zombie:** 4 Rotten Flesh in the main hand; lasts 5 minutes.
* **Zombie Horse:** 12 Rotten Flesh in the main hand and a Saddle in the offhand; permanent.
* Summoned combat undead act as pets, follow and teleport, and can be equipped with weapons or armor. Zombies cannot use bows.
* **Command Undead:** Press **Medieval Origins: Tertiary Active** to cycle combat summons between follow, sit, and teleport-to-owner commands.
* **Putrid Communion:** Eating bones, rotten flesh, or certain monster heads charges the next matching summon. Combat summon duration increases and can become permanent at maximum charge; undead steeds gain improved attributes.
* **Reaper's Ward:** Press **Secondary Active** to raise a ring of inert skeletons that blocks movement and damages nearby enemies. The base cooldown is approximately 45 seconds.
* **Essence Extraction:** Taking hits builds a resource. Attacking a living creature spends it to drain life, with scaling from Soul/Blood spell power.
* **Necrotic Curse:** Immune to Wither, Poison, and Regeneration. Smite deals extra damage. Healing and Harming are reversed.
* **Chaotic Ally:** Villagers refuse to trade and Iron Golems attack on sight. Pillagers tolerate you.
* **Black Thumb:** Crops cannot be harvested normally and may wilt at your touch.
* **Disturbed:** Cannot sleep.
* **Unguarded:** Most mobs deal increased damage to you.
### Common Questions [#common-questions-13]
The result depends on the exact items in your main hand and offhand. Check the recipes above and make sure you have not reached the five-combat-summon limit.
Charge Putrid Communion with the matching undead food or head before summoning. At maximum charge, combat summons become permanent.
Press **Medieval Origins: Tertiary Active** to cycle the current command mode.
Necrotic Curse uses undead potion rules. Harming heals; Healing damages.
## Siren [#siren]
> **Impact:** Medium\
> **Best for:** Ocean exploration, underwater bases, aquatic combat, and utility control.
Sirens thrive while submerged and regenerate rapidly in water. Land blocks natural regeneration, and even brief contact with fire can be fatal.
### Abilities [#abilities-14]
* **Amphibious:** Breathe, see, mine, and interact normally underwater. Swim faster than ordinary players.
* **Sirens' Song:** Press **Primary Active** to captivate enemies in a large area, temporarily preventing them from harming you. It does not work on bosses or players. The base cooldown is approximately 75 seconds.
* **Holy Water:** Regenerate health much faster while fully submerged.
* **Out of Your Depth:** Natural regeneration is disabled on land. Potions can still restore health.
* **Flammable:** Fire damage is massively increased and may kill you almost immediately.
* **Like Water:** Inherited aquatic movement powers reduce normal water penalties.
* **Captivating:** Press **Secondary Active** near a villager to gain favor and improve trades. The base cooldown is approximately 30 seconds.
* **Fabulous Fins:** When the compatible merfolk mod is installed, Sirens receive its fin appearance or movement integration.
* **Environmental Compatibility:** Supported environment and temperature mods may grant water-dweller traits, cold resistance or immunity, and cold-blooded behavior.
### Common Questions [#common-questions-14]
Out of Your Depth disables normal land regeneration. Enter water or use a potion.
No. The power's description explicitly excludes players, and bosses are also immune.
Extremely dangerous. Flammable multiplies fire damage enough that even a short exposure can be fatal.
Stand near the villager and press **Secondary Active** to use Captivating.
## Valkyrie [#valkyrie]
> **Impact:** Medium\
> **Best for:** Mobile support players, healers, spear users, and anti-undead combat.
Valkyries fly freely, smite enemies every third attack, and heal allies by crashing into the ground. Undead creatures weaken them until enough have been slain to build Vanquisher stacks.
### Abilities [#abilities-15]
* **Feathered:** Permanent white wings allow free flight.
* **Divine Smite:** Every third attack triggers an area smite. Damage scales with Healing or Holy Spell Power.
* **Corruption:** Nearby undead reduce your movement and attack strength, and undead attacks deal additional damage.
* **Vanquisher:** Killing an undead enemy triggers Divine Smite and adds a stack that reduces Corruption. Half of your stacks are lost on death.
* **Intervention:** Press **Primary Active** to launch upward while grounded or dash forward while already flying. You gain fall protection until landing. Landing releases holy energy that cleanses negative effects and heals nearby allies. The base cooldown is approximately 60 seconds.
* **Heavenly Implements:** Increased Healing/Holy Spell Power and bonus effectiveness with lances, spears, and similarly tagged weapons.
### Common Questions [#common-questions-15]
Use Intervention, then land. The healing and cleansing pulse occurs when you strike the ground.
Corruption scales with nearby undead. Kill undead to gain Vanquisher stacks or create distance from them.
The counter belongs to the Valkyrie, not a particular target. Every third qualifying attack triggers Divine Smite.
Weapons recognized by the mod's Valkyrie weapon tags, especially lances and spear-like weapons.
## Wood Elf [#wood-elf]
> **Impact:** Low\
> **Best for:** Archers, scouts, forest bases, and players who favor speed over melee strength.
Wood Elves deal strong ranged damage, track struck enemies, and hide in foliage. They cannot digest meat and are less durable in close combat.
### Abilities [#abilities-16]
* **Natural Archer:** Arrows deal increased damage.
* **Forest Vision:** While inside leaves or tall shrubbery, crouch to gain night vision and become difficult for nearby mobs to detect.
* **Focus:** Draw a bow for approximately three seconds to fully charge a shot with greater speed, range, accuracy, and piercing.
* **Eagle Eyed:** Damaged targets remain visible or trackable for a short period even after leaving direct sight.
* **Towering:** Slightly taller than a human.
* **Steward:** Meat cannot be digested; use plant-based food.
* **Elegant:** Reduced maximum health. Heavy armor slows you unless it has **Featherweight**.
* **Graceful:** Melee attacks deal reduced damage but attack slightly faster.
* **Starting Equipment:** A hidden spawn power may grant origin-specific starting gear according to the pack's configuration.
### Common Questions [#common-questions-16]
No. Keep drawing the bow until the charge meter reaches full, then release the arrow.
The bow must remain drawn for the full charge duration, approximately three seconds.
No. It specifically requires foliage such as leaves or tall shrubbery and activates while crouching.
Graceful trades melee power for faster attacks. This origin is intended to rely primarily on bows.
## Yeti [#yeti]
> **Impact:** Medium\
> **Best for:** Tank players, cold-biome survival, and close-range area control.
Yetis have greatly increased health, ignore Slowness, and dominate icy environments. Fire and hot biomes counter their strengths.
### Abilities [#abilities-17]
* **Frigid Pulse:** Press **Primary Active** to entomb nearby enemies in ice. It does not work in the Nether or on bosses. The base cooldown is approximately 30 seconds.
* **From Whence You Came:** Move faster and ignore fall damage in icy biomes.
* **Frosty Breath:** Nearby opponents are automatically slowed.
* **Titanic:** Greatly increased maximum health.
* **Unstoppable:** Immune to the Slowness status effect.
* **Winter Body:** Taller and significantly wider than a human.
* **Flammable:** Fire deals increased damage.
* **Thick Fur:** Desert and hot-biome conditions reduce movement speed and maximum health.
* **Cold Compatibility:** Supported temperature mods may grant cold resistance or complete cold immunity.
### Common Questions [#common-questions-17]
The power explicitly checks the dimension and cannot create its ice prison in the Nether.
Not necessarily. Unstoppable blocks the Slowness status effect, while Thick Fur can apply attribute penalties directly in hot biomes.
Snowy and icy biomes provide the strongest mobility and fall-damage benefits while avoiding Thick Fur penalties.
The base origin is naturally cold-themed. Full temperature-system immunity depends on which compatibility mods are installed.
## General FAQ [#general-faq]
Open the Origins information screen using the key assigned under **Options → Controls → Origins**. Exact default keys can vary by installation and by conflicts with other mods — in Arcadia it is simply `O`.
Normally, an **Orb of Origin** reopens origin selection. Server administrators can also change origins with Origins commands. Your modpack or server may alter or restrict both methods.
Several powers are compatibility integrations for optional magic, temperature, thirst, survival, or merfolk mods. Only the integration matching installed mods may load. Datapacks and server configuration can also replace origin definitions.
Check all of the following:
1. Primary, Secondary, and **Medieval Origins: Tertiary Active** are bound.
2. The power is off cooldown.
3. The required item, biome, light level, hunger, health, or target condition is satisfied.
4. Another mod is not using the same key.
5. Both the server and client have matching mod and datapack versions.
Yes. Small origins may fit through narrow openings, while large origins may be unable to use normal doors or corridors. Reach, camera height, collision, mounts, and animations can also be affected depending on the installed scaling support.
It prevents heavy armor from slowing origins such as Arachnae, Elves, Alfiq, and winged characters. It does not remove reduced health, physical vulnerability, material aversions, or complete armor bans.
A Mirroring helmet protects other players from a Gorgon's gaze and prevents Dwarf sunlight blindness. The Gorgon's own daylight weakness only requires a helmet.
Incubi and Revenants use undead-style effect handling. Instant Healing harms them, while Instant Harming can restore health. Smite also deals additional damage.
The values in this guide are the base values found in version 6.7.8. A server datapack can replace power files and change cooldowns, ranges, damage, or restrictions.
## Unavailable or Incomplete Origin Data [#unavailable-or-incomplete-origin-data]
The following entries exist in part of the 6.7.8 archive but are not complete playable choices in the included origin layer.
### Troll [#troll]
A complete Troll origin file exists, but Troll is not included in the playable origin layer, and its in-game description states **“NOT CURRENTLY IMPLEMENTED.”** Its defined powers include:
* **Ironhide:** Natural armor and greatly increased health.
* **Ham Fisted:** Strong unarmed attacks but no shield use.
* **Mountainous:** Approximately twice normal human size.
* **Apex Predator:** Cannot eat ordinary food and instead gains nourishment by killing creatures.
* **Lumbering:** Reduced movement speed.
* **Old Blood:** Natural healing works only in mountainous or hilly homelands.
* **Out of Stock:** Cannot wear normal armor.
### Keres [#keres]
Keres has an icon, English descriptions, badge text, and one partial wing power, but no complete origin JSON file is included. The language data describes a soul-based flying death spirit with Bleeding, life siphoning, permanent Soul progression, no normal regeneration, sunlight Soul drain, and weakness to holy damage. It should not be documented as playable until the missing power and origin files are supplied.
### Paladin [#paladin]
`medievalorigins:paladin` is referenced by the main origin layer, but the uploaded archive contains no Paladin origin file, power directory, icon, or English description. It is therefore a broken or leftover reference rather than a usable origin.
### High Elf Subclasses [#high-elf-subclasses]
Arcanist, Pyromancer, and Cryomancer are referenced by the High Elf subclass layer and have language entries, but their individual origin JSON files are absent from the archive. See the [High Elf](#high-elf) section for their intended bonuses.
# Progression (/modpacks/arcadia/progression)
This page outlines the **main quest acts** and the **required bosses / kills** for progression in the Arcadia RPG pack.
## Act I — Rites of Passage [#act-i--rites-of-passage]
**Theme:** Early-world setup, first major bosses, unlocking new realms (Twilight Forest, Nether, End, Aether), and core progression.
Act I introduces the main world structure and opens access to key dimensions and boss chains.
### Main Progression Beats [#main-progression-beats]
* Establish a secure base and basic logistics (*Time for your Adventure! / Establishing Credibility*).
* Unlock access to the **Twilight Forest** dimension via the **basic enchanting advancement**.
To enter the Twilight Forest, dig a 2×2 pool of water one block deep, surround it with flowers, then throw a diamond into the water.

* Unlock the **Nether** and start Nether fortress & bastion content.
The Nether can only be accessed after slaying The Naga in the Twilight Forest.
* Follow the **Soul Star → Lich Tower → Night Lich** chain.

* Discover the **Nether Gauntlet** and slay it to unlock access to The End.

* Explore the **Deep Dark**, **Ocean Monuments**, and special boss structures (crypts, cloud temple, and so on).
To enter the Everdawn dimension you will need to obtain Ancient Debris.
### Required Bosses & Kills (Act I) [#required-bosses--kills-act-i]
| Boss / Target | Mod / Source | How to Encounter / Unlock |
| -------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Naga** | *Twilight Forest* | Enter **Twilight Forest**, then follow the **Magic Map** to the Naga Courtyard icon and defeat the Naga. Unlocks follow-up tower content. |
| **Twilight Lich** | *Twilight Forest* | Use the **Magic Map** to locate the **Lich Tower** in Twilight Forest. Climb the tower and defeat the Twilight Lich. Shield phase requires reflecting projectiles. |
| **Minoshroom** | *Twilight Forest* | After defeating the Lich and progressing, explore the **Labyrinth** beneath Twilight swamps and defeat the Minoshroom in the maze boss room. |
| **Hydra** | *Twilight Forest* | Locate the **Hydra Lair** (Hydra icon on the Magic Map) in Twilight swamps and defeat the Hydra. Important step in Nether-related progression. |
| **Warden** | *Minecraft (vanilla)* | Quest: *Echoes of the Past* — explore **Ancient Cities** in the Deep Dark, trigger shriekers, and defeat a Warden. |
| **Elder Guardian** | *Minecraft (vanilla)* | Quest: *In the Depths* — raid an **Ocean Monument** and defeat an Elder Guardian. |
| **Wither Skeletons ×10** | *Minecraft (vanilla)* | Quest: *Force Reduction* — in **Nether Fortresses**, kill 10 Wither Skeletons after first observing them (*Charred Menace*). |
| **Wither** | *Minecraft (vanilla)* | Quests: *Assemble the Effigy* → *Unimaginable Malice* — build the classic Wither structure using **4 Soul Sand + 3 Wither Skeleton Skulls**, then defeat the Wither. Summoning the Wither is also how you unlock access to the Everdawn Dimension. |
| **Corpse Warlock** | *EEEABSMobs* | Quests: *Unholy Service* → *Deacons of Death* — find the **Bloody Altar** in the Nether (advancement for altar), then defeat the Corpse Warlock associated with it. |
| **Nether Gauntlet** | *Bosses of Mass Destruction* | Quests: *The Forgotten Arena* → *Keeper of the Gate* — locate the **Gauntlet Arena** in the Nether (large blackstone arena in lava seas), break a face of the central obelisk to spawn and defeat the Nether Gauntlet. Only damageable via its front eye. Unlocks access toward the Void / End content. |
| **Night Lich** | *Bosses of Mass Destruction* | Quests: *Arcane Adversary* → *Night Lich* — follow **Soul Stars** dropped by undead to the **Lich Tower** structure high in cold mountains, place Soul Stars in the altars, and defeat the flying Night Lich. Unlocks access to the Aether. |
| **Hovering Hurricanes ×4** | *Legendary Monsters* | Quests: *Temple of Wind* → *Elemental Constructs* — locate the **Cloudy Temple** structure, then kill 4 Hovering Hurricanes around/within the temple. |
| **Cloud Golem** | *Legendary Monsters* | Quest: *Ten Cloud Golem* — after clearing the Hovering Hurricanes at the Cloudy Temple, fight and defeat the Cloud Golem at the temple peak arena. |
| **Haunted Knights ×5** | *Legendary Monsters* | Quests: *Creepy Crypts* → *Armored Company* — locate the **Abandoned Crypt** using its advancement, then kill 5 Haunted Knights inside. |
| **Possessed Paladin** | *Legendary Monsters* | Quest: *An Unholy Chevalier* — deep within the Abandoned Crypt, disturb and defeat the **Possessed Paladin** (stun attack and second phase). Major undead boss tied to the crypt chain. |
Some related quests (like **The Tarot**, **The Opposition**, and piglin
trading) don’t require kills, but they support progression with rewards and
lore.
## Act II — The Hero Evolves [#act-ii--the-hero-evolves]
**Theme:** Mid-game power spike, finishing the Twilight Forest line, clearing The End, exploring the Aether, and tackling special overworld / ocean / End bosses.
Act II assumes you have solid gear and skills from Act I (Hydra, Nether Gauntlet, Night Lich already done).
### Main Progression Beats [#main-progression-beats-1]
* Finish **Twilight Forest**: Knights → Ur-Ghast → Alpha Yeti → Snow Queen.
* Enter **The End**, kill the **Ender Dragon**, then defeat the **Obsidilith**.
* Complete the **Aquamirae** frozen-sea chain with **Captain Cornelia**.
* Follow **John’s Void Worm chain** in the End (Alex’s Mobs).
* Clear all three **Aether dungeons** (Bronze, Silver, Gold).
* Explore **Iron’s Spellbooks Catacombs** and defeat the **Ancient King**.
### Required Bosses & Major Kills (Act II) [#required-bosses--major-kills-act-ii]
| Boss / Target | Mod / Source | Where / How to Encounter |
| ----------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Knight Phantom** | *Twilight Forest* | Use the **Magic Map** to find the dense forest around the tall tower. At the goblin trenches, place a Twilight boss trophy on the pedestal to lower the barrier and fight the Knight Phantom group underground. |
| **Ur-Ghast** | *Twilight Forest* | After the Knights, proceed deeper into the dark forest to the **Dark Tower**. Climb the tower, use the redstone machines and mini ghasts to weaken the Ur-Ghast, then finish it off on the roof. |
| **Alpha Yeti** | *Twilight Forest* | Follow the **Magic Map** to the yeti cave icon in cold biomes (Twilight Glacier area). Enter the cave and defeat the Alpha Yeti. |
| **Snow Queen** | *Twilight Forest* | After the Alpha Yeti, head to the **Aurora Palace / Glacier Tower**. Climb to the top and defeat the Snow Queen in the upper chambers. |
| **Ender Dragon** | *Minecraft (vanilla)* | After the **Nether Gauntlet**, locate a **Stronghold**, activate the End portal, enter **The End**, and defeat the Ender Dragon as normal. |
| **Obsidilith** | *Bosses of Mass Destruction* | In The End, use an **End Gateway** to reach the outer islands. Find the **Obisidilith Arena**, climb to the roof, place an **Eye of Ender** on the Obsidian Altar, and defeat the Obsidilith. |
| **First Mate (Vindicator)** | *Minecraft (vanilla) / Aquamirae* | Find the frozen **ship graveyard** structure in icy oceans (Aquamirae). Board the ship, locate and kill the Vindicator “First Mate” in the captain’s quarters. |
| **Captain Cornelia** (first kill) | *Aquamirae* | After looting the **Shell Horn** from the ship, blow the horn near the ship graveyard to summon **Captain Cornelia** from the depths and defeat her. |
| **Captain Cornelia** (repeat kill) | *Aquamirae* | Find more ships / horns in the area and blow another conch to summon Cornelia again. Defeat her a second time for the follow-up reward and lore. |
| **Tyros** | *Irons Spells and Spellbooks* | Found in the Nether, find the structure The Citadel, at the top of this structure youll need a Cinderous Soulcaller to summon him. |
| **Void Worm** | *Alex’s Mobs* | Follow John’s chain: obtain a **Capsid** in the End, gather **Crimson Mosquito Larva** in Nether Crimson Forests, combine them into a **Mysterious Worm** in The End, then toss the larva into the void to summon and defeat the **Void Worm**. |
| **Slider** | *The Aether* | Enter **The Aether** (glowstone+water portal after Night Lich). Locate a **Bronze Dungeon** and defeat the **Slider** boss inside. Use a **pickaxe** to damage it. |
| **Valkyries (Champions)** | *The Aether* | In a **Silver Dungeon**, duel **Lesser Valkyries** and collect at least **10 Victory Medals**. These fights are part of the lead-up challenge to the queen. |
| **Valkyrie Queen** | *The Aether* | After collecting enough Victory Medals, reach the throne room of the Silver Dungeon and defeat the **Valkyrie Queen**. |
| **Sun Spirit** | *The Aether* | Find a **Gold Dungeon** (Sun Temple) in the Aether, enter, and defeat the **Sun Spirit** inside the small sun-altar chamber. |
| **Ancient King / Dead King (Lich)** | *Iron’s Spells & Spellbooks* | Locate the **Catacombs** structure underground (Buried Throne). Fight through to the throne room and defeat the lich-like **Ancient / Dead King** to complete the chain. |
### Twilight Forest Cleanup (Act II) [#twilight-forest-cleanup-act-ii]
These quests finish the Twilight Forest boss sequence started in Act I:
* **Crypt Guardians → Knight Phantom**
* Area: dense dark forest around the massive tower.
* Action: use a Twilight boss trophy on the pedestal to open the goblin trenches and fight the Knight Phantom group.
* **How Did That Get Here? → Ur-Ghast**
* Area: **Dark Tower** marked on the Magic Map.
* Action: climb the tower, use the redstone machines with tiny ghasts to weaken the boss, then kill the **Ur-Ghast**.
* **Angry Snowman → Alpha Yeti**
* Area: snowy cave icon on Magic Map in cold Twilight regions.
* Action: enter the yeti cave and kill the **Alpha Yeti**.
* **Slay the Queen! → Snow Queen**
* Area: tall ice / aurora tower (Glacier dungeon).
* Action: ascend the tower and defeat the **Snow Queen** at the top.
### The End & Void Bosses [#the-end--void-bosses]
* **The End**
* Unlocks after slaying the **Nether Gauntlet** (Act I).
* Quest: *Visit The End* — simply enter **minecraft:the\_end** via a stronghold portal.
* **Ender Dragon**
* Quest: slay the **Ender Dragon** and earn the standard `minecraft:end/kill_dragon` advancement.
* **Tiny Portals → Obsidilith**
* Use an **End Gateway** by throwing an Ender Pearl into it to reach End outer islands.
* Locate the **Obisidilith Arena**; the main arena floor is sealed, so climb to the roof.
* At the **Obsidian Altar**, place an **Eye of Ender** to spawn the **Obsidilith** (Bosses of Mass Destruction) and defeat it.
* **Viral Marketing → Nightmare Fuel → Genetic Manipulation → Strange Energies → Slay the Void Worm**
* Get a **Capsid** (top portion of the flying viral mobs) in The End.
* In the Nether’s **Crimson Forest**, kill **Crimson Mosquitos** to obtain **larva**.
* In The End, combine the capsid and larva to create the **Mysterious Worm**.
* Toss the larva into the void (per quest instructions) to summon the **Void Worm** and defeat it.
### Frozen Seas & Captain Cornelia (Aquamirae) [#frozen-seas--captain-cornelia-aquamirae]
* **A Frozen Wreck**
* Find a large **frozen ship** structure in icy oceans.
* **Pillagers!? → First Mate**
* Board the wreck.
* Kill the **Vindicator First Mate** (one-time kill) and loot the **Shell Horn**.
* **Captain Cornelia’s Conch**
* Use (right-click) the **Shell Horn** near the ship graveyard to summon **Captain Cornelia**.
* Defeat **Captain Cornelia** once.
* **She Keeps Comin…**
* Gather another horn from other nearby ships.
* Summon and kill **Captain Cornelia** again for additional Aquamirae rewards.
* Obtain the **Frozen Key** from her loot to continue into deeper Aquamirae content.
### The Aether Dungeons [#the-aether-dungeons]
Unlocked after defeating the **Night Lich** in Act I and constructing the glowstone+water Aether portal.
* **The Aether**
* Build a standard rectangular frame of **Glowstone**, then right-click the inside with a **Water Bucket** to light the portal.
* Enter **aether:the\_aether**.
* **Moving Blocks → Slider (Bronze Dungeon)**
* Find a **Bronze Dungeon** (large floating structure).
* Fight the **Slider** boss inside.
* Use a **pickaxe** instead of a sword for effective damage.
* **Champions in the Sky → Valkyries**
* Locate a **Silver Dungeon** (large temple with valkyries).
* Duel **Lesser Valkyries** and collect **10 Victory Medals** dropped when you win.
* **Are You Worthy? → Valkyrie Queen (Silver Dungeon)**
* After collecting enough medals, access the throne room.
* Challenge and defeat the **Valkyrie Queen**.
* **Primal Warmth → Sun Spirit (Gold Dungeon)**
* Find a **Gold Dungeon** (sun-themed structure) suspended in the Aether.
* Enter and defeat the **Sun Spirit** in the central chamber.
### Catacombs & the Ancient / Dead King (Iron’s Spells & Spellbooks) [#catacombs--the-ancient--dead-king-irons-spells--spellbooks]
* **Buried Throne → Catacombs**
* While mining or exploring caves, find the **Catacombs** structure (`irons_spellbooks:catacombs`).
* **Slay the Dead King**
* Fight through the catacombs to the main throne room.
* Defeat the lich-like **Ancient King / Dead King**, a powerful spellcasting boss connected to blood magic.
## Act III — Trial of the Immortals [#act-iii--trial-of-the-immortals]
**Theme:** High-tier ritual bosses, Cataclysm structures, and world-altering threats.\
This act introduces the major bosses from the **Cataclysm** mod and shifts progression toward:
* Specialized Eyes that track disturbances
* Multi-stage structures and arenas
* Endgame-level combat challenges
### Core Setup — Cataclysmic Rumblings [#core-setup--cataclysmic-rumblings]
As you return to the Overworld after conquering other realms, your contacts among villages and tribes report:
* **Tremors** beneath deserts and frozen wastes
* **Strange constructs** awakening in long-abandoned ruins
* **Shadows and serpents** haunting the depths of the sea
* **Prisons of souls** flickering with necromantic energy
You’ve learned enough tricks with Ender Eyes to imbue them with **resonant materials** tied to each disturbance, crafting a set of specialized Eyes:
* **Mech Eye** – machine and redstone-infused
* **Flame Eye** – blaze, nether sand, and infernal metal
* **Void Eye** – End-infused, tied to ancient citadels
* **Monstrous Eye** – nether metal + lava essence
* **Abyss Eye** – frozen magma and drowned stone
* **Desert Eye** – relics from arid ruins
* **Cursed Eye** – necrotic and phantom-touched
Each Eye points to a **Cataclysm structure** containing an “immortal” threat. Act III is about tracking down and ending each of those threats.
### Eye & Structure Flow (High Level) [#eye--structure-flow-high-level]
* **Cataclysmic Rumblings**
* Craft at least one specialized Eye using an Ender Eye + themed materials.
* **Electric Eye → Ancient Factory → Harbinger**
* **Eye of Flames → Burning Arena → Ignis**
* **Void Eye → Ruined Citadel → Ender Golem & Guardian**
* **The Soul Forge → Netherite Monstrosity**
* **Eye of the Abyss → Sunken City → Abyssal Sacrifice → Leviathan**
* **Eye of the Desert → Cursed Pyramid → Ancient Remnant**
* **Evil Eye → Frosted Prison → Maledictus**
Players don’t need to do them in a strict order, but all of them push toward the same theme:\
you’re no longer just surviving – you’re cleaning up the cosmic mess left behind.
### Boss & Encounter Guide [#boss--encounter-guide]
#### Netherite Monstrosity — The Soul Forge [#netherite-monstrosity--the-soul-forge]
**Quest:** *The Netherite Construct*\
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Monstrous Eye** using Eye of Ender, four Buckets of Lava, two Netherite Scraps, and two Blackstone.
* Use the Monstrous Eye to locate the **Soul Forge** structure.
**What You’ll Find:**
* A massive open forge filled with:
* Chains, lava pits, smelteries, and anvils
* Menacing constructs working the forge
* At its heart: the **Netherite Monstrosity**, a gigantic forged abomination.
**Fight Notes:**
* Heavy melee damage, big hitbox, punishing close range
* Resistant to knockback and fire
* Recommended:
* Fire resistance
* High armor and mobility
* Ranged options for repositioning between attacks
#### Ignis — Warrior-God of Flame [#ignis--warrior-god-of-flame]
**Quest:** *Warrior-God of Flame*\
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Flame Eye** with:
3 Blaze Powder, 2 Netherite Scrap, 1 Eye of Ender, and 3 Soul Sand.
* Use it to find the **Burning Arena**.
**Arena & Ritual:**
* Multifloor arena of brick and lava
* Lesser gladiators drop **Burning Ashes**
* Collect Burning Ashes and place them in the **central brazier** at the top level
This awakens **Ignis**, a towering warrior-god forged from flame and rage.
**Fight Notes:**
* Constant fire hazards and AOE flames
* Knock-ups and arena control elements
* Strongly recommended:
* Fire Resistance + Fire Protection gear
* A mix of melee burst and cautious ranged play
* Extra regen / healing to offset chip damage
#### Ender Golem & Ender Guardian — Ruined Citadel [#ender-golem--ender-guardian--ruined-citadel]
**Quests:**
* *Ambulatory Statues* – Ender Golem
* *A Much Larger Ambulatory Statue* – Ender Guardian
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Void Eye** using 2 Endstone Bricks, 2 Purpur Blocks, 2 Purpur Pillars, an Eye of Ender, and 2 Shulker Shells.
* Use it in the End to locate the **Ruined Citadel**.
**Structure:**
* A fractured, yet well-preserved citadel floating in the End
* Packed with:
* Traps on the floors
* Hostile mobs
* Living statues and box-like mollusks
* Plenty of loot
**Progression:**
1. **Ender Golem** – patrols upper or mid levels.
2. Hidden trap door / deeper descent leads to the arena containing the **Ender Guardian**.
**Fight Notes (Ender Golem):**
* Functions as a mini-boss
* Melee-focused construct with significant durability
**Fight Notes (Ender Guardian):**
* Larger, heavily armed version; now the true boss
* Expect:
* Shockwaves
* High-damage melee
* Arena-focused patterns
* Recommended:
* Feather Falling and mobility
* Good sustain and ranged options for when it becomes unsafe to stay in melee
#### The Harbinger — The Wither, Reborn [#the-harbinger--the-wither-reborn]
**Quest:** *The Wither, Reborn*\
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Mech Eye** from iron, redstone blocks, and Eye of Ender.
* Follow it to the **Ancient Factory**.
**Structure:**
* Advanced “ancient tech” facility packed with:
* Mechanical constructs
* Redstone machinery
* Automaton workers
At the largest central chamber sits a dormant **mechanized Wither** on a dais:\
the **Harbinger**.
**How to Awaken It:**
* Feed the construct a **Nether Star**.
**Fight Notes:**
* Hybrid of Wither behavior + mechanical enhancements
* Expect:
* Projectile barrages
* Arena control and potentially environmental hazards
* Recommended:
* Wither protection (potions, regen, golden apples)
* Strong ranged build with burst windows
#### Ancient Remnant — Cursed Pyramid [#ancient-remnant--cursed-pyramid]
**Quest:** *Preserved Remains*\
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Desert Eye** from Eye of Ender, 2 Chiseled Sandstone, 1 Gold Ingot, 1 Emerald, 1 Dead Bush, 1 Cactus, 1 Rotten Flesh, and 1 Bone.
* Use it to locate the **Cursed Pyramid**.
**Structure:**
* Classic sandstone pyramid with:
* Scorpions
* Undead and fossilized lizardfolk
* Deeper chambers housing greater fossilized figures
**Ritual:**
* Acquire a **Desert Jewel Fragment** — available from the Traveling Trader in the quest book.
* Craft the **Necklace of the Desert**.
* Present it as an offering in the inner chamber to awaken the **Ancient Remnant**.
**Fight Notes:**
* Large skeletal reptilian boss with desert-themed attacks
* Sand, projectiles, and possibly adds
* Recommended:
* Good crowd control
* Mobility + sustain
* Sand / knockback awareness
#### The Leviathan — Great Serpent of the Deep [#the-leviathan--great-serpent-of-the-deep]
**Quest:** *Great Serpent*\
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Abyss Eye** using:
* Eye of Ender
* Crying Obsidian
* Use it to find the **Sunken City**.
**Structure:**
* A drowned metropolis of:
* Stone colonnades
* Prismarine streets
* Alien sea culture (Deeplings and their constructs)
**Ritual – Abyssal Sacrifice:**
To summon the Leviathan, craft **Abyssal Sacrifice** using:
* Athame from Deepling Warlocks
* Coral used in Deepling golem sentries
* Various ocean-related items (ink, shells, etc.)
Use the sacrifice item at the central altar to call forth **The Leviathan**.
**Fight Notes:**
* Large underwater serpent boss
* High mobility, wide area attacks
* Recommended:
* Water Breathing (potion, enchantments, or gear)
* Depth Strider / Dolphin’s Grace equivalents
* Strong trident or ranged option that works underwater
#### Maledictus — A Compilation of Evil [#maledictus--a-compilation-of-evil]
**Quest:** *A Compilation of Evil*\
**Mod:** Cataclysm
**How to Track It:**
* Craft the **Cursed Eye** from an Eye of Ender, 4 Gold Ingots, 2 Phantom Membranes, 1 Rotten Flesh, and 1 Bone.
* Use it to find the **Frozen Penitentiary**.
**Structure:**
* A frozen prison complex of stone in the wastes
* Packed with restless spirits and necrotic energies
**Boss Trigger:**
* Deep within lies a lone tombstone shrouded in an oppressive miasma.
* Touching the tombstone:
* Swirls the dark mist
* Summons **Maledictus**, a massive ghost built from many evil souls
**Fight Notes:**
* Spectral wings, room-wide darkness effects
* Composite attacks drawing on multiple “evil” archetypes
* Recommended:
* Anti-undead tools (where applicable)
* Light sources and damage mitigation
* Balanced build; expect both ranged and melee pressure
* Defeating him grants you rare loot including Stellothorn, a throwable scythe that returns to you and heals on hit, along with crafting materials for powerful gear and spells.
#### NightWarden — Powerful multiphase boss [#nightwarden--powerful-multiphase-boss]

**Quest:** *NightWarden*
**Mod:** T.O Magic 'n Extras — Iron's Spells Addon
**How to Track It:**
* Craft the **Eye of Nothingness**, then follow it to the boss.

* Found in the End dimension.
**Structure:**
* Found only within the **Void Cathedral**, a rare structure that spawns in the End dimension.
**Boss Trigger:**
* Right-clicking him opens a menu with hints about his gimmicks and lore.
* There are three difficulty options to choose from.
* You will need **Excrucis** to trigger him.
The NightWarden adapts to incoming damage. Without counterspell you will not
be able to dispel that adaptation, and the fight becomes unwinnable.
**Fight Notes:**
* He has damage adaptation, lifesteal, and three phases — the first is spell-based, the second is melee. His attacks often require high mobility to dodge.
* His damage adaptation can be dispelled with counterspell once you meet the requirement.
* On entering the third phase he casts **supernova**, which bypasses Abyssal Shroud, deals 10,000 damage, and spawns a massive black hole.
### Act III Summary Table [#act-iii-summary-table]
| Boss | Location | Key Item / Trigger | Theme |
| ------------------------- | --------------------- | --------------------------- | ------------------------ |
| Netherite Monstrosity | Soul Forge | Monstrous Eye | Forged nether construct |
| Ignis | Burning Arena | Burning Ashes in brazier | Flame gladiator-god |
| Ender Golem | Ruined Citadel | Void Eye | Stone sentinel |
| Ender Guardian | Ruined Citadel Depths | Deeper citadel progress | Empowered stone guardian |
| Harbinger (Wither Reborn) | Ancient Factory | Nether Star to awaken | Mechanized Wither |
| Ancient Remnant | Cursed Pyramid | Necklace of the Desert | Desert ancestor beast |
| The Leviathan | Sunken City | Abyssal Sacrifice | Oceanic world-serpent |
| Maledictus | Frozen Penitentiary | Interact with cursed tomb | Composite ghost of evil |
| Night Warden | Void Cathedral | Eye of Nothingness/Excrucis | heavy magic |
### Act III Completion [#act-iii-completion]
By the end of Act III, the player should:
* Have defeated all major Cataclysm “immortal” threats
* Collected high-tier gear and unique rewards
* Significantly advanced core stats and skills
From here, only the **true End Game** remains.
## End Game — But It’s You? [#end-game--but-its-you]
After surviving the threats of multiple realms and defeating immortal forces, there is only one final enemy left:
**You.**
The End Game arc of Arcadia RPG revolves around confronting your own shadow — a manifestation of your strength, choices, and growth throughout the journey.
### Final Trial Unlock Requirements [#final-trial-unlock-requirements]
The End Game chapter becomes available after completing:
* **Act I – The Beginning**
* **Act II – The Rising Threat**
* **Act III – The Mechanical Age**
Once these are cleared, the final quest chain will open.
### Crafting the Shadow Orb [#crafting-the-shadow-orb]
The final summoning item is the **Shadow Orb**.
To create it, you must gather powerful materials from multiple dimensions:
* **Blackstone** – Carved from Nether stone.
* **Ghast Tear** – Dropped by Ghasts.
* **Nether Star** – Dropped by the Wither.
* **Echo Shard** – Found in Ancient Cities.
* **Dragon’s Breath** – Collected from the Ender Dragon.
### Dark Doppelganger Boss [#dark-doppelganger-boss]
**Mod:** Dark Doppelganger
To begin the final encounter:
1. Travel to a void location (commonly The End).
2. Throw the **Shadow Orb** into the void.
3. This will summon the **Dark Doppelganger**.
This boss is designed as a reflection of the player.
Defeating it completes the final story arc.
### End Game Rewards [#end-game-rewards]
Defeating the Dark Doppelganger rewards you with powerful endgame items and bonuses:
* **Dragonite Sword** (Dragonite Gear mod)
* **Skill Cloak (Max Tier)**
* **Create Mod – Creative Motor**
* **+10 XP Levels**
* **+5 Magic Levels**
### Personal Balance (Repeatable Endgame Loop) [#personal-balance-repeatable-endgame-loop]
After defeating the Dark Doppelganger, a new repeatable quest becomes available. It allows you to challenge your shadow self as often as you like.
**How it works:**
* Requires **Netherite Coins** as payment.
* In exchange, you receive another **Shadow Orb**.
* This allows you to resummon the **Dark Doppelganger** anytime.
This creates a replayable endgame loop for:
* Testing gear
* Farming high-tier rewards
* Roleplaying long-term character balance
### End Game Flow [#end-game-flow]
1. Craft the **Shadow Orb**.
2. Enter the void and summon the **Dark Doppelganger**.
3. Defeat the Doppelganger.
4. Unlock the **Personal Balance** loop.
5. Resummon and re-challenge the boss as often as you like.
# Shops and Coins (/modpacks/arcadia/shops_and_coins)
Arcadia RPG comes with a built-in **Shop**, located inside the **Quest Book**, allowing players to purchase useful items if they’re struggling to find them naturally.
Some items can be purchased multiple times, while others are limited to a **one-time purchase** only.
The shop uses a custom **coin currency system** with multiple tiers.

## Coin Tiers [#coin-tiers]
There are five tiers of coins:
* **Copper Coin**
* **Iron Coin**
* **Gold Coin**
* **Diamond Coin**
* **Netherite Coin**
Each tier is 9× more valuable than the one before it.
## Coin Progression & Crafting [#coin-progression--crafting]
You can combine coins to upgrade them into higher tiers by crafting **Coin Piles**.
The process works like this:
1. Combine **9 coins** of the same tier.
2. This creates a **Coin Pile**.
3. Craft that coin pile to receive **1 coin** of the next tier.

### Example [#example]
To create **1 Iron Coin**:
* 9 Copper Coins → 1 Pile of Copper Coins
* 1 Pile of Copper Coins → 1 Iron Coin
## Coin Exchange Table [#coin-exchange-table]
| Coins Used | You Get | Final Value |
| ----------------- | ------------------------- | ---------------- |
| 9 Copper Coins | 1 Pile of Copper Coins | 1 Iron Coin |
| 9 Iron Coins | 1 Pile of Iron Coins | 1 Gold Coin |
| 9 Gold Coins | 1 Pile of Gold Coins | 1 Diamond Coin |
| 9 Diamond Coins | 1 Pile of Diamond Coins | 1 Netherite Coin |
| 9 Netherite Coins | 1 Pile of Netherite Coins | N/A |

## How to Earn Coins [#how-to-earn-coins]
Coins can be obtained through:
* **Quest rewards**
* **Loot chests**
* Special modpack events and encounters
## Tips [#tips]
* Save your coins early — they become very important in mid and late game.
* Try not to waste high-tier coins on cheap shop items.
* Use Copper and Iron coins for early-game purchases only.
# Starter Guide (/modpacks/arcadia/starter_guide)
Welcome to Arcadia, hero.
## Your Origin [#your-origin]
The first thing you did was choose an origin — and no, you didn't pick the wrong one. Every origin has its own playstyle, with its own buffs and debuffs and its own set of challenges.
* You can always change your origin with the **Orb of Origin**. One is available in the Quest Book shop.
* Press **O** to view your origin's abilities.
* Press **G** to use your primary ability.
* For any other abilities your origin has, check its description and your keybind settings.
On the origin screen, use the scrollbar on the far right to read the full
description.

## Storage [#storage]
### Backpacks [#backpacks]
Backpacks are the most basic form of storage, and every player should get one immediately. They are **essential for exploration** — without one you'll run out of inventory space very quickly.

### Backpack Tiers [#backpack-tiers]
Backpack tiers scale with your mining progression:
* Copper Backpack
* Iron Backpack
* Gold Backpack
* Diamond Backpack
* Netherite Backpack
To craft or upgrade one, surround the backpack with blocks of the matching material — for example, Copper Blocks for the Copper Backpack.

If one backpack isn't enough, craft several so you don't have to travel back and forth between your base and wherever you're exploring.
For base storage:
* Chests can be upgraded using valuable ores.
* Once you reach the End, you'll unlock **Shulker Boxes** for advanced portable storage.
### Reforging [#reforging]
Arcadia used a reforger station before v3.2.0. The latest Tiered update fixed
the server/client crashes, so update your pack if you're not on **v3.2.0 or
higher**.
To reforge or re-tier an item you need one of three hammers, matching the item being rerolled. Take the **Armorer's**, **Toolsmith's**, or **Weaponsmith's** hammer to an anvil along with the item.
An item must be at 100% durability (fully repaired) to be reforged with a hammer in an anvil.
You can obtain these hammers from quest chapter rewards or buy them in the
Quest Shop. Each hammer has 20 durability.
**The three hammers:**

**Rerolling a bow with the correct hammer:**

**Using a hammer on a weapon:**

**Using the wrong hammer:**

## Stats System [#stats-system]
Arcadia uses a custom stat system where certain equipment is locked behind stat requirements. For the full details, see the [Reskillable Reimagined](/mods/reskillable-reimagined) page.
Stats are leveled up using **normal Minecraft XP**.

* Maximum level is **50**.
* The [Leveling Guide](/modpacks/arcadia/leveling_guide) covers which advancements gate each level.

# Tiered Item Modifiers (/modpacks/arcadia/tiered-item-modifiers)
This page documents the custom item modifiers contained in the server's **Tiered/Reforged datapack**. These modifiers can change the stats of armor, weapons, bows, tools, shields, staffs, fishing rods, and elytra.
A modifier's coloured name is not always a simple power ranking. Some
modifiers are direct upgrades, some are penalties, and others trade one stat
for another. Always read the actual effect.
## Quick Answer [#quick-answer]
When an eligible item receives a modifier, the system:
1. Finds every modifier pool that matches the item.
2. Selects a matching pool using the pool's relative weight.
3. Selects one modifier from that pool using the modifier's relative weight.
4. Applies the modifier only while the item is used in its configured equipment slot.
5. Allows the modifier to be rerolled with the appropriate hammer and the Anvil.
If you don't like the roll, reforging sends the item back to step 2 — a new pool
and a new modifier are selected, at the cost of XP and hammer durability.
## Best Modifier by Playstyle [#best-modifier-by-playstyle]
This is a practical recommendation chart, not a strict weakest-to-strongest ranking.
| Item type | Strong general-purpose choices | Specialist choices | Usually reroll |
| ------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| Armor | Godly, Epic, or a Legendary variant | Arcane/Magical for casters; Swift/Speed for mobility; Unchained for damage | Dented I–II; Dented III unless the health trade is useful |
| Melee weapons | Legendary, Mythic, Epic | Arcane for spellblades; Berserk for extreme critical-heavy damage; Critical for a lighter crit trade-off | Dull |
| Bows | Legendary, Epic, Rare | Elastic for draw speed; Light for accuracy | Clumsy or Stretched; Stiff is a trade-off |
| Tools | Legendary — Ultimine, Epic, Hasteful | Extended for reach and a small Ultimine boost; Swift for travel while mining | Common has no bonus |
| Shields | Reinforced, Fortified, Resilient | Unchained for an aggressive off-hand build | Dented |
| Staffs | Spiritual or Mystical | Wildsong for nature/sound magic; Energized for faster casting | Unstable; Useless is usually poor |
| Fishing rods | Legendary | Lucky II for Luck and Lure; Lucky I for a simpler Luck bonus | Unlucky |
| Elytra | Legendary or Epic | — | Common Elytra |
## How Weights Work [#how-weights-work]
* **Pool weight** decides how often a group of modifiers is considered compared with other matching groups.
* **Modifier weight** decides how often an individual modifier is selected after its pool is chosen.
* A higher number means **more common**, not stronger.
* A weight is not a direct percentage because one item may match several pools at the same time.
* Special modded items may match both a normal equipment pool and a special item-only pool.
### Main Pool Weights [#main-pool-weights]
| Equipment group | Pools and relative weights |
| ---------------------------- | --------------------------------------------------------- |
| General armor | Normal **5**, Bad **3**, Good **3** |
| General melee weapons | Common **5**, Bad **3**, Good **2** |
| Simply Swords unique weapons | Additional good pool **2** |
| General bows | Bad **3**, Good **2** |
| Too Many Bows bows | Special pool **2** |
| General tools | Normal **7**, Good **3**, Gathering **3**, Extended **3** |
| Shields | Bad **3**, Good **2** |
| Staffs | Staff pool **5** |
| Fishing rods | Fishing pool **1** |
| Elytra | Elytra pool **1** |
| Angel armor | Special pool **2** |
| Tectonic Crest armor | Special pool **2** |
| Eldritch Pan | Special pool **5** |
## Reforging [#reforging]
Use the **Anvil** to replace an item's current modifier with another valid roll.
| Equipment | Required hammer |
| -------------------------------------------------------- | ------------------------ |
| Armor, shields, and elytra | **Armorer's Hammer** |
| Swords, axes, bows, and staffs | **Weaponsmith's Hammer** |
| Pickaxes, shovels, hoes, fishing rods, and general tools | **Toolsmith's Hammer** |
The tables below show the configured **experience cost** and **hammer durability cost** for each modifier. Reforged describes its experience cost in XP points rather than full experience levels.
## Reading the Stat Tables [#reading-the-stat-tables]
* **Flat additions** are shown as `+1`, `+4`, and so on.
* **Percentage modifiers** are shown as `+10%` or `−25%`.
* **2 maximum health = 1 heart**.
* **2 armor points = 1 full armor icon**.
* Armor values are listed **per equipped armor piece**, not as a full-set total.
* Main-hand bonuses apply only while the item is held in the main hand.
* Off-hand shield bonuses apply only while the shield is in the off hand.
* Staff bonuses are configured for either hand.
* A percentage modifier on an attribute whose normal base is `0` may do nothing until another item or effect first adds that attribute.
## Armor Modifiers [#armor-modifiers]
These modifiers can roll on equipment matched by the configured Forge or Bookshelf armor tags. Unless noted otherwise, the effect applies while the armor piece is equipped in any armor slot.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ---------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -----: | --------------------------- |
| **Common (`standard_armors/common`)** | No stat change | No attribute changes. | 8 | 1 XP / 1 hammer durability |
| **Dented I (`armors/dented`)** | Negative | −1 armor (−0.5 armor icons). | 3 | 2 XP / 2 hammer durability |
| **Dented II (`armors/dented1`)** | Negative | −1.5 armor (−0.75 armor icons). | 4 | 2 XP / 2 hammer durability |
| **Dented III (`armors/dented2`)** | Trade-off | −1 armor (−0.5 armor icons); +1 maximum health (+0.5 hearts). | 4 | 2 XP / 2 hammer durability |
| **Unchained (`armors/unchained`)** | Damage trade-off | −2 armor (−1 armor icons); +25% attack damage. | 3 | 3 XP / 2 hammer durability |
| **Fortified (`armors/fortified`)** | Defense | +25% armor. | 3 | 4 XP / 2 hammer durability |
| **Heavy (`armors/heavy`)** | Knockback defense | +10% knockback resistance. | 3 | 4 XP / 2 hammer durability |
| **Reinforced (`armors/reinforced`)** | Defense | +2 armor (+1 armor icons). | 3 | 4 XP / 2 hammer durability |
| **Resilient I (`armors/resilient`)** | Health | +1 maximum health (+0.5 hearts). | 3 | 4 XP / 2 hammer durability |
| **Resilient II (`armors/resilient_1`)** | Health / stamina | +4 maximum health (+2 hearts); +20 idle stamina regeneration. | 4 | 4 XP / 2 hammer durability |
| **Magical (`armors/magical`)** | Spellcasting | +20% mana regeneration; +15% spell power; +5% cast-time reduction; +15% spell resistance. | 2 | 3 XP / 2 hammer durability |
| **Arcane (`armors/arcane`)** | Advanced spellcasting | +25% mana regeneration; +25% spell power; +20% spell cooldown reduction; +20% spell resistance. | 2 | 3 XP / 2 hammer durability |
| **Speed (`armors/speed`)** | Mobility | +1 armor (+0.5 armor icons); +15% attack speed; +10% movement speed; +10% swim speed; +35 idle stamina regeneration. | 4 | 4 XP / 2 hammer durability |
| **Swift (`armors/swift`)** | Advanced mobility | +25% attack speed; +20% movement speed; +0.25 entity reach; +1 block reach; +20% swim speed; +75 idle stamina regeneration. | 2 | 4 XP / 2 hammer durability |
| **Rare — Defense (`standard_armors/rare`)** | Health / defense | +4 maximum health (+2 hearts); +1 armor (+0.5 armor icons). | 4 | 6 XP / 3 hammer durability |
| **Rare — Experience (`standard_armors/rare_1`)** | Health / experience | +4 maximum health (+2 hearts); +65% experience gained. | 2 | 6 XP / 3 hammer durability |
| **Epic (`standard_armors/epic`)** | Health / defense | +6 maximum health (+3 hearts); +2 armor (+1 armor icons); +1 armor toughness. | 2 | 8 XP / 4 hammer durability |
| **Legendary — Tank (`standard_armors/legendary`)** | Maximum defense | +10 maximum health (+5 hearts); +4 armor (+2 armor icons); +0.5 Luck; +2 armor toughness. | 1 | 10 XP / 5 hammer durability |
| **Legendary — Balanced (`standard_armors/legendary_1`)** | Balanced defense | +8 maximum health (+4 hearts); +1 armor (+0.5 armor icons); +1 Luck; +1.5 armor toughness. | 1 | 10 XP / 5 hammer durability |
| **Legendary — Juggernaut (`standard_armors/legendary_2`)** | Extreme armor | +12 maximum health (+6 hearts); +8 armor (+4 armor icons). | 1 | 10 XP / 5 hammer durability |
| **Legendary — Tough (`standard_armors/legendary_3`)** | Health / toughness | +10 maximum health (+5 hearts); +1 armor (+0.5 armor icons); +0.5 Luck; +2 armor toughness. | 1 | 10 XP / 5 hammer durability |
| **Mythic (`standard_armors/mythic`)** | Health / stamina | +12 maximum health (+6 hearts); +1 armor (+0.5 armor icons); +100 idle stamina regeneration; +0.5 Luck. | 1 | 10 XP / 5 hammer durability |
| **Godly (`standard_armors/godly`)** | All-round premium | +12 maximum health (+6 hearts); +20% attack speed; +2 armor (+1 armor icons); +100 idle stamina regeneration; +3 Luck; +5 experience gained; +15% spell power; +10% movement speed; +10% swim speed; +0.25 entity reach. | 1 | 10 XP / 5 hammer durability |
### Armor Notes [#armor-notes]
* **Dented I, II, and III** are separate internal files even though their visible names may be similar.
* **Rare** and **Legendary** have multiple internal variants with different bonuses. Read the tooltip rather than relying on the rarity name alone.
* **Heavy** uses a percentage knockback-resistance bonus. Because ordinary players begin with zero knockback resistance, it is most useful when another item or effect already provides some.
* **Godly**, **Mythic**, and the Angel special include some bonuses configured for `MAINHAND`. Those specific lines only activate while the armor item itself is held, not while it is worn.
* **Tectonic Crest Special** contains `−50% spell cooldown reduction`. A negative reduction normally makes spell cooldown behavior worse rather than better.
## Special Armor-Set Modifiers [#special-armor-set-modifiers]
These are only added by item-specific pools. The listed items may also match ordinary armor pools, so the special modifier is not necessarily the only possible result.
| Special modifier | Eligible items | Effect per piece | Weight | Reforge cost |
| ------------------------------------------ | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -----: | --------------------------- |
| **Angel Set Special** (`armors/set`) | Epic Paladins Angel helmet, chestplate, leggings, and boots | +12 maximum health (+6 hearts); +2 armor (+1 armor icons); +1.5 armor toughness; +100 idle stamina regeneration; +0.5 Luck. | 1 | 10 XP / 5 hammer durability |
| **Tectonic Crest Special** (`armors/set2`) | Travel Optics Tectonic Crest helmet, chestplate, leggings, and boots | +15% spell power; −50% spell cooldown reduction; +35% fire spell power. | 1 | 10 XP / 5 hammer durability |
## Melee Weapon Modifiers [#melee-weapon-modifiers]
These modifiers are intended for swords, axes, Forge-tagged melee weapons, compatible Blue Skies weapons, and selected Sons of Sins weapons. Simply Swords unique weapons also receive their own positive-only pool.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ----------------------------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -----: | --------------------------- |
| **Common (`standard_weapons/common`)** | No stat change | No attribute changes. | 8 | 1 XP / 1 hammer durability |
| **Dull (`melee_weapons/dull`)** | Negative | −10% attack damage. | 3 | 2 XP / 2 hammer durability |
| **Berserk (`melee_weapons/berserk`)** | Extreme critical-heavy damage | +75% attack damage; −25% attack speed; +2 critical bonus damage; +55% to existing critical rate. | 3 | 3 XP / 2 hammer durability |
| **Critical (`melee_weapons/critical`)** | Critical-hit trade-off | −10% attack damage; +2 critical bonus damage; +25 percentage points of critical-hit chance. | 3 | 3 XP / 2 hammer durability |
| **Keen (`melee_weapons/keen`)** | Damage | +10% attack damage. | 3 | 4 XP / 2 hammer durability |
| **Sharp (`melee_weapons/sharp`)** | Damage | +15% attack damage. | 3 | 4 XP / 2 hammer durability |
| **Rare (`melee_weapons/rare`)** | Balanced offense | +0.25 attack damage; +0.1 attack speed. | 4 | 6 XP / 3 hammer durability |
| **Epic (`melee_weapons/epic`)** | Fast offense | +0.375 attack damage; +0.5 attack speed. | 2 | 8 XP / 4 hammer durability |
| **Legendary (`melee_weapons/legendary`)** | Premium offense | +0.625 attack damage; +1 attack speed; +0.5 Luck. | 1 | 10 XP / 5 hammer durability |
| **Mythic (`melee_weapons/mythic`)** | Offense / defense | +1.625 attack damage; +2 armor (+1 armor icons); +1.5 Luck; +2 armor toughness; +65% two-handed stamina reduction. | 2 | 10 XP / 5 hammer durability |
| **Arcane (`melee_weapons/arcane`)** | Spellblade | +1.625 attack damage; +5% spell resistance; +1.5 Luck; +5% spell power; +5% mana regeneration; +25 maximum mana; +65% two-handed stamina reduction. | 2 | 10 XP / 5 hammer durability |
### Melee Notes [#melee-notes]
* **Berserk** now grants a very large +75% attack-damage bonus, +2 critical bonus damage, and +55% to existing critical rate, but still reduces attack speed by 25%. It no longer reduces block or entity reach.
* **Berserk’s** critical-rate bonus is multiplicative, so it increases an existing critical-rate value by 55% rather than adding 55 percentage points.
* **Critical** sacrifices 10% normal attack damage for +2 critical bonus damage and 25 percentage points of critical-hit chance.
* **Arcane** and **Mythic** include Better Paragliders two-handed stamina attributes.
* A separate `melee_weapons/extended` file exists with +1 block reach and +2 FTB Ultimine maximum blocks, but no pool currently references it. The active version used by the shared tools-and-weapons pool is `tools/extended`.
## Bow Modifiers [#bow-modifiers]
General bows matched by the Forge bow tags use the following modifiers.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| -------------------------------- | ------------------------- | ------------------------------------------------------------------ | -----: | --------------------------- |
| **Clumsy (`bows/clumsy`)** | Negative | −0.3 arrow damage; −0.2 accuracy. | 3 | 2 XP / 2 hammer durability |
| **Stiff (`bows/stiff`)** | Trade-off | −0.5 draw speed; +0.2 arrow velocity. | 3 | 3 XP / 2 hammer durability |
| **Stretched (`bows/stretched`)** | Negative | −0.2 arrow damage; −0.2 arrow velocity. | 3 | 2 XP / 2 hammer durability |
| **Elastic (`bows/elastic`)** | Draw speed | +1.5 draw speed. | 3 | 4 XP / 2 hammer durability |
| **Light (`bows/light`)** | Accuracy | +0.4 accuracy. | 3 | 4 XP / 2 hammer durability |
| **Rare (`bows/rare`)** | Projectile power | +0.3 arrow damage; +0.1 arrow velocity. | 4 | 6 XP / 3 hammer durability |
| **Epic (`bows/epic`)** | Advanced projectile power | +0.3 draw speed; +0.6 arrow damage; +0.4 arrow velocity. | 2 | 8 XP / 4 hammer durability |
| **Legendary (`bows/legendary`)** | Premium bow | +1 draw speed; +0.25 accuracy; +1 arrow damage; +1 arrow velocity. | 1 | 10 XP / 5 hammer durability |
### Too Many Bows Modifiers [#too-many-bows-modifiers]
Bows in the `too_many_bows:bows` tag can also use these special versions. They rely on Too Many Bows and UnionLib attributes.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ----------------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -----: | --------------------------- |
| **Rare — Too Many Bows (`bow/rare`)** | Too Many Bows | +0.4 Too Many Bows draw speed; +0.15 accuracy; +0.15 Too Many Bows damage; +3 percentage points of Too Many Bows critical chance; +0.5 arrow velocity. | 4 | 10 XP / 5 hammer durability |
| **Epic — Too Many Bows (`bow/epic`)** | Too Many Bows | +1.2 Too Many Bows draw speed; +0.2 accuracy; +0.25 Too Many Bows damage; +6 percentage points of Too Many Bows critical chance; +0.75 arrow velocity. | 2 | 10 XP / 5 hammer durability |
| **Legendary — Too Many Bows (`bow/legendary`)** | Too Many Bows | +1 Too Many Bows draw speed; +0.25 accuracy; +0.5 Too Many Bows damage; +15 percentage points of Too Many Bows critical chance; +1 arrow velocity. | 1 | 10 XP / 5 hammer durability |
### Bow Notes [#bow-notes]
* **Clumsy**, **Stiff**, and **Stretched** can appear in the Too Many Bows special pool as well as the general bow pools.
* A Too Many Bows item that also matches the Forge bow tags may qualify for more than one bow pool.
* Accuracy, arrow velocity, draw speed, and arrow damage are custom UnionLib or Too Many Bows attributes; the tooltip value is the safest comparison between two bows.
## Tool Modifiers [#tool-modifiers]
These can roll on pickaxes, shovels, hoes, and other items matched by the configured tool tags. Axes and some weapons can match overlapping tool and weapon pools.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ---------------------------------------------------------- | --------------------- | --------------------------------------------------------------------------------- | -----: | --------------------------- |
| **Common (`standard_tools/common`)** | No stat change | No attribute changes. | 8 | 1 XP / 1 hammer durability |
| **Uncommon (`standard_tools/uncommon`)** | Reach | +1 block reach. | 8 | 1 XP / 1 hammer durability |
| **Hasteful (`gathering_tools/hasteful`)** | Mining speed | +20% block-break speed. | 3 | 4 XP / 2 hammer durability |
| **Swift (`gathering_tools/swift`)** | Mining / movement | +10% block-break speed; +10% movement speed. | 3 | 4 XP / 2 hammer durability |
| **Extended (`tools/extended`)** | Reach / Ultimine | +1 block reach; +2 FTB Ultimine maximum blocks. | 2 | 4 XP / 2 hammer durability |
| **Rare (`standard_tools/rare`)** | Experience / speed | +5% experience gained; +0.1 attack speed. | 4 | 6 XP / 3 hammer durability |
| **Epic (`standard_tools/epic`)** | Mining / attack speed | +0.075 block-break speed; +0.5 attack speed. | 2 | 8 XP / 4 hammer durability |
| **Legendary — Ultimine (`standard_tools/legendary`)** | Ultimine / experience | +12.5% experience gained; +1 attack speed; +6 FTB Ultimine maximum blocks. | 1 | 10 XP / 5 hammer durability |
| **Legendary — Battle Tool (`standard_tools/legendary_1`)** | Combat / defense | +0.625 attack damage; +4 armor (+2 armor icons); +0.5 Luck; +5 experience gained. | 1 | 10 XP / 5 hammer durability |
### Tool Notes [#tool-notes]
* **Legendary — Ultimine** adds 6 to the FTB Ultimine maximum-block limit while held.
* **Extended** adds 1 block of block reach and 2 to the FTB Ultimine maximum-block limit while held.
* The `gathering_tools/swift_1` file is defined but not included in any pool, so it cannot roll normally.
* The two Legendary tool files are very different: one focuses on Ultimine and XP, while the alternate acts more like a combat/defense tool.
## Shield Modifiers [#shield-modifiers]
Shield effects are configured for the off hand.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ------------------------------------- | ----------------- | ---------------------------------------------- | -----: | -------------------------- |
| **Dented (`shields/dented`)** | Negative | −1 armor (−0.5 armor icons). | 2 | 2 XP / 2 hammer durability |
| **Unchained (`shields/unchained`)** | Damage trade-off | −2 armor (−1 armor icons); +25% attack damage. | 1 | 3 XP / 2 hammer durability |
| **Heavy (`shields/heavy`)** | Knockback defense | +10% knockback resistance. | 1 | 4 XP / 2 hammer durability |
| **Fortified (`shields/fortified`)** | Defense | +25% armor. | 1 | 4 XP / 2 hammer durability |
| **Reinforced (`shields/reinforced`)** | Defense | +2 armor (+1 armor icons). | 1 | 4 XP / 2 hammer durability |
| **Resilient (`shields/resilient`)** | Health | +1 maximum health (+0.5 hearts). | 1 | 4 XP / 2 hammer durability |
### Shield Notes [#shield-notes]
* **Unchained** removes 2 armor points but increases total attack damage by 25% while the shield is in the off hand.
* **Heavy** is percentage-based knockback resistance and may show little or no benefit when the player has no existing knockback resistance.
## Staff Modifiers [#staff-modifiers]
Staff modifiers rely mainly on **Iron's Spells 'n Spellbooks**. Wildsong additionally uses **FamiliarsLib**. Their bonuses work in either the main hand or off hand.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| -------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------- | -----: | -------------------------- |
| **Unstable (`staffs/unstable`)** | Negative | −10% mana regeneration; −10% spell power; −10% cast-time reduction; −15% spell cooldown reduction. | 6 | 0 XP / 2 hammer durability |
| **Useless (`staffs/useless`)** | Mixed / mostly negative | −20% mana regeneration; −15% spell power; +15% cast-time reduction. | 6 | 0 XP / 2 hammer durability |
| **Bent (`staffs/bent`)** | Spell-power trade-off | −20% mana regeneration; +15% spell power. | 8 | 0 XP / 2 hammer durability |
| **Enchanted (`staffs/enchanted`)** | Mana | +10% mana regeneration. | 4 | 0 XP / 2 hammer durability |
| **Energized (`staffs/energized`)** | Faster casting | +15% cast-time reduction; +15% spell cooldown reduction. | 4 | 0 XP / 2 hammer durability |
| **Enlightened (`staffs/enlightened`)** | Spell power | +10% spell power. | 4 | 0 XP / 2 hammer durability |
| **Mystical (`staffs/mystical`)** | Advanced spellcasting | +10% mana regeneration; +15% spell power; +10% cast-time reduction; +10% spell cooldown reduction. | 2 | 0 XP / 2 hammer durability |
| **Spiritual (`staffs/spiritual`)** | Premium spellcasting | +25% mana regeneration; +20% spell power. | 2 | 0 XP / 2 hammer durability |
| **Wildsong (`staffs/wildsong`)** | Nature / sound magic | +50% sound spell power; +30% nature spell power. | 4 | 0 XP / 2 hammer durability |
### Staff Notes [#staff-notes]
* **Spiritual** is the strongest general mana-and-power roll.
* **Mystical** improves mana regeneration, spell power, casting speed, and cooldowns together.
* **Wildsong** is specifically designed for sound and nature magic.
* **Bent** is a trade-off: less mana regeneration but more spell power.
* **Useless** reduces mana regeneration and spell power but improves cast-time reduction.
* A no-bonus `staffs/common` file exists, but the staff pool does not currently reference it.
## Fishing-Rod Modifiers [#fishing-rod-modifiers]
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ---------------------------------------- | ------------------- | ------------------------------------------------------- | -----: | -------------------------- |
| **Unlucky (`fishing_rods/unlucky`)** | Negative | −1 Fishing Luck. | 1 | 4 XP / 2 hammer durability |
| **Lucky I (`fishing_rods/lucky`)** | Luck | +1 Fishing Luck. | 3 | 4 XP / 2 hammer durability |
| **Lucky II (`fishing_rods/lucky1`)** | Luck / faster bites | +1 Fishing Luck; +2.5 Fishing Lure. | 3 | 4 XP / 2 hammer durability |
| **Legendary (`fishing_rods/legendary`)** | Premium fishing | +2 Fishing Luck; +5 Fishing Lure; +5 experience gained. | 3 | 4 XP / 2 hammer durability |
### Fishing Notes [#fishing-notes]
* These modifiers now use the flat `additional_attributes:fishing_luck` and `additional_attributes:fishing_lure` attributes rather than percentage-based generic Luck.
* Lucky II is configured with **2.5 Fishing Lure**. Because fishing Luck and Lure behave like level-style values, the tooltip may display a rounded whole number instead of the decimal.
* Legendary is the strongest fishing roll and uses separate modifier IDs for Fishing Luck, Fishing Lure, and experience gained.
* The pool explicitly lists the four Aquaculture rods and now includes the correct `forge:fishing_rods` tag verifier, allowing other properly tagged modded rods to qualify.
* A redundant `id: forge:fishing_rods` verifier is still present, but the valid tag entry directly below it handles tag-based matching.
* The vanilla fishing rod can also match the standard tool pool through its explicit item entry.
## Elytra Modifiers [#elytra-modifiers]
The elytra pool includes the vanilla Elytra, Alex's Mobs Tarantula Hawk Elytra, and Enigmatic Legacy's Enigmatic Elytra.
| Modifier | Best for | Effect per item | Weight | Reforge cost |
| ------------------------------------------------ | ------------------- | -------------------------------------------------- | -----: | -------------------------- |
| **Common Elytra (`elytra/common_elytra_1`)** | Negative | −30% durability; −2 maximum health (−1 heart). | 50 | 2 XP / 2 hammer durability |
| **Epic Elytra (`elytra/epic_elytra`)** | Durability / health | +20% durability; +2 maximum health (+1 heart). | 8 | Not defined |
| **Legendary Elytra (`elytra/legendary_elytra`)** | Health / speed | +2 maximum health (+1 heart); +10% movement speed. | 3 | Not defined |
### Elytra Notes [#elytra-notes]
* The pool weights are **50 Common**, **8 Epic**, and **3 Legendary**, making the Common penalty much more frequent than the two upgrades within this pool.
* The Epic and Legendary Elytra files do not define a reforge hammer, experience cost, or hammer-durability cost.
* The Common Elytra modifier reduces durability by 30% and removes 1 heart.
* The Epic version adds durability and 1 heart.
* The Legendary version adds 1 heart and 10% movement speed.
## Item-Specific Weapon Modifier [#item-specific-weapon-modifier]
| Modifier | Eligible item | Configured effect | Weight | Reforge cost |
| ------------------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------- | -----: | -------------------------- |
| **Eldritch Pan Special** (`standard_weapons/pan`) | Enigmatic Legacy Eldritch Pan | +100 idle stamina regeneration; +1000 one-handed stamina reduction; +1000 two-handed stamina reduction. | 8 | 1 XP / 1 hammer durability |
The Pan's three stamina attributes are configured for armor slots rather than
a hand slot. As written, those bonuses are unlikely to activate while the Pan
is held.
## Mod Compatibility [#mod-compatibility]
Some modifiers reference attributes supplied by other mods. The basic modifier can only provide a bonus when the corresponding attribute exists.
| Mod or library | Used for |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Iron's Spells 'n Spellbooks | Mana regeneration, spell power, spell resistance, maximum mana, cast-time reduction, cooldown reduction, fire power, and nature power |
| UnionLib | Bow damage, draw speed, velocity, accuracy, dig speed, and critical-hit chance |
| Too Many Bows | Special bow draw speed, damage, and critical chance |
| Better Paragliders | Idle stamina regeneration and one-/two-handed stamina reduction |
| Additional Attributes | Fishing Luck and Fishing Lure |
| AttributesLib | Experience-gained bonuses |
| Additional Entity Attributes | Critical bonus damage for Berserk and Critical |
| FTB Ultimine | Extra maximum blocks for the Extended and Legendary tool modifiers |
| FamiliarsLib | Sound spell power for Wildsong |
| Forge | Swim speed, reach, and equipment tags |
| Bookshelf | Additional armor tag matching |
## Why an Item May Not Receive a Modifier [#why-an-item-may-not-receive-a-modifier]
An item only qualifies when its item ID or one of its tags matches a pool verifier. A modded item may look like a sword, staff, shield, or armor piece but still receive no modifier when its developer did not add it to the expected Forge or mod-specific tag.
Common reasons include:
* The item is missing the required Forge tag.
* The datapack lists a tag as an item ID by mistake.
* The item belongs to a mod that uses its own unusual equipment system.
* The modifier references an attribute supplied by a mod that is not installed.
* The tier file exists but is not referenced by a pool.
* The pool references a tier file that is missing.
## Frequently Asked Questions [#frequently-asked-questions]
Not automatically. Several internal files share the same rarity name, and specialist modifiers may be better for a particular build. A caster may prefer Arcane armor over a health-focused Legendary roll, while a miner may prefer Hasteful or Extended over a combat-oriented Legendary tool.
The datapack contains multiple separate Legendary files for armor and tools. The visible rarity name may be the same, but the internal variant and effects are different.
It is a relative selection weight. A modifier with weight 4 is selected more often than one with weight 1 inside the same chosen pool. It does not mean a 4% chance.
Reroll it in the Anvil with the correct hammer. Each roll consumes the configured XP and hammer durability.
No. The item must be in a configured slot: armor worn, weapons/tools in the main hand, shields in the off hand, or staffs in either hand.
The files are configured so the listed values belong to each individual armor piece. Equipping several pieces is intended to combine their bonuses, although exact stacking can depend on the Reforged version and attribute IDs.
The fishing modifiers now use flat, level-style Fishing Luck and Fishing Lure attributes. Lucky II is configured with 2.5 Fishing Lure, but the tooltip may round or truncate that decimal when displaying it.
Percentage modifiers multiply an existing attribute value. Knockback resistance normally begins at zero, so multiplying zero produces no additional value until another source adds some first.
The datapack includes cross-mod attributes for the server's larger modpack. For example, caster modifiers use Iron's Spells attributes and one tool modifier changes FTB Ultimine's block limit.
It can when it matches overlapping tags. The Extended tool pool explicitly includes swords and axes, and axes commonly match both tool and melee pools.
The Angel and Tectonic items have item-specific pools, but they can also match general armor tags. The system considers every matching pool.
Its file contains a negative cooldown-reduction amount. Unless another mod interprets the attribute unusually, negative cooldown reduction works as a penalty.
## Internal IDs [#internal-ids]
When reporting a bug, include the full internal modifier ID shown in the tables. This is especially important for duplicate visible names such as Dented, Rare, Legendary, Resilient, Lucky, and Swift.
# Tom's Simple Storage (/modpacks/arcadia/toms-simple-storage)
Tom’s Simple Storage is a lightweight, vanilla-styled storage network mod that lets you connect multiple inventories into one searchable system.\
Instead of digging through dozens of chests, you can manage everything from a single terminal.
## Core Blocks & Items [#core-blocks--items]
| Block / Item | Purpose |
| --------------------------------- | ------------------------------------------------------------- |
| **Storage Terminal** | Main hub. Lets you view and search all connected inventories. |
| **Crafting Terminal** | Same as Storage Terminal, but includes a crafting grid. |
| **Inventory Connector** | Connects a chest/barrel/container to your network. |
| **Storage / Inventory Cables** | Links your connectors and terminals into one network. |
| **Wireless Terminal** | Lets you access storage remotely from anywhere. |
| **Filtered Connectors / Hoppers** | Used for automation, sorting, or restricting items. |
## Getting Started: Basic Setup [#getting-started-basic-setup]
Place a
**Storage Terminal**
.
Attach an
**Inventory Connector**
to any chest, barrel, or storage block.
Use
**Storage Cables**
to connect the terminal and connectors together.
Open the terminal — it will now show items from every connected container.
Your storage network is now active.
## Using the Crafting Terminal [#using-the-crafting-terminal]
If you use a **Crafting Terminal** instead:
* You can craft items directly from stored materials.
* Items taken for crafting are pulled automatically from the network.
* Crafted items go straight into your storage system.
## Special Features [#special-features]
### Search System [#search-system]
* Use the search bar to instantly filter items stored in your network.
* Matching happens in real time as you type.
### Wireless Access [#wireless-access]
* Use the **Wireless Terminal** to access your storage from anywhere.
* Great for mining runs, farms, or remote bases.
### Automation & Sorting [#automation--sorting]
* Use **Filtered Connectors** to send certain items into specific chests.
* Useful for organizing ores, mob drops, or farming loot.
* Combine with hoppers or automation mods for advanced setups.
## Expanding Your Network [#expanding-your-network]
* Just place more storage containers.
* Attach Inventory Connectors.
* Connect them to the network with cables.
* They immediately join your system — no extra setup required.
## Tips [#tips]
* Place terminals in central locations.
* Use filtered connectors to prevent messy item mixing.
* Use wireless terminals for remote access when exploring.
* You can hide cables inside walls for aesthetic builds.
# Arsenal & Combat (/modpacks/fantasy-mc/arsenal)
This guide is based on the in-game FTB Quests.
Fantasy MC offers a massive variety of weapons, combat styles, and archetypes.
## Combat Archetypes [#combat-archetypes]
The modpack features three main combat archetypes, each with unique playstyles:
### Melee Archetype [#melee-archetype]
Close-quarters combat with swords, axes, and unique melee weapons.
### Ranged Archetype [#ranged-archetype]
Distance-based combat with bows, crossbows, and special ranged weapons.
### Magic Archetype [#magic-archetype]
Spell-based combat using wands, staves, and magical abilities.
### Summoning Archetype (Still implementing) [#summoning-archetype-still-implementing]
Tamed mobs & Summoned mobs gets bonuses from their owner.
## Item Evolution [#item-evolution]
*Experimental System, still implementing*
Some weapons can evolve and grow stronger through use:
* Kill enemies to gain evolution progress
* Reach thresholds for upgrade choices
* Evolved weapons gain new abilities
This system is currently experimental and will receive updates in future patches!
# Artifacts & Accessories (/modpacks/fantasy-mc/artifacts)
This guide is based on the in-game FTB Quests.
Fantasy MC features numerous accessories and artifacts that provide powerful bonuses.
## Accessory Slots [#accessory-slots]
Accessories are equipped in special slots separate from armor. These items provide passive bonuses and sometimes active abilities.
### Slot Types (Custom archetypes made from modded items) [#slot-types-custom-archetypes-made-from-modded-items]
* **Trinket** - General accessory slot
* **Belt** - Belt accessories
* **Key** - Special key items with unique effects
* **Blessing** - Divine/magical enhancements
## Artifacts Mod [#artifacts-mod]
The Artifacts mod adds rare accessories found through exploration:
### How to Obtain [#how-to-obtain]
* **Dungeon Chests** - Random loot in dungeons
* **Structure Loot** - Found in generated structures
## RPG Series Accessories [#rpg-series-accessories]
### Categories [#categories]
**Relics**
Powerful accessories with spells:
* Spell power increases
* Defensive stats
**Accessories**
General utility items:
* Stat bonuses
# Bosses Guide (/modpacks/fantasy-mc/bosses)
This guide is based on the in-game FTB Quests.
Fantasy MC features a diverse roster of challenging bosses from multiple mods.
## Marium's Soulslike Weaponry [#mariums-soulslike-weaponry]
Challenging Soulslike-inspired bosses with complex attack patterns.
### The Old Champion's Remains [#the-old-champions-remains]
A boss spawning in the Old Champion's Graves, this skeleton figure has been possessed by The Frenzied Shade. The Old Champion will go in a defensive state behind his shield after a period of time or if the target wields a ranged weapon. When in the defensive state, he is slower, but will take reduced damage from all sources.
If you manage to lure him under the open sky, he will be slowed and weakened. When reaching half health, the Old Champion will stagger, and rise again stronger than before, no longer gaining negative effects under the open sky, and instead gaining Speed and Strength.
After killing the Old Champion, it will drop the Draugr sword, and the Frenzied Shade will spawn. He can be re-summoned by right clicking the Old Moon Altar with the Draugr sword.
**Attacks:**
* **Shield Bash:** Slams his shield at his foe, knocking it back far away.
* **Sword Thrust:** Thrusts his sword Draugr at the target with increased range, dealing high damage.
### The Frenzied Shade (Night Shade) [#the-frenzied-shade-night-shade]
Spawns after defeating the Old Champion
**Note:** Can phase through walls and lose aggro if too far away.
### The Decaying King [#the-decaying-king]
**Location:** Decaying Kingdom structure in the Nether.
Once a powerful ruler who attempted to make order in the chaos lands of The Nether, was cursed by what he thought was his allies. His kingdom was sieged and fell under the lava sea.
The Decaying King wields The Darkin Blade, and drops it along with a Lord Soul and the Withered Demon Heart. He can be re-summoned by right clicking the Blackstone Pedestal with the Withered Demon Heart in hand.
**Attacks:**
* **Sword Slam:** Quickly charges up his blade and slams it into the ground.
* **Fire Barrage:** Unleashes a mass of fire balls from its mouth.
* **Wither Barrage:** Shoots a horde of Shadow Orbs, applying Wither and Decay on targets hit.
* **Detonation:** Folds his arms together, charging up for an explosion around him.
* **Spin:** Spins his arms around, knocking away anything in its path.
* **Pull:** Pulls the target into him from afar.
* **Magma Burst:** Smashes the ground, summoning lava around it for 3 seconds.
### The Returning Knight [#the-returning-knight]
**Location:** Cathedral of Resurrection structure (or summon via Old Moon Altar with a Lost Soul).
Once a respected champion of moonlight, turned to a darker power when he threw away The Moonlight Greatsword. He coated himself in dark runes, making him both impenetrable and able to reflect any projectile.
**Important:** ALL projectiles are reflected - use melee only!
At half health, he will use his last forces of moonlight to become Unbreakable, gaining Resistance. Drops Moonstone, Nightfall, a Lord Soul and the Arkenstone.
**Attacks:**
* **Children of the Grave:** Slams Nightfall into the ground, summoning Remnants and Dark Sorcerers.
* **Obliterate:** Charges up Nightfall over two seconds, then slams it dealing massive damage.
* **Blinding Light:** Quickly sweeps his left arm, applying Blindness, Slowness and knockback.
* **Mace of Spades:** Swiftly swipes away enemies, then follows up with a quicker Obliterate.
* **Eruption:** Slams Nightfall into the ground three times, causing huge eruptions on all targets around him.
### The Fallen Icon [#the-fallen-icon]
Summoned by using the Essence of Eventide on the Old Moon Altar. This is a fierce empowered version of the Returning Knight with a dangerous second phase.
When summoned, Unbreakable will be used right away, affecting all nearby players with Weakness, Nausea and Slowness. Unlike the Returning Knight, the Fallen Icon cannot reflect projectiles, but is still immune to them!
**Phase 1 Changes:**
* Blinding Light becomes a ground slam AOE attack
* Eruption does not target allied summons
* Children of the Grave summons only Netherite Armored Remnants
* Obliterate is slightly faster
**Phase 2 - Harbinger of Moonlight:**
When entering the second phase, the Icon drags the Moonlight Greatsword out of the ground.
* **Moonfall:** Charges up the greatsword before slamming it down, causing ground ruptures.
* **Moonveil:** Penetrates the sword into the ground causing an explosion, then a second deeper explosion.
* **Sword of Light:** Swings the sword 5 times, each shooting a Moonlight Projectile, with the last swing dealing massive damage.
* **Core Beam:** Unleashes a large beam that summons explosions on the target area.
* **Thrust:** Thrusts the blade at the target, applying Cursed Wounds if hit.
Drops the Essence of Luminescence for crafting the Pure Moonlight Greatsword.
### The Monarch of Chaos [#the-monarch-of-chaos]
Summoned by using the Shard of Uncertainty (dropped by the Wither) on the Blackstone Pedestal block.
The Monarch of Chaos wields the Withered Wabbajack and wears the Crown of Chaos and Cape of Chaos. Thanks to the Cape, it turns all Grass Blocks around it into Withered Grass Blocks, which inflict Decay on entities standing on them. The Crown allows the boss to heal on this zone.
**Attacks:**
* **Cripple:** Swings its staff left to right, thrusts forward, then smashes. Deals more damage with each combo.
* **Chaos Skulls:** Shoots continuous Chaos Skulls with random effects, damage, and spawns (explosions, entities, lightning).
* **Lightning Call:** Summons lightning bolts around itself, spreading outward three times.
* **Barrage:** Shoots lots of random projectiles - tridents, arrows, moonlight beams, eggs, or seeking shulker projectiles.
* **Teleportation or Obliteration:** Channels the wand to either teleport away or summon a massive soul explosion.
### Moonknight [#moonknight]
Summoned via the Old Moon Altar and using the Eventide Essence.
### Day Stalker & Night Prowler [#day-stalker--night-prowler]
Summoned as a duo boss encounter after obtaining the Chaos Orb and throwing the orb.
## Bosses of Mass Destruction [#bosses-of-mass-destruction]
Use **Soul Stars** (dropped by undead mobs) to locate their structures.
### Void Blossom [#void-blossom]
**Location:** Underground in Lush Cave biomes.
**How to Find:** Follow Void Lilies in underground lush caves to the Void Blossom arena.
### Night Lich [#night-lich]
**Location:** Lich Tower structure in cold biomes.
**How to Find:** Follow Soul Stars to locate the tower.
### Nether Gauntlet [#nether-gauntlet]
**Location:** Gauntlet Arena in the Nether
**How to Summon:** Break a face of the central obelisk.
### Obsidilith [#obsidilith]
**Location:** Obsidilith Arena in The End dimension.
Found after reaching The End. Come prepared with End-tier gear.
## AdventureZ Bosses [#adventurez-bosses]
### The Blackstone Golem [#the-blackstone-golem]
**How to Summon:** Build a summoning structure in the Nether using Polished Blackstone, Polished Blackstone Bricks, Cracked Polished Blackstone Bricks, and Gilded Blackstone Shards.
### The Eye [#the-eye]
Summoned by making a custom structure.
## RPG-Minibosses [#rpg-minibosses]
Elite humanoid minibosses that spawn randomly in the world. Each has a "minor" variant and a full-power version.
| Miniboss | Type |
| ----------------------- | ------------------------------------ |
| **Archmage Fire** | Fire mage with ranged spells |
| **Juggernaut** | Heavy armored melee fighter |
| **Mercenary** | Balanced sword fighter |
| **Trickster (Rogue)** | Fast, evasive attacker |
| **Templar** | Holy knight with healing |
| **Magus** | Summoned with Lavos Horn |
| **Gemini Alpha & Beta** | Dual boss (requires Gemini Fragment) |
## Mutant Monsters [#mutant-monsters]
Mutated versions of vanilla mobs, created using **Chemical X** splash potions on normal mobs or encountered normally.
| Mutant | Created From |
| --------------------- | ------------------------------------ |
| **Mutant Creeper** | Splash Chemical X on Creeper |
| **Mutant Enderman** | Splash Chemical X on Enderman |
| **Mutant Skeleton** | Splash Chemical X on Skeleton |
| **Mutant Zombie** | Splash Chemical X on Zombie |
| **Mutant Snow Golem** | Splash Chemical X on Snow Golem |
| **Spider Pig** | Splash Chemical X on Pig near Spider |
## Other World Bosses [#other-world-bosses]
Various bosses that spawn naturally or through progression.
| Boss | Location | Mod |
| ------------------- | ------------------------------- | ---------------- |
| **Frostologer** | Frozen biomes | Frostiful |
| **Invoker** | Illager structures, raids | Illager Invasion |
| **Netherman** | | Knight Quest |
| **Bee Queen** | The Bumblezone dimension | The Bumblezone |
| **Deer God** | Cult hideout | Formidulus |
| **Sacred Pontiff** | | Companions |
| **Stalker** | Otherside dimension (Deep Dark) | Deeper & Darker |
| **Draugr Overlord** | | Draugr Invasion |
| **Wither** | Summoned (vanilla) | Minecraft |
| **Ender Dragon** | The End (vanilla) | Minecraft |
## Boss Progression Order [#boss-progression-order]
Recommended order for tackling major bosses or follow the guide by pressing Esc and clicking on the book icon:
1. **The Old Champion's Remains** → **Frenzied Shade** (Overworld)
2. **Void Blossom** (Overworld caves)
3. **Night Lich** (Cold biomes)
4. **The Decaying King** (Nether)
5. **Blackstone Golem** (Nether)
6. **Nether Gauntlet** (Nether)
7. **The Returning Knight** → **The Fallen Icon** (Soulslike chain)
8. **The Monarch of Chaos** (requires Wither kill)
9. **Ender Dragon** → **The Eye** (The End)
10. **Obsidilith** (End-game)
# Fantasy MC (/modpacks/fantasy-mc)
Welcome to the Fantasy MC wiki! This modpack adds custom origins, powerful weapons, challenging bosses, and magical artifacts.
## Guides [#guides]
## Playing With Friends [#playing-with-friends]
Fantasy MC has an official server hosted by CDU, which you can find on the
[CraftDownUnder site](https://www.craftdownunder.co/servers/fanmc).
To host your own multiplayer server, see the [Server Hosting Guide](/server-hosting-guide).
Alternatively, you can play with others by adding them as Friends from the in-game Multiplayer tab, then hitting Open to Friends in the pause menu while inside a world.
# Starter Guide (/modpacks/fantasy-mc/starter-guide)
This guide is based on the in-game FTB Quests.
Welcome to Fantasy MC!
## First Steps [#first-steps]
### Choosing an Origin [#choosing-an-origin]
Upon spawning, you'll be prompted to choose an Origin. Each Origin provides unique abilities, strengths, and weaknesses.
**Tips:**
* If unsure, choose **Human** for a balanced experience
* You can change your origin later with an **Orb of Origin**
* Press **O** to view your origin's abilities
* Press **G** to activate your primary ability
### Keybinds to Know [#keybinds-to-know]
* **O** - View Origin abilities
* **G** - Primary Origin ability
* **P** - Party menu (for multiplayer)
* Check your keybind settings for other Origin abilities
## Essential Gear [#essential-gear]
### Backpacks [#backpacks]
Backpacks are **essential** for exploration. Craft one immediately!
## Quest System [#quest-system]
* FantasyMC intends to use FTBQuests to the fullest
* There will be many types of quests inside FMC:
- Hold item
- Use item
- Interact Entity
- Blabber Dialogue
- Many more!
* This will help to guide you when you need it!
## Early Progression (Version 0.3.0 Beta) [#early-progression-version-030-beta]
### There is currently no set progression yet but following these will help you get started well. [#there-is-currently-no-set-progression-yet-but-following-these-will-help-you-get-started-well]
### Phase 1: Setup [#phase-1-setup]
1. Gather basic resources
2. Craft a backpack
3. Find or build shelter
4. Start exploring nearby structures
### Phase 2: Gearing Up [#phase-2-gearing-up]
1. Craft iron tools and armor
2. Find your first dungeon
3. Collect accessories and artifacts
4. Start completing quests
### Phase 3: First Bosses [#phase-3-first-bosses]
1. Locate the Old Champion's Grave
2. Prepare for your first boss fight
3. Collect boss drops
4. Progress toward new dimensions
## Classes [#classes]
Fantasy MC features a class system (currently being expanded):
* Classes offer different playstyles
* A massive update is coming for this system
* For now, experiment with different combat styles
## Parties [#parties]
### Parties [#parties-1]
For playing with friends:
* Press **P** or use `/party create` to create a party
* Coordinate on boss fights
FTBTeams's party commands has been disabled due to the nature of these quests not working well with quest sharing.
## Multiplayer [#multiplayer]
### Playing with Friends [#playing-with-friends]
Two options for multiplayer:
1. **Server Hosting** - See the [Server Hosting Guide](/server-hosting-guide)
2. **Open to Friends** - Use the in-game multiplayer tab
## Useful Features [#useful-features]
### Explorer's Compass [#explorers-compass]
Craft an Explorer's Compass to locate structures:
* Gathers materials from normal gameplay
* Essential for finding specific locations
### Transmog [#transmog]
* Make your item take the appearance of another!
# Combat (/modpacks/legacies/combat)
## Shields [#shields]
Shields have been overhauled, aiming to be much more interesting design-wise whilst still convenient to use.
Both Parrying bonuses and Blocking Strength are displayed on the tooltip of a Shield.
### Parrying [#parrying]
* blocking an attack within 24 ticks of pulling up a shield will knock back attackers
* parried attacks have a 25% reduced penalty to shield strength (more on that below) at baseline
* parried attacks play a special sound
### Blocking Strength [#blocking-strength]
* shields now have a meter on the hotbar, representing the % strength of the shield
* blocking damage reduces shield strength
* blocking strength can be preserved with the help of certain shield enchantments
* the default blocking strength is 32
* axes deal double damage to blocking strength, though they still break shields as normal (for a reduced amount of time compared to vanilla)
* blocking strength begins to regenerate after not blocking damage for 5 seconds
* blocking strength can also be recovered by dealing damage
* running out of blocking strength will disable the shield for 15 seconds, so it's best not to block for *too* long
### Blocking Delay [#blocking-delay]
* the 5 tick delay from vanilla before blocking has been removed
* this makes parrying and blocking much more responsive
### Shield Overhaul Enchantments [#shield-overhaul-enchantments]
* **Parry** (Shields): max level III. Each level reduces the parrying window by 4 ticks, but increases the shield strength mitigation when parrying by 25% and increases the chance to deflect a disabling-hit from axes by 25%
* **Endurance** (Shields): max level III. Each level increases the maximum shield strength by 1/3rd
* **Stagger** (Shields): max level I. Parrying damages the attacker by 1, and gives them 3 seconds of weakness and slowness
* **Dueling** (Swords / Sharp Weapon): max level III. Each level increases the shield strength recovered when attacking by 1/3rd
## Quivers [#quivers]
Quivers are an all-new item designed to enhance the flow of ranged combat. Think of them as what Shields are to melee combat, but for ranged.
* can hold up to 4 stacks of arrows
* the selected arrow stack can be changed in the inventory via scroll wheel
* the selected arrow stack can be changed in-use using a new keybind (defaults to G)
* the selected arrow type is displayed on the hotbar, and takes precedence over any other arrows you may have
* Quivers are equipped by holding them in the mainhand or offhand, or they may be equipped in the new Accessories inventory slot
* equipped Quivers grant a x1.4 accuracy boost and x1.2 bow draw speed increase
* arrows in Quivers which are not equipped can still be consumed as a fallback, though no stat benefits will be provided
* Quiver stats are displayed in their tooltip
* each individual Quiver will remember which slot you have selected
* Quivers work with Infinity, too
* Quivers can be dyed, as with Bundles
* **Weighted Quivers** store 8 stacks of arrows with a x1.1 accuracy multiplier and x1.2 range multiplier
* **Sapphire Quivers** store 1 stack of arrows with a x1.7 bow draw speed multiplier and x1.1 range multiplier
Quivers and Weighted Quivers can be found in various structures. Sapphire Quivers are crafted, and regular Quivers may also be traded by max-level Fletchers.
The base bow draw speed is slightly reduced in order to better accommodate the introduction of Quivers.
## Katanas [#katanas]
* a fast-striking blade which has the ability to block attacks
* blocks 50% of damage when blocking, but the block cannot be broken and covers a wide 135 degree arc
* enchantable with most sword enchantments
* enchantable with Dueling, which reduces knockback taken whilst held
* enchantable with Relentless, which allows timing attack combos to deal additional knockback & damage
* found from Remnants' Ominous Vaults
## Boomerangs [#boomerangs]
* found from overhauled Dungeons
* thrown weapon which deals increased damage based on travel time
* enchantable with Rebound, Featherweight, Shadowstep, Decay, Rejuvenate, Flame & Freeze (view the [Enchanting](/modpacks/legacies/enchanting) page on where & how to acquire enchantments)
## Daggers [#daggers]
* deals extra damage when attacking from behind
* shorter reach, high attack speed
## Hooks [#hooks]
* high-damage, slow-swinging weapon with extra melee reach
* enchantable with Shatter
* found from fishing and in underwater ruins
## Knives [#knives]
* short attack distance, very high attack speed
* used in farming
## Tridents [#tridents]
* now have extra melee reach
## Hunger [#hunger]
* saturation goes down statically based on time past and heals missing hearts as it declines
* walking, jumping (non-sprinting) and breaking blocks no longer consume hunger
* sprinting & other actions consume slightly reduced hunger
* healing 1 health consumes 1 hunger point, and provided you have enough hunger to sprint, you will continue to heal hearts over time (at a slower rate than when saturated)
* the rate of healing and consumption of hunger is dependent on difficulty (and thus faster / less exhausting on Easy whilst more punishing on Hard), much like how vanilla has separate starvation mechanics per-difficulty
* if you are below the hunger barrier, taking damage will also consume hunger, as it is no longer able to replenish health
Further, additional tweaks are added such as stackable stews/soups & eating being interrupted when taking damage.
## Miscellaneous [#miscellaneous]
* every item has had its attack damage, hit speed and range tweaked. These changes are extensive, and thus will not be individually documented here.
* potions are now stackable to 16.
* Snowballs and Eggs now deal a small amount of knockback.
# Enchanting (/modpacks/legacies/enchanting)
Vanilla Minecraft's enchanting system is well-known, iconic, and arguably flawed. Legacies aims to tackle these inherent design flaws in Enchanting and Repairing without making them unrecognisable - a rebalance doesn't mean the core people enjoy has to be abolished.
In Legacies, enchanting is greatly expanded through the introduction of a new enchanting attributes system, alongside a ton of other changes and new enchantments to discover.
## Using the Enchanting Table [#using-the-enchanting-table]
### Enchanting Tables [#enchanting-tables]
* requires bookshelves in order to function
* can now re-enchant already enchanted items up to the enchanting limit
* the pool of available enchantments is highly customisable, and determined by a new set of enchanting attributes
### Enchanting Attributes [#enchanting-attributes]
* Mana - primary attribute which represents classic magic & enchantments (ie sharpness, efficiency, physical protection)
* Frost - primary attribute which represents cold magic (ie icebound, frostbite, chilled)
* Scorch - primary attribute which represents fire magic (ie smiting, flame, blazing)
* Flow - sub-attribute of mana & frost which represents water & movement (ie depth strider, respiration, quickstep)
* Chaos - sub-attribute of frost & scorch which represents an unpredictable combination of elements (ie thorns, elemental protection, entropy)
* Greed - sub-attribute of scorch & mana which represents a need for treasure (ie fortune, looting, luck of the sea)
* Might - sub-attribute of all 3 primary attributes which represents strength (ie knockback, riptide, cleaving)
* Corruption - represents the chance to receive a curse, defaults to 0
* Divinity - represents the chance to receive a blessing, defaults to 0
### Bookshelves [#bookshelves]
* the vanilla Bookshelf slightly increases all attributes, excluding Corruption & Divinity
* the Arcane Bookshelf increases Mana & its sub-attributes and is crafted with calcite
* the Glacial Bookshelf increases Frost & its sub-attributes and is crafted with packed ice
* the Infernal Bookshelf increases Scorch & its sub-attributes and is crafted with blackstone
* full details can be found in-game on the tooltip of each block
### Altar & Tomes [#altar--tomes]
* the Altar is crafted from Deepslate & Amethyst, and is used in order to place Tomes which can significantly influence the Enchanting Table and allows you to receive Blessings
* 7 main tomes (Mana, Frost, Scorch, Flow, Chaos, Greed, Might) which each increase Divinity and Corruption simultaneously, alongside increasing their respective attribute & decreasing opposing ones
* 2 modification tomes (Stability & Power) which reduces Corruption and increases enchanting power respectively
* full details on the exact properties of each Tome can be found in-game as part of their item tooltips
### Where to find Tomes [#where-to-find-tomes]
*Structures in rounded brackets are part of Legacies & Legends integration*
* Tome of Mana: found in Strongholds, Ruined Libraries and Simple Dungeons
* Tome of Frost: found in Igloos or Shipwrecks and Frozen Dungeons
* Tome of Scorch: found in Fortresses, Spires and Infernal Dungeons
* Tome of Flow: found from slain Elder Guardians and in Remnants' ominous vaults
* Tome of Chaos: found in Woodland Mansions and Verdant Dungeons
* Tome of Greed: found in Ancient Cities and Arid Dungeons
* Tome of Might: found in Trial Chambers ominous vaults and Deep Dungeons
* Tome of Stability: traded from max level Librarians and found in Mineshafts and Remnants' library barrels
* Tome of Power: traded from max level librarians and found in Trial Chambers and Remnants' library barrels
## Using an Anvil [#using-an-anvil]
### Anvils [#anvils]
* repairing or renaming items no longer requires XP
* combining enchanted items uses a new experience formula, which is static based on the enchantments being combined and the final output item
* as such, there is no XP limit on the Anvil, you can do what you want so long as you do not exceed the enchantment cap
### Enchanted Books [#enchanted-books]
* now have 4 durability, and only lose 1 when applied to an item
* can be repaired with lapis lazuli
* this makes treasure enchantments useable indefinitely once collected
* enchanted books are still combined into one when merged, and cannot be enchanted at the enchanting table
## Systems [#systems]
### Experience Improvements [#experience-improvements]
*Legacies rebalances experience level requirements. The rebalance keeps level 1-30 balance very close to vanilla, whilst higher levels only increase slightly, ensuring players are not punished for collecting XP beyond level 30.*
* Levels 1-30 increase requirements every 5 levels, with level 30 requiring slightly more than vanilla (1500 vs 1395 cumulative)
* Levels 31-90 increase requirements every 10 levels, with the overall increase being much slower than vanilla (lvl 90 requires 9000 cumulative XP rather than vanilla's 20393)
* Levels 91+ have a spike in experience requirements, as beyond this point is intended to serve as recognition for player survival and grinding, rather than being efficient for enchanting. Lvl 95 requires 10000 cumulative XP, lvl 100 requires 15000 cumulative, and each level beyond 100 requires exactly 5000 xp per level
*Together, these serve to make it much more viable to earn XP beyond level 30 for enchanting, whilst still having a jump at 90-100 to avoid the level number being over-inflated.*
### Blessings [#blessings]
* Blessings are the opposites of Curses
* cannot be grindstoned
* appear at the top of enchantment tooltips as golden/orange
* maximum 1 per item
### Curses [#curses]
* new maximum of 1 per item
### Enchantment Cap [#enchantment-cap]
* there is a cap of 3 enchanments per item, excluding a Blessing & Curse
### Enchantment Levels [#enchantment-levels]
* all enchantments have been rescaled to have a maximum level of either I or III
* this doesn't mean they've been nerfed - their levels (and thus usefulness per level) has been rescaled for consistency's sake
### Enchantment Descriptions [#enchantment-descriptions]
* all enchantments now have descriptions visible when holding shift over their item's tooltip
* enchantments also have descriptions visible in the enchanting table
### Enchantable Animal Armor [#enchantable-animal-armor]
* horse, nautilus & wolf armor can be enchanted with many new and existing enchantments
### Repair & Enchant [#repair--enchant]
* all vanilla items without repair materials now have one (ie bow with string or trident with prismarine shard)
* additionally, all enchantable items which previously could not (ie Elytra or Shield) can now be enchanted at the Enchanting Table
### Misc [#misc]
* All Compasses can be enchanted with Blessing of Bounding or Curse of Vanishing
## Enchantments [#enchantments]
*Legacies features a ton of new and reworked enchantments. Here, you can view them separated into attribute type / blessing / curse / treasure. For descriptions on what the enchantments do, simply hold shift over an enchanted item in-game to view a full description. Attributes ensure that you are never cluttered with enchantments, as you're able to fine-tune your prefered enchantment pools.*
### Blessings [#blessings-1]
* Blessing of Mending (all) (any)
* Blessing of Infinity (Mana) (bows)
* Blessing of Frost (Frost) (boots, horse armor)
* Blessing of Inferno (Scorch) (weapons)
* Blessing of Tempering (Scorch) (armor)
* Blessing of Fluidity (Flow) (helmet)
* Blessing of Channeling (Chaos) (tridents)
* Blessing of Conductivity (Chaos) (spears)
* Blessing of Bounding (Greed) (any)
* Blessing of Vengeance (Might) (weapons)
### Universal Enchantments [#universal-enchantments]
* Unbreaking (all)
### Mana Enchantments [#mana-enchantments]
* Sharpness (sharp weapons excl. axes)
* Sweeping Edge (swords)
* Efficiency (tools)
* Power (bows)
* Silk Touch (tools)
* Density (maces)
* Physical Protection (armor)
* Galloping (horse armor)
* Recovery (wolf armor)
* Jousting (spears)
* Endurance (shields)
* Rebound (boomerangs)
* Bundling (nebulite tools)
### Frost Enchantments [#frost-enchantments]
* Chilled (weapons)
* Icebound (boots, horse armor)
* Frostbite (shields)
* Shatter (hooks)
### Scorch Enchantments [#scorch-enchantments]
* Flame (bows, boomerangs)
* Smiting (weapons)
* Blazing (boots, horse armor)
* Scorch (shields)
### Flow Enchantments [#flow-enchantments]
* Lure (fishing rods)
* Loyalty (tridents)
* Quick Charge (crossbows)
* Aqua Affinity (helmets)
* Respiration (helmets)
* Depth Strider (boots)
* Impaling (tridents)
* Lunge (spears)
* Leaping (horse armor)
* Equestrian (horse armor)
* Quickstep (leggings)
* Velocity (bows, crossbows)
* Slipstream (nautilus armor)
* Parry (shields)
* Dueling (swords)
### Greed Enchantments [#greed-enchantments]
* Luck of the Sea (fishing rods)
* Fortune (tools)
* Looting (weapons)
* Extraction (helmets)
* Collection (chestplates)
* Bundling (bundles)
### Chaos Enchantments [#chaos-enchantments]
* Thorns (chestplates)
* Elemental Protection (armor)
* Entropy (sharp weapons)
### Might Enchantments [#might-enchantments]
* Piercing (crossbows)
* Knockback (sharp weapons)
* Punch (bows)
* Breach (maces)
* Multishot (crossbows)
* Riptide (tridents)
* Arcane Protection (armor)
* Bloodlust (sharp weapons)
* Ferocity (wolf armor)
* Cleaving (axes)
* Stagger (shields)
* Striking (knives)
* Steadfast (katanas)
### Treasure Enchantments [#treasure-enchantments]
* Swift Sneak (Ancient Cities) (leggings)
* Soul Speed (Bastions, Piglin trading) (boots)
* Wind Burst (Trial Chambers) (maces)
* Feather Falling (End Cities) (boots)
* Tangled (Jungle Temples, Verdant Dungeons) (leggings)
* Rejuvenate (Simple Dungeons) (boomerangs)
* Decay (Verdant Dungeons) (boomerangs)
* Featherweight (Arid Dungeons) (boomerangs)
* Freeze (Frozen Dungeons) (boomerangs, crossbows)
* Shadowstep (Deep Dungeons) (boomerangs)
* Reforge (Bastion treasure) (tools)
* Relentless (Remnants) (katanas)
* Reaping (Catacombs) (weapons)
* Rebrush (Catacombs) (brushes)
* Recoil (End Cities) (elytras)
### Curses [#curses-1]
* Curse of Vanishing (any)
* Curse of Binding (armor)
* Curse of Fragility (tools)
* Curse of Faltering (bows, crossbows)
* Curse of Shattering (tools)
* Curse of Displacement (chestplate)
* Curse of Sliding (boots)
## Old Documentation [#old-documentation]
This documentation describes the **old 1.21.4 version** of Legacies and is
kept for reference only. Everything above reflects the current version.
#### The Core of Enchanting [#the-core-of-enchanting]
In Minecraft, enchanting revolves around 3 key pillars - enchanting tables, anvils, and enchanted books. Enchantments themselves can be obtained through either enchanted books and items obtained from the table, villagers, or world loot, and books and items can be combined in the anvil to further build up enchantments.
In Minecraft, it is arguable that the "core" of enchanting is the Enchantment Table - you can spend experience to enchant your gear, and place bookshelves to increase the likelihood of more powerful enchantments.
You've the anvil for repairs, and to combine these enchanted items.
And you've got villagers and world loot to obtained pre-enchanted items and books, books primarily the more important of the two, as you can insert powerful enchantments into your already-upgraded gear.
Legacies doesn't remove these sources or senses of familiarity, it simply rethinks them.
These changes culminate in more enchantment variety, without any additional clutter, and makes using and upgrading lower-tier weapons with low-level enchants a great, viable choice earlier on, alongside the late-game enchanting having less of a focus on min-maxxing while maintaining full customisability and existing systems.
#### The Enchanting Table [#the-enchanting-table]
Once again, the true core of enchanting is the Enchantment Table, where you can use an enchanting table to enchant your weapons, tools, armour and more. Legacies expands on the foundation of the Enchanting Table, re-asserting its place as the centrepiece of all enchanting procedures.
##### Back to Basics [#back-to-basics]
The default pool of available enchantments has been heavily simplified to just the bare essentials, which is coupled with Chiseled Bookshelves to add new books, allowing you to fine-tune your enchanting experience in lieu of pure RNG or vanilla's anvil enchanting.
##### Expanded Enchanting [#expanded-enchanting]
Chiseled bookshelves now maintain an essential use, alongside the regular bookshelf, allowing you to insert discovered enchanting books to add them to the possible pool of enchantments - providing a way for you to focus your available enchants on just the ones you want, and have discovered, minimising clutter and giving more power to the table.
##### More Enchantable Items [#more-enchantable-items]
As part of the new changes to the Enchanting Table, additional items can now be enchanted at the table which previously required an Anvil to be enchanted.
* Elytra
* Shield
* Brush
* Shears
* Flint and Steel
* Carrot on a Stick
* Warped Fungus on a Stick
#### The Anvil [#the-anvil]
The anvil has had one of the biggest, and simplest changes. It can no longer combine enchanted items, and is used solely for repairing. Repairing and renaming incurs no xp fee, so you can easily repair your items infinitely. No need to worry if you can't, or don't want to, find mending, and no need to worry about wasting time enchanting earlier gear such as copper, gold, rose or iron, as they can be cheaply repaired at no xp cost.
Alongside this, remnant, netherite and featherzeal can be repaired using scrap - no need to waste an entire ingot on repairing if you don't want to.
These two changes ensure that both pre-diamond gear and gear without mending is still easy and viable to maintain and use.
##### Anvil Repair Materials [#anvil-repair-materials]
As part of the new changes to the Anvil, a plethora of items can now be repaired using specific materials which previously did not have specific repair items.
* repair Bows with String
* repair Crossbows with Tripwire Hooks
* repair Tridents with Prismarine Shards or Trident Shards
* Repair Fishing Rods with String
* repair Brushes with Feathers
* repair Flint and Steel with Flint
* repair Carrot-on-a-Sticks with Carrots
* repair Warped-Fungus-on-a-Sticks with Warped Fungus
#### The Enchanted Book [#the-enchanted-book]
With the entirely reworked enchanting system explained above, you may be beginning to wonder what's actually happening with books - and how you're meant to get all the other enchantments with such a simple and small default pool. It's actually quite simple! As enchanted books can be inserted into chiseled bookshelves around an enchanting table, allowing you to customise your available enchantments, enchantments and their books are split into unique, exclusive availability from 3 main sources - the default table, villagers, and world loot/structures.
Don't forget that the new Boomerangs, Katanas, Knives and Hooks have their own unique enchantments!
It is important to note that you'll still find items throughout the world with a wide variety of enchantments applied.
##### Sharpness and Protection [#sharpness-and-protection]
Smite/Arthropods/Sharpness and Protection/Blast/Projectile aren't great. Nonetheless, most of us don't want to part with Sharpness or Protection - and Legacies introduces a solution.
*Blast Protection, Fire Protection, Protection, Bane of Arthropods, Smite and Fire Aspect have all been removed. This is due to them being reworked into replacements as shown below.*
* Arcane Protection | Gives protection against magical damage, including potion effects and sharpness damage
* Elemental Protection | Gives protection against environmental damage, including fire and freeze
* Physical Protection | Gives protection against physical damage, including standard melee and ranged damage
* Chilled | Attacks provide a chance to freeze an enemy. Deals additional damage against cold-weak mobs such as arthropods
* Smiting | Attacks light targets on fire. Deals additional damage against fire-weak mobs such as the undead
* Sharpness | Damage from sharpness now counts as magical damage, rather than normal damage
##### Enchantment Tweaks and Max Levels [#enchantment-tweaks-and-max-levels]
An odd question to those playing vanilla, but a common one in modded. Really, max levels don't make all that much sense - and Legacies fixes that.
*All enchantments have been rebalanced to either have a maximum level of I or III, to ensure consistency throughout the game. Don't fear! The enchantments themselves have been adjusted to compensate - so they aren't nerfed at max level, eg Sharpness III is as good as the old Sharpness V. Due to this, many enchantments have received smaller tweaks which are not listed below.*
* Thorns is now chestplate-exclusive. The enchantment itself now deals more damage per level and deals reduced durability damage to armor to compensate
* Soul Speed is now incompatible with Frost Walker and Depth Strider, and deals less durability damage to your boots
* added the Curse of Fragility. This curse is exclusive to tools, and increases the durability damage taken by the item. Furthermore, the Curse of Fragility is incompatible with the Unbreaking enchantment
##### Other New Enchantments [#other-new-enchantments]
* Featherweight - Boomerangs fly further, faster and ramp up damage quicker. Found in Arid Dungeons, exclusive to Boomerangs
* Decay - Boomerangs poison targets when thrown. Found in Verdant Dungeons, incompatible with Rejuvenate
* Rejuvenate - Boomerangs give regeneration to targets when thrown. Found in Simple Dungeons, exclusive to Crossbows and Boomerangs, incompatible with Decay
* Extraction - grants more experience from mined blocks. Exclusive to Helmets, incompatible with Aqua Affinity
* Freeze - ranged attacks afflict targets with freeze for a short time. Found in Frozen Dungeons, incompatible with Flame
* Striking - increases hit speed and damage against certain passive or neutral mobs, specifically animals with some sort of hide-like skin. Exclusive to Knives, incompatible with other damage enchantments
* Shatter - hits apply Freezing for a short duration. Hitting frozen enemies causes them to shatter, dealing bonus damage. Exclusive to Hooks, incompatible with other damage enchantments
* Tangled - allows you to traverse blocks and similar items which would otherwise slow you down at a faster speed. Found in Jungle Temples, Leggings exclusive, incompatible with Swift Sneak
* Collection (Chestplate enchant, non-treasure) - all nuggets collected are sent into the void rather than your inventory, appearing as their full combined counterparts once you reach 9 nuggets, to de-clutter your inventory on long, late-game mining expeditions
* Reforge (Pickaxe enchant, treasure, found in Bastion Treasure, incompatible with Fortune and Silk Touch) - Reforge is a very unique enchant in the sense that it smelts certain blocks into their smelted counterparts when mined - but that it also gives a chance to give special bonus loot (eg scrap, ingots, alloy) when mining relevant blocks, making this enchant a rare, but viable alternative to the other pickaxe enchants. As an example, Reforge has a 1/4 chance to give you Iron Ingots or Iron Alloy (Deepslate only) when mining Iron Ore, or a 1/8 chance of getting a second item from non-ores (eg Scrap from Debris, Charcoal from logs etc). Reforge works on all ores which can be smelted, alongside Debris, logs, clay, sand, and other similar blocks
* Relentless | Rapidly chaining Katana attacks builds up cycles of knockback, and even bonus damage at full force
* Dueling | Increases knockback resistance whilst holding the Katana. Incompatible with Relentless
* Rebrush - brush enchantment that adds a chance of receiving extra loot from archaeology
* Reaping - weapon enchantment that increases XP dropped by slain mobs, incompatible with Looting
#### Enchantments, and Where to Find Them [#enchantments-and-where-to-find-them]
Enchantments are now acquired in specific ways, such as from the table by default, else from villager trading or world exploration.
Do note that once you acquire a book, you must still add it to a Chiseled Bookshelf beside an Enchanting Table for it to be added to the possible pool of enchantments.
##### Basic Enchants (found in the Enchanting Table) [#basic-enchants-found-in-the-enchanting-table]
* Physical Protection
* Sharpness
* Sweeping Edge
* Efficiency
* Unbreaking
* Power
* Lure
* Loyalty
* Quick Charge
* Piercing
* Density
* Shatter
* Striking
* Rebound
* Dueling
##### Special Enchants (found from Villager trading) [#special-enchants-found-from-villager-trading]
* Elemental Protection
* Arcane Protection
* Aqua Affinity
* Smiting
* Chilled
* Knockback
* Silk Touch
* Punch
* Breach
* Multishot
* Impaling
* Extraction
* Collection
##### World Enchants (found from various structures throughout the world) [#world-enchants-found-from-various-structures-throughout-the-world]
* Curse of Binding
* Curse of Vanishing
* Curse of Fragility
* Frost Walker (more frequently from Frozen Dungeons)
* Mending (more frequently from Deep Dungeons)
* Infinity (more frequently from Simple Dungeons)
* Luck of the Sea (more frequently from Fishing)
* Respiration (more frequently from Fishing)
* Thorns (more frequently from Jungle Temples and Verdant Dungeons)
* Depth Strider (more frequently from Shipwrecks)
* Fortune (more frequently from Desert Pyramids and Arid Dungeons)
* Flame (more frequently from Nether Fortresses, Ruined Portals and Infernal Dungeons)
* Riptide (more frequently from Underwater Ruins)
* Looting (more frequently from Desert Pyramids and Arid Dungeons)
##### Treasure Enchants (found from specific structures throughout the world) [#treasure-enchants-found-from-specific-structures-throughout-the-world]
* Swift Sneak (Ancient Cities)
* Soul Speed (Piglin Trading and Bastions)
* Wind Burst (Trial Chambers)
* Channeling (Woodland Mansions)
* Feather Falling (End Cities)
* Tangled (Jungle Temples and Verdant Dungeons)
* Rejuvenate (Simple Dungeons)
* Decay (Verdant Dungeons)
* Featherweight (Arid Dungeons)
* Freeze (Frozen Dungeons)
* Reforge (Bastion Treasure)
* Relentless (Remnants)
* Reaping (Catacombs)
* Rebrush (Catacombs)
* Bundling (End Cities)
* Recoil (End Cities)
# Legacies (/modpacks/legacies)
Welcome to Legacies — a comprehensive overhaul of Minecraft focused on fulfilling the vanilla style in a unique, highly custom and integrated manner.
Here you can find all there is to know about Legacies, including installation, progression and more. This wiki prioritises explaining game mechanics and progression, so much of the new content is meant to be found in-game rather than listed here.
## Wiki Pages [#wiki-pages]
## Multiplayer & Servers [#multiplayer--servers]
Legacies features two public SMPs — a global (EU) one available for all to join, and a smaller AU one, which requires whitelisting. Both are pre-added to the server list in fresh installs of Legacies.
To host your own multiplayer server, see the [Server Hosting Guide](/server-hosting-guide).
Alternatively, you can play with others by opening any world to Multiplayer in the pause menu, which creates a temporary IP for your friends to join using e4mc.
## Installation [#installation]
### Client [#client]
**System requirements**
| | RAM | GPU |
| ----------------------------- | ------------------ | ---------- |
| Minimum (shaders disabled) | 8 GB, 5 allocated | Integrated |
| Recommended (shaders enabled) | 16 GB, 8 allocated | Discrete |
**Installing on a client**
To play Legacies on a client you need a modded Minecraft launcher, such as the
[Modrinth App](https://modrinth.com/app) or the
[CurseForge Launcher](https://www.curseforge.com/download/app).
Legacies is available from both [Modrinth](https://modrinth.com/modpack/legacies)
and [CurseForge](https://www.curseforge.com/minecraft/modpacks/legacies-mc). Both
versions of the pack are fully cross-compatible, so you can play with your
friends regardless of how they downloaded it.
### Server [#server]
**Server requirements**
| | RAM |
| ----------- | ---- |
| Minimum | 4 GB |
| Recommended | 6 GB |
You can either self-host Legacies by following the guide below, or use an
existing server host such as [BisectHosting](https://www.bisecthosting.com/PixelDream?r=WikiLegacies).
**Installing a server**
To install Legacies on a server, use the CurseForge server pack, which is
attached as an additional file to every Legacies release on CurseForge.
Players from both Modrinth and CurseForge will be able to join your server.
For step-by-step instructions on installing the CurseForge server pack, see the
[Server Hosting Guide](/server-hosting-guide).
# Loot (/modpacks/legacies/loot)
## Artifacts [#artifacts]
Artifacts are types of unique, rare loot you can find whilst exploring various structures, and in some cases even from crafting with certain items or killing certain mobs.
### Equipment [#equipment]
#### Armor [#armor]
| Item | Effect & source |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| **Turtle Shell** | Provides extended breathing time, mining speed & vision whilst underwater. Crafted from Turtle Scutes |
| **Reinforced Chestplate** | Massive boost to knockback resistance with a high durability. Found in Deep Ruins, Sculk Ruins or Ancient Cities |
| **Drift Leggings** | Increases movement speed & reduces gravity. Crafted from Drift Jelly Bottles and Nebulite |
| **Wanderer Boots** | Allows the wearer to sprint up blocks. Found in Simple Dungeons |
#### Tools [#tools]
| Item | Effect & source |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Verdant Sword** | Inflicts poison on hit. Found in Jungle Temples |
| **Cleaving Battleaxe** | Inflicts weakness on hit. Found in Dungeons |
| **Molten Pickaxe** | Smelts mined blocks. Found in Nether Fortresses |
| **Prospector Shovel** | Mining sand has a chance to provide iron nuggets, gold nuggets or emeralds. Mining red sand has a chance to provide golden nuggets only, but in higher quantities. Found in Buried Treasure |
| **Withered Hoe** | Tills Nylium → Netherrack → Soul Soil → Soul Sand, rather than tilling Dirt. Also has the side effect of applying Wither on hit. Dropped rarely by Wither Skeletons |
| **Frosted Spear** | Charge attacks freeze struck targets for a duration determined by the strength of the charge. Found in Igloos and Frozen Dungeons |
### Tablets & Totems [#tablets--totems]
#### Tablets [#tablets]
*Tablets are rare one-time-use consumables. Upon use, they convert into a blank tablet, though they have a small chance of breaking entirely.*
| Tablet | Effect & source |
| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Tablet of Recall** | After a long use duration, you are teleported to your spawn point. Does not work between dimensions. Found from Dungeons, Strongholds, Forest Ruins, Deep Ruins, Abandoned Mineshafts, Ruined Portals and End Cities. May also be traded by Wandering Traders, if Villager Config is installed (Ingredient: Diamonds) |
| **Tablet of Revealing** | After a short use duration, all nearby entities are revealed through the Glowing effect. Found in Mineshafts and traded by Wandering Traders, if Villager Config is installed (Ingredient: Glow Berries) |
| **Tablet of Haste** | After a short use duration, applies the Haste effect. Found in Mineshafts and traded by Wandering Traders, if Villager Config is installed (Ingredient: Gold Ingots) |
| **Tablet of Deafening** | After a long use duration, lets out a shriek and gives all nearby entities Darkness, Weakness and Slowness for a short time. Found in Ancient Cities (Ingredient: Echo Shards) |
| **Tablet of Channeling** | After a long use duration, thunder roars and a storm appears. Found in Woodland Mansions (Ingredient: Copper Ingot) |
| **Tablet of Instability** | Lowers gravity & makes you phase through entities and projectiles. Found in Deep Ruins, Sculk Ruins & Deep Dungeons (Ingredient: Phantom Membrane) |
| **Tablet of Warping** | You teleport a short distance whenever you take damage, or before a projectile would hit you. Found in End Cities (Ingredient: Chorus Fruit) |
#### Totems [#totems]
*Totems save you from death and are consumed when doing so. In addition to the mainhand & offhand, totems can be used in the new accessory slot.*
| Totem | Effect & source |
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| **Totem of Undying** | Now equippable in the trinket slot |
| **Totem of Resurrection** | Returns you to your spawn point when triggered, alongside granting a period of Regeneration upon doing so. Found from Deep Dungeons |
| **Totem of Teleportation** | Teleports you when triggered and grants Regeneration, Invisibility and Speed for a short duration. Found from End Cities |
### Accessories [#accessories]
A new inventory slot above the offhand has been added — the accessory slot. In this slot, you can equip one of many items: either an amulet, ring, necklace, or even a quiver or totem.
#### Amulets [#amulets]
*Amulets use their durability as a charge meter that regenerates passively over time, and decreases when their effect is used. If the charge runs out, the amulet is destroyed.*
* **Amulet of Absorption** — decreases damage taken as health decreases
* **Amulet of Obsidian** — provides immunity to fire
* **Amulet of Deflection** — deflects incoming projectiles
#### Rings [#rings]
*Rings lose durability whenever their specific effect is used. They can each be repaired with the correct repair materials for the specific ring.*
* **Ring of Evasion** — turn invisible and move faster when crouched
* **Ring of Striking** — increases melee attack damage
* **Ring of Hunting** — restores hunger when killing entities
* **Ring of Construction** — increases block place speed and extends block place distance
* **Ring of Archery** — increases accuracy with Bows & Crossbows
* **Ring of Excavation** — reduces the delay between mining blocks
* **Ring of Restoration** — restores health when collecting experience orbs
#### Necklaces [#necklaces]
*Necklaces lose durability in the same way as armor. They can each be repaired with the correct repair materials for the specific necklace.*
* **Necklace of Purity** — nullifies all potion effects
* **Necklace of Leaping** — increases jump height & minimum fall distance
* **Necklace of Protection** — increases armor defence
* **Necklace of Regeneration** — regenerate a small amount of health when hurt
* **Necklace of Resilience** — survive fatal blows on half a heart, if you were above 3 hearts when taking that instance of damage
* **Necklace of Bartering** — Piglins will treat you as if you are wearing gold armor
* **Necklace of Isolation** — Endermen will treat you as if you are wearing a Carved Pumpkin
## Other Loot [#other-loot]
### Sapphire & Wands [#sapphire--wands]
*Sapphire Ore is a rare Overworld ore which never generates exposed to air.* It is used to craft a variety of items, such as:
* blank tablets into functional tablets (each tablet has a unique recipe)
* Wands (used to summon a magic, floating platform which you can build on and use to break your fall)
* Sapphire Quivers
* Sapphire Lanterns
* Sapphire Blocks
### Music Discs [#music-discs]
* Svall
* Taswell
* Tundra
* Infinite Spooky Amethyst
* Shulker
* Far Lands
* Castles
* 113
* Gravel
* Bliss
* Decay
* Glare
* Stasis
* Ossuaire
* Fausse Vie
* Around The Corner
* Refer
* Retold
### Lore Books [#lore-books]
* As Above
* Ascent
* Consequences
* Derelict
* Distant Memory
* Fisherman's Tale
* Forgotten Tale
* Key
* Knowledge
* Legacies
* Only The Beginning
* ???
* Remains
* Respite
* Ruination
* ℸ ̣⍑ᒷ ᒷリ↸
* The Fortress
* The Library
* The Portal
* The Stronghold
* The Warden
* Treasure Tale
* Ward
### Armor Trims [#armor-trims]
* Desolation
* Stasis
* Undead
* Matrix
* Geode
* Overgrowth
* Martyr
* Zephyr
* Cot
* Embrace
### Equipment [#equipment-1]
* Katana
* Boomerang
* Quiver
* Weighted Quiver
* Hook
# Progression (/modpacks/legacies/progression)
Progression in Legacies has been thoroughly and thoughtfully expanded upon, without being made too complex. The existing vanilla progression path remains familiar, with a few new additions and better utilisation and pacing of existing features.
In addition to many other gameplay and progression mechanic changes, Legacies consists of a varied, mainline and vanilla-adjacent set of gear progression.
## Getting Started [#getting-started]
You've loaded into a new world. You've punched a tree, you've crafted some stone tools. What next?
In Legacies, things change quite substantially from this point forward, however there'll still be plenty of things you're familiar with - don't worry.
First, it's recommended you get your bearings of the game by checking the overhauled Advancements menu. You can access this by pausing the game and heading over to the Advancements tab.
### Advancements [#advancements]
Here, you'll find that Advancements have been completely overhauled. Legacies removes the entire vanilla Advancement system, replacing with its own in order to help guide you through the game and ensure all advancements account for each and every mod within Legacies. There are 5 advancement tabs.
Legacies
* this is the first tab you'll unlock, as it is accessible at the start of the game. This tab is the core progression of the game, all organised into one category that'll guide you as you progress. You'll find that it includes relevant information such as getting copper equipment, upgrading at a smithing table, acquiring Fractured Eyes, shearing sheep for wool and much more on your reimagined journey to defeat the Ender Dragon
Overworld
* this tab is unlocked by completing the "And So It Begins" advancement, for finding your first Fractured Eye. Here, there'll be advancements pertaining to the Overworld
Nether
* this tab is unlocked by completing the "We Need To Go Deeper" advancement, for entering the Nether. Here, there'll be advancements pertaining to the Nether
End
* this tab is unlocked by completing the "The End?" advancement, for entering the End. Here, there'll be advancements pertaining to the End dimension
Adventure
* this tab is unlocked by completing the "Sweet Dreams" advancement, for sleeping in a bed to pass the night. Here, there will be advancements relating to the overall game itself, rather than a specific dimension or the main story advancements.
All advancement tabs include brand-new, remixed and returning advancements. In Legacies, each advancement will grant either 20XP for a regular advancement, 100XP for a more difficult one, or 500XP for a very challenging one, so be sure to check back here frequently to level up faster!
### Surviving, Sleeping and... Yarn? [#surviving-sleeping-and-yarn]
Beds & Sleeping Bags are essential utilities to survive, as they allow you to skip the dangers of the night. Beds set your spawn, whilst Sleeping Bags do not.
However, the process of earning the ability to skip nights in Legacies is more challenging than vanilla, as crafting Beds or Sleeping Bags requires both Wool & Yarn.
Wool is acquired as in vanilla, however yarn is not so simple - you'll need to find some cotton seeds (whilst some structures have it, you can reliably find patches of wild cotton throughout various forests and plains). Next, you'll settle down and plant your cotton, harvest it, craft it into yarn and then enjoy the delights of Rugs, Sleeping Bags and Beds.
This redesign ensures that the night cannot be so easily avoided in the early-game, whilst making adventuring in the late game easier through Sleeping Bags. Rugs are pretty cool to build with, too!
### Exploring [#exploring]
You may notice that you can't view your coordinates! This may seem troubling at first, however never fear - you can craft a compass to get your coordinates back, craft a clock to view the time, and takes notes of your current position with the N key.
It is highly recommended to utilise compasses, maps, clocks and the note system during your time in Legacies. To help encourage this, you can now also craft compasses using Metal Chunks found from loot or during fishing.
Furthermore, lodestones attached to compasses in your inventory will now be displayed on the locator bar.
If you don't like Legacies' integrated approach to world exploration and locating, you can set the `reducedDebugInfo` gamerule to false by running `/gamerule reducedDebugInfo false`.
### Fractured Eyes [#fractured-eyes]
Legacies overhauls how players reach the End dimension. Rather than crafting Eyes of Ender directly, you'll find Fractured Eyes out in the world which can be repaired into full Eyes using a Fractured Eye, Ender Pearl and Blaze Powder - think of it as a middle-ground between vanilla and the more complex and time-consuming End Remastered mod that you may have seen used in other modpacks.
## Smithing & Fletching Overhauls [#smithing--fletching-overhauls]
### Smithing Table [#smithing-table]
The Smithing Table is far more essential in Legacies. You need to upgrade Copper to Iron, or Gold to Rose. And later game, you'll be upgrading Diamond equipment, too!
Copper \~> Iron | Requires an Iron Upgrade Smithing Template + Iron Ingot
Gold \~> Rose | Requires a Rose Upgrade Smithing Template + Rose Ingot
Upgrade Templates can be found in the world, or - as they're essential to game progression - can be crafted directly, albeit at a more expensive price. You can use the search function from REI in the inventory in-game to view these recipes.
The duplication recipes are simple enough - as with the trims, cobblestone surrounding an Iron Alloy (craftable netherite-scrap-like replacement with 4 iron + 4 coal), and crafting directly simply replaces the template with a block of the lower tier, in this case being copper.
Do note that an Iron Alloy is required to craft the shield. Once again, you can view these recipes in-game at your leisure.
### Fletching Table [#fletching-table]
That's right, the Fletching Table actually does something!
You can efficiently craft arrows & tipped arrows at the Fletching Table, and you can also craft the new explosive arrows. All recipes can be viewed using REI.
## Gear Progression [#gear-progression]
Core progression is overhauled, as described below. A lot of this centers around one of the mods I developed for Legacies - that being [Progression Reborn](https://modrinth.com/mod/progression-reborn)
### Ore Rebalance [#ore-rebalance]
Ores now drop 3-9 raw nuggets from stone, or 5-15 from deepslate. This sounds stingy, however it works to stretch out progression and is alleviated by cheaper recipes (such as trim duplication), and a substantially increased variety of options to chose from as you progress.
### Copper [#copper]
Using stone tools, you need to mine Copper in order to craft Copper tools and armor. You can also find Copper Horse Armor out in the world.
If you're afraid you can't use copper for building anymore - don't worry! You craft a new, beacon-useable copper block with copper now, and if you put that into a stonecutter, you'll receive 4 polished copper - which is what the vanilla copper blocks have been renamed to. This way, Copper works great as a balanced early-game material and essential step in progression, without making it any harder to build with late-game!
### Iron [#iron]
Copper Pickaxes are now necessary to mine Iron Ore. Additionally, you must attain Iron by upgrading Copper at the Smithing Table.
Additionally, Iron tools have double the durability of vanilla - that being \~500 instead of \~250.
Iron equipment is acquired via upgrading Copper equipment at the smithing table, as described above.
### Gold [#gold]
Think of Gold as the Nether's equivalent of Copper. If you find yourself there early-game somehow, definitely try to get some, especially considering the durability is quite a bit higher than in vanilla
### Rose [#rose]
Rose is the Nether's equivalent to Iron - and a very pretty, pinkish building set and trim material.
Compared to Iron, it is weaker (less protection, more toughness) and less durable - but much faster and more enchantable than Iron, and equally as capable of mining Diamonds.
Do not get in the mindset of vanilla where you "have to get" Iron! Rose is just a viable alternative, and can be really fun to enchant considering that repairs are now free and progression has slowed down!
Rose equipment is acquired via upgrading Gold equipment at the smithing table, as described above.
### Diamond [#diamond]
The vanilla classic, and an essential step in progression once mined with an Iron or Rose pickaxe. Do note that it'll take longer to get enough Diamonds for a full set versus vanilla, so don't shy away from repairing and enchanting earlier-game gear, as it's still quite effective and durable in Legacies.
### Remnant, Netherite and Featherzeal [#remnant-netherite-and-featherzeal]
Huh? 3 Choices?
That's right - one for each and every dimension, each with their own unique benefits to ensure that all 3 options do not outclass one another.
You can get each one by upgrading Diamond at the Smithing Table. Horse Armor is available for all new materials too, often via Smithing Table upgrades.
There's Remnant for the Overworld, Netherite for the Nether and Featherzeal for the End
Forgotten Remains and Remnant Equipment
* Forgotten Remains found in the Deep Dark and Magmatic Caves
* Upgrade Template found in Ancient Cities and Infernal Dungeons
* Armor grants Explosion Knockback Resistance
* Tools have increased durability
* all equipment is immune to blast damage when dropped and in regards to durability
Ancient Debris and Netherite Equipment
* Ancient Debris found in the Nether, slightly more common in Basalt Deltas
* Upgrade Template found in Bastions
* Armor grants Burn Time Reduction
* Tools have increased damage
* all equipment is immune to fire damage when dropped and in regards to durability
Timelost Fragments and Featherzeal Equipment
* Timelost Fragments found in the outer islands of the End dimension
* Upgrade Template found in End Cities
* Armor grants Safe Fall Distance
* Tools have increased mining speed
* all equipment is unaffected by both gravity and the void when dropped
## Confronting the Dragon [#confronting-the-dragon]
You've finally repaired all your Fractured Eyes and lit the portal to the End. By now, you might be in full enchanted Diamond armour... maybe even Remnant or Netherite. You're prepared, right? This will be easy, right?
Don't be so sure...
# World (/modpacks/legacies/world)
Legacies introduces a plethora of new biomes, structures and much more. Whilst not feasible to cover them all here, there's at least some documentation.
## Biomes [#biomes]
Do note that whilst pretty much every vanilla biome has seen either major or minor additions (new blocks, mobs, etc — they will not all be covered here). This section specifically focuses on a few of the larger biome overhauls and new biomes, however will absolutely not include all new biome content added in Legacies, not by a long shot.
### Forests [#forests]
* Maple Forest
* Dying Forest
* Snowy Dying Forest
* Golden Forest
* Windswept Jungle
* Sparse Windswept Jungle
* Rainforest
* Pine Taiga
* Snowy Pine Taiga
* Old Growth Pine Taiga — Overhaul
* Savanna — Overhaul
### Swamps [#swamps]
* Fen
* Cypress Wetlands
* Swamp — Overhaul
### Fields [#fields]
* Golden Fields
* Flower Fields
* Tundra
### Deserts [#deserts]
* Oasis
### Rivers & Beaches [#rivers--beaches]
* Cold River
* Cold Beach
* Lukewarm River
* Lukewarm Beach
* Tropical River
* Tropical Beach
* Warm River
* Arid Shore
* Golden River
* Snowy Shore
### Caves [#caves]
* Mesoglea Caves
* Magmatic Caves
* Frozen Caves
### End [#end]
* Veiled Woodlands
* Magnia Fields
* Celestial Grove
* Corrupt Barrens
* Void Skies
* Void Sky Islands
* Void Depths
There are many more biome overhauls and additions to discover in-game.
## Structures [#structures]
Do note that many structures have been made rarer in order to preserve the sense of isolation that older versions were known for, whilst leaving room for the addition of a plentiful amount of new structures to increase exploration variety.
### Surface [#surface]
* Ruins
* Forest Ruins
* Obelisks
* Ruined Libraries
* Swamp Village
* Jungle Village
* Pale Cabin
* Swamp Hut — Overhaul
* new Illager structures
* new archaeology ruins
### Caves [#caves-1]
* Simple Dungeon
* Deep Dungeon
* Arid Dungeon
* Infernal Dungeon
* Frozen Dungeon
* Verdant Dungeon
* Deep Ruins
* Sculk Ruins
* Catacombs
* Remnants
* Underground Cabins
* Stronghold — Overhaul
### Nether [#nether]
* Scaffholding
* Citadel
* Ruined Aether Portal
* Spire
### End [#end-1]
* End City — Overhaul
* Mirestone Ruins
* End Ruins
* End Remnants
## Worldgen [#worldgen]
Here are some of Legacies' many worldgen tweaks.
### Overworld [#overworld]
* terrain generation is now cut off at y320 rather than y256
* underground rivers now generate
### Biome & Cave Depth [#biome--cave-depth]
* ore variants have been added for Andesite, Diorite, Granite, Dolerite, Tuff, Sandstone & Red Sandstone
* Sandstone extends deeper below Deserts
* Red Sandstone extends deeper below Badlands
* Andesite replaces Stone in cold regions
* Diorite replaces Stone in tropical regions at high y-levels
* Granite replaces Stone in arid regions
* Dolerite replaces Stone in freezing regions
### Nether [#nether-1]
* the Nether is now 192 blocks tall
* Quartz and Gold ore veins now generate, much like the Overworld's Copper and Iron ore veins
* Nether biomes now generate in 4d, allowing for vertical placement differentiation
### End [#end-2]
* completely overhauled terrain with Enderscape
* new Purpur & Ametrur clusters
# Actions (/mods/rpg-dialogue/actions)
`"type"` in a choice's `actions`, or in a dialogue's `on_close`. They run in the order they are written.
An unnamespaced type means one of this mod's: `"give_item"` and `"rpg_dialogue:give_item"` are the same thing.
## The list [#the-list]
| Type | Fields | Does |
| ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------- |
| `give_item` | `item`, `count`=1 | Hands it over, dropping it at their feet if there is no room. |
| `take_item` | `item`, `count`=1 | Takes it. **All or none**, never half a payment. Item or `#tag`. |
| `grant_effect` | `effect`, `seconds`=60, `amplifier`=0, `visible`=true | A blessing, a warm meal, a night's rest. |
| `heal` | `health`=6.0 | In half-hearts. Mends them where they stand. |
| `give_experience` | `points`=0, `levels`=0 | Levels mean the same thing at every point in the game; points do not. |
| `play_sound` | `sound`, `volume`=1.0, `pitch`=1.0 | Into the world at the speaker, so a bystander hears it too. |
| `set_flag` | `flag`, `set`=true | Writes something down about this player, or rubs it out. |
| `run_command` | `command` | Any server command, level 2. The escape hatch. |
| `adjust_gossip` | `gossip`, `amount`, `radius`=0 | Moves vanilla's own reputation. `0` radius is the speaker alone. |
| `open_dialogue` | `dialogue` | Carries on into another file, same speaker. This is how trees are built. |
| `go_back` | none | Returns to whatever they left to ask about this. Pair with `can_go_back`. |
| `open_trades` | none | Vanilla's merchant screen, through vanilla's own discount path. Returns here after. |
| `if_so` | `requires`, `then` | One choice that pays differently depending on the world. |
## Ranges [#ranges]
Values outside these are reported when the pack is read, rather than silently clamped at runtime.
| Field | Range |
| ----------------- | ------------------ |
| `count` | 1 to 64 |
| `seconds` | 1 to 86400 (a day) |
| `amplifier` | 0 to 4 |
| `health` | 0.5 to 100.0 |
| `points` | 0 to 100000 |
| `levels` | 0 to 100 |
| `volume` | 0.0 to 2.0 |
| `pitch` | 0.5 to 2.0 |
| `amount` (gossip) | 1 to 100 |
| `radius` (gossip) | 0.0 to 128.0 |
## The ones worth knowing about [#the-ones-worth-knowing-about]
### `run_command` [#run_command]
A conversation can do anything a datapack function can: place a structure, grant an advancement, move a scoreboard, start your own quest, without anyone writing Java.
```json
{ "type": "run_command", "command": "function mypack:open_the_gate" }
```
It runs from the player's position with `@s` bound to them, at permission level 2, with output suppressed.
### `adjust_gossip` [#adjust_gossip]
This moves **vanilla's own** gossip: the same number that already sets trade prices, already decides whether the golems mind you, and already spreads between villagers on its own.
```json
{ "type": "adjust_gossip", "gossip": "minor_positive", "amount": 5, "radius": 16.0 }
```
A `radius` of `0` means the speaker alone, which is the usual one: they will pass it on themselves. For scale, vanilla hands out 25 for laying hands on a villager, so keep anything a conversation gives away well under that.
### `open_trades` [#open_trades]
Opens vanilla's merchant screen through vanilla's own discount path, so reputation earned in the conversation is already priced in. The conversation returns when the trades are closed.
Vanilla's container screens read 1–9 as "swap the hovered slot with that hotbar slot", so a digit *held* into a choice that opens the trades can swap whatever the pointer is resting on. It needs both a held key and a pointer over a slot.
### `if_so` [#if_so]
One choice that pays differently depending on the world, rather than two choices with the same words on them.
```json
{
"type": "if_so",
"requires": [ { "condition": "at_hour", "span": "night" } ],
"then": [
{ "type": "give_item", "item": "minecraft:torch", "count": 4 }
]
}
```
### `go_back` [#go_back]
Returns the player to whatever conversation they left to ask about this one. Pair it with the `can_go_back` condition so the way back is only offered where there is one:
```json
"choices": [
{
"label": { "translate": "mypack.back" },
"requires": [ { "condition": "can_go_back" } ],
"actions": [ { "type": "go_back" } ]
},
{
"label": { "translate": "mypack.back" },
"requires": [ { "condition": "inverted", "of": { "condition": "can_go_back" } } ]
}
]
```
Two choices with the same label, one that returns and one that simply closes, so the same wording works whether the player arrived from a menu or walked up to the speaker.
## Write them in pairs [#write-them-in-pairs]
**An action that takes something goes with a [condition](/mods/rpg-dialogue/conditions) that checks for it**, and the player is never offered what they cannot afford.
* `take_item` over the same thing `has_items` guards.
* `go_back` behind `can_go_back`.
* `open_trades` behind `has_trades`.
## Adding your own [#adding-your-own]
A record, a `MapCodec`, and one call. See [For mod developers](/mods/rpg-dialogue/for-developers#adding-an-action-condition-or-value).
# Choice slots (/mods/rpg-dialogue/choice-slots)
A dialogue is one id and one file: claim the same id and you replace it outright. That is the right answer for rewriting somebody's greeting, and the wrong one for *adding a line to it*, since two packs that both did it would erase each other silently.
So a conversation can leave a gap with a name on it, and anyone may write for the gap.
## The host leaves a slot [#the-host-leaves-a-slot]
**`data/villagers/dialogues/farmer.json`**, the pack that owns the greeting:
```json
"choices": [
{ "label": { "translate": "villagers.choice.trade" }, "actions": [ { "type": "open_trades" } ] },
{ "slot": "villagers:business" },
{ "label": { "translate": "villagers.choice.weather" } },
{ "label": { "translate": "rpg_dialogue.choice.leave" } }
]
```
A `{ "slot": "..." }` entry sits among the ordinary choices, in the position where contributions belong.
## Another pack fills it [#another-pack-fills-it]
**`data/errands/dialogue_choices/deliveries.json`**, a different pack entirely:
```json
{
"into": "villagers:business",
"priority": 0,
"choices": [
{
"label": { "translate": "errands.choice.deliver" },
"requires": [ { "condition": "errands:errand", "state": "ready" } ],
"actions": [ { "type": "errands:hand_in_errand" } ]
}
]
}
```
| Field | Default | Meaning |
| ---------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `into` | required | The slot to fill, named exactly as the `slot` that declares it. A list, `"into": ["a:x", "b:y"]`, fills several with the same choices. |
| `priority` | `0` | Where these sit among other packs' contributions to the same slot. Highest first, ties broken by file id. |
| `choices` | required | Ordinary [choices](/mods/rpg-dialogue/dialogue-files#choices), `requires` and `actions` and all. |
**One file can fill forty conversations.** Every greeting that leaves the same slot open is filled by the same contribution, rather than five choices copied into forty files that then drift apart.
## Four things worth knowing [#four-things-worth-knowing]
### The host decides where they land [#the-host-decides-where-they-land]
Appending to the end would put contributions after the farewell, and the farewell has to stay last.
### Contributions add, they do not replace [#contributions-add-they-do-not-replace]
Two packs filling one slot both appear. A slot nobody fills is not there at all, so a mod that ships a greeting with a gap for its sibling works perfectly well on its own.
### One file can fill several slots [#one-file-can-fill-several-slots]
Give `into` a list where the same choices belong in more than one place.
```json
{ "into": [ "rpg_villagers:business", "rpg_errands:business" ], "choices": [ ... ] }
```
A mod that fills a village mod's slot when it is installed, and its own fallback greeting's when it is not, is writing the same choices for both.
### You cannot inject into a conversation that did not invite it [#you-cannot-inject-into-a-conversation-that-did-not-invite-it]
No slot, no gap. Override the file instead. A slot is an invitation, and one you can read in the file rather than discover at runtime.
## How it behaves [#how-it-behaves]
Contributed choices are weighed by their own `requires` when the panel is sent, exactly like the host's own.
The merge happens **as the pack is read**, so what the player sees is one list that nothing downstream can tell from a conversation written by a single hand.
It is reported in the log:
```
Choices are written for slot x:y, which no dialogue leaves open
```
This is the one mistake here with no visible symptom, since the choices simply are not there. It is also **expected** in a clean run of any mod that names an absent sibling's slot: an optional integration costs one warning per boot and nothing else.
# Conditions (/mods/rpg-dialogue/conditions)
`"condition"` in any `requires` list: on a [choice](/mods/rpg-dialogue/dialogue-files#choices), a [variant](/mods/rpg-dialogue/variants), a [murmur line](/mods/rpg-dialogue/murmurs), or a [speaker binding](/mods/rpg-dialogue/speakers).
A list is an **and**. `any_of` is the or, `inverted` is the not.
They are weighed on the server as the panel is sent, and again when it comes back up, so a merchant who sold out while the player was reading is no longer offering to show you. A choice that fails a condition is never sent at all.
## About the conversation [#about-the-conversation]
| Condition | Fields | True when |
| --------------- | ---------------------------------------- | ------------------------------------------------------------------------------ |
| `has_flag` | `flag`, `is`=true | The player carries that flag. **Reach for this first.** |
| `has_completed` | `dialogue` | They have read that conversation through to the end. |
| `has_items` | `item`, `count`=1 | They are carrying enough. Item or `#tag`. |
| `holding` | `item`, `is`=true | It is in one of their hands. |
| `times_spoken` | `at_least`=0, `at_most`=∞, `today`=false | How often they have come to *this* speaker, counting the visit being paid now. |
| `can_go_back` | none | They turned away from something to be here. |
| `has_trades` | none | The speaker has something in stock right now. |
| `sells` | `item` | The speaker has that particular thing in stock. |
| `profession` | `is` (list) | The speaker's trade is one of these. |
| `any_of` | `of` (list) | Any one of them holds. |
| `inverted` | `of` | The wrapped one does not. |
`profession` is what a villager **is**, where `sells` is what they happen to have on the counter today.
## About the world [#about-the-world]
All of these measure from the **speaker**, not the player. A remark about the weather is theirs. A conversation opened with nobody on the other side falls back to the reader.
| Condition | Fields | True when |
| ------------------- | --------------------------------- | ----------------------------------------------------------------------- |
| `at_hour` | `span` | See [Spans](#spans). |
| `in_weather` | `sky` | `clear`, `rain`, `thunder`. A storm is not also rain. |
| `in_biome` | `biomes` (tag) | They are standing in that country. |
| `indoors` | `is`=true | They cannot see the sky. A tree counts, and should. |
| `during_raid` | none | There is a raid on where they stand. |
| `near_structure` | `structures` (tag), `chunks`=4 | One stands in an already-loaded chunk nearby. `chunks` is 0 to 8. |
| `in_village` | `is`=true | By vanilla's own reckoning: the beds and workstations actually claimed. |
| `village_has` | `professions` (list), `radius`=48 | Somebody of that trade is within reach. `radius` is 1 to 128. |
| `reputation` | `gossip`, `at_least`, `at_most` | Vanilla's gossip, the same number that sets prices. |
| `player_health` | `at_least`=0.0, `at_most`=1.0 | A *share* of their maximum, not half-hearts. |
| `player_has_effect` | `effect` | They have it. `hero_of_the_village` is the one worth writing for. |
| `remembers` | `memory`, `is`=true | Any of the facts a villager's brain already holds. |
| `doing` | `is` | See [States](#states). |
## Spans [#spans]
`at_hour` takes one of six, by the world's own daylight clock.
| Span | Ticks |
| ------------- | -------------- |
| `day` | 0 to 11999 |
| `night` | 13000 to 22999 |
| `morning` | 0 to 5999 |
| `afternoon` | 6000 to 11999 |
| `evening` | 12000 to 13999 |
| `small_hours` | 16000 to 19999 |
They overlap deliberately: `morning` and `afternoon` are halves of `day`, and `small_hours` is the dead middle of the night rather than all of it.
## States [#states]
`doing` describes what the speaker is up to.
| State | Means |
| -------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `calm` | Not preoccupied: the same question a conversation asks before it opens, so this is somebody who would have stopped to talk. |
| `idle` | Nobody in their sights and nothing has just hit them. The plainer question, and the same for every kind of mob. |
| `fighting` | Swinging at something: you, or anybody else. |
| `fighting_you` | Swinging at the player reading this, which is worth its own line. |
| `fleeing` | Running, hiding, or keeping something at arm's length. |
| `threatened` | Something hostile is within eight blocks and in plain sight of them. The most expensive condition here. |
A conversation cannot open with somebody who is fighting or fleeing, so a *conversation* gated on those would never be given. Put them on [murmur lines](/mods/rpg-dialogue/murmurs) instead.
## Reputation [#reputation]
```json
{ "condition": "reputation", "gossip": "major_negative", "at_most": 0 }
```
This is vanilla's own gossip, not a second reputation kept alongside it: the same number that decides whether you get a discount, and which villagers already pass between themselves as they go about the day.
Leave `gossip` out and it is the reckoning of all of it together. A speaker with no gossip of its own, an iron golem for instance, borrows the nearest villager's.
## Player health [#player-health]
```json
{ "condition": "player_health", "at_most": 0.4 }
```
A **share** of their maximum, from `0.0` to `1.0`, rather than a count of half-hearts, so one line works for a player on twenty hearts and a player on ten.
## Memories [#memories]
`remembers` reaches any of the roughly thirty facts a villager's brain already keeps, by their vanilla ids:
```json
{ "condition": "remembers", "memory": "minecraft:golem_detected_recently" }
```
Useful ones include `minecraft:home`, `minecraft:job_site`, `minecraft:meeting_point`, `minecraft:golem_detected_recently`, `minecraft:hurt_by`, and `minecraft:last_slept`. Set `"is": false` to ask that they do **not** hold it, which is how you write a villager who has nowhere to sleep.
## Combining them [#combining-them]
```json
"requires": [
{ "condition": "at_hour", "span": "night" },
{
"condition": "any_of",
"of": [
{ "condition": "in_weather", "sky": "thunder" },
{ "condition": "during_raid" }
]
},
{ "condition": "inverted", "of": { "condition": "has_flag", "flag": "mypack:already_warned" } }
]
```
At night, during either a storm or a raid, and only if they have not been warned already.
## Adding your own [#adding-your-own]
A record, a `MapCodec`, and one call. See [For mod developers](/mods/rpg-dialogue/for-developers#adding-an-action-condition-or-value).
# Dialogue files (/mods/rpg-dialogue/dialogue-files)
`data//dialogues/.json`. Everything is optional except having something to say.
## The fields [#the-fields]
| Field | Meaning |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `pages` | One page per click, typed out in turn. Give this or `variants`. |
| `variants` | [Several tellings](/mods/rpg-dialogue/variants), one picked per opening. |
| `speaker` | The name at the head of the panel. Left out, whoever was clicked supplies theirs. |
| `portrait` | Who stands in the window. See [Portraits](#portraits). |
| `sounds` | `{ "move": }`, with optional `volume` and `pitch`. The panel under the player's hands, not the speaker. |
| `reveal_speed` | Characters per tick, `1`–`64`. Default `2`. `64` means "already written", no reveal at all. |
| `dismissible` | Whether escape closes it early. **Default `true`.** `false` makes them read it through. |
| `theme` | Six colours. See [Themes](#themes). |
| `choices` | What the player can say at the end. None means the last page simply closes. May include a [slot](/mods/rpg-dialogue/choice-slots) for another pack to fill. |
| `with` | Facts the world has to supply before a line can be said. See [Values](/mods/rpg-dialogue/values). |
| `on_close` | [Actions](/mods/rpg-dialogue/actions) that run when the player is finished, whatever they chose and even if nothing. |
| `once` | Whether `on_close` runs only the first time each player finishes it. |
`once` is for a welcome that hands out a keepsake. It gates `on_close` only; choices are never gated this way.
## Choices [#choices]
A choice is a `label`, an optional `requires`, and an optional `actions`.
```json
"choices": [
{
"label": { "translate": "mypack.smith.repair" },
"requires": [ { "condition": "has_items", "item": "minecraft:iron_ingot", "count": 3 } ],
"actions": [
{ "type": "take_item", "item": "minecraft:iron_ingot", "count": 3 },
{ "type": "run_command", "command": "..." }
]
},
{ "label": { "translate": "rpg_dialogue.choice.leave" } }
]
```
A choice whose `requires` do not hold is never sent to the client at all, so writing conditions is how you hide an answer rather than grey it out.
A conversation offering no valid choices is given a farewell line automatically. Write your own anyway: yours will be in the speaker's voice.
## Portraits [#portraits]
Leave `portrait` out and the window shows **whoever the player walked up to**, exactly as they look, framed on their face. How close to stand is measured off them, so a baby and an iron golem both fill the window. That gets you a villager's profession, outfit and badge, or any mob's armour and trim, without the dialogue describing any of it.
| Field | Default | Meaning |
| ---------- | ------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `entity` | whoever was clicked | Builds a copy of that entity type to draw instead. See the warning below. |
| `framing` | `face` | `face` for head and shoulders, `full` to stand them in the window whole. |
| `scale` | measured | Pixels per block of speaker. Naming one overrules the measurement for every speaker who ever reads this dialogue. |
| `body_yaw` | `-32.0` | Three-quarter turn, so the speaker is angled rather than facing dead-on. |
| `head_yaw` | `15.0` | Head turned back off that angle, so they still address the player. |
| `tilt` | `-11.0` | Slight downward view tilt, for the isometric feel. |
| `offset_x` | per framing | Centring nudge in blocks, applied after the scale. |
| `offset_y` | per framing | The same, vertically. Positive lowers the speaker in the window. |
`framing` owns the rest of the defaults along with it, so asking for `full` does not mean restating the scale and centring to get a sensible result back.
Naming a type builds a copy purely to be drawn, and a copy is never added to a level and never ticked, so an animation pack driving a model off the entity's own counters holds it on one frame. Anything chosen per entity rather than per type goes the same way: a face picked off a UUID is picked off a brand new one, so the window shows a different villager from the one the player walked up to.
Name a type for a speaker who is genuinely absent: a voice out of a book, somebody being quoted, a dialogue nobody walked up to.
```json
"portrait": { "entity": "minecraft:evoker", "framing": "full" }
```
For anyone standing in front of the player, leave `portrait` out, or give it `framing` and `scale` without an `entity`, and open the dialogue with them as the target. They are then drawn as they are, moving as they move.
## Themes [#themes]
Six colours, written as `#RRGGBB` or `#AARRGGBB`. The defaults suit vanilla's inventory texture.
| Field | Default | What it colours |
| ------------ | ----------- | ------------------------------------------------------------------------- |
| `speaker` | `#4A2410` | The name at the head of the panel, a warm brown so it reads as a heading. |
| `body` | `#1F1F1B` | The spoken text. Near-black on purpose. |
| `hint` | `#3D3D36` | A choice at rest. |
| `hint_hover` | `#D9901A` | A choice under the pointer or lit by the keyboard. |
| `separator` | `#5D6159` | The rule under the speaker's name, drawn as a bevel shadow. |
| `backdrop` | `#73000000` | The tint laid over the world behind the panel. |
```json
"theme": {
"speaker": "#B03A2E",
"hint_hover": "#E8C547",
"backdrop": "#A0000000"
}
```
Anything you leave out keeps its default.
## Sounds [#sounds]
```json
"sounds": { "move": "minecraft:ui.button.click", "volume": 0.55, "pitch": 1.0 }
```
This is the sound of the **panel**, made as the player moves between answers, not the sound of somebody talking. For that, see [what a speaker sounds like](/mods/rpg-dialogue/for-developers#what-a-speaker-sounds-like).
## Reveal speed [#reveal-speed]
Characters per tick, from `1` to `64`. The default of `2` reads at about the pace of somebody speaking.
Set `64` for a conversation that should simply be on screen: a sign, a note, an interface pretending to be a conversation.
## Text is a text component, everywhere [#text-is-a-text-component-everywhere]
Every field that takes text takes a full Minecraft text component, so all of this is available:
```json
{ "text": "Careful with that.", "color": "red", "italic": true }
{ "translate": "mypack.smith.warning" }
{ "translate": "mypack.golem.count", "fallback": "I keep %s of them." }
```
Use `translate` for anything you intend to ship. A `fallback` keeps the line readable for anyone who has not installed your language file, which is what the bundled example does.
# Your first conversation (/mods/rpg-dialogue/first-conversation)
Two files in a datapack, and a villager will talk to you. Put them in a datapack in `world/datapacks/`, or in your mod's own `data/` folder if you are writing one.
## Two files [#two-files]
### What she says [#what-she-says]
**`data/mypack/dialogues/innkeeper.json`**
```json
{
"speaker": { "text": "Marda" },
"pages": [
{ "text": "You look like you have walked a long way." },
{ "text": "There is a bed upstairs, and stew if you want it." }
],
"choices": [
{
"label": { "text": "I will take the stew." },
"requires": [ { "condition": "has_items", "item": "minecraft:emerald" } ],
"actions": [
{ "type": "take_item", "item": "minecraft:emerald" },
{ "type": "give_item", "item": "minecraft:rabbit_stew" }
]
},
{ "label": { "text": "Another time." } }
]
}
```
### Who says it [#who-says-it]
**`data/mypack/dialogue_speakers/innkeeper.json`**
```json
{
"entity": "minecraft:villager",
"dialogue": "mypack:innkeeper"
}
```
### Try it [#try-it]
Run `/reload`, then right-click a villager. That is the whole loop.
## What that file is already doing [#what-that-file-is-already-doing]
**The stew choice is not offered at all** unless the player is carrying an emerald. Conditions are weighed on the server, and a choice that fails one is never sent.
**The panel is headed "Marda"** rather than "Villager", because you said so. Leave `speaker` out and whoever was clicked supplies their own name.
Write `{ "translate": "mypack.innkeeper.1" }` instead of `{ "text": ... }`. Every field that takes text is a full text component, so a language file is free.
## The shape of it [#the-shape-of-it]
A conversation is **pages**, then **choices**. Nothing else is required: a dialogue with pages and no choices is an announcement, and the last page simply closes.
A choice with no `actions` is a way out of the conversation and nothing more, which is what most farewells are.
## Namespaces [#namespaces]
An unnamespaced kind means one of this mod's. `"type": "give_item"` and `"type": "rpg_dialogue:give_item"` are the same thing.
Kinds from another mod are namespaced as normal: `"type": "yourmod:ring_the_bell"`.
References to a *dialogue* always need the namespace, since nothing can guess which pack you meant. `"dialogue": "mypack:innkeeper"`, never `"dialogue": "innkeeper"`.
## Next [#next]
# For mod developers (/mods/rpg-dialogue/for-developers)
Everything on the other pages is a datapack file and needs no Java. This page is for a mod that wants to add to the system rather than write for it.
## Depending on it [#depending-on-it]
The jar is on Modrinth, which serves a public Maven. There is no repository of ours to add:
```gradle
repositories {
maven { url = "https://api.modrinth.com/maven" }
}
dependencies {
// Fabric
modImplementation "maven.modrinth:rpg-dialogue:"
// NeoForge
implementation "maven.modrinth:rpg-dialogue:"
}
```
The javadoc documents the whole API. The licence grants you the right to depend on it and to redistribute the unmodified jar in a modpack, and you may license your own mod however you like. Anything you write *for* it, dialogues, murmurs and translations, is yours outright.
## Opening a conversation [#opening-a-conversation]
```java
DialogueManager.open(player, ResourceLocation.fromNamespaceAndPath("yourmod", "greeting"), speaker);
```
That is the whole of it. `speaker` may be `null` for a conversation with nobody in particular, in which case conditions that ask about a speaker fall back to the reader.
Also useful:
| Call | Answers |
| --------------------------------------------- | ----------------------------------------------------------------------- |
| `DialogueManager.has(id)` | Whether any pack defines it. |
| `DialogueManager.hasCompleted(player, id)` | Whether they have read it through. Persisted, and carried across death. |
| `DialogueManager.isTalkingTo(player, entity)` | Whether those two are mid-conversation. |
| `DialogueManager.speakingTo(entity)` | Who, if anybody, that entity is talking to. |
| `DialogueManager.interrupt(entity)` | Ends it, for when your mob has somewhere more urgent to be. |
## Adding an action, condition or value [#adding-an-action-condition-or-value]
A record, a `MapCodec`, and one call. Register while your mod initialises, before any pack is read.
```java
public record RingTheBell(int radius) implements DialogueAction {
public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group(Codec.INT.optionalFieldOf("radius", 16).forGetter(RingTheBell::radius))
.apply(instance, RingTheBell::new));
@Override public MapCodec extends DialogueAction> codec() { return CODEC; }
@Override public void run(DialogueContext context) {
// context.player(), context.target(), context.speaker()
}
}
DialogueAction.register(ResourceLocation.fromNamespaceAndPath("yourmod", "ring_the_bell"),
RingTheBell.CODEC);
```
Packs then write `{ "type": "yourmod:ring_the_bell", "radius": 24 }`.
`DialogueCondition.register` and `DialogueValue.register` work the same way. Namespace them to your own mod: an unnamespaced name in a file means one of this mod's, so taking one of those over is not something a pack can ask for by accident.
## Hooks [#hooks]
| Hook | For |
| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DialogueEvents.OPENED` / `CLOSED` / `ABANDONED` | Every conversation ends exactly once, through `CLOSED` if the player was there and `ABANDONED` if they were not, so anything held for its duration has somewhere to let go. |
| `Attention.HOLDING` / `BROKE_OFF` | Say that a mob of yours is attending to somebody, and it will stand still and turn to face them for as long as that holds. Two neighbours mid-conversation are the obvious case. A conversation and a trade already do this. `BROKE_OFF` tells you when it is over, so you do not have to work out for yourself when a speaker has somewhere more urgent to be. |
| `DialogueSpeakers.NAMING` | Give entities proper names. "Villager" above a line of dialogue undoes most of what the dialogue was for. First registration to answer wins; a name tag always beats all of them. |
| `SpeakerBindings.route` | Choose a conversation in code at the moment of the click, for the one thing a binding cannot do: name a file that depends on the speaker. See [Routing](/mods/rpg-dialogue/speakers#routing-when-a-file-cannot-name-the-dialogue). |
| `Speech.BEGAN` / `Speech.REVEALED` | Client-side. Make your own noise as a speaker's words appear, per line or per letter. See [below](#what-a-speaker-sounds-like). |
| `MurmurManager.speak` | Put a line over anybody's head, to everyone in earshot, in their own voice, without a conversation being opened. The primitive [murmurs](/mods/rpg-dialogue/murmurs) are built on. |
| `WorldText.CROWDING` | Say that your own marker occupies the space over an entity's head, and murmurs there will lift clear of it. |
| `DialoguePosable` | Implement on your entity to arrange it before it is drawn in the portrait window: drop a spawn animation, hide a marker. |
| `PlayerFlags` | Read and write the same flags `set_flag` and `has_flag` use. |
| `Recently.pick` | Reuse the no-repeats memory for your own barks, so yours and ours know about each other. |
| [Choice slots](/mods/rpg-dialogue/choice-slots) | Add your choices to a conversation another mod owns, and leave gaps in yours for a sibling mod to fill. No Java at all; it is a file in your own `data/`. |
| `FloatingText` | Draw your own world-space text the way murmurs are drawn, rather than nearly that way. |
| `WorldIcon` | The same for a sprite rather than a sentence: a quest marker, a status icon. Pair it with `WorldText.CROWDING` and murmurs will lift clear of it. Two copies of this code is how two mods' marks end up at different heights over one head. |
It is undone straight afterwards, because the entity in the window is usually the live one still standing out in the world. Set a flag your renderer reads and clear it again. Never write anything they keep counting.
## What a speaker sounds like [#what-a-speaker-sounds-like]
This mod plays a speaker's **own idle noise, once, as each line begins**. A villager hums, a pillager grunts, an iron golem creaks, whatever vanilla already has them say when they have nothing to say. It needs no files and is right for every mob, including modded ones.
That is deliberately all it does. A written voice, meaning a blip every few letters and a pitch per profession, is a large thing to carry and means having an opinion about what a villager sounds like. [Valor Core](https://modrinth.com/mod/valor-core) has that, and any mod can do the same:
```java
// from your client initialiser: one blip every five letters, per speaker
Speech.BEGAN.register((speaker, line) -> letters.put(speaker.getId(), 0));
Speech.REVEALED.register((speaker, letter, at) -> {
if (!Character.isLetterOrDigit(letter)) return;
if ((letters.merge(speaker.getId(), 1, Integer::sum) - 1) % 5 == 0) playYourBlip(speaker, letter);
});
```
`Speech.BEGAN` fires once per line, before any of it is on screen. `Speech.REVEALED` fires for every letter as it appears. Both fire for a conversation and for an overheard murmur alike, so one listener covers both.
`at` counts every character there is, spaces and punctuation included, so blipping on every fifth of those is a beat too quick and leaves a hole wherever the writing has a gap. Counting only what should sound spaces the blips five *letters* apart however much punctuation is between them.
There is no `voice` field on a dialogue or a murmur. A voice is a fact about who is talking, not about which file they are reading from.
## Design rules worth knowing [#design-rules-worth-knowing]
Things the API assumes, which will save you a confusing hour.
### The client is told nothing it does not need [#the-client-is-told-nothing-it-does-not-need]
It receives the words, the choice labels, and whether each label leads to another screen. Never the actions, never the conditions, never which entity the server attached the conversation to.
A close packet is checked against the conversation the server opened, and the answer counts only as a position in the list the server itself sent, so a choice whose conditions failed cannot be picked by naming its index.
The one exception is the list of entity **kinds** something is bound to, sent on join and after a reload. It buys the client the ability to leave a click alone, and gives away no more than a player would learn by clicking one of each.
### Conditions are weighed twice [#conditions-are-weighed-twice]
As the panel is sent, and again when it comes back up. A merchant who sold out while the player was reading is no longer offering to show you.
### A conversation with three questions is one visit [#a-conversation-with-three-questions-is-one-visit]
`times_spoken` counts walking up to somebody, not clicking through their branches, and a menu they opened and closed does not count either.
### A file that does nothing but branch still needs a way out [#a-file-that-does-nothing-but-branch-still-needs-a-way-out]
A conversation offering no valid choices is given a farewell line automatically, so the player is never stuck on a panel with nothing to press.
### Datapack, therefore overridable [#datapack-therefore-overridable]
A pack can replace any dialogue your mod ships by claiming the same id, and `/reload` re-reads all of it. Clients need no copy of anything.
## What holds a speaker still [#what-holds-a-speaker-still]
A mob with somebody's attention has its AI step cancelled outright, which is the whole of standing still and facing them. Nothing in vanilla does this: marking a villager as trading does not, because the brain ticks regardless, so without it they walk off to bed mid-sentence.
Register through `Attention.HOLDING` and your own mob gets the same treatment, and `BROKE_OFF` when it ends.
# RPG Dialogue (/mods/rpg-dialogue)
A panel rises, somebody speaks a line at a time, and the player answers. Every word of it, and everything it does about the world, is a datapack file, so a modpack needs no Java and a mod needs one line of it.
RPG Dialogue is a library. No items, no changed vanilla behaviour, nothing in front of a player until a pack asks for it. The one exception is the [bundled example](#the-bundled-example), which is on by default.
## At the panel [#at-the-panel]
What the player presses, once a conversation is open.
| Key | What it does |
| ---------------------------------- | --------------------------------------------------------------------------------------------------------- |
| **1**–**5** | Says the answer the digit is drawn beside. |
| **↑** **↓**, **W** **S** | Moves between answers. Whatever the player has walking bound to, not W and S as such. |
| **Wheel** | The same, and it carries a long list along with it. |
| **Enter**, **Space** | Finishes the line, then turns the page or says the lit answer. |
| **Escape** | Leaves, if the conversation allows it. See [`dismissible`](/mods/rpg-dialogue/dialogue-files#the-fields). |
| **Click** | Anywhere finishes the line; on an answer, says it. |
## Installing [#installing]
**Minecraft 1.21.1**, on either **Fabric** or **NeoForge**. There is one jar and it runs on both.
On Fabric, install **Fabric API** as well. It is the only dependency this mod has on either loader.
Drop the jar in `mods/`. On a server it belongs on the server; clients need it too, since the panel is drawn client-side.
## The bundled example [#the-bundled-example]
Switched **on** when you install it: one talkative villager, a few things overheard, and lines for raiders. Every file is in the jar under `data/rpg_dialogue_example/`, to read as a worked example.
Right-click a villager and they will say one of six things, picked to suit the hour, your health, and how often you have bothered them already.
Turn it off in `config/rpg_dialogue.properties`, which the mod writes on first launch:
```properties
example_content=false
```
The example's speaker binding sits at priority `-1000`, so anything you write outranks it automatically.
## Where to go next [#where-to-go-next]
# Murmurs (/mods/rpg-dialogue/murmurs)
Half a thought that was not meant for the player, floating over a speaker's head for a few seconds. Nothing to answer, nothing remembered, and the cheapest characterisation there is: a hostile that mutters something on the way in is a person doing something.
## A murmur file [#a-murmur-file]
`data//murmurs/.json`
```json
{
"speakers": [ "#minecraft:raiders" ],
"lines": [
{ "text": { "translate": "mypack.murmur.cold" } },
{ "text": { "translate": "mypack.murmur.captain" }, "weight": 2 },
{
"text": { "translate": "mypack.murmur.charge" },
"requires": [ { "condition": "doing", "is": "fighting" } ]
}
]
}
```
| Field | Default | Meaning |
| ---------- | ----------- | -------------------------------------------------------------------------------- |
| `speakers` | required | Entity types or `#tags` these lines belong to. |
| `lines` | required | The lines themselves. |
| `when` | `overheard` | `overheard` for the ordinary kind, `brushed_off` for [the other](#brushed-off). |
| `priority` | `0` | Settles which file wins where two disagree. |
| `requires` | none | [Conditions](/mods/rpg-dialogue/conditions) asked of **every** line in the file. |
A line takes the same `text`, `requires`, `with` and `weight` a [variant](/mods/rpg-dialogue/variants) does, and draws on the same no-repeat memory, so a player is not told the same murmur twice in a row wherever it came from.
## Lines gather [#lines-gather]
Lines gather across **every** file that covers a speaker, so a file written for one particular mob adds to your general one rather than replacing it, and nobody has to own the file for villagers.
## Narrowing a file [#narrowing-a-file]
A file-level `requires` asks the same of every line in it, which is how you narrow a file below what `speakers` can express. A `#tag` is a kind of entity, and a farmer is not a kind of entity:
```json
{
"speakers": [ "minecraft:villager" ],
"requires": [ { "condition": "profession", "is": [ "minecraft:farmer" ] } ],
"lines": [ { "text": { "translate": "mypack.murmur.farmer.back" } } ]
}
```
File-level conditions are flattened onto the lines as the pack is read, and behave exactly as though written on each line by hand.
## Brushed off [#brushed-off]
```json
{
"speakers": [ "minecraft:villager" ],
"when": "brushed_off",
"lines": [
{ "text": { "text": "Not now! Not now." } },
{ "text": { "text": "Have you seen what is out there?" } }
]
}
```
A `brushed_off` line is said to a player who tried to start a conversation at a bad moment: the speaker has just been hit, is on fire, has a target, or is running for a doorway. Exactly the states that would have refused the conversation anyway, and no others.
A right-click refused in silence is indistinguishable from a mod that has stopped working, and somebody who will not stop for you ought at least to say so.
A speaker who is asleep, or a merchant already trading with somebody else, is left to vanilla entirely and says nothing. Set [`interrupts`](/mods/rpg-dialogue/speakers) on the binding to let the conversation open regardless, and no `brushed_off` line is ever reached for it.
## Kept deliberately sparse [#kept-deliberately-sparse]
One speaker at a time, then quiet for the best part of a minute before that speaker says anything again. Lines carry sixteen blocks, so a murmur is something you walk into rather than something broadcast at you.
A square where four people mutter at once is a chat room, and the line you were meant to catch is the one you missed.
## Where the text is drawn [#where-the-text-is-drawn]
Murmurs are drawn in world space over the speaker's head. If your own mod hangs a marker there, say so and murmurs will lift clear of it rather than drawing through it. See [`WorldText.CROWDING`](/mods/rpg-dialogue/for-developers#hooks).
## Speaking a line from code [#speaking-a-line-from-code]
For a line over anybody's head with no file and no conversation at all:
```java
MurmurManager.speak(entity, line, earshot);
```
The earshot is yours to choose, since how far something carries depends on what it is. `MurmurManager.EARSHOT` is the sixteen blocks a murmur uses.
# Speaking to somebody (/mods/rpg-dialogue/speakers)
Three ways, and you will probably use all three.
## 1. A right-click [#1-a-right-click]
`data//dialogue_speakers/.json`
```json
{
"entity": "#minecraft:raiders",
"dialogue": "mypack:raider_parley",
"priority": 10,
"requires": [ { "condition": "player_has_effect", "effect": "minecraft:hero_of_the_village" } ]
}
```
| Field | Default | Meaning |
| ------------ | -------- | ----------------------------------------------------------------------------------------------- |
| `entity` | required | An entity type, or a `#tag` of them. |
| `dialogue` | required | The dialogue to open, namespaced. |
| `priority` | `0` | Highest wins where several bindings name the same entity. |
| `requires` | none | [Conditions](/mods/rpg-dialogue/conditions) that must hold for this binding to be the one used. |
| `interrupts` | `false` | Whether the conversation may start while the speaker is being hit, fighting or fleeing. |
Several bindings may name the same entity: **the highest `priority` whose `requires` all hold is the one that opens.** So write the ordinary greeting with no conditions, and stack the special cases above it.
An entity with nothing bound to it is an ordinary right-click, and vanilla handles it as it always did.
`interrupts` is off by default. A speaker who is asked at a bad moment can [say so instead](/mods/rpg-dialogue/murmurs#brushed-off).
### Leave vanilla's item interactions alone [#leave-vanillas-item-interactions-alone]
Binding a conversation to a mob takes over its right-click, which can take away something vanilla did with an item. An ingot mends an iron golem, a bucket milks a cow. Bow out with `holding`:
```json
"requires": [
{ "condition": "inverted", "of": { "condition": "holding", "item": "minecraft:iron_ingot" } }
]
```
A name tag and a spawn egg are refused before any binding is consulted, so naming a bound mob always works. A sleeping speaker, and a merchant already trading with somebody else, are refused too.
## 2. The `/dialogue` command [#2-the-dialogue-command]
For everything that is not a click: entering a region, finishing an advancement, pressing a button.
```mcfunction
dialogue open @s mypack:awakening
dialogue open @a[distance=..8] mypack:the_gate_speaks @e[type=villager,limit=1]
dialogue flag @s set mypack:told_about_ruins
dialogue flag @s clear mypack:told_about_ruins
dialogue flag @s list
dialogue list
```
| Command | Does |
| ---------------------------------------------- | -------------------------------------------------------------------------------- |
| `dialogue open [speaker]` | Opens it for each player. The trailing entity is who the conversation is *with*. |
| `dialogue flag set ` | Writes a flag on each player. The same flags `set_flag` and `has_flag` use. |
| `dialogue flag clear ` | Rubs it out. |
| `dialogue flag list` | Lists what one player carries. |
| `dialogue list` | How many dialogues are loaded. A quick check that a pack was read. |
The trailing `speaker` matters: every condition and value that asks about a speaker asks about **them**, so a line about the weather is theirs and a reward reaches them. Leave it out for a conversation with nobody in particular, and those conditions fall back to the reader.
Permission level 2, the same as a command block. The dialogue argument suggests every id a pack has actually defined, so a typo is caught before the command runs.
A command run from a `minecraft:load` function prints nothing, so `dialogue list` is invisible from one. Use `say` to prove a function ran.
## 3. From code [#3-from-code]
One line of Java, for a mod that opens conversations of its own:
```java
DialogueManager.open(player, ResourceLocation.fromNamespaceAndPath("yourmod", "greeting"), speaker);
```
See [For mod developers](/mods/rpg-dialogue/for-developers#opening-a-conversation).
### Routing: when a file cannot name the dialogue [#routing-when-a-file-cannot-name-the-dialogue]
Reach for this only if you are writing a mod and the *name of the file* depends on the speaker. Everything else is a binding with `requires` and a `priority`, and better written as one, because then a pack can change it.
```java
// dialogues/villager/.json, including a profession from a mod nobody has heard of yet
SpeakerBindings.route(new SpeakerRoute(new Kind.Any(MY_SPEAKERS), 0, false, (player, entity) -> ...));
```
Return `null` to stand aside and let the next entry answer.
Routes sit in the **same priority-ordered list** as the bindings read from `dialogue_speakers/`, so a pack outranks your routing by writing a binding above it, you outrank another mod's by registering higher, and a tie between a route and a binding goes to the binding.
# Values (/mods/rpg-dialogue/values)
Values are listed under `with`, and arrive in the line as translation arguments in that order.
```json
{
"pages": [ { "translate": "mypack.golem.count" } ],
"with": [ { "value": "villagers", "radius": 32.0, "age": "adult" } ]
}
```
```json
{ "mypack.golem.count": "I keep %s of them. All of them, every night." }
```
That says "I keep **seven** of them." Because they are arguments rather than text spliced into the sentence, a translator can put the number wherever their own language wants it.
`with` sits on the dialogue, on a [variant](/mods/rpg-dialogue/variants), or on a [murmur line](/mods/rpg-dialogue/murmurs). A variant names its own rather than inheriting the file's.
## The list [#the-list]
| Value | Fields | Gives |
| -------------- | --------------------------------------------------------- | -------------------------------------------------------------- |
| `player_name` | none | Whoever is being spoken to. |
| `speaker_name` | none | Whoever is talking, by the same name the panel is headed with. |
| `times_spoken` | `today`=false, + [number style](#numbers-arrive-as-words) | How often they have come to this speaker. |
| `villagers` | `radius`=48, `age`=`any`, + number style | How many are within the speaker's sight. `radius` is 1 to 128. |
| `neighbour` | `professions` (list), `radius`=48 | The nearest of that trade, by name. |
`age` on `villagers` is `any`, `adult` or `child`.
## Numbers arrive as words [#numbers-arrive-as-words]
"…seven" is a sentence. "…7" is a debug readout. Any value that counts therefore spells itself out, up to ninety-nine, after which it falls back to figures.
Three fields adjust that, on any counting value:
| Field | Default | Does |
| ------------ | ------- | ---------------------------------------------------------------------- |
| `digits` | `false` | Figures instead of words. For a ledger, a price, a tally on a board. |
| `capitalize` | `false` | For a number that begins a sentence. |
| `off_by` | `0` | Shifts the number reported. For a speaker who counts badly on purpose. |
```json
{ "value": "villagers", "radius": 32.0, "capitalize": true }
```
`off_by` is for characterisation: a speaker who is sure there are eleven of them, and just as sure there are nine two lines later, is a person.
## `neighbour` [#neighbour]
Names the nearest villager of a given trade.
```json
{
"pages": [ { "translate": "mypack.villager.neighbours", "fallback": "%s is about, if you need them." } ],
"with": [
{
"value": "neighbour",
"professions": [ "minecraft:farmer", "minecraft:librarian", "minecraft:cleric" ],
"radius": 48.0
}
]
}
```
Where nobody of that trade is within reach, the line still has to say something, so it falls back to a vague phrase rather than a blank.
Put a [`village_has`](/mods/rpg-dialogue/conditions) condition over the same trades on the line that uses `neighbour`, and a line that names somebody is only ever given where there is somebody to name.
## Text this mod already ships [#text-this-mod-already-ships]
Two translation keys you can use in your own files, so the wording matches everywhere and is translated for you:
| Key | English |
| --------------------------- | -------------------------------- |
| `rpg_dialogue.choice.leave` | "I will trouble you no further." |
| `rpg_dialogue.someone` | "one of the others" |
`rpg_dialogue.choice.leave` is the farewell the panel supplies when a conversation offers no valid choices, so using it for your own way out keeps the two consistent.
## Adding your own [#adding-your-own]
A record, a `MapCodec`, and one call. See [For mod developers](/mods/rpg-dialogue/for-developers#adding-an-action-condition-or-value).
# Variants (/mods/rpg-dialogue/variants)
A dialogue can hold `variants` instead of `pages`: a list of tellings, one of which is picked each time the conversation opens.
```json
{
"variants": [
[ { "translate": "mypack.smith.1" } ],
[ { "translate": "mypack.smith.2" } ],
[ { "translate": "mypack.smith.3" } ],
{
"pages": [ { "translate": "mypack.smith.night" } ],
"requires": [ { "condition": "at_hour", "span": "small_hours" } ],
"weight": 3
}
]
}
```
A bare array is just its pages. The object form adds three fields:
| Field | Default | Meaning |
| ---------- | -------- | ---------------------------------------------------------------------------------------- |
| `pages` | required | The pages of this telling. |
| `requires` | none | [Conditions](/mods/rpg-dialogue/conditions) that must hold for it to be a candidate. |
| `with` | none | [Values](/mods/rpg-dialogue/values) this telling needs. Named per variant, not per file. |
| `weight` | even | How common this one is relative to the others, `1` to `1000`. |
Write four greetings for a trade and the fourth smith the player meets is still saying something new.
## Three things that make this work [#three-things-that-make-this-work]
### The player is not told the same line twice in a row [#the-player-is-not-told-the-same-line-twice-in-a-row]
What they have lately heard is remembered against **them**, not against the speaker. Two villagers reading one file are two mouths on one script, and hearing it from the second directly after the first is worse than hearing it from the same one twice.
A player who hears six different lines and then a repeat concludes there are seven. A player who hears the same line twice concludes there is one.
The memory holds the last twelve at most, and is not saved: a player who logs out and back in has had the break it was standing in for.
### Conditions turn variants from filler into answers [#conditions-turn-variants-from-filler-into-answers]
A line for the rain, a line for the small hours, a line for the fourth time you have asked this morning.
```json
{
"pages": [ { "text": "You are bleeding on my doorstep. Sit down before you fall down." } ],
"requires": [ { "condition": "player_health", "at_most": 0.4 } ],
"weight": 5
}
```
A heavier `weight` on a line that rarely applies means it nearly always wins when it does, without ever being the only thing that could.
### Plain `pages` beside conditional variants is the fallback [#plain-pages-beside-conditional-variants-is-the-fallback]
A dialogue may carry both. The `pages` are given exactly when **none** of the variants apply, rather than turning up at random alongside them, so the ordinary greeting can be plain `pages` and every variant a special case, without writing a condition that means "and none of the others".
## Writing them [#writing-them]
Write the repetitive lines gated on `times_spoken` with `at_most`, and leave one flat line ungated. People do not become irritable when you keep talking to them; they run out of material and then say one flat thing forever.
```json
{
"variants": [
{
"pages": [ { "translate": "mypack.smith.first" } ],
"requires": [ { "condition": "times_spoken", "at_most": 1 } ]
},
{
"pages": [ { "translate": "mypack.smith.warming" } ],
"requires": [ { "condition": "times_spoken", "at_least": 2, "at_most": 5 } ]
}
],
"pages": [ { "translate": "mypack.smith.enough" } ]
}
```
Walking up to somebody is one visit, however many branches the player clicks through, and a menu they opened and closed does not count either. The visit being paid right now is counted, so the first meeting is `at_most: 1`.
## Murmurs work the same way [#murmurs-work-the-same-way]
A [murmur](/mods/rpg-dialogue/murmurs) line takes the same `requires`, `with` and `weight` a variant does, and draws on the same no-repeat memory. Everything on this page applies to both.
# Errand files (/mods/rpg-errands/errand-files)
One errand per file, in `data//errands/.json`. Everything is optional except saying what you want.
```json
{
"wanted": "#c:ingots/iron",
"count": { "min": 6, "max": 12 },
"professions": [ "minecraft:toolsmith" ],
"rewards": [ { "type": "rpg_dialogue:give_item", "item": "minecraft:emerald", "count": 5 } ],
"favour": 8
}
```
**The file path is the id.** `data/mypack/errands/village/stone.json` is `mypack:village/stone`, folders and all, and that id is what a `errands_run` condition counts and what another pack claims to replace it.
**One errand per file**, the way one dialogue is one file. An errand naming an item nothing provides fails to read, and one file each means that failure costs exactly that errand rather than the twenty written beside it.
## The fields [#the-fields]
| Field | Default | Meaning |
| ------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `task` | `rpg_errands:bring` | Which of [the three kinds](/mods/rpg-errands/tasks). Left out it is `bring`, and nine in ten should be. |
| `count` | `1` | How many, as a figure or a span. 1 to 256. See [How many](/mods/rpg-errands/tasks#how-many-a-figure-or-a-span). |
| `called` | the item's or tag's own name | What to call the haul, when neither serves. "A night's catch". |
| `professions` | `[]` | Which trades ask this. Empty means the trade is not what decides it. |
| `entities` | `[]` | Which kinds of creature ask this, for a mod whose people are not villagers. |
| `requires` | `[]` | Everything else that has to hold. The whole [condition registry](/mods/rpg-dialogue/conditions). |
| `rewards` | `[]` | What they get for it. The whole [action registry](/mods/rpg-dialogue/actions). |
| `favour` | `0` | 0 to 200. How well it is thought of afterwards, in vanilla's gossip. |
| `asking` | a shared one | The conversation it is put to the player in. |
| `reminding` | a shared one | What they say when the player comes back without it. |
| `thanking` | a shared one | What they say when it is done. |
| `repeatable` | `true` | Whether it may be run more than once. |
| `weight` | `1` | 1 to 1000. How often it comes up against the others that fit. |
What is actually wanted, `wanted` for a fetch, `quarry` for a hunt, `to` and `away` for a delivery, is read flat out of the same file and belongs to [the task](/mods/rpg-errands/tasks).
## Who asks [#who-asks]
Three fields, and they answer two different questions.
`professions` and `entities` ask **who they are**, and either one alone is enough: an errand naming both is asked by that trade or by that creature. Naming neither means the trade is not what decides it, and anyone a pack points at the errand system may ask.
`requires` asks **about the moment**, and is weighed separately because it changes while the player is standing there and who somebody is does not.
```json
{
"task": "rpg_errands:hunt",
"quarry": "#minecraft:raiders",
"count": { "min": 4, "max": 8 },
"requires": [
{ "condition": "rpg_dialogue:near_structure", "structures": "rpg_errands:ill_omened", "chunks": 6 },
{ "condition": "rpg_dialogue:in_village" }
]
}
```
Anything it can say, `requires` can say too, through `profession`. It is there because naming a trade is what most errands want and should cost one line.
## Paying for it [#paying-for-it]
`rewards` is a list of ordinary [actions](/mods/rpg-dialogue/actions), run in order the moment it is settled. Anything a conversation can do, an errand can pay with.
```json
"rewards": [
{ "type": "rpg_dialogue:give_item", "item": "minecraft:emerald", "count": 5 },
{ "type": "rpg_dialogue:give_item", "item": "minecraft:bread", "count": 3 },
{ "type": "rpg_dialogue:run_command", "command": "advancement grant @s only mypack:helped_out" }
]
```
Because it is the whole registry, a mod that registers an action granting its own currency, skill points or reputation can pay out an errand without a line of this mod changing.
`favour` is separate and is not an action. It moves **vanilla's own gossip** with whoever is standing there, which is the number that already sets your prices, already spreads between villagers by itself and already fades. The shipped errands run from 4 for hauling logs to 14 for clearing a pillager outpost.
`Errand mypack:iron pays nothing at all` in the log means no `rewards` and `favour` of zero. It is not fatal, since a pack may mean to pay in favour alone, but far more often it is a `rewards` block that failed to be written, and the symptom is an errand that feels broken rather than mean.
## The three conversations [#the-three-conversations]
Every errand has three moments: being asked, being reminded, being thanked. Name a file for any of them and it is used; leave one out and a shared conversation is used instead, chosen by the kind of task.
| Task | Asking | Reminding | Thanking |
| --------- | ------------------------------------------ | --------------------- | -------------------- |
| `bring` | `rpg_errands:villager/errand/asking` | `.../reminding` | `.../thanking` |
| `hunt` | `rpg_errands:villager/errand/hunt/asking` | `.../hunt/reminding` | `.../hunt/thanking` |
| `deliver` | `rpg_errands:villager/errand/carry/asking` | `.../carry/reminding` | `.../carry/thanking` |
Three sets rather than one, because the sentences are not interchangeable. "Bring me four of them" is nonsense said about wolves, and "so you are the one they sent" only makes sense said by somebody who was not there when it was agreed.
The shared ones name the goods and the number through [values](/mods/rpg-errands/in-conversation#values), so one written line serves every errand in the pack. Yours can do the same, or write it out in prose. See [Writing your own](/mods/rpg-errands/in-conversation#writing-your-own).
## `repeatable` and `weight` [#repeatable-and-weight]
**`repeatable: false`** for anything that would be strange to be asked for twice. It is counted for good: the tally of what a player has run outlives the promise itself, so a one-off stays run long after the village has forgotten the running of it.
**`weight`** decides how often an errand comes up against the others that fit the same speaker at the same moment. A weight of three comes up three times as often as a weight of one. It is not a percentage and does not have to add up to anything.
Every errand that fits is given a number drawn from who is asking, what day it is and which errand it is, and the lowest wins. So a pack adding a twelfth errand, or a player finishing a one-off, changes which errands are in the running without moving the numbers the others already drew.
## What the log tells you [#what-the-log-tells-you]
Three lines worth grepping for after writing errands.
| Line | Means |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `Loaded 27 errand(s)` | How many files parsed. Not how many are askable. |
| `27 of 27 errand(s) can be asked for in this world` | Every item and entity tag every errand names resolved to something. Printed once the world is standing, and again after each reload. |
| `Could not read errand mypack:iron: ...` | That file failed. |
A parse failure does not always drop the file: whatever parsed is kept, so an errand with one bad reward still loads and the count still reads as expected. Grep for `Could not read`.
The dormant report is the useful one. `26 of 27` names the odd one out, and the usual cause is a tag no installed mod fills, which is exactly what should happen for an errand written for a mod that is not here. See [A tag nothing fills is never asked for](/mods/rpg-errands/tasks#a-tag-nothing-fills-is-never-asked-for).
# Your first errand (/mods/rpg-errands/first-errand)
One file in a datapack, and a toolsmith will ask you for iron. Put it in a datapack in `world/datapacks/`, or in your mod's own `data/` folder if you are writing one.
## One file [#one-file]
### What they want [#what-they-want]
**`data/mypack/errands/iron.json`**
```json
{
"wanted": "#c:ingots/iron",
"count": { "min": 6, "max": 12 },
"professions": [ "minecraft:toolsmith" ],
"rewards": [
{ "type": "rpg_dialogue:give_item", "item": "minecraft:emerald", "count": 5 }
],
"favour": 8
}
```
### Try it [#try-it]
Run `/reload`, then walk up to a toolsmith. About half the time they will be wearing a gold **!**, and their greeting will have "Is there anything you need?" in it.
That is a whole errand: the toolsmith wants between six and twelve iron, pays five emeralds, and thinks better of you for it. Nothing else is required, and there is no second file. The conversation it is asked in, the reminding when you come back short, the thanks when you hand it over and the mark over the head are all supplied.
## What that file is already doing [#what-that-file-is-already-doing]
**It is only ever offered by a toolsmith.** `professions` is asked of who they are, before anything else is weighed.
**It asks for a different amount each time.** The span is the whole point, and the [reason is its own section](#the-span-is-the-point).
**It reaches every mod's iron**, because `#c:ingots/iron` is a tag rather than an item. Written as `"minecraft:iron_ingot"` it would be an errand about vanilla's iron in particular.
**It pays through RPG Dialogue's [action registry](/mods/rpg-dialogue/actions)**, so anything a conversation can hand over, an errand can pay with: an item, a command, a mod's own currency.
**It moves vanilla's gossip by eight.** That is the same number that already sets your prices with that villager and already spreads to their neighbours on its own, so running errands is the way back from having helped yourself to a village.
## The span is the point [#the-span-is-the-point]
A flat number is the same errand every time it is asked. The toolsmith wanted eight iron last week and wants eight iron today, and a player who has run it once has run it forever.
```json
"count": 8
"count": { "min": 6, "max": 12 }
```
Written as a span they want seven this time and eleven the next, and it stops being an entry in a table and starts being somebody short of iron by however much they happen to be short. The figure is drawn once, when the promise is made, and written down, so however the day turns over afterwards they hold you to the number they said.
## Who asks, and when [#who-asks-and-when]
Two separate questions, and they are separate because one changes while the player is standing there and the other does not.
```json
{
"wanted": "#c:ingots/iron",
"professions": [ "minecraft:toolsmith" ],
"requires": [
{ "condition": "rpg_dialogue:in_weather", "sky": "thunder" }
]
}
```
`professions` asks **who they are**. `requires` asks **about the moment**, and takes the whole of RPG Dialogue's [condition registry](/mods/rpg-dialogue/conditions): the weather, the hour, the state of the village, whether they have stock, whatever a mod has taught it to ask about.
`professions` is only shorthand. Anything it can say, `requires` can say too, and `requires` can say a great deal more.
## Saying it in your own words [#saying-it-in-your-own-words]
Left alone, the villager asks plainly and names the goods. An errand with a reason behind it, which is most of the good ones, names a conversation of its own:
```json
{
"wanted": "#c:ingots/iron",
"professions": [ "minecraft:toolsmith" ],
"asking": "mypack:toolsmith_iron"
}
```
That is an ordinary [dialogue file](/mods/rpg-dialogue/dialogue-files), written however you like, which ends in a choice carrying `rpg_errands:take_errand`. See [Errands in conversation](/mods/rpg-errands/in-conversation#writing-your-own).
## Next [#next]
# For mod developers (/mods/rpg-errands/for-developers)
Everything on the other pages is a datapack file and needs no Java. This page is for a mod that wants to work with the system rather than write for it.
## Depending on it [#depending-on-it]
The jar is on Modrinth, which serves a public Maven. There is no repository of ours to add:
```gradle
repositories {
maven { url = "https://api.modrinth.com/maven" }
}
dependencies {
// Fabric
modImplementation "maven.modrinth:rpg-errands:"
// NeoForge
implementation "maven.modrinth:rpg-errands:"
}
```
Everything below is the same class on both loaders. This mod owns no platform service of its own; the two things it cannot do in common code are RPG Dialogue's, and already work on both.
The javadoc documents the whole API. The licence grants you the right to depend on it and to redistribute the unmodified jar in a modpack, and you may license your own mod however you like. Anything you write *for* it, errands, dialogues and translations, is yours outright.
`ordering = "AFTER"` on the `rpg_dialogue` dependency in your `neoforge.mods.toml` if you construct anything through its helpers, which this mod does. Constructed first, the helper has no mod event bus to hand its attachments to.
## Taking somebody out of it [#taking-somebody-out-of-it]
```java
// Never asked, never marked. The click falls through to whatever else would handle it.
Errands.exempt(entity -> Inns.is(entity, Inns.MUSICIAN));
```
Somebody halfway through a set does not stop it to ask you to fetch four rabbit hides, and an inn where all three of them do is not an inn with music in it, it is a queue with a soundtrack.
**Reach for this only when being asked at all is wrong.** Two things that are not reasons:
* **Somebody merely busy.** They should still be asked.
* **Somebody whose greeting you have replaced.** Already covered, and silently: a mark is only drawn where the conversation that would actually open mentions an errand, so a greeting of yours with no errand choice in it takes them out correctly without registering anything.
Register while your mod initialises. It is asked of every villager in range on every sweep, so keep it cheap. A predicate rather than a set of entities because the answer is about what somebody is doing, and that changes.
## The rest [#the-rest]
| Call | Answers |
| ----------------------------------- | --------------------------------------------------------------------------------------- |
| `Errands.between(player, entity)` | Which of the [five states](/mods/rpg-errands/in-conversation#the-five-states) holds. |
| `Errands.standing(player, entity)` | The errand itself, how many were asked for, and how far along. Null for nothing at all. |
| `Errands.offeredBy(player, entity)` | What they would ask for today, or null. |
| `Errands.get(id)` | An errand as a pack wrote it. |
| `Errands.isExempt(entity)` | Whether anything has claimed them. |
| `ErrandLog.timesRun(player, id)` | How often this player has run that particular errand. |
| `ErrandLog.totalRun(player)` | How many they have run for anybody. |
| `Task.register(id, codec)` | A fourth kind of task. |
`standing` hands back one settled record rather than making you assemble it: which errand, who asked, how many were `required()`, how many are `done()`, what `remaining()` is, whether it has been `taken()` and whether it is `settled()`. Which errand somebody wants cannot be read off its own file, since the amount is drawn when the promise is made and how far along the player is depends on the kind of task.
Note that the person `standing` is asked about may not be the person who asked. A delivery is spoken of and settled by whoever it was carried to, and remains the sender's entry in the ledger.
## Adding a task kind [#adding-a-task-kind]
`Task` is deliberately not sealed, and `task` takes a whole namespaced id precisely so that it can be somebody else's. A record, a `MapCodec` and one call:
```java
public record Escort(EntityType> who, int away) implements Task {
public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("who").forGetter(Escort::who),
Codec.intRange(16, 4096).optionalFieldOf("away", 160).forGetter(Escort::away)
).apply(instance, Escort::new));
@Override public MapCodec extends Task> codec() { return CODEC; }
// Where your three shared conversations live, under your own namespace.
@Override public String shared() { return "villager/errand/escort"; }
// amount(), exists(), name(), done(): see the javadoc
}
Task.register(ResourceLocation.fromNamespaceAndPath("yourmod", "escort"), Escort.CODEC);
```
Packs then write `{ "task": "yourmod:escort", "who": "minecraft:villager", "away": 200 }`, and the fields are read flat out of the errand's own file rather than from a block inside it.
| Method | For |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `amount()` | How many are wanted, before the day's draw settles on a figure. |
| `exists()` | Whether there is anything in this world it could mean. False for a tag nothing fills, which is how a kind written for an absent mod lies dormant. |
| `name()` | What to call it in a sentence, when the errand does not name the haul itself. |
| `done(player, held)` | How far along the player is, counted the way your kind counts. |
| `shared()` | Where your three shared conversations live, so a pack using your kind writes none. |
| `settledBy(...)` | Whether somebody other than the sender is who it is settled with. Only a delivery has anybody to say yes to. |
| `countsKill(...)` | Whether killing this counts. Nothing else in the world has an opinion. |
| `collect(player, required)` | Take whatever settling costs, all or nothing, or take nothing at all. |
**Register while your mod initialises, before any pack is read.** A kind nothing has registered is a parse error in every errand that names it.
## Adding a condition, value or action [#adding-a-condition-value-or-action]
Those registries are RPG Dialogue's, not this mod's, and errands take the whole of them. A condition you register can gate an errand's `requires`; an action you register can be an errand's `rewards`, which is how a mod's own currency, skill points or reputation pay out an errand without a line of this mod changing.
See [RPG Dialogue for mod developers](/mods/rpg-dialogue/for-developers#adding-an-action-condition-or-value).
## Drawing your own marks [#drawing-your-own-marks]
If your mod puts a sprite over a head as well, draw it through RPG Dialogue's `WorldIcon`, which is what this mod's marks use, and declare the space with `WorldText.CROWDING` so murmurs lift clear of it. Two copies of that code is how two mods' marks end up at different heights over one villager.
# How it works (/mods/rpg-errands/how-it-works)
Useful to a pack author deciding how much to write, and to anybody wondering why the village behaves as it does.
## An errand is worked out, not stored [#an-errand-is-worked-out-not-stored]
What somebody wants today comes from their uuid, the day number and the errand's id, stirred together. Nothing is saved until a promise is actually made.
That is what buys all of this at once:
* It survives the chunk unloading under whoever was going to ask.
* Every player on a server is told the same thing by the same villager.
* It costs no saved bytes, in a world with two thousand villagers in it.
* It rotates at dawn on its own, with nothing scheduled and nothing to tick.
**About half a village wants something on any given day.** Fifty-five in a hundred, and the rest is the point. A village where everyone has a job for you is a quest hub with thatch on it: you stop talking to people and start clearing a list, and the one who genuinely needs something is indistinguishable from the eleven dispensing content.
## The same answer three times [#the-same-answer-three-times]
A villager is asked what they want three times over: once to decide whether to offer the choice at all, again when the player picks it, and again when the player agrees. Drawn at random the player would be shown one errand and handed another.
So the draw is steady, and so is the number. An errand written as a span wants twenty-six today and thirty-five tomorrow, and **the figure is written into the ledger the moment the promise is made**, so however the day turns over afterwards, they hold you to the number they said.
An errand you were offered and did not take may well be gone tomorrow, because tomorrow is a different draw. One you agreed to is yours until you settle it or twelve days pass.
Every errand that fits is given a number drawn from who is asking, what day it is and which errand it is, weighted by `weight`, and the lowest wins. Drawing per errand rather than picking from a list is what keeps the answer steady when the list moves: adding a twelfth errand, or finishing a one-off, changes which errands are in the running without disturbing the numbers the others already drew.
## The marks [#the-marks]
Worked out on the server, because whether somebody has something to ask is a question about the player asking, and the client is told nothing it could not learn by walking up to them.
**How often.** Once a second, per player. What a villager wants turns over at dawn; the only thing that moves quickly is whether you are carrying enough yet.
**How far.** Villagers within 32 blocks. The client fades them out a little inside that, so one never pops into being in front of you.
**What is sent.** Only what changed. An unchanged village costs the looking and no packet.
**Where it sits.** Where a name tag would, bobbing gently. A [murmur](/mods/rpg-dialogue/murmurs) over the same head lifts clear of it rather than overlapping.
Four things take a villager out of being marked, and only the first two are stated in code:
1. **They are asleep.** A mark over a bed is an invitation to stand there clicking.
2. **They are a child.** A child asks for nothing.
3. **Another mod has claimed them.** See [`Errands.exempt`](/mods/rpg-errands/for-developers#taking-somebody-out-of-it).
4. **Their conversation says nothing about errands.** A nitwit, somebody the village has turned against, or anybody whose greeting your pack rewrote without an errand choice in it.
That last one is the important one. The question a mark has to answer is not "does the errand system have something for them" but "will the player see the option", and it is settled by asking RPG Dialogue which conversation would **actually** open for this player at this moment, conditions weighed, and then looking in that file for an errand choice.
Take the errand choices out of a profession's greeting and its villagers stop being marked, without telling this mod anything. Asking one particular mod which greeting *it* would choose would get the wrong answer the moment a pack outranked it, and the symptom is a mark over somebody whose conversation says nothing about errands.
## The ledger [#the-ledger]
Promises are kept **on the player**, keyed by whoever asked.
* **One per villager.** Agreeing to one with somebody replaces nothing, because they can only have asked for one.
* **Carried across death.** Dying is not a way out of a promise.
* **Lapses after twelve days.** Long enough that an errand is not a timer, short enough that a promise means something.
* **Settled is remembered for the rest of the day.** Then it lapses back to nothing, and that villager has something else to say tomorrow.
* **Pruned as it is written.** Nobody ends up carrying a saved list of every villager they ever met.
Kept on the player rather than on the villager because a promise has to survive the chunk unloading under the person you made it to. Otherwise walking out of render distance is how you get out of an errand.
A promise whose errand a pack has since removed reads as nothing, so a player is never held to a promise the game can no longer describe.
## Favour [#favour]
`favour` moves **vanilla's own gossip**, and deliberately not a reputation of this mod's own. It is the number that already sets your prices, already decides whether the golems mind you, already spreads between villagers by itself and already fades.
Only whoever is standing there is told. They pass it on themselves, in their own time, which is both vanilla's behaviour and the truer one: a favour is between two people until one of them mentions it. For a delivery that means the village at the far end warms to you and the one that sent you does not, which is right. They have not heard yet.
Because it is the same number that a mod like RPG Villagers docks you for robbing the place, running errands is the way back from having helped yourself to a village, without either mod knowing the other exists.
## What is deliberately not here [#what-is-deliberately-not-here]
**Nothing chimes.** Not when the last wolf falls, not when the last iron goes into the pack. An errand is known two ways, by the mark and by asking, and every kind of errand is known those same two ways. A chime for one of the three would say that one of them is really a quest.
**No timer, no counter, no quest log.** The mark is the interface.
**One kill answers one promise**, even where it would answer two. A wolf is one wolf, and two villagers who both want the wolves seen to are both owed their own.
**A hunt starts counting when you agree.** Killing four wolves and then agreeing to deal with the wolves starts from none, which is the only reading that does not have players clearing the woods first and collecting afterwards.
**A fetch is counted by what the thing is.** No enchantment, no name, no durability is inspected, so a villager never turns away perfectly good iron for having a name on it.
# Errands in conversation (/mods/rpg-errands/in-conversation)
Nothing about an errand is hard-wired into who says what. A conversation asks how things stand, says what is wanted, and offers to take it on or hand it over, and all of that is written in datapack files.
Ten kinds, added to RPG Dialogue's own [conditions](/mods/rpg-dialogue/conditions), [values](/mods/rpg-dialogue/values) and [actions](/mods/rpg-dialogue/actions), and used exactly like them.
## The five states [#the-five-states]
How things stand between one player and one person. **Exactly one holds at any moment.**
| State | Means |
| --------- | ----------------------------------------------------------------------------------- |
| `none` | Nothing between them. Either they have nothing to ask, or it is long since settled. |
| `offered` | They have something to ask and the player has not taken it on. |
| `running` | The player took it on and is still short of it. |
| `ready` | The player took it on and is carrying the whole of it. |
| `settled` | They ran it and the villager still remembers. The rest of that day, and no longer. |
That is what lets a conversation offer the right line without asking three questions: a choice gated on `ready` and one gated on `running` can never both be shown, so the villager either asks after the goods or waits for them, and never does both in the same breath.
## Conditions [#conditions]
| Condition | Fields | Holds when |
| ------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------- |
| `rpg_errands:errand` | `state` | That state is the one that holds. |
| `rpg_errands:errand_kind` | `kind` | The errand in play is of that task kind. |
| `rpg_errands:errands_run` | `errand` (optional), `at_least`=0, `at_most`=∞ | The player has run that many. Named, of one errand; left out, of all of them. |
```json
"requires": [
{ "condition": "rpg_errands:errand", "state": "ready" },
{ "condition": "rpg_errands:errand_kind", "kind": "rpg_errands:hunt" }
]
```
`errand_kind` is for the handful of lines that cannot cover all three tasks. "I have what you asked for" is right over a sack of clay and strange said having just come back from killing wolves.
`errands_run` is what a village's opinion of you can be written against without inventing a second reputation to hold it. Somebody who has run nine errands out of this village is a known quantity, and a line gated on `at_least` is how they find that out.
`any_of` takes them as ordinary conditions: `{ "condition": "any_of", "of": [ ... ] }`.
## Values [#values]
| Value | Gives |
| ------------------------------ | ------------------------------------------ |
| `rpg_errands:errand_item` | What is being asked for, by name. |
| `rpg_errands:errand_count` | How many were asked for, as agreed. |
| `rpg_errands:errand_remaining` | How many are still wanted. Never negative. |
These are what let one written line serve every errand in the pack. "%1$s %2$s, if you can spare them" is a sentence about wheat, about copper, about the wolves in the trees and about a mod's own material, none of which needed a file:
```json
{
"pages": [ { "translate": "mypack.asking" } ],
"with": [
{ "value": "rpg_errands:errand_count", "capitalize": true },
{ "value": "rpg_errands:errand_item" }
]
}
```
Both counting values take the usual [number style](/mods/rpg-dialogue/values#numbers-arrive-as-words) fields, so they arrive as words rather than figures. "Twenty-six", not "26". Add `"digits": true` for a ledger, and `"capitalize": true` for a number that begins a sentence.
`errand_remaining` is for the line given to somebody who came back short. A player carrying twenty of the twelve that were asked for is short of none of them, and a villager who announced they were owed minus eight would be doing arithmetic rather than talking.
## Actions [#actions]
| Action | Does |
| ----------------------------- | ------------------------------------------------------------------------------- |
| `rpg_errands:speak_of_errand` | Says the thing that needs saying: the asking, or the reminding. Opens a screen. |
| `rpg_errands:take_errand` | They agree to it. |
| `rpg_errands:hand_in_errand` | Settled: takes what it costs, pays, moves the gossip, says so. Opens a screen. |
| `rpg_errands:drop_errand` | They back out. Nothing was done, so nothing is remembered. |
`speak_of_errand` is one action rather than two on purpose. The conversation gates its choices on the state, and cannot then pair the wrong label with the wrong conversation.
`hand_in_errand` does everything in one place and in one order: take, pay, thank, then say so. Taking comes first and takes all or nothing, so no path through it pays out twice or pays out for a player who dropped the goods on the last page.
Deliberate. The errand is whatever stands between this player and the person in front of them, worked out on the server from the pair of them. A client crafting a packet could at most pick a choice it was already offered about the errand it was already on.
A villager is only marked if the conversation that would actually open for that player contains a choice carrying `speak_of_errand` or `hand_in_errand`. It is asked of the file rather than of the moment, which is what keeps a mark honest, and it means a greeting of your own with no errand choice in it takes those villagers out of the system silently and correctly. See [The marks](/mods/rpg-errands/how-it-works#the-marks).
## Writing your own [#writing-your-own]
An errand names its own conversations with [`asking`, `reminding` and `thanking`](/mods/rpg-errands/errand-files#the-three-conversations). They are ordinary [dialogue files](/mods/rpg-dialogue/dialogue-files) and the only thing that makes them errand conversations is the actions in them.
**An `asking` file needs a way to say yes.**
```json
{
"pages": [
{ "text": "The last of my ink went on a copy nobody has come to collect." },
{ "text": "Six sacs would set me right, if the squid are running." }
],
"dismissible": true,
"choices": [
{
"label": { "translate": "rpg_errands.choice.accept" },
"actions": [ { "type": "rpg_errands:take_errand" } ]
},
{ "label": { "translate": "rpg_errands.choice.decline" } }
]
}
```
**A `reminding` file needs a way to hand it over**, gated on `ready`, and usually a way out:
```json
"choices": [
{
"label": { "translate": "rpg_errands.choice.deliver" },
"requires": [ { "condition": "rpg_errands:errand", "state": "ready" } ],
"actions": [ { "type": "rpg_errands:hand_in_errand" } ]
},
{ "label": { "translate": "rpg_errands.choice.later" } },
{
"label": { "translate": "rpg_errands.choice.abandon" },
"actions": [ { "type": "rpg_errands:drop_errand" } ]
}
]
```
**A `thanking` file is only words.** It is opened by `hand_in_errand` after everything has already happened, so it must not carry one itself.
A `reminding` conversation that reads differently when the player is short and when they are carrying the lot is one file with [variants](/mods/rpg-dialogue/variants), each gated on `running` or `ready`. That is how the shipped one is written.
## Text this mod already ships [#text-this-mod-already-ships]
Translation keys you can use in your own files, so the wording matches everywhere and is translated for you.
| Key | English |
| ---------------------------------- | ------------------------------ |
| `rpg_errands.choice.ask` | "Is there anything you need?" |
| `rpg_errands.choice.accept` | "I will see it done." |
| `rpg_errands.choice.hunt.accept` | "It will be seen to." |
| `rpg_errands.choice.carry.accept` | "I will carry it." |
| `rpg_errands.choice.decline` | "Not today." |
| `rpg_errands.choice.recall` | "What was it you asked of me?" |
| `rpg_errands.choice.deliver` | "I have what you asked for." |
| `rpg_errands.choice.hunt.deliver` | "It is done." |
| `rpg_errands.choice.carry.deliver` | "I was sent to find you." |
| `rpg_errands.choice.later` | "You will have them." |
| `rpg_errands.choice.abandon` | "Find another for it." |
| `rpg_errands.choice.more` | "There was something else." |
| `rpg_errands.choice.trade` | "Let me see what you have." |
# RPG Errands (/mods/rpg-errands)
The mason is short of flint and there is a storm coming. The shepherd wants the wolves in the trees seen to. Somebody needs word carried over the hill, and the person you find at the other end is glad you came.
About half a village wants something on any given day, and what they want turns over at dawn. Nothing is timed, nothing is tracked in the corner of the screen, and you can take one on, go and do something else entirely, and come back to it in a week.
Every errand is asked for inside a conversation, so [RPG Dialogue](/mods/rpg-dialogue) has to be installed alongside it. It gets on with [RPG Villagers](https://modrinth.com/mod/rpg-villagers) but does not need it: installed together the errands appear in the village's own greetings, installed alone this mod brings a plain greeting of its own to hang them from.
## Reading the marks [#reading-the-marks]
From across the square, without right-clicking eleven people to find out.
{/* The three sprites are the mod's own art, scaled 8x with nearest neighbour from
common/src/main/resources/assets/rpg_errands/textures/marker/ in the rpg-errands repo.
That art is generated by tools/author_markers.py there, so regenerate these if it changes. */}
| Mark | Means |
| ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
|
| They have something to ask. |
|
| You took one on and are still short of it. |
|
| You are carrying the whole of it. Go and say so. |
Colour says whether there is anything to be done here, gold yes and iron not yet, and shape says which kind of doing. The two read independently, so a player learns them once.
Nobody is marked in their sleep, no child is ever asked, and a villager whose greeting says nothing about errands wears no mark. See [How it works](/mods/rpg-errands/how-it-works#the-marks).
## What you get [#what-you-get]
Across thirteen trades and the village at large, all of them in `data/rpg_errands/errands/`, all of them replaceable.
Of anybody with something to ask, or waiting on you for it.
Nothing is timed. An untouched one lapses after twelve days.
Settling one moves vanilla's own gossip, which already sets your prices and already spreads between villagers on its own.
This is a mod, not a library. What keeps that safe is priority rather than absence: the plain greeting it falls back to sits at `-900`, so any real content in your pack wins automatically, and every errand, conversation and tag it ships is a file you can claim the id of.
## Installing [#installing]
**Minecraft 1.21.1**, on either **Fabric** or **NeoForge**. There is one jar and it runs on both.
Install **[RPG Dialogue](/mods/rpg-dialogue)**. On Fabric, install **Fabric API** as well.
Drop the jar in `mods/`. On a server it belongs on the server *and* on clients, since the marks are drawn client-side.
## Where to go next [#where-to-go-next]
# The three tasks (/mods/rpg-errands/tasks)
An errand is not a quest and this is not a scripting language. What makes one worth doing is who asks and why, and a system with fifteen kinds of objective in it has usually stopped believing that. So there are three.
The kind is named flat, in the errand's own file, and left out it is `bring`.
## `bring` [#bring]
Fetch something and bring it back. The plain one, and the one nine errands in ten should be.
```json
{
"wanted": "#c:stones",
"count": { "min": 24, "max": 40 }
}
```
| Field | Default | Meaning |
| -------- | -------- | --------------------------------------------------------------- |
| `wanted` | required | An item or a `#tag`. See [Naming the goods](#naming-the-goods). |
| `count` | `1` | A figure or a span. |
What the player is carrying is counted by **what the thing is and nothing else**. A villager asking for eight iron does not inspect it for enchantments, and one who did would turn away perfectly good iron for having a name on it.
The whole amount is counted before a single stack is touched, so a hand-over is all or nothing. A player who dropped a stack while reading the last page keeps everything they still have rather than paying half of it for nothing.
## `hunt` [#hunt]
Deal with something that has been troubling the place. The oldest errand there is, and the one a village has the best reason to ask: nobody in it can fight, the thing in the trees does not care about that, and you are the one passing through with a sword.
```json
{
"task": "rpg_errands:hunt",
"quarry": "#rpg_errands:wolves",
"count": 4
}
```
| Field | Default | Meaning |
| -------- | -------- | --------------------------- |
| `quarry` | required | An entity type or a `#tag`. |
| `count` | `1` | A figure or a span. |
**Kills count only while the promise is being carried.** Killing four wolves and then agreeing to deal with the wolves starts from none, which is the honest reading and the only one that does not have players clearing the woods first and collecting afterwards.
**One kill answers one promise**, even where it would answer two. A wolf is one wolf, and two villagers who both want the wolves seen to are both owed their own.
## `deliver` [#deliver]
Carry word to somebody else, somewhere else. The errand that is about the map: everything else happens within sight of whoever asked, and this one sends you over the hill.
```json
{
"task": "rpg_errands:deliver",
"to": [ "minecraft:mason" ],
"away": 160
}
```
| Field | Default | Meaning |
| ------------- | ------- | ------------------------------------------------------------------------------ |
| `to` | `[]` | Which trades can be told. Empty means any villager will do. |
| `to_entities` | `[]` | Which kinds of creature can be told, for a mod whose people are not villagers. |
| `away` | `160` | How far from where you agreed the hearer has to be, in blocks. 16 to 4096. |
**Nothing is actually carried.** No parcel to lose, no stack to drop, nothing to be robbed of. The whole of the errand is the walk, and the person who lights up when you get there is often the first thing telling the player there was another village over the hill.
Whoever you find is the one you were sent to, so long as they are one of the trades named and standing at least `away` blocks from where the promise was made. Children cannot receive one, and neither can the person who sent you.
`away` is measured from where the player agreed, not from the sender's home. Set too low it is a walk across the same village, and the errand settles itself on the neighbour standing behind you.
Naming nobody at all means any villager will do, which is what "get word to the next village" wants. The thanks, and the favour, go to whoever receives it: the village at the far end warms to you and the one that sent you does not, which is right, since they have not heard yet.
## How many: a figure, or a span [#how-many-a-figure-or-a-span]
Both spellings are the same field, so nothing has to be rewritten to move between them.
```json
"count": 32
"count": { "min": 24, "max": 40 }
```
The figure is drawn once, when the promise is made, and written into the ledger, so however the day turns over afterwards, they hold you to the number they said.
**Ceiling of 256.** More than a player carries back in one go stops being an errand and becomes a grind, and a village asking for it reads as a quest board rather than as a neighbour.
`deliver` has no count. One message is one message.
## Naming the goods [#naming-the-goods]
`wanted` and `quarry` are written the way a recipe writes an ingredient: the thing itself, or a tag.
```json
"wanted": "minecraft:emerald"
"wanted": "#c:ingots/copper"
"quarry": "minecraft:zombie"
"quarry": "#rpg_errands:wolves"
```
**A tag is what you usually want.** An errand about the wolves taking the sheep is an errand about wolves however many mods provide them, and a haul written against `#c:ingots/copper` is payable in copper rather than in one mod's copper.
Naming a thing that is not installed **fails to read** and the log says so, with the fix in the message. Naming a *tag* that nothing fills is fine, and is the point:
### A tag nothing fills is never asked for [#a-tag-nothing-fills-is-never-asked-for]
That is how an errand written for a mod nobody has installed lies dormant instead of sending the player after something that does not exist. Both items and creatures are checked once the world is standing, and everything that can never be asked is named in the log:
```
26 of 27 errand(s) can be asked for in this world
These errands want something nothing here provides, so they will never be offered: [mypack:brass]
```
### Give a tag a name [#give-a-tag-a-name]
A tag has no name of its own, so write one, or the player is asked for "Wolves" with a capital W and no thought behind it.
| What | Key |
| -------------- | ---------------------------------------- |
| An item tag | `rpg_dialogue.wanted..` |
| A creature tag | `rpg_errands.quarry..` |
Slashes in the path become dots. Both fall back to the tag's last path segment tidied up, so a missing key is never a missing-key placeholder.
```json
{
"rpg_dialogue.wanted.mypack.hide": "Leather",
"rpg_errands.quarry.mypack.wolves": "wolves"
}
```
`wanted` is RPG Dialogue's own type and looks its name up under its own prefix. Put item tag names there; put creature tag names under `rpg_errands.quarry`.
Asked for "Thirty-two Stone" over a tag holding only cobblestone, a player standing there with a stack of stone watches the game refuse to notice it. Being quietly generous about what counts never turns anybody away; the other way round is a promise the hand-over then breaks.
### `called`, for a haul with no good name [#called-for-a-haul-with-no-good-name]
Where neither the item's own name nor the tag's serves, name the haul itself:
```json
{
"wanted": "#rpg_errands:catch",
"count": { "min": 8, "max": 16 },
"called": { "translate": "mypack.errand.nights_catch" }
}
```
It is a full text component, so a translation key is free. It replaces the name everywhere the errand is spoken of.
## A fourth kind [#a-fourth-kind]
`task` takes a whole namespaced id precisely so that it can be somebody else's. A mod adding a kind gets its own three shared conversations by saying where they live, and nothing here has to know. See [For mod developers](/mods/rpg-errands/for-developers#adding-a-task-kind).
# What ships (/mods/rpg-errands/what-ships)
Everything this mod ships is a datapack file in `data/rpg_errands/`, which means everything can be replaced by claiming its id, and read as a worked example in the meantime.
Twenty-seven errands, across thirteen trades and the village at large. Seven of them name no profession, so anybody in the village may ask.
## Fetching [#fetching]
Twenty-one of them, all paid in emeralds.
| Errand | Asked by | Wants | How many | Pays | Favour |
| -------------------- | ---------------------------------------- | ------------------------------------- | -------- | ------------------- | ------ |
| `armorer/copper` | Armorer | Copper ingots (`#rpg_errands:copper`) | 8 to 16 | 3 emeralds | 6 |
| `butcher/meat` | Butcher | Raw meat (`#rpg_errands:meat`) | 8 to 16 | 2 emeralds | 5 |
| `cartographer/paper` | Cartographer, Librarian | Paper (`#rpg_errands:paper`) | 16 to 32 | 3 emeralds | 6 |
| `cleric/bone` | Cleric | Bones (`#rpg_errands:bone`) | 12 to 24 | 2 emeralds | 5 |
| `farmer/bone_meal` | Farmer | Bone meal (`#rpg_errands:bone_meal`) | 16 to 32 | 3 emeralds | 6 |
| `farmer/seed` | Farmer | Seed (`#rpg_errands:seed`) | 16 to 32 | 2 emeralds | 5 |
| `fisherman/catch` | Fisherman | Fish (`#rpg_errands:catch`) | 8 to 16 | 2 emeralds | 5 |
| `fisherman/string` | Fisherman | String (`#rpg_errands:string`) | 8 to 16 | 2 emeralds | 5 |
| `fletcher/feather` | Fletcher | Feathers (`#rpg_errands:feather`) | 12 to 24 | 2 emeralds | 5 |
| `fletcher/flint` | Fletcher | Flint (`#rpg_errands:flint`) | 10 to 20 | 2 emeralds | 5 |
| `leatherworker/hide` | Leatherworker | Leather (`#rpg_errands:hide`) | 6 to 14 | 2 emeralds | 5 |
| `librarian/ink` | Librarian | Ink sacs (`#rpg_errands:ink`) | 6 | 3 emeralds, 2 books | 6 |
| `mason/clay` | Mason | Clay balls (`#rpg_errands:clay`) | 12 to 24 | 2 emeralds | 5 |
| `mason/sand` | Mason | Sand (`#rpg_errands:sand`) | 16 to 32 | 2 emeralds | 5 |
| `shepherd/grain` | Shepherd | Wheat (`#rpg_errands:grain`) | 12 to 24 | 2 emeralds | 5 |
| `shepherd/wool` | Shepherd | Wool (`#rpg_errands:wool`) | 8 to 16 | 2 emeralds | 5 |
| `toolsmith/coal` | Toolsmith, Armorer, Weaponsmith, Butcher | Coal (`#rpg_errands:coal`) | 16 to 32 | 3 emeralds | 6 |
| `village/bread` | Anyone | Bread (`#rpg_errands:bread`) | 6 to 12 | 2 emeralds | 5 |
| `village/kindling` | Anyone | Logs (`#rpg_errands:kindling`) | 12 to 24 | 2 emeralds | 4 |
| `village/stone` | Anyone | Stone (`#rpg_errands:stone`) | 24 to 48 | 2 emeralds | 4 |
| `weaponsmith/iron` | Weaponsmith, Toolsmith | Iron ingots (`#rpg_errands:iron`) | 5 to 12 | 4 emeralds | 7 |
## Hunting [#hunting]
| Errand | Asked by | Wants | How many | Pays | Favour |
| ------------------ | ----------------- | ----------------------------------- | -------- | ------------------------- | ------ |
| `shepherd/wolves` | Shepherd, Butcher | Wolves (`#rpg_errands:wolves`) | 3 to 6 | 5 emeralds | 8 |
| `village/creepers` | Anyone | Creepers (`#rpg_errands:creepers`) | 3 to 6 | 4 emeralds | 7 |
| `village/raiders` | Anyone | Raiders (`#rpg_errands:raiders`) | 4 to 8 | 8 emeralds, 4 iron ingots | 14 |
| `village/undead` | Anyone | Dead things (`#rpg_errands:undead`) | 6 to 12 | 4 emeralds | 7 |
## Carrying word [#carrying-word]
| Errand | Asked by | Sends you to | Pays | Favour |
| -------------------- | ------------ | ---------------------------------------------------- | ------------------- | ------ |
| `cartographer/chart` | Cartographer | A cartographer or librarian, 256 blocks off | 6 emeralds, 8 paper | 11 |
| `village/word` | Anyone | A farmer, cleric, librarian or mason, 200 blocks off | 5 emeralds | 9 |
## The four that are not plain [#the-four-that-are-not-plain]
Worth reading as examples, since each shows a field the rest do not use.
| Errand | What it does differently |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `librarian/ink` | `requires` [`has_trades`](/mods/rpg-dialogue/conditions), so only a librarian with stock asks, and it names its own two-page `asking` conversation instead of the shared one. |
| `village/raiders` | `requires` [`near_structure`](/mods/rpg-dialogue/conditions) over `#rpg_errands:ill_omened` within six chunks, so it is only ever asked near a pillager outpost or a woodland mansion. It pays the most of anything here. |
| `toolsmith/coal` | `weight: 2`, being wanted by four trades and the plainest thing any of them could want. |
| `village/undead` | `weight: 2`, since it is the one hunt every village has a reason for. |
## The tags [#the-tags]
Errands name tags rather than items so they reach every mod's version of a thing. The `#c:` entries are all `required: false`, so a tag no installed mod fills costs nothing.
| Tag | Called | Holds |
| ------------------------ | ------------- | ------------------------------------------------------------------------------------- |
| `#rpg_errands:bone` | Bones | `minecraft:bone`, `#c:bones` |
| `#rpg_errands:bone_meal` | Bone Meal | `minecraft:bone_meal` |
| `#rpg_errands:bread` | Bread | `minecraft:bread`, `#c:foods/bread` |
| `#rpg_errands:catch` | Fish | `#minecraft:fishes`, `#c:foods/raw_fish` |
| `#rpg_errands:clay` | Clay Balls | `minecraft:clay_ball` |
| `#rpg_errands:coal` | Coal | `#minecraft:coals`, `#c:coals` |
| `#rpg_errands:copper` | Copper Ingots | `minecraft:copper_ingot`, `#c:ingots/copper` |
| `#rpg_errands:feather` | Feathers | `minecraft:feather`, `#c:feathers` |
| `#rpg_errands:flint` | Flint | `minecraft:flint` |
| `#rpg_errands:grain` | Wheat | `minecraft:wheat`, `#c:crops/wheat`, `#c:grains` |
| `#rpg_errands:hide` | Leather | `minecraft:leather`, `minecraft:rabbit_hide`, `#c:leathers`, `#c:hides` |
| `#rpg_errands:ink` | Ink Sacs | `minecraft:ink_sac`, `minecraft:glow_ink_sac` |
| `#rpg_errands:iron` | Iron Ingots | `minecraft:iron_ingot`, `#c:ingots/iron` |
| `#rpg_errands:kindling` | Logs | `#minecraft:logs` |
| `#rpg_errands:meat` | Raw Meat | the five vanilla raw meats, `#c:raw_meats`, `#c:foods/raw_meat` |
| `#rpg_errands:paper` | Paper | `minecraft:paper` |
| `#rpg_errands:sand` | Sand | `#minecraft:sand`, `#c:sands` |
| `#rpg_errands:seed` | Seed | `#minecraft:villager_plantable_seeds`, melon and pumpkin seeds, `#c:seeds` |
| `#rpg_errands:stone` | Stone | `#minecraft:stone_crafting_materials`, the six stones, `#c:stones`, `#c:cobblestones` |
| `#rpg_errands:string` | String | `minecraft:string`, `#c:strings` |
| `#rpg_errands:wool` | Wool | `#minecraft:wool`, `#c:wools` |
| Creature tag | Called | Holds |
| ----------------------- | ----------- | --------------------------------------------------- |
| `#rpg_errands:creepers` | creepers | `minecraft:creeper` |
| `#rpg_errands:raiders` | raiders | `#minecraft:raiders` |
| `#rpg_errands:undead` | dead things | zombie, husk, drowned, skeleton, stray, `#c:undead` |
| `#rpg_errands:wolves` | wolves | `minecraft:wolf` |
One worldgen tag as well, `#rpg_errands:ill_omened`, naming the pillager outpost and the woodland mansion. It exists because the raiders errand asks about it, and owning it means the errand reads whether or not any other mod defines one.
## The conversations [#the-conversations]
```
data/rpg_errands/dialogues/villager/
greeting.json the plain fallback greeting
errand/asking.json asked for something, six tellings
errand/reminding.json come back without it, five tellings
errand/thanking.json handed over, four tellings
errand/ink.json the librarian's own asking
errand/hunt/asking|reminding|thanking.json
errand/carry/asking|reminding|thanking.json
```
Each is written in [variants](/mods/rpg-dialogue/variants), so the same errand asked twice does not read as a recording, and each names the goods through [values](/mods/rpg-errands/in-conversation#values) rather than in the text.
## Changing what ships [#changing-what-ships]
Claim the id and yours wins. Nothing here is special-cased.
| Want to | Write |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Change an errand | `data/rpg_errands/errands//.json` |
| Turn one off | Claim its id and give it a `requires` that never holds |
| Add errands of your own | `data//errands/.json`. They join the draw |
| Change what they say | `data/rpg_errands/dialogues/villager/errand/**` |
| Change where errands are offered | See [Where errands are offered](/mods/rpg-errands/where-errands-appear#moving-them-somewhere-else-entirely) |
| Change what counts as "the wolves" | `data/rpg_errands/tags/entity_type/wolves.json` |
| Change what counts as iron | `data/rpg_errands/tags/item/iron.json` |
| Replace the plain greeting | a `dialogue_speakers` binding above `-900` |
Errands are drawn per errand rather than picked from a list, so adding twenty of your own does not disturb how often the shipped ones come up, and it does not require touching them. Turn one off only when it is actively wrong for your pack.
# Where errands are offered (/mods/rpg-errands/where-errands-appear)
An errand is offered inside somebody's greeting, and this mod does not own anybody's greeting. So the choices are written as a [contribution](/mods/rpg-dialogue/choice-slots) rather than into a conversation, and the file names every slot they belong in.
**`data/rpg_errands/dialogue_choices/errands.json`**
```json
{
"into": [ "rpg_errands:business", "rpg_villagers:business" ],
"priority": 0,
"choices": [ ... ]
}
```
## The five choices [#the-five-choices]
Each one is gated so that only the right one can appear.
| Label | Shown when | Does |
| ------------------------------ | --------------------- | --------------------------------------------- |
| "Is there anything you need?" | `offered` | `speak_of_errand`, which opens the asking. |
| "What was it you asked of me?" | `running` | `speak_of_errand`, which opens the reminding. |
| "I have what you asked for." | `ready` and `bring` | `hand_in_errand` |
| "It is done." | `ready` and `hunt` | `hand_in_errand` |
| "I was sent to find you." | `ready` and `deliver` | `hand_in_errand` |
Three ways of saying the same thing because the sentence is not interchangeable between the tasks, and one condition on a choice is cheaper than three errand systems.
A second file, `errands_welcome.json`, puts the asking alone into `rpg_villagers:welcome/business`, which is the one-off conversation that mod gives a stranger.
## With a village mod, and without [#with-a-village-mod-and-without]
**With [RPG Villagers](https://modrinth.com/mod/rpg-villagers) installed**, the choices land in its greetings, where the player's business with a villager belongs: after "let me see your wares" and before the small talk.
**Without it**, this mod's own plain greeting opens instead. It is bound to every villager at priority `-900`:
```json
{
"entity": "minecraft:villager",
"dialogue": "rpg_errands:villager/greeting",
"priority": -900
}
```
The greeting itself is three lines of nothing much, a way into trading, the errand slot, and a way out. Trading is still one click away in it, because a mod about errands must not take the shop window away.
`-900` is a floor, not an opinion. A [speaker binding](/mods/rpg-dialogue/speakers) of your own at any priority above that wins, and RPG Villagers' own route at `0` wins automatically. That is what makes it safe for this mod to do something the moment it is installed.
```
Choices are written for slot rpg_villagers:business, which no dialogue leaves open
```
That is the RPG Villagers half of `into` with that mod absent. A slot nothing declares is simply inert, so an optional integration costs one line in the log and nothing else. It is not a fault.
## Putting errands in your own conversations [#putting-errands-in-your-own-conversations]
Leave the slot open wherever they belong, and the same file fills it:
```json
"choices": [
{ "label": { "translate": "mypack.choice.trade" }, "actions": [ { "type": "open_trades" } ] },
{ "slot": "rpg_errands:business" },
{ "label": { "translate": "rpg_dialogue.choice.leave" } }
]
```
A slot is an invitation. Where a greeting of yours leaves none, its villagers are never marked and never asked, which is the correct way to take a whole profession out of the system without registering anything.
## Moving them somewhere else entirely [#moving-them-somewhere-else-entirely]
Two ways, depending on how much you want to change.
**Write your own contribution.** Any file in your own `dialogue_choices/` may fill `rpg_errands:business`, or any slot of yours, with choices whose labels and gating you decide. Contributions add rather than replace, so yours appear alongside the shipped five unless you also take those out.
**Claim the shipped file's id.** A file at `data/rpg_errands/dialogue_choices/errands.json` in a pack loaded after this mod replaces it outright. That is how to change which slots the choices go into, reword them, or empty them.
| Want to | Write |
| ----------------------------------------- | ---------------------------------------------------------------- |
| Add errands to your own greeting | `{ "slot": "rpg_errands:business" }` in it |
| Change the wording of the five choices | your own `dialogue_choices` file, or claim `rpg_errands:errands` |
| Send them somewhere other than `business` | claim `rpg_errands:errands` and change `into` |
| Replace the plain fallback greeting | a `dialogue_speakers` binding above `-900` |
| Stop a profession being asked at all | a greeting of your own, with no errand slot in it |