In this video, you can see hit markers of different colours depending on weapon efficiency. There is also a red or green hit marker at the right of the crossair depending on element efficiency.
Mebahel RPG Resistance & Weakness is a lightweight combat API and balancing framework for Minecraft that includes out-of-the-box support for vanilla mobs as well as creatures from Mebahel's Creatures - Draugr Invasion and Dwarven Automatons, requiring no initial configuration. It adds configurable damage multipliers based on both physical weapon types and elemental damage types, allowing entities to react uniquely to swords, arrows, maces, fire, frost, or any custom element added by other mods.
The goal is simple: make combat feel more readable, more tactical, and easier to balance across vanilla mobs, modded mobs, and large RPG-style modpacks.
entities.jsonThe default system separates damage into two layers.
| Layer | Types | Purpose |
|---|---|---|
| Physical | Slash, Pierce, Blunt | Represents the weapon or attack shape |
| Elemental | Fire, Frost | Represents magical or elemental properties |
Both layers can apply at the same time.
For example, a frost arrow may be detected as:
| Layer | Detected Type |
|---|---|
| Physical | Pierce |
| Elemental | Frost |
The final damage is calculated as:
finalDamage = baseDamage × physicalMultiplier × elementalMultiplier
| Multiplier | Meaning |
|---|---|
1.0 | Neutral damage |
> 1.0 | Weakness, increased damage |
< 1.0 | Resistance, reduced damage |
0.0 | Full immunity |
Recommended balancing range for most mobs is between 0.75 and 1.25.
The default preset is designed to keep vanilla combat familiar while adding meaningful RPG-style advantages.
| Entity | Slash | Pierce | Blunt | Fire | Frost |
|---|---|---|---|---|---|
minecraft:zombie | 1.0 | 0.9 | 1.1 | 1.25 | 0.9 |
minecraft:husk | 1.0 | 0.9 | 1.1 | 1.2 | 0.95 |
minecraft:drowned | 1.0 | 0.9 | 1.1 | 1.1 | 1.0 |
minecraft:zombie_villager | 1.0 | 0.9 | 1.1 | 1.25 | 0.9 |
minecraft:skeleton | 1.0 | 0.95 | 1.15 | 1.1 | 0.9 |
minecraft:stray | 1.0 | 0.95 | 1.15 | 1.15 | 0.85 |
minecraft:wither_skeleton | 1.0 | 0.95 | 1.1 | 0.85 | 1.1 |
minecraft:creeper | 1.0 | 1.05 | 0.9 | 1.1 | 0.95 |
minecraft:spider | 1.1 | 0.95 | 0.95 | 1.2 | 0.9 |
minecraft:cave_spider | 1.1 | 0.95 | 0.95 | 1.2 | 0.9 |
minecraft:witch | 1.0 | 1.0 | 1.0 | 1.1 | 0.95 |
minecraft:pillager | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
minecraft:vindicator | 1.0 | 1.0 | 1.05 | 1.0 | 1.0 |
minecraft:evoker | 1.0 | 1.0 | 1.0 | 1.1 | 0.95 |
minecraft:vex | 1.05 | 1.05 | 1.0 | 1.1 | 0.95 |
minecraft:ravager | 0.95 | 0.9 | 1.1 | 1.05 | 0.95 |
minecraft:guardian | 0.95 | 1.0 | 1.05 | 1.15 | 0.9 |
minecraft:elder_guardian | 0.95 | 1.0 | 1.1 | 1.15 | 0.9 |
minecraft:slime | 1.0 | 1.0 | 1.1 | 1.0 | 1.0 |
minecraft:silverfish | 1.0 | 1.0 | 1.1 | 1.0 | 1.0 |
minecraft:endermite | 1.05 | 1.0 | 0.95 | 1.1 | 0.95 |
minecraft:enderman | 1.0 | 1.0 | 0.95 | 1.15 | 0.9 |
minecraft:shulker | 0.9 | 0.9 | 1.15 | 1.0 | 1.0 |
minecraft:ender_dragon | 1.0 | 0.95 | 1.05 | 0.9 | 1.05 |
minecraft:blaze | 1.0 | 1.0 | 1.0 | 0.75 | 1.25 |
minecraft:magma_cube | 1.0 | 1.0 | 1.05 | 0.8 | 1.2 |
minecraft:ghast | 1.0 | 1.05 | 0.95 | 0.9 | 1.1 |
minecraft:piglin | 1.0 | 1.0 | 1.0 | 1.05 | 0.95 |
minecraft:piglin_brute | 1.0 | 1.0 | 1.05 | 1.05 | 0.95 |
minecraft:zombified_piglin | 1.0 | 0.9 | 1.1 | 0.85 | 0.95 |
minecraft:hoglin | 1.0 | 0.95 | 1.1 | 1.0 | 1.05 |
minecraft:zoglin | 1.0 | 0.95 | 1.1 | 0.85 | 1.05 |
minecraft:wither | 1.0 | 0.95 | 1.0 | 0.9 | 1.05 |
minecraft:warden | 1.0 | 0.95 | 1.05 | 0.95 | 0.95 |
minecraft:phantom | 1.0 | 1.1 | 1.0 | 1.1 | 0.95 |
The base config can also include presets for Mebahel ecosystem mobs. These entries are safe even if the related mods are not installed, because they are stored as entity ID strings.
| Entity | Slash | Pierce | Blunt | Fire | Frost |
|---|---|---|---|---|---|
mebahelcreaturesdwarven:dwarven_sphere | 0.8 | 0.8 | 1.4 | 1.0 | 1.0 |
mebahelcreaturesdwarven:dwarven_centurion | 0.8 | 0.8 | 1.4 | 1.0 | 1.0 |
mebahelcreaturesdwarven:dwarven_spider | 0.8 | 0.8 | 1.4 | 1.0 | 1.0 |
mebahelcreaturesdwarven:dwarven_spider_guardian | 0.8 | 0.8 | 1.4 | 1.0 | 1.0 |
Dwarven automatons are metal constructs. They resist slashing and piercing damage, but are vulnerable to blunt impact.
| Entity | Slash | Pierce | Blunt | Fire | Frost |
|---|---|---|---|---|---|
mebahelcreaturesdraugr:draugr | 1.15 | 0.9 | 0.9 | 1.2 | 0.85 |
mebahelcreaturesdraugr:draugr_archer | 1.15 | 0.9 | 0.9 | 1.2 | 0.85 |
mebahelcreaturesdraugr:draugr_wight | 1.15 | 0.9 | 0.9 | 1.2 | 0.85 |
mebahelcreaturesdraugr:draugr_scourge | 1.2 | 0.85 | 0.85 | 1.15 | 0.8 |
mebahelcreaturesdraugr:draugr_overlord | 1.2 | 0.85 | 0.85 | 1.15 | 0.8 |
mebahelcreaturesdraugr:skeleton_warrior | 1.1 | 0.9 | 0.9 | 1.15 | 0.9 |
mebahelcreaturesdraugr:skeleton_warrior_head | 1.1 | 0.9 | 0.9 | 1.15 | 0.9 |
mebahelcreaturesdraugr:infernal_draugr | 1.15 | 0.9 | 0.9 | 0.75 | 1.25 |
mebahelcreaturesdraugr:flame_atronach | 1.0 | 1.0 | 1.0 | 0.75 | 1.25 |
Draugr are ancient undead warriors. They are weak to slashing damage and fire, but resist piercing, blunt impact, and frost.
The mod creates its configuration in:
config/mebahel-rpg_resistance-weakness/
| File | Purpose |
|---|---|
config.json | Damage detection, keywords, priorities, and client feedback options |
entities.json | Entity-specific resistance and weakness multipliers |
entities.json controls the actual damage multipliers for each mob.
Example:
{
"entities": {
"minecraft:zombie": {
"mebahelrpgresistanceweakness:slash": 1.0,
"mebahelrpgresistanceweakness:pierce": 0.9,
"mebahelrpgresistanceweakness:blunt": 1.1,
"mebahelrpgresistanceweakness:fire": 1.25,
"mebahelrpgresistanceweakness:frost": 0.9
}
}
}
This means:
| Damage Type | Multiplier | Result |
|---|---|---|
| Slash | 1.0 | Neutral |
| Pierce | 0.9 | 10% reduced damage |
| Blunt | 1.1 | 10% increased damage |
| Fire | 1.25 | 25% increased damage |
| Frost | 0.9 | 10% reduced damage |
Damage detection is configured in config.json.
The mod detects damage types using stable IDs and translation keys from weapons, projectiles, and items. This avoids relying on translated display names or custom item names.
Example detection section:
{
"elementDetection": {
"physicalPriority": [
"mebahelrpgresistanceweakness:blunt",
"mebahelrpgresistanceweakness:pierce",
"mebahelrpgresistanceweakness:slash"
],
"elementalPriority": [
"mebahelrpgresistanceweakness:frost",
"mebahelrpgresistanceweakness:fire"
],
"needles": {
"mebahelrpgresistanceweakness:slash": [
"sword",
"blade",
"slash",
"claw",
"claymore",
"cutlass",
"katana",
"scythe",
"sickle",
"dagger",
"axe",
"war_axe",
"halberd"
],
"mebahelrpgresistanceweakness:pierce": [
"arrow",
"bow",
"bolt",
"trident",
"spear",
"lance",
"javelin",
"rapier",
"pierce"
],
"mebahelrpgresistanceweakness:blunt": [
"mace",
"hammer",
"warhammer",
"club",
"blunt",
"anchor",
"fist",
"pickaxe",
"staff",
"wand"
],
"mebahelrpgresistanceweakness:fire": [
"fire",
"flame",
"burn",
"lava",
"inferno"
],
"mebahelrpgresistanceweakness:frost": [
"frost",
"ice",
"freeze",
"snow",
"stalhrim"
]
}
}
}
physicalPriority decides which physical type wins when a weapon matches multiple keywords.
For example, pickaxe contains axe, but it should be treated as blunt. Placing blunt before slash ensures pickaxes are classified correctly.
elementalPriority decides which elemental type wins when a damage source matches multiple elemental keywords.
For example, a custom item containing both fire and frost keywords will use the first matching element in the priority list.
The mod includes optional hitmarker feedback to show whether an attack was effective or resisted.
Config section:
{
"clientFeedback": {
"showPhysicalHitmarker": true,
"showElementalHitmarker": true,
"colorblindMode": false
}
}
| Option | Description |
|---|---|
showPhysicalHitmarker | Enables or disables the physical effectiveness hitmarker |
showElementalHitmarker | Enables or disables the elemental effectiveness hitmarker |
colorblindMode | Uses blue/orange instead of green/red |
| Result | Normal Mode | Colorblind Mode |
|---|---|---|
| Effective damage | Green | Blue |
| Resisted damage | Red | Orange |
| Neutral damage | White | White |
The physical hitmarker uses a generic physical icon.
The elemental hitmarker uses a generic elemental icon, making it compatible with custom elements such as Holy, Poison, Lightning, or Arcane.
Datapacks can add new preset values for vanilla or modded mobs.
Datapack entity files go here:
data/<namespace>/rpg_resweak/entities/<entity_namespace>/<entity_path>.json
Example path:
data/my_rpg_pack/rpg_resweak/entities/minecraft/zombie.json
Recommended format:
{
"mebahelrpgresistanceweakness:slash": 1.0,
"mebahelrpgresistanceweakness:pierce": 0.9,
"mebahelrpgresistanceweakness:blunt": 1.1,
"mebahelrpgresistanceweakness:fire": 1.25,
"mebahelrpgresistanceweakness:frost": 0.9
}
Legacy format is also supported:
{
"multipliers": {
"mebahelrpgresistanceweakness:slash": 1.0,
"mebahelrpgresistanceweakness:pierce": 0.9,
"mebahelrpgresistanceweakness:blunt": 1.1
}
}
Datapacks act as presets.
When a datapack is loaded:
entities.jsonThis means datapacks are safe to use in existing worlds and modpacks.
Example:
If entities.json already contains:
{
"entities": {
"minecraft:zombie": {
"mebahelrpgresistanceweakness:fire": 1.5
}
}
}
and a datapack provides:
{
"mebahelrpgresistanceweakness:fire": 1.25,
"mebahelrpgresistanceweakness:frost": 0.9
}
the final config keeps the player value and only adds the missing one:
{
"entities": {
"minecraft:zombie": {
"mebahelrpgresistanceweakness:fire": 1.5,
"mebahelrpgresistanceweakness:frost": 0.9
}
}
}
When damage is calculated, the mod checks values in this order:
| Priority | Source |
|---|---|
| 1 | Runtime overrides |
| 2 | entities.json |
| 3 | Datapack values |
| 4 | Fallback 1.0 |
In normal gameplay, entities.json is the main source of truth once generated.
Other mods can register new elemental damage types through the API. This is useful for RPG systems that need custom elements such as Holy, Poison, Lightning, Arcane, Shadow, or Radiant damage.
A custom element has two important parts:
| Part | Purpose |
|---|---|
| Element ID | The unique identifier used in configs and datapacks, such as my_mod:holy |
| Needles | The keywords used by the detector to recognize that an attack belongs to this element |
Example: registering a Holy element.
Identifier HOLY = new Identifier("my_mod", "holy");
RPGElements.registerElementalWithNeedles(
HOLY,
new ElementDefinition(HOLY),
List.of(
"holy",
"sun",
"light",
"silver",
"radiant"
)
);
The third argument, List.of(...), defines the detection keywords for the element. The detector checks stable signatures built from weapon IDs, projectile IDs, item IDs, and translation keys. If one of these signatures contains a matching keyword, the attack can be classified as that element.
For example, the Holy element above may be detected from IDs such as:
| ID or Translation Key | Matching Needle |
|---|---|
my_mod:silver_sword | silver |
my_mod:holy_staff | holy |
item.my_mod.radiant_blade | radiant |
my_mod:sun_arrow | sun |
Once the element is registered, it can be used in entities.json like any built-in element:
{
"entities": {
"minecraft:zombie": {
"my_mod:holy": 1.25
}
}
}
This means zombies take 25% increased damage from attacks detected as my_mod:holy.
Custom elements can also be used in datapacks:
{
"my_mod:holy": 1.25,
"my_mod:poison": 0.75
}
Example datapack path:
data/my_rpg_pack/rpg_resweak/entities/minecraft/zombie.json
When a custom element is registered with RPGElements.registerElementalWithNeedles(...), it can be added to elementalPriority in config.json.
Example:
{
"elementDetection": {
"elementalPriority": [
"my_mod:holy",
"mebahelrpgresistanceweakness:frost",
"mebahelrpgresistanceweakness:fire"
]
}
}
Priority matters when the same attack matches multiple elemental keywords. The first matching element in elementalPriority is selected.
For example, if an item ID is my_mod:holy_fire_sword, and both holy and fire match, the selected element depends on the order in elementalPriority.
For best compatibility, use lowercase English keywords that are likely to appear in item or projectile IDs.
Recommended:
List.of("holy", "sun", "light", "silver", "radiant")
Avoid overly generic keywords such as:
List.of("the", "magic", "item", "weapon")
Generic keywords can accidentally classify too many attacks as the custom element.
Custom elements are automatically supported by the generic elemental hitmarker. The hitmarker does not need a custom icon or color per element; it only indicates whether the elemental part of the attack was effective, resisted, or neutral.
Mods can define default multipliers directly through the API.
MebahelsRPGWeaknessesResistances.addBasic(
ModEntities.MY_ENTITY,
1.0f, // slash
0.9f, // pierce
1.2f, // blunt
1.25f, // fire
0.85f // frost
);
MebahelsRPGWeaknessesResistances.putDefault(
ModEntities.MY_ENTITY,
new Identifier("my_mod", "holy"),
1.25f
);
putDefault is safe. It only writes a value if the player has not already configured one.
MebahelsRPGWeaknessesResistances.setMultiplier(
ModEntities.MY_ENTITY,
new Identifier("my_mod", "holy"),
1.5f
);
This is intended for commands, debug tools, or admin-side balancing. It overwrites the config value.
entities.json for final server-side tuning0.75 and 1.25 unless designing high-impact mechanics0.0 unless full immunity is intentionalentities.jsonMebahel RPG Resistance & Weakness provides a clean, configurable RPG combat layer for Minecraft. It gives modders and modpack authors a flexible way to make enemies feel distinct without hardcoding balance into entity classes.
Whether you want skeletons to fear maces, automatons to resist arrows, fire creatures to shrug off flames, or undead to burn under holy magic, this mod provides the framework to do it cleanly.

A lightweight and highly configurable combat framework that transforms Minecraft into a tactical experience by adding comprehensive physical (Slash, Pierce, Blunt) and elemental resistance and weakness systems to every mob.