Add armor set and armor set bonus setting (#41)

- Add settingtypes of:
  -  armor_set_elements
  - armor_set_multiplier
- Add check to armor.registration_armor for "_materialname", print msg to debug if not found
- Complete change to how an armor set is calculated
- Set elements linked to settingtypes no longer hard linked to num armor.elements
- Set multiplier linked to settingtypes no longer hard coded
- Readme.MD updated:
  - Addition of the 2 new settingtypes
  - Addition of "Armor Material" topic
This commit is contained in:
Sirrobzeroone 2021-01-12 01:34:28 +11:00 committed by GitHub
parent a3cba570c4
commit e7abacc94e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 121 additions and 39 deletions

@ -2,7 +2,7 @@
| | | | |
|--|--|--|--|
|-[Overview](#overview) |||-[API](#api)|
|-[Overview](#overview) |||-[API](#api)
|-[Armor Configuration](#armor-configuration) |||- - [3d_Armor Item Storage](#3d_armor-item-storage)
|- - [disable_specific_materials](#to-disable-individual-armor-materials) |||- - [Armor Registration](#armor-registration)
|- - [armor_init_delay](#initialization-glitches-when-a-player-first-joins) |||- - [Registering Armor Groups](#registering-armor-groups)
@ -11,15 +11,16 @@
|- - [armor_update_time](#how-often-player-armor-items-are-updated) |||- - - [Attributes](#attributes)
|- - [armor_drop](#drop-armor-when-a-player-dies) |||- - - [Physics](#physics)
|- - [armor_destroy](#destroy-armor-when-a-player-dies) |||- - - [Durability](#durability)
|- - [armor_level_multiplier](#armor-level-multiplyer) |||- - [Armour Functions](#armour-functions)
|- - [armor_heal_multiplier](#armor-healing-multiplyer) |||- - - [armor:set_player_armor](#armor-set_player_armor)
|- - [armor_water_protect](#enable-water-protection) |||- - - [armor:punch](#armor-punch)
|- - [armor_fire_protect](#enable-fire-protection) |||- - - [armor:damage](#armor-damage)
|- - [armor_punch_damage](#enable-punch-damage-effects) |||- - - [armor:remove_all](#armor-remove_all)
|- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories) |||- - - [armor:equip](#armor-equip)
|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - - [armor:unequip](#armor-unequip)
| - [Credits](#credits) |||- - - [armor:update_skin](#armor-update_skin)
| |||- - [Callbacks](#Callbacks)
|- - [armor_level_multiplier](#armor-level-multiplyer) |||- - - [Armor Material](#armor-material)
|- - [armor_heal_multiplier](#armor-healing-multiplyer) |||- - [Armour Functions](#armor-functions)
|- - [armor_set_elements](#allows-the-customisation-of-armor-set) |||- - - [armor:set_player_armor](#armor-set_player_armor)
|- - [armor_set_bonus](#armor-set-bonus-multiplier) |||- - - [armor:punch](#armor-punch)
|- - [armor_water_protect](#enable-water-protection) |||- - - [armor:damage](#armor-damage)
|- - [armor_fire_protect](#enable-fire-protection) |||- - - [armor:remove_all](#armor-remove_all)
|- - [armor_punch_damage](#enable-punch-damage-effects) |||- - - [armor:equip](#armor-equip)
|- - [armor_migrate_old_inventory](#migration-of-old-armor-inventories) |||- - - [armor:unequip](#armor-unequip)
|- - [wieldview_update_time](#how-often-player-wield-items-are-updated) |||- - - [armor:update_skin](#armor-update_skin)
|-[Credits](#credits) |||- - [Callbacks](#Callbacks)
| |||- - - [Item callbacks](#item-callbacks)
| |||- - - [Global callbacks](#global-callbacks)
@ -39,7 +40,7 @@ Overall level is boosted by 10% when wearing a full matching set.
# Armor Configuration
Override the following default settings by adding them to your ***minetest.conf*** file.
Change the following default settings by going to Main Menu>>Settings(Tab)>>All Settings(Button)>>Mods>>minetest-3d_Armor>>3d_Armor
### To disable individual armor materials
**set the below to false**
@ -95,6 +96,17 @@ Override the following default settings by adding them to your ***minetest.conf*
armor_heal_multiplier = 1
### Allows the customisation of armor set
**Shields already configured as need to be worn to complete an armor set**
**These names come from [Element names](#groups-used-by-3d_armor), the second half of the element name only is used eg armor_head is head**
armor_set_elements = head torso legs feet shield
### Armor set bonus multiplier
**Set to 1 to disable set bonus**
armor_set_multiplier = 1.1
### Enable water protection
**periodically restores breath when activated**
@ -254,13 +266,9 @@ Adding Elements is more complex but the below code can be used to add new elemen
if minetest.global_exists("armor") and armor.elements then
table.insert(armor.elements, "hands")
local mult = armor.config.level_multiplier or 1
armor.config.level_multiplier = mult * 0.5
end
**1st line** not strictly needed but checks that the global table "armor" and subtable "elements" exists
**2nd line** adds a new value to the armor.elements table called "hands"
**3rd line** in this case will be set to one ***note: need more detail here***
**4th line** simply sets the multiplier, by setting 0.5 smaller armor becomes less effective and larger more effective. good values are between 0.1 and 1 in increments of 0.1.
See ***init.lua*** under **3d_armor>>shields** for a further example
@ -352,6 +360,40 @@ Durability is determined by the value assigned to the group ***armor_use***. The
65535/2000 = 327.6 (327)
After 327 uses(hits) the armor item will break.
### Armor Material
The material the armor is made from is defined by adding the material to the end of registered armor item name. It is very important the material is the last item in the registered item name and it is preceeded by an "_" eg "_materialname".
The material name is what 3d_armor uses to determine if a player is wearing a set of armor. To recieve the set bonus all items worn must be made of the same material.
So to get a set bonus under the default set settings the players armor items listed below must be made of the same material:
* head - Helmet
* torso - Chestplate
* legs - Leggings
* feet - Boots
* shield - Shields
If all of the above were made of material "wood" the player would recieve an ***armor_set_bonus*** of armor_level * 1.1, essentially +10%
**Example One**
armor:register_armor("3d_armor:helmet_bronze", {
description = S("Bronze Helmet"),
inventory_image = "3d_armor_inv_helmet_bronze.png",
groups = {armor_head=1, armor_heal=6, armor_use=400, physics_speed=-0.01, physics_gravity=0.01},
armor_groups = {fleshy=10},
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
})
**Example Two**
armor:register_armor("new_mod:helmet_spartan_bronze", {
description = S("Spartan Helmet"),
inventory_image = "new_mod_inv_helmet_spartan_bronze.png",
groups = {armor_head=1, armor_heal=6, armor_use=350, physics_speed=-0.01, physics_gravity=0.01},
armor_groups = {fleshy=12},
damage_groups = {cracky=3, snappy=2, choppy=2, crumbly=1, level=2},
})
***Note: At the moment an armor item can only be made of one material***
## Armor Functions
### armor set_player_armor

@ -95,6 +95,8 @@ armor.config = {
material_gold = true,
material_mithril = true,
material_crystal = true,
set_elements = "head torso legs feet shield",
set_multiplier = 1.1,
water_protect = true,
fire_protect = minetest.get_modpath("ethereal") ~= nil,
fire_protect_torch = minetest.get_modpath("ethereal") ~= nil,
@ -117,6 +119,14 @@ armor.register_armor = function(self, name, def)
end
return armor:equip(player, itemstack)
end
-- The below is a very basic check to try and see if a material name exists as part
-- of the item name. However this check is very simple and just checks theres "_something"
-- at the end of the item name and logging an error to debug if not.
local check_mat_exists = string.match(name, "%:.+_(.+)$")
if check_mat_exists == nil then
minetest.log("warning:[3d_armor] Registered armor "..name..
" does not have \"_material\" specified at the end of the item registration name")
end
minetest.register_tool(name, def)
end
@ -197,7 +207,6 @@ armor.set_player_armor = function(self, player)
end
local state = 0
local count = 0
local material = {count=1}
local preview = armor:get_preview(name)
local texture = "3d_armor_trans.png"
local physics = {}
@ -205,6 +214,9 @@ armor.set_player_armor = function(self, player)
local levels = {}
local groups = {}
local change = {}
local set_worn = {}
local armor_multi = 0
local worn_armor = armor:get_weared_armor_elements(player)
for _, phys in pairs(self.physics) do
physics[phys] = 1
end
@ -258,21 +270,38 @@ armor.set_player_armor = function(self, player)
local value = def.groups["armor_"..attr] or 0
attributes[attr] = attributes[attr] + value
end
local mat = string.match(item, "%:.+_(.+)$")
if material.name then
if material.name == mat then
material.count = material.count + 1
end
end
-- The following code compares player worn armor items against requirements
-- of which armor pieces are needed to be worn to meet set bonus requirements
for loc,item in pairs(worn_armor) do
local item_mat = string.match(item, "%:.+_(.+)$")
local worn_key = item_mat or "unknown"
-- Perform location checks to ensure the armor is worn correctly
for k,set_loc in pairs(armor.config.set_elements)do
if set_loc == loc then
if set_worn[worn_key] == nil then
set_worn[worn_key] = 0
set_worn[worn_key] = set_worn[worn_key] + 1
else
material.name = mat
set_worn[worn_key] = set_worn[worn_key] + 1
end
end
end
end
-- Apply the armor multiplier only if the player is wearing a full set of armor
for mat_name,arm_piece_num in pairs(set_worn) do
if arm_piece_num == #armor.config.set_elements then
armor_multi = armor.config.set_multiplier
end
end
for group, level in pairs(levels) do
if level > 0 then
level = level * armor.config.level_multiplier
if material.name and material.count == #self.elements then
level = level * 1.1
if armor_multi ~= 0 then
level = level * armor.config.set_multiplier
end
end
local base = self.registered_groups[group]

@ -48,6 +48,8 @@ for name, config in pairs(armor.config) do
local setting = minetest.settings:get("armor_"..name)
if type(config) == "number" then
setting = tonumber(setting)
elseif type(config) == "string" then
setting = tostring(setting)
elseif type(config) == "boolean" then
setting = minetest.settings:get_bool("armor_"..name)
end
@ -62,6 +64,10 @@ for material, _ in pairs(armor.materials) do
end
end
-- Convert set_elements to a Lua table splitting on blank spaces
local t_set_elements = armor.config.set_elements
armor.config.set_elements = string.split(t_set_elements, " ")
-- Remove torch damage if fire_protect_torch == false
if armor.config.fire_protect_torch == false and armor.config.fire_protect == true then
for k,v in pairs(armor.fire_nodes) do

@ -1,4 +1,3 @@
[3d_armor]
armor_material_wood (Enable wood armor) bool true
@ -38,6 +37,12 @@ armor_level_multiplier (Armor effectiveness multiplier) float 1
# eg: armor_heal_multiplier = 0 will disable healing altogether.
armor_heal_multiplier (Armor healing multiplier) float 1
# Armor set item names, remove or add items to include them or remove them from whats considered an Armor set.
armor_set_elements (Armor set items) string head torso legs feet shield
# Bonus multiplier when wearing armor set, set to the same as armor_level_multiplier to disable
armor_set_multiplier (Armor Set Bonus multiplier) float 1.1
# Enable water protection (periodically restores breath when activated).
armor_water_protect (Enable water protection) bool true