1
0
mirror of https://github.com/minetest-mods/3d_armor.git synced 2025-06-29 14:50:47 +02:00

68 Commits

Author SHA1 Message Date
793c74856f Fix nil index in on_damage callback 2017-05-03 17:56:32 +01:00
47734969e2 Bump version to 0.4.9 2017-04-28 19:06:38 +01:00
1af0bb60f8 Rename on_punch callback to avoid potential conflict with nodes 2017-04-21 18:33:30 +01:00
a11b3302e1 Move armor initialization back out of the api 2017-04-19 21:53:13 +01:00
664d9fbfef Increase fleshy level of wood and cactus leggings 2017-04-19 19:42:12 +01:00
4dd7e41749 Add damage method and update README.txt 2017-04-19 19:00:00 +01:00
df429ee487 Run inventory equip callbacks before set_player_armor 2017-04-16 19:34:09 +01:00
7566ecccee Initialize armor after all on_joinplayer callbacks have run 2017-04-16 16:52:49 +01:00
99bc8cf2d3 Reverse order of stack and index in callbacks for consistency 2017-04-15 20:44:05 +01:00
a2ec13e28d Only allow armor items in the armor inventory 2017-04-15 18:00:10 +01:00
065815eec1 Include stack index it armor item callbacks 2017-04-15 17:54:39 +01:00
16b0ee2d9e Register adminshield alias for consistency 2017-04-14 20:19:38 +01:00
64f8b3cd58 Fix OOM crash with admin shield 2017-04-14 17:08:08 +01:00
74ef6c5759 Shields: check valid hitter 2017-04-13 21:29:57 +01:00
b741b7426b More player validity checks 2017-04-13 20:34:55 +01:00
db312b3245 Code styling 2017-04-13 20:11:15 +01:00
de2c47f334 More protection from un-initialized player crashes 2017-04-13 19:47:43 +01:00
b4283f6e60 Fix string concatenation in UI form, resolves #104 2017-04-13 17:21:16 +01:00
888fbacb49 Prevent potentially bogus warning 2017-04-11 21:26:06 +01:00
50453aa5a6 Fix warnings 2017-04-11 20:55:28 +01:00
b45fbd0f2a Log warning if initialization fails and validate armor.def for UI 2017-04-11 20:42:58 +01:00
9ffcc19fd7 Improve player initialization and increase default delay 2017-04-11 19:34:06 +01:00
6359b0a0ed bugfix: the count was lost 2017-04-10 18:24:27 +01:00
4dbe76312b Hazmat suit: updates and fixes 2017-04-09 20:43:55 +01:00
20edce6c55 Better balance of armor weights 2017-04-09 18:49:44 +01:00
6e58d1280b Add minor physics penalties to metal armors 2017-04-09 18:37:55 +01:00
20d4728829 Only reciprocate damage of valid tool items 2017-04-09 18:07:53 +01:00
7cfd744ff3 Respect flammable group when fire is protection enabled 2017-04-09 17:34:22 +01:00
a76a35f177 Fix regression with heal_multiplier config 2017-04-09 16:25:52 +01:00
e5e926a02e Use metal sounds for enhanced shields 2017-04-09 15:43:35 +01:00
3951c833da More documentation ammendments 2017-04-09 15:00:48 +01:00
e9a2c57826 Correction to example code 2017-04-08 22:32:46 +01:00
5508a26dbf Bugfix: shields crash with nil method, fixes #102 2017-04-08 22:28:52 +01:00
0ec7858937 Add punch damage groups and effects 2017-04-08 21:32:56 +01:00
1e059f2557 Bugfix: recognise boolean false in configuration 2017-04-05 17:51:50 +01:00
5dab1ca887 Add intllib support to 3d_armor_stand 2017-03-31 22:09:32 +01:00
1fdff7adaa Make water protection optional, default true
This can save a `global_step` regisration if neither fire or water
protection are enabled.
2017-03-31 22:03:59 +01:00
23e4d5114f Add support for intllib 2017-03-31 20:12:20 +01:00
7fde7c050d Update wieldview README about dependencies 2017-03-31 17:42:22 +01:00
45099ae25a Mod-defined wield item transformation w/ group 2017-03-31 17:42:22 +01:00
edebf13c1f Remove unneeded default dependency from wieldview 2017-03-31 17:42:22 +01:00
4083782246 Improve get_armor_formspec 2017-03-29 19:31:00 +01:00
5911447048 Move shields level reduction to shields mod 2017-03-29 19:13:13 +01:00
3aac5c98f4 Fix movement and level bugs 2017-03-29 17:44:40 +01:00
fe9664589a Fix potential missing texture bug 2017-03-26 22:46:51 +01:00
11ce84873b Add support for non-fleshy damage groups, closes #47 2017-03-26 20:53:04 +01:00
86fd6b0d7d Fix crash caused by 27a3823eed 2017-03-23 00:59:21 +00:00
27a3823eed Improve error logging, reduce log level to warning 2017-03-22 19:00:48 +00:00
348dad3d4d Log warning of unused mods when dependencies are missing 2017-03-21 15:16:58 +00:00
ea86aa35f5 Merge branch 'bell07-pr_compat_cleanup' 2017-03-21 14:54:03 +00:00
f0edb9a710 Inventory compat cleanup
fix inventory_plus after cleanup. Create own register_on_player_receive_fields for this inventory

removed smart_inventory (moved to the inventoy mod), adjusted sfinv

moved sfinv to own mod 3d_armor_sfinv

moved unified_inventory to 3d_armor_ui

moved inventory_plus support to own mod 3d_armor_ip
2017-03-21 14:50:17 +00:00
75191490c2 Use api call to get player skin 2017-03-19 18:52:51 +00:00
f91af02c45 Fix inventory paging bugs caused by previous commit 2017-03-19 18:06:54 +00:00
3843578a33 Remove unnecessary code 2017-03-19 17:22:24 +00:00
1570efb7ac Depreciate update_inventory and use on_update callback 2017-03-19 16:10:52 +00:00
5517be8ff2 Replace missed global config, fixes #94 2017-03-19 13:28:55 +00:00
709535dff0 Only apply valid wardrobe mod skins, fixes #93 2017-03-18 22:14:08 +00:00
a1d904c517 Remove redundant code 2017-03-18 22:02:11 +00:00
3c2cb16351 Correction to documentation 2017-03-18 20:39:03 +00:00
6bf28dc2c5 Only allow one of each armor element in armor slots
Required, otherwise equip callbacks may be bogus.
2017-03-18 20:32:11 +00:00
75a7181e0f Add callbacks, closes #46 2017-03-18 20:12:43 +00:00
2b840fbe38 Add comment and remove empty lines 2017-03-18 18:04:10 +00:00
701215c22f Depreciate global configs, closes #68 2017-03-18 17:23:50 +00:00
e46ff3488b Remove kill/me commands 2017-03-17 21:57:13 +00:00
f74a52df62 Code re-organisation
This should make it easier to merge features from the now
out-dated development branch.
2017-03-17 20:26:41 +00:00
3c4500a9bf Only show protection levels of enabled features 2017-03-17 18:27:19 +00:00
e69b59e2af Fix alignment of formspec page slots 2017-03-15 19:31:48 +00:00
d43d96bb28 Fix typo in cactus helmet description, closes #91 2017-03-15 18:58:27 +00:00
29 changed files with 1747 additions and 1118 deletions

View File

@ -3,7 +3,9 @@
Depends: default Depends: default
Recommends: sfinv, inventory_plus or unified_inventory (use only one to avoid conflicts) Recommends: sfinv, unified_inventory or smart_inventory (use only one to avoid conflicts)
Supports: player_monoids and armor_monoid
Adds craftable armor that is visible to other players. Each armor item worn contributes to Adds craftable armor that is visible to other players. Each armor item worn contributes to
a player's armor group level making them less vulnerable to weapons. a player's armor group level making them less vulnerable to weapons.
@ -14,10 +16,173 @@ Overall level is boosted by 10% when wearing a full matching set.
Fire protection added by TenPlus1 when using crystal armor if Ethereal mod active, level 1 Fire protection added by TenPlus1 when using crystal armor if Ethereal mod active, level 1
protects against torches, level 2 for crystal spike, level 3 for fire, level 5 for lava. protects against torches, level 2 for crystal spike, level 3 for fire, level 5 for lava.
Configuration Armor Configuration
------------- -------------------
Armor can be configured by adding a file called armor.conf in 3d_armor mod and/or world directory. Override the following default settings by adding them to your minetest.conf file.
see armor.conf.example for all available options.
-- Set false to disable individual armor materials.
armor_material_wood = true
armor_material_cactus = true
armor_material_steel = true
armor_material_bronze = true
armor_material_diamond = true
armor_material_gold = true
armor_material_mithril = true
armor_material_crystal = true
-- Increase this if you get initialization glitches when a player first joins.
armor_init_delay = 1
-- Number of initialization attempts.
-- Use in conjunction with armor_init_delay if initialization problems persist.
armor_init_times = 1
-- Increase this if armor is not getting into bones due to server lag.
armor_bones_delay = 1
-- How often player armor items are updated.
armor_update_time = 1
-- Drop armor when a player dies.
-- Uses bones mod if present, otherwise items are dropped around the player.
armor_drop = true
-- Pulverise armor when a player dies, overrides armor_drop.
armor_destroy = false
-- You can use this to increase or decrease overall armor effectiveness,
-- eg: level_multiplier = 0.5 will reduce armor level by half.
armor_level_multiplier = 1
-- You can use this to increase or decrease overall armor healing,
-- eg: armor_heal_multiplier = 0 will disable healing altogether.
armor_heal_multiplier = 1
-- Enable water protection (periodically restores breath when activated)
armor_water_protect = true
-- Enable fire protection (defaults true if using ethereal mod)
armor_fire_protect = false
-- Enable punch damage effects.
armor_punch_damage = true
API
---
Armor Registration:
armor:register_armor(name, def)
Wrapper function for `minetest.register_tool`, while registering armor as
a tool item is still supported, this may be deprecated in future so new code
should use this method.
Additional fields supported by 3d_armor:
texture = <filename>
preview = <filename>
armor_groups = <table>
damage_groups = <table>
reciprocate_damage = <bool>
on_equip = <function>
on_unequip = <function>
on_destroy = <function>
on_damage = <function>
on_punched = <function>
armor:register_armor_group(group, base)
Example:
armor:register_armor_group("radiation", 100)
armor:register_armor("mod_name:speed_boots", {
description = "Speed Boots",
inventory_image = "mod_name_speed_boots_inv.png",
texture = "mod_name_speed_boots.png",
preview = "mod_name_speed_boots_preview.png",
groups = {armor_feet=1, armor_use=500, physics_speed=1.2, flammable=1},
armor_groups = {fleshy=10, radiation=10},
damage_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1},
reciprocate_damage = true,
on_destroy = function(player, index, stack)
local pos = player:getpos()
if pos then
minetest.sound_play({
name = "mod_name_break_sound",
pos = pos,
gain = 0.5,
})
end
end,
})
See armor.lua, technic_armor and shields mods for more examples.
Default groups:
Elements: armor_head, armor_torso, armor_legs, armor_feet
Attributes: armor_heal, armor_fire, armor_water
Physics: physics_jump, physics_speed, physics_gravity
Durability: armor_use, flammable
Notes:
Elements may be modified by dependent mods, eg shields adds armor_shield.
Attributes and physics values are 'stackable', durability is determined
by the level of armor_use, total uses == approx (65535/armor_use), non-fleshy
damage groups need to be defined in the tool/weapon used against the player.
Reciprocal tool damage will be done only by the first armor inventory item
with `reciprocate_damage = true`
Armor Functions:
armor:set_player_armor(player)
Primarily an internal function but can be called externally to apply any
changes that might not otherwise get handled.
armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
Used to apply damage to all equipped armor based on the damage groups of
each individual item.`hitter`, `time_from_last_punch` and `tool_capabilities`
are optional but should be valid if included.
armor:damage(player, index, stack, use)
Adds wear to a single armor itemstack, triggers `on_damage` callbacks and
updates the necessary inventories. Also handles item destruction callbacks
and so should NOT be called from `on_unequip` to avoid an infinite loop.
Item Callbacks:
on_equip = func(player, index, stack)
on_unequip = func(player, index, stack)
on_destroy = func(player, index, stack)
on_damage = func(player, index, stack)
on_punched = func(player, hitter, time_from_last_punch, tool_capabilities)
Notes:
`on_punched` is called every time a player is punched or takes damage, `hitter`,
`time_from_last_punch` and `tool_capabilities` can be `nil` and will be in the
case of fall damage, etc. When fire protection is enabled, hitter == "fire"
in the event of fire damage. Return `false` to override armor damage effects.
When armor is destroyed `stack` will contain a copy of the previous stack.
Global Callbacks:
armor:register_on_update(func(player))
armor:register_on_equip(func(player, index, stack))
armor:register_on_unequip(func(player, index, stack))
armor:register_on_destroy(func(player, index, stack))
Global Callback Example:
armor:register_on_update(function(player)
print(player:get_player_name().." armor updated!")
end)
Note: worldpath config settings override any settings made in the mod's directory.

View File

@ -1,45 +0,0 @@
minetest.register_alias("adminboots","3d_armor:boots_admin")
minetest.register_alias("adminhelmet","3d_armor:helmet_admin")
minetest.register_alias("adminchestplate","3d_armor:chestplate_admin")
minetest.register_alias("adminleggings","3d_armor:leggings_admin")
minetest.register_tool("3d_armor:helmet_admin", {
description = "Admin Helmet",
inventory_image = "3d_armor_inv_helmet_admin.png",
groups = {armor_head=1000, armor_heal=1000, armor_use=0, armor_water=1, not_in_creative_inventory=1},
wear = 0,
on_drop = function(itemstack, dropper, pos)
return
end,
})
minetest.register_tool("3d_armor:chestplate_admin", {
description = "Admin Chestplate",
inventory_image = "3d_armor_inv_chestplate_admin.png",
groups = {armor_torso=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1},
wear = 0,
on_drop = function(itemstack, dropper, pos)
return
end,
})
minetest.register_tool("3d_armor:leggings_admin", {
description = "Admin Leggings",
inventory_image = "3d_armor_inv_leggings_admin.png",
groups = {armor_legs=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1},
wear = 0,
on_drop = function(itemstack, dropper, pos)
return
end,
})
minetest.register_tool("3d_armor:boots_admin", {
description = "Admin Boots",
inventory_image = "3d_armor_inv_boots_admin.png",
groups = {armor_feet=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1},
wear = 0,
on_drop = function(itemstack, dropper, pos)
return
end,
})

474
3d_armor/api.lua Normal file
View File

@ -0,0 +1,474 @@
local skin_previews = {}
local use_player_monoids = minetest.global_exists("player_monoids")
local use_armor_monoid = minetest.global_exists("armor_monoid")
local armor_def = setmetatable({}, {
__index = function()
return setmetatable({
groups = setmetatable({}, {
__index = function()
return 0
end})
}, {
__index = function()
return 0
end
})
end,
})
local armor_textures = setmetatable({}, {
__index = function()
return setmetatable({}, {
__index = function()
return "blank.png"
end
})
end
})
armor = {
timer = 0,
elements = {"head", "torso", "legs", "feet"},
physics = {"jump", "speed", "gravity"},
attributes = {"heal", "fire", "water"},
formspec = "image[2.5,0;2,4;armor_preview]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
default.get_hotbar_bg(0, 4.7)..
"list[current_player;main;0,4.7;8,1;]"..
"list[current_player;main;0,5.85;8,3;8]",
def = armor_def,
textures = armor_textures,
default_skin = "character",
materials = {
wood = "group:wood",
cactus = "default:cactus",
steel = "default:steel_ingot",
bronze = "default:bronze_ingot",
diamond = "default:diamond",
gold = "default:gold_ingot",
mithril = "moreores:mithril_ingot",
crystal = "ethereal:crystal_ingot",
},
fire_nodes = {
{"default:lava_source", 5, 8},
{"default:lava_flowing", 5, 8},
{"fire:basic_flame", 3, 4},
{"fire:permanent_flame", 3, 4},
{"ethereal:crystal_spike", 2, 1},
{"ethereal:fire_flower", 2, 1},
{"default:torch", 1, 1},
{"default:torch_ceiling", 1, 1},
{"default:torch_wall", 1, 1},
},
registered_groups = {["fleshy"]=100},
registered_callbacks = {
on_update = {},
on_equip = {},
on_unequip = {},
on_damage = {},
on_destroy = {},
},
version = "0.4.9",
}
armor.config = {
init_delay = 2,
init_times = 10,
bones_delay = 1,
update_time = 1,
drop = minetest.get_modpath("bones") ~= nil,
destroy = false,
level_multiplier = 1,
heal_multiplier = 1,
material_wood = true,
material_cactus = true,
material_steel = true,
material_bronze = true,
material_diamond = true,
material_gold = true,
material_mithril = true,
material_crystal = true,
water_protect = true,
fire_protect = minetest.get_modpath("ethereal") ~= nil,
punch_damage = true,
}
-- Armor Registration
armor.register_armor = function(self, name, def)
minetest.register_tool(name, def)
end
armor.register_armor_group = function(self, group, base)
base = base or 100
self.registered_groups[group] = base
if use_armor_monoid then
armor_monoid.register_armor_group(group, base)
end
end
-- Armor callbacks
armor.register_on_update = function(self, func)
if type(func) == "function" then
table.insert(self.registered_callbacks.on_update, func)
end
end
armor.register_on_equip = function(self, func)
if type(func) == "function" then
table.insert(self.registered_callbacks.on_equip, func)
end
end
armor.register_on_unequip = function(self, func)
if type(func) == "function" then
table.insert(self.registered_callbacks.on_unequip, func)
end
end
armor.register_on_damage = function(self, func)
if type(func) == "function" then
table.insert(self.registered_callbacks.on_damage, func)
end
end
armor.register_on_destroy = function(self, func)
if type(func) == "function" then
table.insert(self.registered_callbacks.on_destroy, func)
end
end
armor.run_callbacks = function(self, callback, player, index, stack)
if stack then
local def = stack:get_definition() or {}
if type(def[callback]) == "function" then
def[callback](player, index, stack)
end
end
local callbacks = self.registered_callbacks[callback]
if callbacks then
for _, func in pairs(callbacks) do
func(player, index, stack)
end
end
end
armor.update_player_visuals = function(self, player)
if not player then
return
end
local name = player:get_player_name()
if self.textures[name] then
default.player_set_textures(player, {
self.textures[name].skin,
self.textures[name].armor,
self.textures[name].wielditem,
})
end
end
armor.set_player_armor = function(self, player)
local name, player_inv = self:get_valid_player(player, "[set_player_armor]")
if not name then
return
end
local state = 0
local count = 0
local material = {count=1}
local preview = armor:get_preview(name)
local texture = "3d_armor_trans.png"
local textures = {}
local physics = {}
local attributes = {}
local levels = {}
local groups = {}
local change = {}
for _, phys in pairs(self.physics) do
physics[phys] = 1
end
for _, attr in pairs(self.attributes) do
attributes[attr] = 0
end
for group, _ in pairs(self.registered_groups) do
change[group] = 1
levels[group] = 0
end
local list = player_inv:get_list("armor")
for i, stack in pairs(list) do
if stack:get_count() == 1 then
local def = stack:get_definition()
for _, element in pairs(self.elements) do
if def.groups["armor_"..element] then
if def.armor_groups then
for group, level in pairs(def.armor_groups) do
if levels[group] then
levels[group] = levels[group] + level
end
end
else
local level = def.groups["armor_"..element]
levels["fleshy"] = levels["fleshy"] + level
end
end
-- DEPRECATED, use armor_groups instead
if def.groups["armor_radiation"] and levels["radiation"] then
levels["radiation"] = def.groups["armor_radiation"]
end
end
local item = stack:get_name()
local tex = def.texture or item:gsub("%:", "_")
tex = tex:gsub(".png$", "")
local prev = def.preview or tex.."_preview"
prev = prev:gsub(".png$", "")
texture = texture.."^"..tex..".png"
preview = preview.."^"..prev..".png"
state = state + stack:get_wear()
count = count + 1
for _, phys in pairs(self.physics) do
local value = def.groups["physics_"..phys] or 0
physics[phys] = physics[phys] + value
end
for _, attr in pairs(self.attributes) do
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
else
material.name = mat
end
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
end
end
local base = self.registered_groups[group]
self.def[name].groups[group] = level
if level > base then
level = base
end
groups[group] = base - level
change[group] = groups[group] / base
end
for _, attr in pairs(self.attributes) do
self.def[name][attr] = attributes[attr]
end
for _, phys in pairs(self.physics) do
self.def[name][phys] = physics[phys]
end
if use_armor_monoid then
armor_monoid.monoid:add_change(player, change, "3d_armor:armor")
else
player:set_armor_groups(groups)
end
if use_player_monoids then
player_monoids.speed:add_change(player, physics.speed,
"3d_armor:physics")
player_monoids.jump:add_change(player, physics.jump,
"3d_armor:physics")
player_monoids.gravity:add_change(player, physics.gravity,
"3d_armor:physics")
else
player:set_physics_override(physics)
end
self.textures[name].armor = texture
self.textures[name].preview = preview
self.def[name].level = self.def[name].groups.fleshy or 0
self.def[name].state = state
self.def[name].count = count
self:update_player_visuals(player)
self:run_callbacks("on_update", player)
end
armor.punch = function(self, player, hitter, time_from_last_punch, tool_capabilities)
local name, player_inv = self:get_valid_player(player, "[punch]")
if not name then
return
end
local state = 0
local count = 0
local recip = true
local default_groups = {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
local list = player_inv:get_list("armor")
for i, stack in pairs(list) do
if stack:get_count() == 1 then
local name = stack:get_name()
local use = minetest.get_item_group(name, "armor_use") or 0
local damage = use > 0
local def = stack:get_definition() or {}
if type(def.on_punched) == "function" then
damage = def.on_punched(player, hitter, time_from_last_punch,
tool_capabilities) ~= false and damage == true
end
if damage == true and tool_capabilities then
local damage_groups = def.damage_groups or default_groups
local level = damage_groups.level or 0
local groupcaps = tool_capabilities.groupcaps or {}
local uses = 0
damage = false
for group, caps in pairs(groupcaps) do
local maxlevel = caps.maxlevel or 0
local diff = maxlevel - level
if diff == 0 then
diff = 1
end
if diff > 0 and caps.times then
local group_level = damage_groups[group]
if group_level then
local time = caps.times[group_level]
if time then
local dt = time_from_last_punch or 0
if dt > time / diff then
if caps.uses then
uses = caps.uses * math.pow(3, diff)
end
damage = true
break
end
end
end
end
end
if damage == true and recip == true and hitter and
def.reciprocate_damage == true and uses > 0 then
local item = hitter:get_wielded_item()
if item and item:get_name() ~= "" then
item:add_wear(65535 / uses)
hitter:set_wielded_item(item)
end
-- reciprocate tool damage only once
recip = false
end
end
if damage == true and hitter == "fire" then
damage = minetest.get_item_group(name, "flammable") > 0
end
if damage == true then
self:damage(player, i, stack, use)
end
state = state + stack:get_wear()
count = count + 1
end
end
self.def[name].state = state
self.def[name].count = count
end
armor.damage = function(self, player, index, stack, use)
local old_stack = ItemStack(stack)
stack:add_wear(use)
self:run_callbacks("on_damage", player, index, stack)
self:set_inventory_stack(player, index, stack)
if stack:get_count() == 0 then
self:run_callbacks("on_unequip", player, index, old_stack)
self:run_callbacks("on_destroy", player, index, old_stack)
self:set_player_armor(player)
end
end
armor.get_player_skin = function(self, name)
local skin = nil
if self.skin_mod == "skins" or self.skin_mod == "simple_skins" then
skin = skins.skins[name]
elseif self.skin_mod == "u_skins" then
skin = u_skins.u_skins[name]
elseif self.skin_mod == "wardrobe" then
local skins = wardrobe.playerSkins or {}
if skins[name] then
skin = string.gsub(skins[name], "%.png$","")
end
end
return skin or armor.default_skin
end
armor.add_preview = function(self, preview)
skin_previews[preview] = true
end
armor.get_preview = function(self, name)
local preview = armor:get_player_skin(name).."_preview.png"
if skin_previews[preview] then
return preview
end
return "character_preview.png"
end
armor.get_armor_formspec = function(self, name, listring)
if armor.def[name].init_time == 0 then
return "label[0,0;Armor not initialized!]"
end
local formspec = armor.formspec..
"list[detached:"..name.."_armor;armor;0,0.5;2,3;]"
if listring == true then
formspec = formspec.."listring[current_player;main]"..
"listring[detached:"..name.."_armor;armor]"
end
formspec = formspec:gsub("armor_preview", armor.textures[name].preview)
formspec = formspec:gsub("armor_level", armor.def[name].level)
for _, attr in pairs(self.attributes) do
formspec = formspec:gsub("armor_attr_"..attr, armor.def[name][attr])
end
for _, group in pairs(self.attributes) do
formspec = formspec:gsub("armor_group_"..group, armor.def[name][group])
end
return formspec
end
armor.update_inventory = function(self, player)
-- DEPRECATED: Legacy inventory support
end
armor.set_inventory_stack = function(self, player, i, stack)
local msg = "[set_inventory_stack]"
local name = player:get_player_name()
if not name then
minetest.log("warning", "3d_armor: Player name is nil "..msg)
return
end
local player_inv = player:get_inventory()
local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"})
if not player_inv then
minetest.log("warning", "3d_armor: Player inventory is nil "..msg)
return
elseif not armor_inv then
minetest.log("warning", "3d_armor: Detached armor inventory is nil "..msg)
return
end
player_inv:set_stack("armor", i, stack)
armor_inv:set_stack("armor", i, stack)
end
armor.get_valid_player = function(self, player, msg)
msg = msg or ""
if not player then
minetest.log("warning", "3d_armor: Player reference is nil "..msg)
return
end
local name = player:get_player_name()
if not name then
minetest.log("warning", "3d_armor: Player name is nil "..msg)
return
end
local inv = player:get_inventory()
if not inv then
minetest.log("warning", "3d_armor: Player inventory is nil "..msg)
return
end
return name, inv
end
armor.drop_armor = function(pos, stack)
local obj = minetest.add_item(pos, stack)
if obj then
obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)})
end
end

View File

@ -1,3 +1,7 @@
-- DEPRECATED, will not be supported in future versions
-- See README.txt for new configuration options.
-- Armor Configuration (defaults) -- Armor Configuration (defaults)
-- You can remove any unwanted armor materials from this table. -- You can remove any unwanted armor materials from this table.

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,7 @@
default default
player_monoids? player_monoids?
armor_monoid? armor_monoid?
inventory_plus?
unified_inventory?
sfinv?
fire? fire?
ethereal? ethereal?
bakedclay? bakedclay?
intllib?

View File

@ -1,254 +1,409 @@
ARMOR_MOD_NAME = minetest.get_current_modname() local S = function(s) return s end
dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/armor.lua") if minetest.global_exists("intllib") then
dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/admin.lua") S = intllib.Getter()
end
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local worldpath = minetest.get_worldpath()
local last_punch_time = {}
local pending_players = {}
local timer = 0
if ARMOR_MATERIALS.wood then dofile(modpath.."/api.lua")
minetest.register_tool("3d_armor:helmet_wood", {
description = "Wood Helmet", -- Legacy Config Support
inventory_image = "3d_armor_inv_helmet_wood.png",
groups = {armor_head=5, armor_heal=0, armor_use=2000}, local input = io.open(modpath.."/armor.conf", "r")
wear = 0, if input then
}) dofile(modpath.."/armor.conf")
minetest.register_tool("3d_armor:chestplate_wood", { input:close()
description = "Wood Chestplate", input = nil
inventory_image = "3d_armor_inv_chestplate_wood.png", end
groups = {armor_torso=10, armor_heal=0, armor_use=2000}, input = io.open(worldpath.."/armor.conf", "r")
wear = 0, if input then
}) dofile(worldpath.."/armor.conf")
minetest.register_tool("3d_armor:leggings_wood", { input:close()
description = "Wood Leggings", input = nil
inventory_image = "3d_armor_inv_leggings_wood.png", end
groups = {armor_legs=5, armor_heal=0, armor_use=2000}, for name, _ in pairs(armor.config) do
wear = 0, local global = "ARMOR_"..name:upper()
}) if minetest.global_exists(global) then
minetest.register_tool("3d_armor:boots_wood", { armor.config[name] = _G[global]
description = "Wood Boots", end
inventory_image = "3d_armor_inv_boots_wood.png", end
groups = {armor_feet=5, armor_heal=0, armor_use=2000}, if minetest.global_exists("ARMOR_MATERIALS") then
wear = 0, armor.materials = table.copy(ARMOR_MATERIALS)
}) end
if minetest.global_exists("ARMOR_FIRE_NODES") then
armor.fire_nodes = table.copy(ARMOR_FIRE_NODES)
end end
if ARMOR_MATERIALS.cactus then -- Load Configuration
minetest.register_tool("3d_armor:helmet_cactus", {
description = "Cactuc Helmet", for name, config in pairs(armor.config) do
inventory_image = "3d_armor_inv_helmet_cactus.png", local setting = minetest.setting_get("armor_"..name)
groups = {armor_head=5, armor_heal=0, armor_use=1000}, if type(config) == "number" then
wear = 0, setting = tonumber(setting)
}) elseif type(config) == "boolean" then
minetest.register_tool("3d_armor:chestplate_cactus", { setting = minetest.setting_getbool("armor_"..name)
description = "Cactus Chestplate", end
inventory_image = "3d_armor_inv_chestplate_cactus.png", if setting ~= nil then
groups = {armor_torso=10, armor_heal=0, armor_use=1000}, armor.config[name] = setting
wear = 0, end
}) end
minetest.register_tool("3d_armor:leggings_cactus", { for material, _ in pairs(armor.materials) do
description = "Cactus Leggings", local key = "material_"..material
inventory_image = "3d_armor_inv_leggings_cactus.png", if armor.config[key] == false then
groups = {armor_legs=5, armor_heal=0, armor_use=1000}, armor.materials[material] = nil
wear = 0, end
})
minetest.register_tool("3d_armor:boots_cactus", {
description = "Cactus Boots",
inventory_image = "3d_armor_inv_boots_cactus.png",
groups = {armor_feet=5, armor_heal=0, armor_use=1000},
wear = 0,
})
end end
if ARMOR_MATERIALS.steel then dofile(modpath.."/armor.lua")
minetest.register_tool("3d_armor:helmet_steel", {
description = "Steel Helmet", -- Mod Compatibility
inventory_image = "3d_armor_inv_helmet_steel.png",
groups = {armor_head=10, armor_heal=0, armor_use=500}, if minetest.get_modpath("technic") then
wear = 0, armor.formspec = armor.formspec..
}) "label[5,2.5;"..S("Radiation")..": armor_group_radiation]"
minetest.register_tool("3d_armor:chestplate_steel", { armor:register_armor_group("radiation")
description = "Steel Chestplate", end
inventory_image = "3d_armor_inv_chestplate_steel.png", local skin_mods = {"skins", "u_skins", "simple_skins", "wardrobe"}
groups = {armor_torso=15, armor_heal=0, armor_use=500}, for _, mod in pairs(skin_mods) do
wear = 0, local path = minetest.get_modpath(mod)
}) if path then
minetest.register_tool("3d_armor:leggings_steel", { local dir_list = minetest.get_dir_list(path.."/textures")
description = "Steel Leggings", for _, fn in pairs(dir_list) do
inventory_image = "3d_armor_inv_leggings_steel.png", if fn:find("_preview.png$") then
groups = {armor_legs=15, armor_heal=0, armor_use=500}, armor:add_preview(fn)
wear = 0, end
}) end
minetest.register_tool("3d_armor:boots_steel", { armor.skin_mod = mod
description = "Steel Boots", end
inventory_image = "3d_armor_inv_boots_steel.png", end
groups = {armor_feet=10, armor_heal=0, armor_use=500}, if not minetest.get_modpath("moreores") then
wear = 0, armor.materials.mithril = nil
}) end
if not minetest.get_modpath("ethereal") then
armor.materials.crystal = nil
end end
if ARMOR_MATERIALS.bronze then -- Armor Initialization
minetest.register_tool("3d_armor:helmet_bronze", {
description = "Bronze Helmet", armor.formspec = armor.formspec..
inventory_image = "3d_armor_inv_helmet_bronze.png", "label[5,1;"..S("Level")..": armor_level]"..
groups = {armor_head=10, armor_heal=6, armor_use=250}, "label[5,1.5;"..S("Heal")..": armor_attr_heal]"
wear = 0, if armor.config.fire_protect then
}) armor.formspec = armor.formspec.."label[5,2;"..S("Fire")..": armor_fire]"
minetest.register_tool("3d_armor:chestplate_bronze", { end
description = "Bronze Chestplate", armor:register_on_destroy(function(player, index, stack)
inventory_image = "3d_armor_inv_chestplate_bronze.png", local name = player:get_player_name()
groups = {armor_torso=15, armor_heal=6, armor_use=250}, local def = stack:get_definition()
wear = 0, if name and def and def.description then
}) minetest.chat_send_player(name, S("Your").." "..def.description.." "..
minetest.register_tool("3d_armor:leggings_bronze", { S("got destroyed").."!")
description = "Bronze Leggings", end
inventory_image = "3d_armor_inv_leggings_bronze.png", end)
groups = {armor_legs=15, armor_heal=6, armor_use=250},
wear = 0, local function init_player_armor(player)
}) local name = player:get_player_name()
minetest.register_tool("3d_armor:boots_bronze", { local player_inv = player:get_inventory()
description = "Bronze Boots", local pos = player:getpos()
inventory_image = "3d_armor_inv_boots_bronze.png", if not name or not player_inv or not pos then
groups = {armor_feet=10, armor_heal=6, armor_use=250}, return false
wear = 0, end
}) local armor_inv = minetest.create_detached_inventory(name.."_armor", {
on_put = function(inv, listname, index, stack, player)
player:get_inventory():set_stack(listname, index, stack)
armor:run_callbacks("on_equip", player, index, stack)
armor:set_player_armor(player)
end,
on_take = function(inv, listname, index, stack, player)
player:get_inventory():set_stack(listname, index, nil)
armor:run_callbacks("on_unequip", player, index, stack)
armor:set_player_armor(player)
end,
on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
local plaver_inv = player:get_inventory()
local stack = inv:get_stack(to_list, to_index)
player_inv:set_stack(to_list, to_index, stack)
player_inv:set_stack(from_list, from_index, nil)
armor:set_player_armor(player)
end,
allow_put = function(inv, listname, index, stack, player)
local def = stack:get_definition() or {}
local allowed = 0
for _, element in pairs(armor.elements) do
if def.groups["armor_"..element] then
allowed = 1
for i = 1, 6 do
local item = inv:get_stack("armor", i):get_name()
if minetest.get_item_group(item, "armor_"..element) > 0 then
return 0
end
end
end
end
return allowed
end,
allow_take = function(inv, listname, index, stack, player)
return stack:get_count()
end,
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
return count
end,
}, name)
armor_inv:set_size("armor", 6)
player_inv:set_size("armor", 6)
for i=1, 6 do
local stack = player_inv:get_stack("armor", i)
armor_inv:set_stack("armor", i, stack)
armor:run_callbacks("on_equip", player, i, stack)
end
armor.def[name] = {
init_time = minetest.get_gametime(),
level = 0,
state = 0,
count = 0,
groups = {},
}
for _, phys in pairs(armor.physics) do
armor.def[name][phys] = 1
end
for _, attr in pairs(armor.attributes) do
armor.def[name][attr] = 0
end
for group, _ in pairs(armor.registered_groups) do
armor.def[name].groups[group] = 0
end
local skin = armor:get_player_skin(name)
armor.textures[name] = {
skin = skin..".png",
armor = "3d_armor_trans.png",
wielditem = "3d_armor_trans.png",
preview = armor.default_skin.."_preview.png",
}
local texture_path = minetest.get_modpath("player_textures")
if texture_path then
local dir_list = minetest.get_dir_list(texture_path.."/textures")
for _, fn in pairs(dir_list) do
if fn == "player_"..name..".png" then
armor.textures[name].skin = fn
break
end
end
end
armor:set_player_armor(player)
return true
end end
if ARMOR_MATERIALS.diamond then -- Armor Player Model
minetest.register_tool("3d_armor:helmet_diamond", {
description = "Diamond Helmet", default.player_register_model("3d_armor_character.b3d", {
inventory_image = "3d_armor_inv_helmet_diamond.png", animation_speed = 30,
groups = {armor_head=15, armor_heal=12, armor_use=100}, textures = {
wear = 0, armor.default_skin..".png",
}) "3d_armor_trans.png",
minetest.register_tool("3d_armor:chestplate_diamond", { "3d_armor_trans.png",
description = "Diamond Chestplate", },
inventory_image = "3d_armor_inv_chestplate_diamond.png", animations = {
groups = {armor_torso=20, armor_heal=12, armor_use=100}, stand = {x=0, y=79},
wear = 0, lay = {x=162, y=166},
}) walk = {x=168, y=187},
minetest.register_tool("3d_armor:leggings_diamond", { mine = {x=189, y=198},
description = "Diamond Leggings", walk_mine = {x=200, y=219},
inventory_image = "3d_armor_inv_leggings_diamond.png", sit = {x=81, y=160},
groups = {armor_legs=20, armor_heal=12, armor_use=100}, },
wear = 0, })
})
minetest.register_tool("3d_armor:boots_diamond", { minetest.register_on_player_receive_fields(function(player, formname, fields)
description = "Diamond Boots", local name = armor:get_valid_player(player, "[on_player_receive_fields]")
inventory_image = "3d_armor_inv_boots_diamond.png", if not name then
groups = {armor_feet=15, armor_heal=12, armor_use=100}, return
wear = 0, end
}) for field, _ in pairs(fields) do
if string.find(field, "skins_set") then
minetest.after(0, function(player)
local skin = armor:get_player_skin(name)
armor.textures[name].skin = skin..".png"
armor:set_player_armor(player)
end, player)
end
end
end)
minetest.register_on_joinplayer(function(player)
default.player_set_model(player, "3d_armor_character.b3d")
minetest.after(0, function(player)
if init_player_armor(player) == false then
pending_players[player] = 0
end
end, player)
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if name then
armor.def[name] = nil
armor.textures[name] = nil
end
pending_players[player] = nil
end)
if armor.config.drop == true or armor.config.destroy == true then
minetest.register_on_dieplayer(function(player)
local name, player_inv = armor:get_valid_player(player, "[on_dieplayer]")
if not name then
return
end
local drop = {}
for i=1, player_inv:get_size("armor") do
local stack = player_inv:get_stack("armor", i)
if stack:get_count() > 0 then
table.insert(drop, stack)
armor:set_inventory_stack(player, i, nil)
armor:run_callbacks("on_unequip", player, i, stack)
end
end
armor:set_player_armor(player)
local pos = player:getpos()
if pos and armor.config.destroy == false then
minetest.after(armor.config.bones_delay, function()
local meta = nil
local maxp = vector.add(pos, 8)
local minp = vector.subtract(pos, 8)
local bones = minetest.find_nodes_in_area(minp, maxp, {"bones:bones"})
for _, p in pairs(bones) do
local m = minetest.get_meta(p)
if m:get_string("owner") == name then
meta = m
break
end
end
if meta then
local inv = meta:get_inventory()
for _,stack in ipairs(drop) do
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
else
armor.drop_armor(pos, stack)
end
end
else
for _,stack in ipairs(drop) do
armor.drop_armor(pos, stack)
end
end
end)
end
end)
end end
if ARMOR_MATERIALS.gold then if armor.config.punch_damage == true then
minetest.register_tool("3d_armor:helmet_gold", { minetest.register_on_punchplayer(function(player, hitter,
description = "Gold Helmet", time_from_last_punch, tool_capabilities)
inventory_image = "3d_armor_inv_helmet_gold.png", local name = player:get_player_name()
groups = {armor_head=10, armor_heal=6, armor_use=250}, if name then
wear = 0, armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
}) last_punch_time[name] = minetest.get_gametime()
minetest.register_tool("3d_armor:chestplate_gold", { end
description = "Gold Chestplate", end)
inventory_image = "3d_armor_inv_chestplate_gold.png",
groups = {armor_torso=15, armor_heal=6, armor_use=250},
wear = 0,
})
minetest.register_tool("3d_armor:leggings_gold", {
description = "Gold Leggings",
inventory_image = "3d_armor_inv_leggings_gold.png",
groups = {armor_legs=15, armor_heal=6, armor_use=250},
wear = 0,
})
minetest.register_tool("3d_armor:boots_gold", {
description = "Gold Boots",
inventory_image = "3d_armor_inv_boots_gold.png",
groups = {armor_feet=10, armor_heal=6, armor_use=250},
wear = 0,
})
end end
if ARMOR_MATERIALS.mithril then minetest.register_on_player_hpchange(function(player, hp_change)
minetest.register_tool("3d_armor:helmet_mithril", { if player and hp_change < 0 then
description = "Mithril Helmet", local name = player:get_player_name()
inventory_image = "3d_armor_inv_helmet_mithril.png", if name then
groups = {armor_head=15, armor_heal=12, armor_use=50}, local heal = armor.def[name].heal
wear = 0, heal = heal * armor.config.heal_multiplier
}) if heal >= math.random(100) then
minetest.register_tool("3d_armor:chestplate_mithril", { hp_change = 0
description = "Mithril Chestplate", end
inventory_image = "3d_armor_inv_chestplate_mithril.png", -- check if armor damage was handled by fire or on_punchplayer
groups = {armor_torso=20, armor_heal=12, armor_use=50}, local time = last_punch_time[name] or 0
wear = 0, if time == 0 or time + 1 < minetest.get_gametime() then
}) armor:punch(player)
minetest.register_tool("3d_armor:leggings_mithril", { end
description = "Mithril Leggings", end
inventory_image = "3d_armor_inv_leggings_mithril.png", end
groups = {armor_legs=20, armor_heal=12, armor_use=50}, return hp_change
wear = 0, end, true)
})
minetest.register_tool("3d_armor:boots_mithril", { minetest.register_globalstep(function(dtime)
description = "Mithril Boots", timer = timer + dtime
inventory_image = "3d_armor_inv_boots_mithril.png", if timer > armor.config.init_delay then
groups = {armor_feet=15, armor_heal=12, armor_use=50}, for player, count in pairs(pending_players) do
wear = 0, local remove = init_player_armor(player) == true
}) pending_players[player] = count + 1
if remove == false and count > armor.config.init_times then
minetest.log("warning", "3d_armor: Failed to initialize player")
remove = true
end
if remove == true then
pending_players[player] = nil
end
end
timer = 0
end
end)
-- Fire Protection and water breating, added by TenPlus1
if armor.config.fire_protect == true then
-- override hot nodes so they do not hurt player anywhere but mod
for _, row in pairs(armor.fire_nodes) do
if minetest.registered_nodes[row[1]] then
minetest.override_item(row[1], {damage_per_second = 0})
end
end
else
print ("[3d_armor] Fire Nodes disabled")
end end
if ARMOR_MATERIALS.crystal then if armor.config.water_protect == true or armor.config.fire_protect == true then
minetest.register_tool("3d_armor:helmet_crystal", { minetest.register_globalstep(function(dtime)
description = "Crystal Helmet", armor.timer = armor.timer + dtime
inventory_image = "3d_armor_inv_helmet_crystal.png", if armor.timer < armor.config.update_time then
groups = {armor_head=15, armor_heal=12, armor_use=50, armor_fire=1}, return
wear = 0, end
}) for _,player in pairs(minetest.get_connected_players()) do
minetest.register_tool("3d_armor:chestplate_crystal", { local name = player:get_player_name()
description = "Crystal Chestplate", local pos = player:getpos()
inventory_image = "3d_armor_inv_chestplate_crystal.png", local hp = player:get_hp()
groups = {armor_torso=20, armor_heal=12, armor_use=50, armor_fire=1}, if not name or not pos or not hp then
wear = 0, return
}) end
minetest.register_tool("3d_armor:leggings_crystal", { -- water breathing
description = "Crystal Leggings", if armor.config.water_protect == true then
inventory_image = "3d_armor_inv_leggings_crystal.png", if armor.def[name].water > 0 and
groups = {armor_legs=20, armor_heal=12, armor_use=50, armor_fire=1}, player:get_breath() < 10 then
wear = 0, player:set_breath(10)
}) end
minetest.register_tool("3d_armor:boots_crystal", { end
description = "Crystal Boots", -- fire protection
inventory_image = "3d_armor_inv_boots_crystal.png", if armor.config.fire_protect == true then
groups = {armor_feet=15, armor_heal=12, armor_use=50, physics_speed=1, physics_jump=0.5, armor_fire=1}, local fire_damage = true
wear = 0, pos.y = pos.y + 1.4 -- head level
}) local node_head = minetest.get_node(pos).name
pos.y = pos.y - 1.2 -- feet level
local node_feet = minetest.get_node(pos).name
-- is player inside a hot node?
for _, row in pairs(armor.fire_nodes) do
-- check fire protection, if not enough then get hurt
if row[1] == node_head or row[1] == node_feet then
if fire_damage == true then
armor:punch(player, "fire")
last_punch_time[name] = minetest.get_gametime()
fire_damage = false
end
if hp > 0 and armor.def[name].fire < row[2] then
hp = hp - row[3] * armor.config.update_time
player:set_hp(hp)
break
end
end
end
end
end
armor.timer = 0
end)
end end
for k, v in pairs(ARMOR_MATERIALS) do
minetest.register_craft({
output = "3d_armor:helmet_"..k,
recipe = {
{v, v, v},
{v, "", v},
{"", "", ""},
},
})
minetest.register_craft({
output = "3d_armor:chestplate_"..k,
recipe = {
{v, "", v},
{v, v, v},
{v, v, v},
},
})
minetest.register_craft({
output = "3d_armor:leggings_"..k,
recipe = {
{v, v, v},
{v, "", v},
{v, "", v},
},
})
minetest.register_craft({
output = "3d_armor:boots_"..k,
recipe = {
{v, "", v},
{v, "", v},
},
})
end

5
3d_armor_ip/LICENSE.txt Normal file
View File

@ -0,0 +1,5 @@
[mod] 3d Armor integration to inventory plus [3d_armor_ip]
==========================================================
License Source Code: (C) 2012-2017 Stuart Jones - LGPL v2.1

2
3d_armor_ip/depends.txt Normal file
View File

@ -0,0 +1,2 @@
3d_armor
inventory_plus?

View File

@ -0,0 +1 @@
Adds 3d_armor page to the inventory plus

34
3d_armor_ip/init.lua Normal file
View File

@ -0,0 +1,34 @@
if not minetest.global_exists("inventory_plus") then
minetest.log("warning", "3d_armor_ip: Mod loaded but unused.")
return
end
armor.formspec = "size[8,8.5]button[6,0;2,0.5;main;Back]"..armor.formspec
armor:register_on_update(function(player)
local name = player:get_player_name()
local formspec = armor:get_armor_formspec(name, true)
local page = player:get_inventory_formspec()
if page:find("detached:"..name.."_armor") then
inventory_plus.set_inventory_formspec(player, formspec)
end
end)
if minetest.get_modpath("crafting") then
inventory_plus.get_formspec = function(player, page)
end
end
minetest.register_on_joinplayer(function(player)
inventory_plus.register_button(player,"armor", "Armor")
end)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.armor then
local name = armor:get_valid_player(player, "[on_player_receive_fields]")
if not name then
return
end
local formspec = armor:get_armor_formspec(name, true)
inventory_plus.set_inventory_formspec(player, formspec)
end
end)

View File

@ -0,0 +1,5 @@
[mod] 3d Armor sfinv integration [3d_armor_sfinv]
=================================================
License Source Code: (C) 2012-2017 Stuart Jones - LGPL v2.1

View File

@ -0,0 +1,2 @@
3d_armor
sfinv?

View File

@ -0,0 +1 @@
Adds 3d_armor page to the sfinv inventory

18
3d_armor_sfinv/init.lua Normal file
View File

@ -0,0 +1,18 @@
if not minetest.global_exists("sfinv") then
minetest.log("warning", "3d_armor_sfinv: Mod loaded but unused.")
return
end
sfinv.register_page("3d_armor:armor", {
title = "Armor",
get = function(self, player, context)
local name = player:get_player_name()
local formspec = armor:get_armor_formspec(name, true)
return sfinv.make_formspec(player, context, formspec, false)
end
})
armor:register_on_update(function(player)
if sfinv.enabled then
sfinv.set_player_inventory_formspec(player)
end
end)

View File

@ -1,3 +1,7 @@
local S = function(s) return s end
if minetest.global_exists("intllib") then
S = intllib.Getter()
end
local armor_stand_formspec = "size[8,7]" .. local armor_stand_formspec = "size[8,7]" ..
default.gui_bg .. default.gui_bg ..
default.gui_bg_img .. default.gui_bg_img ..
@ -128,7 +132,7 @@ local function remove_hidden_node(pos)
end end
minetest.register_node("3d_armor_stand:top", { minetest.register_node("3d_armor_stand:top", {
description = "Armor stand top", description = S("Armor stand top"),
paramtype = "light", paramtype = "light",
drawtype = "plantlike", drawtype = "plantlike",
sunlight_propagates = true, sunlight_propagates = true,
@ -143,7 +147,7 @@ minetest.register_node("3d_armor_stand:top", {
}) })
minetest.register_node("3d_armor_stand:armor_stand", { minetest.register_node("3d_armor_stand:armor_stand", {
description = "Armor stand", description = S("Armor stand"),
drawtype = "mesh", drawtype = "mesh",
mesh = "3d_armor_stand.obj", mesh = "3d_armor_stand.obj",
tiles = {"3d_armor_stand.png"}, tiles = {"3d_armor_stand.png"},
@ -211,7 +215,7 @@ minetest.register_node("3d_armor_stand:armor_stand", {
}) })
minetest.register_node("3d_armor_stand:locked_armor_stand", { minetest.register_node("3d_armor_stand:locked_armor_stand", {
description = "Locked Armor stand", description = S("Locked Armor stand"),
drawtype = "mesh", drawtype = "mesh",
mesh = "3d_armor_stand.obj", mesh = "3d_armor_stand.obj",
tiles = {"3d_armor_stand_locked.png"}, tiles = {"3d_armor_stand_locked.png"},

5
3d_armor_ui/LICENSE.txt Normal file
View File

@ -0,0 +1,5 @@
[mod] 3d Armor integration to unified inventory [3d_armor_ui]
=============================================================
License Source Code: (C) 2012-2017 Stuart Jones - LGPL v2.1

2
3d_armor_ui/depends.txt Normal file
View File

@ -0,0 +1,2 @@
3d_armor
unified_inventory?

View File

@ -0,0 +1 @@
Adds 3d_armor page to the unified inventory

51
3d_armor_ui/init.lua Normal file
View File

@ -0,0 +1,51 @@
if not minetest.global_exists("unified_inventory") then
minetest.log("warning", "3d_armor_ui: Mod loaded but unused.")
return
end
local S = function(s) return s end
if minetest.global_exists("intllib") then
S = intllib.Getter()
end
if unified_inventory.sfinv_compat_layer then
return
end
armor:register_on_update(function(player)
local name = player:get_player_name()
if unified_inventory.current_page[name] == "armor" then
unified_inventory.set_inventory_formspec(player, "armor")
end
end)
unified_inventory.register_button("armor", {
type = "image",
image = "inventory_plus_armor.png",
})
unified_inventory.register_page("armor", {
get_formspec = function(player, perplayer_formspec)
local fy = perplayer_formspec.formspec_y
local name = player:get_player_name()
if armor.def[name].init_time == 0 then
return {formspec="label[0,0;Armor not initialized!]"}
end
local formspec = "background[0.06,"..fy..";7.92,7.52;3d_armor_ui_form.png]"..
"label[0,0;Armor]"..
"list[detached:"..name.."_armor;armor;0,"..fy..";2,3;]"..
"image[2.5,"..(fy - 0.25)..";2,4;"..armor.textures[name].preview.."]"..
"label[5.0,"..(fy + 0.0)..";"..S("Level")..": "..armor.def[name].level.."]"..
"label[5.0,"..(fy + 0.5)..";"..S("Heal")..": "..armor.def[name].heal.."]"..
"listring[current_player;main]"..
"listring[detached:"..name.."_armor;armor]"
if armor.config.fire_protect then
formspec = formspec.."label[5.0,"..(fy + 1.0)..";"..
S("Fire")..": "..armor.def[name].fire.."]"
end
if minetest.global_exists("technic") then
formspec = formspec.."label[5.0,"..(fy + 1.5)..";"..
S("Radiation")..": "..armor.def[name].groups["radiation"].."]"
end
return {formspec=formspec}
end,
})

View File

@ -1,4 +1,4 @@
Modpack - 3d Armor [0.4.8] Modpack - 3d Armor [0.4.9]
========================== ==========================
### Table of Contents ### Table of Contents
@ -19,14 +19,12 @@ Modpack - 3d Armor [0.4.8]
[mod] Visible Player Armor [3d_armor] [mod] Visible Player Armor [3d_armor]
------------------------------------- -------------------------------------
Minetest Version: 0.4.13 Minetest Version: 0.4.15
Game: minetest_game and many derivatives Game: minetest_game and many derivatives
Depends: default Depends: default
Recommends: inventory_plus or unified_inventory (use only one)
Adds craftable armor that is visible to other players. Each armor item worn contributes to Adds craftable armor that is visible to other players. Each armor item worn contributes to
a player's armor group level making them less vulnerable to attack. a player's armor group level making them less vulnerable to attack.
@ -38,7 +36,11 @@ Fire protection has been added by TenPlus1 and in use when ethereal mod is found
armor has been enabled. each piece of armor offers 1 fire protection, level 1 protects armor has been enabled. each piece of armor offers 1 fire protection, level 1 protects
against torches, level 2 against crystal spikes, 3 for fire and 5 protects when in lava. against torches, level 2 against crystal spikes, 3 for fire and 5 protects when in lava.
Compatible with player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam Compatible with sfinv, inventory plus or unified inventory by enabling the appropriate
inventory module, [3d_armor_sfinv], [3d_armor_ip] and [3d_armor_ui] respectively.
Also compatible with [smart_inventory] without the need for additional modules.
built in support player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam
and [simple_skins] by TenPlus1. and [simple_skins] by TenPlus1.
Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory. Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory.
@ -75,7 +77,6 @@ Depends: 3d_armor, technic
Adds hazmat suit to 3d_armor. It protects rather well from fire (if enabled in configuration) and radiation*, and it has built-in oxygen supply. Adds hazmat suit to 3d_armor. It protects rather well from fire (if enabled in configuration) and radiation*, and it has built-in oxygen supply.
Requires technic mod. Requires technic mod.
*Requires patched version of [technic mod](https://github.com/minetest-technic/technic/pull/275)
[mod] 3d Armor Stand [3d_armor_stand] [mod] 3d Armor Stand [3d_armor_stand]
------------------------------------- -------------------------------------

View File

@ -1,2 +1,2 @@
3d_armor 3d_armor
technic technic?

View File

@ -1,70 +1,50 @@
local part_count = 4 if not minetest.get_modpath("technic") then
minetest.log("warning", "hazmat_suit: Mod loaded but unused.")
local level = 35 return
local heal = 20
local use = 1000
local fire = 4
local water = 1
local radiation = 50
if minetest.get_modpath("shields") then
level = level / 0.9
end end
local S = function(s) return s end
if part_count == #armor.elements then if minetest.global_exists("intllib") then
level = level / 1.1 S = intllib.Getter()
end end
level = math.floor(level / part_count)
heal = math.floor(heal / part_count)
fire = math.floor(fire / part_count)
radiation = math.floor(radiation / part_count)
minetest.register_craftitem("hazmat_suit:helmet_hazmat", { minetest.register_craftitem("hazmat_suit:helmet_hazmat", {
description = "Hazmat Helmet", description = S("Hazmat Helmet"),
inventory_image = "hazmat_suit_inv_helmet_hazmat.png", inventory_image = "hazmat_suit_inv_helmet_hazmat.png",
stack_max = 1, stack_max = 1,
}) })
minetest.register_craftitem("hazmat_suit:chestplate_hazmat", { minetest.register_craftitem("hazmat_suit:chestplate_hazmat", {
description = "Hazmat Chestplate", description = S("Hazmat Chestplate"),
inventory_image = "hazmat_suit_inv_chestplate_hazmat.png", inventory_image = "hazmat_suit_inv_chestplate_hazmat.png",
stack_max = 1, stack_max = 1,
}) })
minetest.register_craftitem("hazmat_suit:sleeve_hazmat", { minetest.register_craftitem("hazmat_suit:sleeve_hazmat", {
description = "Hazmat Sleeve", description = S("Hazmat Sleeve"),
inventory_image = "hazmat_suit_inv_sleeve_hazmat.png", inventory_image = "hazmat_suit_inv_sleeve_hazmat.png",
stack_max = 1, stack_max = 1,
}) })
minetest.register_craftitem("hazmat_suit:leggings_hazmat", { minetest.register_craftitem("hazmat_suit:leggings_hazmat", {
description = "Hazmat Leggins", description = S("Hazmat Leggins"),
inventory_image = "hazmat_suit_inv_leggings_hazmat.png", inventory_image = "hazmat_suit_inv_leggings_hazmat.png",
stack_max = 1, stack_max = 1,
}) })
minetest.register_craftitem("hazmat_suit:boots_hazmat", { minetest.register_craftitem("hazmat_suit:boots_hazmat", {
description = "Hazmat Boots", description = S("Hazmat Boots"),
inventory_image = "hazmat_suit_inv_boots_hazmat.png", inventory_image = "hazmat_suit_inv_boots_hazmat.png",
stack_max = 1, stack_max = 1,
}) })
minetest.register_tool("hazmat_suit:suit_hazmat", { armor:register_armor("hazmat_suit:suit_hazmat", {
description = "Hazmat Suit", description = S("Hazmat Suit"),
inventory_image = "hazmat_suit_inv_suit_hazmat.png", inventory_image = "hazmat_suit_inv_suit_hazmat.png",
groups = { groups = {armor_head=1, armor_torso=1, armor_legs=1, armor_feet=1,
armor_head = level, armor_heal=20, armor_fire=4, armor_water=1, armor_use=1000,
armor_torso = level, physics_jump=-0.1, physics_speed=-0.2, physics_gravity=0.1},
armor_legs = level, armor_groups = {fleshy=35, radiation=50},
armor_feet = level, damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
armor_heal = heal,
armor_use = use,
armor_fire = fire,
armor_water = water,
armor_radiation = radiation,
},
wear = 0,
}) })
minetest.register_craft({ minetest.register_craft({

View File

@ -1,30 +1,75 @@
local S = function(s) return s end
if minetest.global_exists("intllib") then
S = intllib.Getter()
end
local use_moreores = minetest.get_modpath("moreores") local use_moreores = minetest.get_modpath("moreores")
local function play_sound_effect(player, name)
if player then
local pos = player:getpos()
if pos then
minetest.sound_play({
pos = pos,
name = name,
max_hear_distance = 10,
gain = 0.5,
})
end
end
end
if minetest.global_exists("armor") and armor.elements then if minetest.global_exists("armor") and armor.elements then
table.insert(armor.elements, "shield") table.insert(armor.elements, "shield")
local mult = armor.config.level_multiplier or 1
armor.config.level_multiplier = mult * 0.9
end end
-- Regisiter Shields -- Regisiter Shields
minetest.register_tool("shields:shield_admin", { armor:register_armor("shields:shield_admin", {
description = "Admin Shield", description = S("Admin Shield"),
inventory_image = "shields_inv_shield_admin.png", inventory_image = "shields_inv_shield_admin.png",
groups = {armor_shield=1000, armor_heal=100, armor_use=0, not_in_creative_inventory=1}, groups = {armor_shield=1000, armor_heal=100, armor_use=0, not_in_creative_inventory=1},
wear = 0, on_punched = function(player, hitter, time_from_last_punch, tool_capabilities)
if type(hitter) == "userdata" then
if hitter:is_player() then
hitter:set_wielded_item("")
end
play_sound_effect(player, "default_dig_metal")
end
return false
end,
}) })
if ARMOR_MATERIALS.wood then minetest.register_alias("adminshield", "shields:shield_admin")
minetest.register_tool("shields:shield_wood", {
description = "Wooden Shield", if armor.materials.wood then
armor:register_armor("shields:shield_wood", {
description = S("Wooden Shield"),
inventory_image = "shields_inv_shield_wood.png", inventory_image = "shields_inv_shield_wood.png",
groups = {armor_shield=5, armor_heal=0, armor_use=2000}, groups = {armor_shield=1, armor_heal=0, armor_use=2000, flammable=1},
wear = 0, armor_groups = {fleshy=5},
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=1},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_wood_footstep")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_wood_footstep")
end,
}) })
minetest.register_tool("shields:shield_enhanced_wood", { armor:register_armor("shields:shield_enhanced_wood", {
description = "Enhanced Wood Shield", description = S("Enhanced Wood Shield"),
inventory_image = "shields_inv_shield_enhanced_wood.png", inventory_image = "shields_inv_shield_enhanced_wood.png",
groups = {armor_shield=8, armor_heal=0, armor_use=1000}, groups = {armor_shield=1, armor_heal=0, armor_use=2000},
wear = 0, armor_groups = {fleshy=8},
damage_groups = {cracky=3, snappy=2, choppy=3, crumbly=2, level=2},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_dig_metal")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_dug_metal")
end,
}) })
minetest.register_craft({ minetest.register_craft({
output = "shields:shield_enhanced_wood", output = "shields:shield_enhanced_wood",
@ -36,18 +81,34 @@ if ARMOR_MATERIALS.wood then
}) })
end end
if ARMOR_MATERIALS.cactus then if armor.materials.cactus then
minetest.register_tool("shields:shield_cactus", { armor:register_armor("shields:shield_cactus", {
description = "Cactus Shield", description = S("Cactus Shield"),
inventory_image = "shields_inv_shield_cactus.png", inventory_image = "shields_inv_shield_cactus.png",
groups = {armor_shield=5, armor_heal=0, armor_use=2000}, groups = {armor_shield=1, armor_heal=0, armor_use=1000},
wear = 0, armor_groups = {fleshy=5},
damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=1},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_wood_footstep")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_wood_footstep")
end,
}) })
minetest.register_tool("shields:shield_enhanced_cactus", { armor:register_armor("shields:shield_enhanced_cactus", {
description = "Enhanced Cactus Shield", description = S("Enhanced Cactus Shield"),
inventory_image = "shields_inv_shield_enhanced_cactus.png", inventory_image = "shields_inv_shield_enhanced_cactus.png",
groups = {armor_shield=8, armor_heal=0, armor_use=1000}, groups = {armor_shield=1, armor_heal=0, armor_use=1000},
wear = 0, armor_groups = {fleshy=8},
damage_groups = {cracky=3, snappy=3, choppy=2, crumbly=2, level=2},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_dig_metal")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_dug_metal")
end,
}) })
minetest.register_craft({ minetest.register_craft({
output = "shields:shield_enhanced_cactus", output = "shields:shield_enhanced_cactus",
@ -59,61 +120,112 @@ if ARMOR_MATERIALS.cactus then
}) })
end end
if ARMOR_MATERIALS.steel then if armor.materials.steel then
minetest.register_tool("shields:shield_steel", { armor:register_armor("shields:shield_steel", {
description = "Steel Shield", description = S("Steel Shield"),
inventory_image = "shields_inv_shield_steel.png", inventory_image = "shields_inv_shield_steel.png",
groups = {armor_shield=10, armor_heal=0, armor_use=500}, groups = {armor_shield=1, armor_heal=0, armor_use=800,
wear = 0, physics_speed=-0.03, physics_gravity=0.03},
armor_groups = {fleshy=10},
damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_dig_metal")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_dug_metal")
end,
}) })
end end
if ARMOR_MATERIALS.bronze then if armor.materials.bronze then
minetest.register_tool("shields:shield_bronze", { armor:register_armor("shields:shield_bronze", {
description = "Bronze Shield", description = S("Bronze Shield"),
inventory_image = "shields_inv_shield_bronze.png", inventory_image = "shields_inv_shield_bronze.png",
groups = {armor_shield=10, armor_heal=6, armor_use=250}, groups = {armor_shield=1, armor_heal=6, armor_use=400,
wear = 0, physics_speed=-0.03, physics_gravity=0.03},
armor_groups = {fleshy=10},
damage_groups = {cracky=2, snappy=3, choppy=2, crumbly=1, level=2},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_dig_metal")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_dug_metal")
end,
}) })
end end
if ARMOR_MATERIALS.diamond then if armor.materials.diamond then
minetest.register_tool("shields:shield_diamond", { armor:register_armor("shields:shield_diamond", {
description = "Diamond Shield", description = S("Diamond Shield"),
inventory_image = "shields_inv_shield_diamond.png", inventory_image = "shields_inv_shield_diamond.png",
groups = {armor_shield=15, armor_heal=12, armor_use=100}, groups = {armor_shield=1, armor_heal=12, armor_use=200},
wear = 0, armor_groups = {fleshy=15},
damage_groups = {cracky=2, snappy=1, choppy=1, level=3},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_glass_footstep")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_break_glass")
end,
}) })
end end
if ARMOR_MATERIALS.gold then if armor.materials.gold then
minetest.register_tool("shields:shield_gold", { armor:register_armor("shields:shield_gold", {
description = "Gold Shield", description = S("Gold Shield"),
inventory_image = "shields_inv_shield_gold.png", inventory_image = "shields_inv_shield_gold.png",
groups = {armor_shield=10, armor_heal=6, armor_use=250}, groups = {armor_shield=1, armor_heal=6, armor_use=300,
wear = 0, physics_speed=-0.04, physics_gravity=0.04},
armor_groups = {fleshy=10},
damage_groups = {cracky=1, snappy=2, choppy=2, crumbly=3, level=2},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_dig_metal")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_dug_metal")
end,
}) })
end end
if ARMOR_MATERIALS.mithril then if armor.materials.mithril then
minetest.register_tool("shields:shield_mithril", { armor:register_armor("shields:shield_mithril", {
description = "Mithril Shield", description = S("Mithril Shield"),
inventory_image = "shields_inv_shield_mithril.png", inventory_image = "shields_inv_shield_mithril.png",
groups = {armor_shield=15, armor_heal=12, armor_use=50}, groups = {armor_shield=1, armor_heal=12, armor_use=100},
wear = 0, armor_groups = {fleshy=15},
damage_groups = {cracky=2, snappy=1, level=3},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_glass_footstep")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_break_glass")
end,
}) })
end end
if ARMOR_MATERIALS.crystal then if armor.materials.crystal then
minetest.register_tool("shields:shield_crystal", { armor:register_armor("shields:shield_crystal", {
description = "Crystal Shield", description = S("Crystal Shield"),
inventory_image = "shields_inv_shield_crystal.png", inventory_image = "shields_inv_shield_crystal.png",
groups = {armor_shield=15, armor_heal=12, armor_use=50, armor_fire=1}, groups = {armor_shield=1, armor_heal=12, armor_use=100, armor_fire=1},
wear = 0, armor_groups = {fleshy=15},
damage_groups = {cracky=2, snappy=1, level=3},
reciprocate_damage = true,
on_damage = function(player, index, stack)
play_sound_effect(player, "default_glass_footstep")
end,
on_destroy = function(player, index, stack)
play_sound_effect(player, "default_break_glass")
end,
}) })
end end
for k, v in pairs(ARMOR_MATERIALS) do for k, v in pairs(armor.materials) do
minetest.register_craft({ minetest.register_craft({
output = "shields:shield_"..k, output = "shields:shield_"..k,
recipe = { recipe = {

View File

@ -1,3 +1,3 @@
3d_armor 3d_armor
technic_worldgen technic_worldgen?
moreores? moreores?

View File

@ -1,23 +1,32 @@
if not minetest.get_modpath("technic_worldgen") then
minetest.log("warning", "technic_armor: Mod loaded but unused.")
return
end
local S = function(s) return s end
if minetest.global_exists("intllib") then
S = intllib.Getter()
end
local stats = { local stats = {
lead = { name="Lead", material="technic:lead_ingot", armor=1.6, heal=0, use=500, radiation=80*1.1 }, lead = { name=S("Lead"), material="technic:lead_ingot", armor=1.6, heal=0, use=500, radiation=80*1.1 },
brass = { name="Brass", material="technic:brass_ingot", armor=1.8, heal=0, use=650, radiation=43 }, brass = { name=S("Brass"), material="technic:brass_ingot", armor=1.8, heal=0, use=650, radiation=43 },
cast = { name="Cast Iron", material="technic:cast_iron_ingot", armor=2.5, heal=8, use=200, radiation=40 }, cast = { name=S("Cast Iron"), material="technic:cast_iron_ingot", armor=2.5, heal=8, use=200, radiation=40 },
carbon = { name="Carbon Steel", material="technic:carbon_steel_ingot", armor=2.7, heal=10, use=100, radiation=40 }, carbon = { name=S("Carbon Steel"), material="technic:carbon_steel_ingot", armor=2.7, heal=10, use=100, radiation=40 },
stainless = { name="Stainless Steel", material="technic:stainless_steel_ingot", armor=2.7, heal=10, use=75, radiation=40 }, stainless = { name=S("Stainless Steel"), material="technic:stainless_steel_ingot", armor=2.7, heal=10, use=75, radiation=40 },
} }
if minetest.get_modpath("moreores") then if minetest.get_modpath("moreores") then
stats.tin = { name="Tin", material="moreores:tin_ingot", armor=1.6, heal=0, use=750, radiation=37 } stats.tin = { name=S("Tin"), material="moreores:tin_ingot", armor=1.6, heal=0, use=750, radiation=37 }
stats.silver = { name="Silver", material="moreores:silver_ingot", armor=1.8, heal=6, use=650, radiation=53 } stats.silver = { name=S("Silver"), material="moreores:silver_ingot", armor=1.8, heal=6, use=650, radiation=53 }
end end
local parts = { local parts = {
helmet = { place="head", name="Helmet", level=5, radlevel = 0.10, craft={{1,1,1},{1,0,1}} }, helmet = { place="head", name=S("Helmet"), level=5, radlevel = 0.10, craft={{1,1,1},{1,0,1}} },
chestplate = { place="torso", name="Chestplate", level=8, radlevel = 0.35, craft={{1,0,1},{1,1,1},{1,1,1}} }, chestplate = { place="torso", name=S("Chestplate"), level=8, radlevel = 0.35, craft={{1,0,1},{1,1,1},{1,1,1}} },
leggings = { place="legs", name="Leggings", level=7, radlevel = 0.15, craft={{1,1,1},{1,0,1},{1,0,1}} }, leggings = { place="legs", name=S("Leggings"), level=7, radlevel = 0.15, craft={{1,1,1},{1,0,1},{1,0,1}} },
boots = { place="feet", name="Boots", level=4, radlevel = 0.10, craft={{1,0,1},{1,0,1}} }, boots = { place="feet", name=S("Boots"), level=4, radlevel = 0.10, craft={{1,0,1},{1,0,1}} },
} }
if minetest.get_modpath("shields") then if minetest.get_modpath("shields") then
parts.shield = { place="shield", name="Shield", level=5, radlevel=0.00, craft={{1,1,1},{1,1,1},{0,1,0}} } parts.shield = { place="shield", name=S("Shield"), level=5, radlevel=0.00, craft={{1,1,1},{1,1,1},{0,1,0}} }
end end
-- Makes a craft recipe based on a template -- Makes a craft recipe based on a template

View File

@ -1,7 +1,7 @@
[mod] visible wielded items [wieldview] [mod] visible wielded items [wieldview]
======================================= =======================================
depends: default, 3d_armor Depends on: 3d_armor
Makes hand wielded items visible to other players. Makes hand wielded items visible to other players.
@ -13,3 +13,11 @@ wieldview_update_time = 2
# Show nodes as tiles, disabled by default # Show nodes as tiles, disabled by default
wieldview_node_tiles = false wieldview_node_tiles = false
Info for modders
################
Wield image transformation: To apply a simple transformation to the item in
hand, add the group “wieldview_transform” to the item definition. The group
rating equals one of the numbers used for the [transform texture modifier
of the Lua API.

View File

@ -1,2 +1 @@
default
3d_armor 3d_armor

View File

@ -29,8 +29,15 @@ wieldview.get_item_texture = function(self, item)
texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) texture = minetest.inventorycube(minetest.registered_items[item].tiles[1])
end end
end end
if wieldview.transform[item] then -- Get item image transformation, first from group, then from transform.lua
texture = texture.."^[transform"..wieldview.transform[item] local transform = minetest.get_item_group(item, "wieldview_transform")
if transform == 0 then
transform = wieldview.transform[item]
end
if transform then
-- This actually works with groups ratings because transform1, transform2, etc.
-- have meaning and transform0 is used for identidy, so it can be ignored
texture = texture.."^[transform"..tostring(transform)
end end
end end
return texture return texture