diff --git a/README.md b/README.md index 8542690..9466b4e 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,53 @@ armor_monoid.register_armor_group("arcane", 100) <br/> As you can see, the argument is not a multiplier, but the base armor group rating. Calling this would mean players start off with an armor rating in -"arcane" of 100 (no protection). \ No newline at end of file +"arcane" of 100 (no protection). + +Special armor groups +==================== + +Luanti defines a number of [special armor groups](https://github.com/luanti-org/luanti/blob/master/doc/lua_api.md#objectref-armor-groups) +that have an engine-based effect and therefore must be handled uniquely by this +monoid. + +`fall_damage_add_percent` +------------------------- + +The `fall_damage_add_percent` armor group controls how much additional damage +that a player will incur when falling from a high height. The armor monoid +handles this group exactly like normal armor groups that have a base value of +100. + +The armor monoid uses the following range of values for the +`fall_damage_add_percent` armor group: + +- `value = 100`: player takes normal fall damage (100%) +- `value = 0`: player takes no fall damage (0%) +- `value = X`: player takes X% less fall damage (1%-99%) +- default value: 100 + +To grant a player fall damage reduction, use the `fall_damage_add_percent` group +as you would any normal armor group: + +```lua +armor_monoid.monoid:add_change(player,{fall_damage_add_percent=0.5},"mymod:half_fall_damage") +``` + +`immortal` +---------- + +The `immortal` armor group controls whether or not a player can suffer damage +and experience drowning. Due to limitations of this monoid, the values of this +armor group are handled differently than most armor groups. + +The armor monoid uses the following values for the `immortal` armor group: + +- `value <= 1`: player is not immortal, subject to damage and drowning +- `value > 1`: player is immortal, will not suffer damage and cannot drown +- default value: 1 + +To grant a player immortality, set this group to a value greater than 1 like so: + +```lua +armor_monoid.monoid:add_change(player,{immortal=2},"mymod:immortality") +``` \ No newline at end of file diff --git a/init.lua b/init.lua index 3a0d0ca..a600fc7 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,11 @@ armor_monoid = {} -local armor_groups = { fleshy = 100 } +local armor_groups = { + fleshy = 100, + fall_damage_add_percent = 100, + immortal = 1, +} armor_monoid.registered_groups = armor_groups @@ -71,6 +75,15 @@ armor_monoid.monoid = player_monoids.make_monoid({ end end + -- fall_damage_add_percent is a special armor group that has an inherent + -- value of 0 rather than 100, so its final value is offset by -100 here + final.fall_damage_add_percent = final.fall_damage_add_percent - 100 + + -- immortal is a special armor group that must be either 0 or 1 to indicate + -- mortality or immortality, respectively, so its final value is constrained + -- here + final.immortal = final.immortal > 1 and 1 or 0 + join_handled[player:get_player_name()] = true player:set_armor_groups(final)