22 Commits

Author SHA1 Message Date
Bradley Pierce
8f775a64f0 Rework armor stand inventories (#165)
This change makes armor stands only have one inventory list instead of four, thereby allowing the user to shift-click items back and forth. There is no visual difference in the formspec, and each piece of armor still has its own dedicated slot. An LBM is used to update the inventories of previous armor stands.
2025-09-06 08:06:39 +02:00
SmallJoker
dbe0a9276a Prevent switching pages when using sfinv
Previously, 3d_armor would issue an inventory update
even if the 3d_armor page wasn't shown..
2025-06-24 21:14:27 +02:00
EmptyStar
dbc891a711 Fix crash when right-clicking to equip a seventh armor element with a full armor inventory (#163) 2025-06-07 00:46:28 +02:00
BlackImpostor
a79d1383aa Russian Capitalization (#162)
* Update 3d_armor.ru.tr

* Create 3d_armor_ip.ru.tr

* Create 3d_armor_sfinv.ru.tr

* Create 3d_armor_ui.ru.tr

* Update 'Fire'

* Capitalization in armor_admin.ru.tr

* Capitalization in armor_bronze.ru.tr

* Capitalization in armor_cactus.ru.tr

* Capitalization in armor_crystal.ru.tr

* Capitalization in armor_diamond.ru.tr

* Capitalization in armor_gold.ru.tr

* Capitalization in armor_mithril.ru.tr

* Capitalization in armor_nether.ru.tr

* Capitalization in armor_steel.ru.tr

* Capitalization in armor_wood.ru.tr

* Capitalization in shields.ru.tr
2025-05-28 17:59:13 +02:00
BlackImpostor
220cbc8d92 Update 3d_armor_stand.ru.tr (#161) 2025-05-27 07:03:33 +02:00
TarasArt
8fe014e6d3 Add Ukrainian localization (#160) 2025-05-07 20:00:30 +02:00
mal
a586aeee0c Update mod.conf (#157)
* Update mod.conf

description changed from wood to nether

* Update mod.conf

Fixed typo from my previous PR.
2025-03-04 15:59:08 +01:00
SmallJoker
082e866274 Update player_api model registration
Ensures correct eye position and collision box.
Values taken from the player_api 'character.b3d' model.
2024-12-27 21:43:08 +01:00
Wiktor Perskawiec
c224a73df7 Add Polish translation (#151) 2024-12-14 18:22:09 +01:00
tenplus1
280165fada tweak feather falling (#150)
changed y_velocity check for player so thart feather falling only works when actually falling and not standing around.
2024-12-12 14:00:26 +01:00
Maurus
ab1bec3be8 Added spanish translations to shields and stands, added "Shared Armor Stand" to template. (#147)
* Create shields.es.tr

Spanish translation for shields.

* Create 3d_armor_stand.es.tr

Spanish translation to armor stands.

* Update template.txt

Added "Shared Armor Stand" to template.
2024-06-25 06:37:04 +02:00
Niklp
22955b413a Fix "player still online" check of armor.unequip (#146) 2024-05-01 07:24:49 +02:00
Niklp
1fcbf64d53 Replace 3d_armor_trans.png w/ engine provided blank.png (#143) 2024-04-04 07:25:05 +02:00
randomei
fb86c02e43 russian translation fixes (#142) 2024-03-25 20:01:28 +01:00
Niklp
20917da061 Fix armor radiation values were not not summed up (#139) 2024-03-22 22:35:43 +01:00
Niklp
7bd77a7b80 Call custom on_punched functions w/ hitter = nil too (#141) 2024-03-19 12:54:42 +01:00
Niklp
25369e5165 Don't assume hitter ~= nil in on_punchplayer callback (#138)
* Don't assume `hitter ~= nil` in on_punchplayer callback

* Use early return
2024-03-17 09:11:03 +01:00
Luke aka SwissalpS
7fc313f911 armorstand nodes are not ground content (#134) 2024-02-29 07:39:44 +01:00
SmallJoker
4bac73fc9e Make all admin armor to protect from drowning (#131) 2024-01-17 10:33:37 +01:00
BuckarooBanzay
f430395b64 resolve player object in async function again (different globalstep)
fixes #132
2024-01-15 10:15:49 +01:00
David Leal
467709c935 Use player_api functions instead of default (#129) 2023-12-26 18:34:43 +01:00
Jaidyn Ann
e0b6112320 Tweak Esperanto translation (#128) 2023-12-19 07:13:04 +01:00
207 changed files with 429 additions and 381 deletions

1
.gitignore vendored
View File

@@ -4,6 +4,7 @@
*bak*
tags
*.vim
armor.conf
## Eclipse project files & directories
.project

View File

@@ -352,7 +352,7 @@ armor.update_player_visuals = function(self, player)
end
local name = player:get_player_name()
if self.textures[name] then
default.player_set_textures(player, {
player_api.set_textures(player, {
self.textures[name].skin,
self.textures[name].armor,
self.textures[name].wielditem,
@@ -373,7 +373,7 @@ armor.set_player_armor = function(self, player)
local state = 0
local count = 0
local preview = armor:get_preview(name)
local texture = "3d_armor_trans.png"
local texture = "blank.png"
local physics = {}
local attributes = {}
local levels = {}
@@ -415,7 +415,7 @@ armor.set_player_armor = function(self, player)
end
-- DEPRECATED, use armor_groups instead
if def.groups["armor_radiation"] and levels["radiation"] then
levels["radiation"] = def.groups["armor_radiation"]
levels["radiation"] = levels["radiation"] + def.groups["armor_radiation"]
end
end
local item = stack:get_name()
@@ -694,6 +694,9 @@ armor.equip = function(self, player, itemstack)
index = i
end
end
if not index then -- armor inventory is full with other armor elements
return itemstack
end
local stack = itemstack:take_item()
armor_inv:set_stack("armor", index, stack)
self:run_callbacks("on_equip", player, index, stack)
@@ -719,11 +722,14 @@ armor.unequip = function(self, player, armor_element)
if self:get_element(stack:get_name()) == armor_element then
armor_inv:set_stack("armor", i, "")
minetest.after(0, function()
local inv = player:get_inventory()
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
else
minetest.add_item(player:get_pos(), stack)
local pplayer = minetest.get_player_by_name(name)
if pplayer then -- player is still online
local inv = pplayer:get_inventory()
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
else
minetest.add_item(pplayer:get_pos(), stack)
end
end
end)
self:run_callbacks("on_unequip", player, i, stack)

View File

@@ -1,37 +0,0 @@
-- Armor Configuration (defaults)
-- Increase this if you get initialization glitches when a player first joins.
ARMOR_INIT_DELAY = 3
-- Number of initialization attempts.
-- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist.
ARMOR_INIT_TIMES = 3
-- Increase this if armor is not getting into bones due to server lag.
ARMOR_BONES_DELAY = 3
-- How often player armor/wield 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: ARMOR_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
-- You can also use this file to execute arbitary lua code
-- eg: Dumb the armor down if using Simple Mobs
--if minetest.get_modpath("mobs") then
-- ARMOR_LEVEL_MULTIPLIER = 1
-- ARMOR_HEAL_MULTIPLIER = 0
--end

View File

@@ -268,8 +268,8 @@ local function init_player_armor(initplayer)
local skin = armor:get_player_skin(name)
armor.textures[name] = {
skin = skin,
armor = "3d_armor_trans.png",
wielditem = "3d_armor_trans.png",
armor = "blank.png",
wielditem = "blank.png",
preview = armor.default_skin.."_preview.png",
}
local texture_path = minetest.get_modpath("player_textures")
@@ -291,21 +291,26 @@ player_api.register_model("3d_armor_character.b3d", {
animation_speed = 30,
textures = {
armor.default_skin..".png",
"3d_armor_trans.png",
"3d_armor_trans.png",
"blank.png",
"blank.png",
},
animations = {
stand = {x=0, y=79},
lay = {x=162, y=166},
lay = {x=162, y=166, eye_height = 0.3, override_local = true,
collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}},
walk = {x=168, y=187},
mine = {x=189, y=198},
walk_mine = {x=200, y=219},
sit = {x=81, y=160},
sit = {x=81, y=160, eye_height = 0.8, override_local = true,
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}},
-- compatibility w/ the emote mod
wave = {x = 192, y = 196, override_local = true},
point = {x = 196, y = 196, override_local = true},
freeze = {x = 205, y = 205, override_local = true},
},
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
-- stepheight: use default
eye_height = 1.47,
})
minetest.register_on_player_receive_fields(function(player, formname, fields)
@@ -322,7 +327,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end)
minetest.register_on_joinplayer(function(player)
default.player_set_model(player, "3d_armor_character.b3d")
player_api.set_model(player, "3d_armor_character.b3d")
init_player_armor(player)
end)
@@ -395,10 +400,14 @@ if armor.config.punch_damage == true then
minetest.register_on_punchplayer(function(player, hitter,
time_from_last_punch, tool_capabilities)
local name = player:get_player_name()
local hit_ip = hitter:is_player()
if name and hit_ip and minetest.is_protected(player:get_pos(), "") then
return
elseif name then
if hitter then
local hit_ip = hitter:is_player()
if name and hit_ip and minetest.is_protected(player:get_pos(), "") then
return
end
end
if name then
armor:punch(player, hitter, time_from_last_punch, tool_capabilities)
last_punch_time[name] = minetest.get_gametime()
end
@@ -440,7 +449,7 @@ minetest.register_globalstep(function(dtime)
local name = player:get_player_name()
if armor.def[name].feather > 0 then
local vel_y = player:get_velocity().y
if vel_y < 0 and vel_y < 3 then
if vel_y < -0.5 then
vel_y = -(vel_y * 0.05)
player:add_velocity({x = 0, y = vel_y, z = 0})
end
@@ -491,5 +500,3 @@ if armor.config.fire_protect == true then
return hp_change
end, true)
end
minetest.log("action", "[3d_armor] loaded.")

View File

@@ -1,7 +1,7 @@
# textdomain: 3d_armor
Radiation=Radiado
Level=Nivelo
Heal=Sanigi
Heal=Blokŝanco
Fire=Fajro
Your @1 is almost broken!=Via @1 estas preskaŭ rompita!
Your @1 got destroyed!=Via @1 detruiĝis!

View File

@@ -0,0 +1,7 @@
# textdomain: 3d_armor
Radiation=Promieniowanie
Level=Poziom
Heal=Uzdrawianie
Fire=Ogień
Your @1 is almost broken!=Twój @1 jest prawie zepsuty!
Your @1 got destroyed!=Twój @1 został zniszczony!

View File

@@ -1,7 +1,7 @@
# textdomain: 3d_armor
Radiation=излучение
Level=уровень
Heal=исцеление
Fire=огонь
Your @1 is almost broken!=
Your @1 got destroyed!=твой(и) @1 был(и) разрушен(ы)!
Radiation=Излучение
Level=Уровень
Heal=Исцеление
Fire=Пламя
Your @1 is almost broken!=Ваш предмет «@1» почти сломан!
Your @1 got destroyed!=Ваш предмет «@1» был уничтожен!

View File

@@ -0,0 +1,7 @@
# textdomain: 3d_armor
Radiation=Радіація
Level=Рівень
Heal=Зцілення
Fire=Вогонь
Your @1 is almost broken!=Ваш @1 майже зламаний!
Your @1 got destroyed!=Ваш(і) @1 був(ли) зламаний(і)!

Binary file not shown.

Before

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 571 B

View File

@@ -1,3 +1,3 @@
# textdomain: 3d_armor_ip
Back=Dorso
Armor=Kiraso
Armor=Armaĵo

View File

@@ -0,0 +1,3 @@
# textdomain: 3d_armor_ip
Back=Назад
Armor=Броня

View File

@@ -0,0 +1,3 @@
# textdomain: 3d_armor_ip
Back=Назад
Armor=Броня

View File

@@ -15,7 +15,7 @@ sfinv.register_page("3d_armor:armor", {
end
})
armor:register_on_update(function(player)
if sfinv.enabled then
if sfinv.enabled and sfinv.get_page(player) == "3d_armor:armor" then
sfinv.set_player_inventory_formspec(player)
end
end)

View File

@@ -1,2 +1,2 @@
# textdomain: 3d_armor_sfinv
Armor=Kiraso
Armor=Armaĵoj

View File

@@ -0,0 +1,2 @@
# textdomain: 3d_armor_sfinv
Armor=Броня

View File

@@ -0,0 +1,2 @@
# textdomain: 3d_armor_sfinv
Armor=Броня

View File

@@ -6,27 +6,27 @@ local armor_stand_formspec = "size[8,7]" ..
default.gui_bg_img ..
default.gui_slots ..
default.get_hotbar_bg(0,3) ..
"list[current_name;armor_head;3,0.5;1,1;]" ..
"list[current_name;armor_torso;4,0.5;1,1;]" ..
"list[current_name;armor_legs;3,1.5;1,1;]" ..
"list[current_name;armor_feet;4,1.5;1,1;]" ..
"list[current_name;main;3,0.5;2,1;]" ..
"list[current_name;main;3,1.5;2,1;2]" ..
"image[3,0.5;1,1;3d_armor_stand_head.png]" ..
"image[4,0.5;1,1;3d_armor_stand_torso.png]" ..
"image[3,1.5;1,1;3d_armor_stand_legs.png]" ..
"image[4,1.5;1,1;3d_armor_stand_feet.png]" ..
"list[current_player;main;0,3;8,1;]" ..
"list[current_player;main;0,4.25;8,3;8]"
"list[current_player;main;0,4.25;8,3;8]" ..
"listring[current_name;main]" ..
"listring[current_player;main]"
local elements = {"head", "torso", "legs", "feet"}
local function drop_armor(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
for _, element in pairs(elements) do
local stack = inv:get_stack("armor_"..element, 1)
for i = 1, 4 do
local stack = inv:get_stack("main", i)
if stack and stack:get_count() > 0 then
armor.drop_armor(pos, stack)
inv:set_stack("armor_"..element, 1, nil)
inv:set_stack("main", i, nil)
end
end
end
@@ -62,14 +62,14 @@ local function update_entity(pos)
object = minetest.add_entity(pos, "3d_armor_stand:armor_entity")
end
if object then
local texture = "3d_armor_trans.png"
local texture = "blank.png"
local textures = {}
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local yaw = 0
if inv then
for _, element in pairs(elements) do
local stack = inv:get_stack("armor_"..element, 1)
for i, element in ipairs(elements) do
local stack = inv:get_stack("main", i)
if stack:get_count() == 1 then
local item = stack:get_name() or ""
local def = stack:get_definition() or {}
@@ -144,237 +144,144 @@ minetest.register_node("3d_armor_stand:top", {
buildable_to = false,
drop = "",
groups = {not_in_creative_inventory = 1},
is_ground_content = false,
on_blast = function() end,
tiles = {"3d_armor_trans.png"},
tiles = {"blank.png"},
})
minetest.register_node("3d_armor_stand:armor_stand", {
description = S("Armor Stand"),
drawtype = "mesh",
mesh = "3d_armor_stand.obj",
tiles = {"3d_armor_stand.png"},
use_texture_alpha = "clip",
paramtype = "light",
paramtype2 = "facedir",
walkable = false,
selection_box = {
type = "fixed",
fixed = {
{-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
},
},
groups = {choppy=2, oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", armor_stand_formspec)
meta:set_string("infotext", S("Armor Stand"))
local inv = meta:get_inventory()
for _, element in pairs(elements) do
inv:set_size("armor_"..element, 1)
local function register_armor_stand(def)
local function owns_armor_stand(pos, meta, player)
if def.name == "locked_armor_stand" and not has_locked_armor_stand_privilege(meta, player) then
return false
end
end,
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
for _, element in pairs(elements) do
if not inv:is_empty("armor_"..element) then
return false
end
local has_access = minetest.is_player(player) and not minetest.is_protected(pos, player:get_player_name())
if def.name == "shared_armor_stand" and not has_access then
return false
end
return true
end,
after_place_node = function(pos, placer)
minetest.add_entity(pos, "3d_armor_stand:armor_entity")
add_hidden_node(pos, placer)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack)
local def = stack:get_definition() or {}
local groups = def.groups or {}
if groups[listname] then
end
minetest.register_node("3d_armor_stand:" .. def.name, {
description = def.description,
drawtype = "mesh",
mesh = "3d_armor_stand.obj",
tiles = {def.texture},
use_texture_alpha = "clip",
paramtype = "light",
paramtype2 = "facedir",
walkable = false,
selection_box = {
type = "fixed",
fixed = {
{-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
},
},
groups = {choppy=2, oddly_breakable_by_hand=2},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", armor_stand_formspec)
meta:set_string("infotext", def.description)
if def.name == "locked_armor_stand" then
meta:set_string("owner", "")
end
local inv = meta:get_inventory()
inv:set_size("main", 4)
end,
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if not inv:is_empty("main") then
return false
end
return true
end,
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
minetest.add_entity(pos, "3d_armor_stand:armor_entity")
if def.name == "locked_armor_stand" then
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", S("Armor Stand (owned by @1)", meta:get_string("owner")))
elseif def.name == "shared_armor_stand" then
meta:set_string("infotext", def.description)
end
add_hidden_node(pos, placer)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if not owns_armor_stand(pos, meta, player) then
return 0
end
local inv = meta:get_inventory()
local stack_def = stack:get_definition() or {}
local groups = stack_def.groups or {}
for i, element in ipairs(elements) do
if groups["armor_"..element] and inv:get_stack(listname, i):is_empty() then
return 1
end
end
return 0
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if not owns_armor_stand(pos, meta, player) then
return 0
end
return 1
end
return 0
end,
allow_metadata_inventory_move = function(pos)
return 0
end,
on_metadata_inventory_put = function(pos)
update_entity(pos)
end,
on_metadata_inventory_take = function(pos)
update_entity(pos)
end,
after_destruct = function(pos)
update_entity(pos)
remove_hidden_node(pos)
end,
end,
allow_metadata_inventory_move = function(pos)
return 0
end,
on_metadata_inventory_put = function(pos, listname, index, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local stack_def = stack:get_definition() or {}
local groups = stack_def.groups or {}
for i, element in ipairs(elements) do
if groups["armor_"..element] then
inv:set_stack(listname, i, stack)
if index ~= i then
inv:set_stack(listname, index, nil)
end
break
end
end
update_entity(pos)
end,
on_metadata_inventory_take = function(pos)
update_entity(pos)
end,
after_destruct = function(pos)
update_entity(pos)
remove_hidden_node(pos)
end,
on_blast = def.on_blast
})
end
register_armor_stand({
name = "armor_stand",
description = S("Armor Stand"),
texture = "3d_armor_stand.png",
on_blast = function(pos)
drop_armor(pos)
armor.drop_armor(pos, "3d_armor_stand:armor_stand")
minetest.remove_node(pos)
end,
end
})
minetest.register_node("3d_armor_stand:locked_armor_stand", {
register_armor_stand({
name = "locked_armor_stand",
description = S("Locked Armor Stand"),
drawtype = "mesh",
mesh = "3d_armor_stand.obj",
tiles = {"3d_armor_stand_locked.png"},
use_texture_alpha = "clip",
paramtype = "light",
paramtype2 = "facedir",
walkable = false,
selection_box = {
type = "fixed",
fixed = {
{-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
},
},
groups = {choppy=2, oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", armor_stand_formspec)
meta:set_string("infotext", S("Armor Stand"))
meta:set_string("owner", "")
local inv = meta:get_inventory()
for _, element in pairs(elements) do
inv:set_size("armor_"..element, 1)
end
end,
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
for _, element in pairs(elements) do
if not inv:is_empty("armor_"..element) then
return false
end
end
return true
end,
after_place_node = function(pos, placer)
minetest.add_entity(pos, "3d_armor_stand:armor_entity")
local meta = minetest.get_meta(pos)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("infotext", S("Armor Stand (owned by @1)", meta:get_string("owner")))
add_hidden_node(pos, placer)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if not has_locked_armor_stand_privilege(meta, player) then
return 0
end
local def = stack:get_definition() or {}
local groups = def.groups or {}
if groups[listname] then
return 1
end
return 0
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if not has_locked_armor_stand_privilege(meta, player) then
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_move = function(pos)
return 0
end,
on_metadata_inventory_put = function(pos)
update_entity(pos)
end,
on_metadata_inventory_take = function(pos)
update_entity(pos)
end,
after_destruct = function(pos)
update_entity(pos)
remove_hidden_node(pos)
end,
on_blast = function(pos)
-- Not affected by TNT
end,
texture = "3d_armor_stand_locked.png"
})
minetest.register_node("3d_armor_stand:shared_armor_stand", {
register_armor_stand({
name = "shared_armor_stand",
description = S("Shared Armor Stand"),
drawtype = "mesh",
mesh = "3d_armor_stand.obj",
tiles = {"3d_armor_stand_shared.png"},
use_texture_alpha = "clip",
paramtype = "light",
paramtype2 = "facedir",
walkable = false,
selection_box = {
type = "fixed",
fixed = {
{-0.25, -0.4375, -0.25, 0.25, 1.4, 0.25},
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
},
},
groups = {choppy=2, oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", armor_stand_formspec)
meta:set_string("infotext", S("Shared Armor Stand"))
local inv = meta:get_inventory()
for _, element in pairs(elements) do
inv:set_size("armor_"..element, 1)
end
end,
can_dig = function(pos, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
for _, element in pairs(elements) do
if not inv:is_empty("armor_"..element) then
return false
end
end
return true
end,
after_place_node = function(pos, placer)
minetest.add_entity(pos, "3d_armor_stand:armor_entity")
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Shared Armor Stand"))
add_hidden_node(pos, placer)
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then
return 0
end
local def = stack:get_definition() or {}
local groups = def.groups or {}
if groups[listname] then
return 1
end
return 0
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if not minetest.is_player(player) or minetest.is_protected(pos, player:get_player_name()) then
return 0
end
return stack:get_count()
end,
allow_metadata_inventory_move = function(pos)
return 0
end,
on_metadata_inventory_put = function(pos)
update_entity(pos)
end,
on_metadata_inventory_take = function(pos)
update_entity(pos)
end,
after_destruct = function(pos)
update_entity(pos)
remove_hidden_node(pos)
end,
on_blast = function(pos)
-- Not affected by TNT
end,
texture = "3d_armor_stand_shared.png"
})
minetest.register_entity("3d_armor_stand:armor_entity", {
@@ -384,7 +291,7 @@ minetest.register_entity("3d_armor_stand:armor_entity", {
mesh = "3d_armor_entity.obj",
visual_size = {x=1, y=1},
collisionbox = {0,0,0,0,0,0},
textures = {"3d_armor_trans.png"},
textures = {"blank.png"},
},
_pos = nil,
on_activate = function(self)
@@ -417,6 +324,32 @@ minetest.register_abm({
end
})
minetest.register_lbm({
label = "Update armor stand inventories",
name = "3d_armor_stand:update_inventories",
nodenames = {"3d_armor_stand:locked_armor_stand", "3d_armor_stand:shared_armor_stand", "3d_armor_stand:armor_stand"},
run_at_every_load = false,
action = function(pos, node)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local lists = inv:get_lists()
for _, element in pairs(elements) do
if not lists["armor_"..element] then
-- Abort to avoid item loss in case env_meta.txt is corrupted/deleted
return
end
end
inv:set_lists({main = {
lists.armor_head[1],
lists.armor_torso[1],
lists.armor_legs[1],
lists.armor_feet[1]
}})
meta:set_string("formspec", armor_stand_formspec)
update_entity(pos)
end
})
minetest.register_craft({
output = "3d_armor_stand:armor_stand",
recipe = {
@@ -439,5 +372,3 @@ minetest.register_craft({
{"3d_armor_stand:armor_stand", "default:copper_ingot"},
}
})
minetest.log("action", "[3d_armor_stand] loaded.")

View File

@@ -1,5 +1,5 @@
# textdomain: 3d_armor_stand
Armor Stand Top=Kirasstando Supro
Armor Stand=Kirasstando
Locked Armor Stand=Ŝlosita Kirasstando
Armor Stand (owned by @1)=Kirasstando (posedata de @1)
Armor Stand Top=Armaĵtenila Supro
Armor Stand=Armaĵtenilo
Locked Armor Stand=Ŝlosita Armaĵtenilo
Armor Stand (owned by @1)=Ŝlosita Armaĵtenilo (posedata de @1)

View File

@@ -0,0 +1,6 @@
# textdomain: 3d_armor_stand
Armor Stand Top=
Armor Stand=Soporte de armadura
Locked Armor Stand=Soporte de armadura privado
Shared Armor Stand=Soporte de armadura compartido
Armor Stand (owned by @1)=Soporte de armadura (de @1)

View File

@@ -0,0 +1,6 @@
# textdomain: 3d_armor_stand
Armor Stand Top=Верх Стойки для Брони
Armor Stand=Стойка для Брони
Locked Armor Stand=Заблокированная Стойка для Брони
Shared Armor Stand=Публичная Стойка для Брони
Armor Stand (owned by @1)=Стойка для Брони (владалец: @1)

View File

@@ -0,0 +1,5 @@
# textdomain: 3d_armor_stand
Armor Stand Top=Верх Стійки для Броні
Armor Stand=Стійка для Броні
Locked Armor Stand=Закрита Стійка для Броні
Armor Stand (owned by @1)=Стійка для Броні (власник @1)

View File

@@ -2,4 +2,5 @@
Armor Stand Top=
Armor Stand=
Locked Armor Stand=
Shared Armor Stand=
Armor Stand (owned by @1)=

View File

@@ -43,9 +43,6 @@ unified_inventory.register_page("armor", {
"image[3.5,"..(fy - 0.25)..";2,4;"..armor.textures[name].preview.."]"..
"label[6.0,"..(fy + 0.0)..";"..F(S("Level"))..": "..armor.def[name].level.."]"..
"label[6.0,"..(fy + 0.5)..";"..F(S("Heal"))..": "..armor.def[name].heal.."]"..
"label[6.0,"..(fy + 2.0)..";"..F(S("Speed"))..": "..armor.def[name].speed.."]"..
"label[6.0,"..(fy + 2.5)..";"..F(S("Jump"))..": "..armor.def[name].jump.."]"..
"label[6.0,"..(fy + 3.0)..";"..F(S("Gravity"))..": "..armor.def[name].gravity.."]"..
"listring[current_player;main]"..
"listring[detached:"..name.."_armor;armor]"
if armor.config.fire_protect then
@@ -59,5 +56,3 @@ unified_inventory.register_page("armor", {
return {formspec=formspec}
end,
})
minetest.log("action", "[3d_armor_ui] loaded.")

View File

@@ -1,7 +1,7 @@
# textdomain: 3d_armor_ui
3D Armor=3D Kiraso
Armor not initialized!=Kiraso ne pravigita!
Armor=Kiraso
3D Armor=3D Armaĵoj
Armor not initialized!=Armaĵoj ne pretigitaj!
Armor=Armaĵo
Level=Nivelo
Heal=Sanigi
Fire=Fajro

View File

@@ -0,0 +1,8 @@
# textdomain: 3d_armor_ui
3D Armor=3D Броня
Armor not initialized!=Броня не инициализирована!
Armor=Броня
Level=Уровень
Heal=Исцеление
Fire=Пламя
Radiation=Излучение

View File

@@ -0,0 +1,8 @@
# textdomain: 3d_armor_ui
3D Armor=3D Броня
Armor not initialized!=Броня не ініціалізована!
Armor=Броня
Level=Рівень
Heal=Зцілення
Fire=Вогонь
Radiation=Радіація

View File

@@ -41,7 +41,7 @@ armor:register_armor(":3d_armor:chestplate_admin", {
description = S("Admin Chestplate"),
inventory_image = "3d_armor_inv_chestplate_admin.png",
armor_groups = {fleshy=100},
groups = {armor_torso=1, armor_heal=100, armor_use=0,
groups = {armor_torso=1, armor_heal=100, armor_use=0, armor_water=1,
not_in_creative_inventory=1},
on_drop = function(itemstack, dropper, pos)
return
@@ -61,7 +61,7 @@ armor:register_armor(":3d_armor:leggings_admin", {
description = S("Admin Leggings"),
inventory_image = "3d_armor_inv_leggings_admin.png",
armor_groups = {fleshy=100},
groups = {armor_legs=1, armor_heal=100, armor_use=0,
groups = {armor_legs=1, armor_heal=100, armor_use=0, armor_water=1,
not_in_creative_inventory=1},
on_drop = function(itemstack, dropper, pos)
return
@@ -82,7 +82,7 @@ armor:register_armor(":3d_armor:boots_admin", {
inventory_image = "3d_armor_inv_boots_admin.png",
armor_groups = {fleshy=100},
groups = {armor_feet=1, armor_heal=100, armor_use=0, physics_speed=1,
not_in_creative_inventory=1},
armor_water=1, not_in_creative_inventory=1},
on_drop = function(itemstack, dropper, pos)
return
end,

View File

@@ -1,5 +1,5 @@
# textdomain: armor_admin
Admin Helmet=Administra Kasko
Admin Chestplate=Administra Brustkiraso
Admin Chestplate=Administra Kiraso
Admin Leggings=Administra Pantalono
Admin Boots=Administra Botoj
Admin Boots=Administraj Botoj

View File

@@ -1,5 +1,5 @@
# textdomain: armor_admin
Admin Helmet=шлем админа
Admin Chestplate=бронежилет админа
Admin Leggings=гамаши админа
Admin Boots=ботинки админа
Admin Helmet=Шлем Админа
Admin Chestplate=Нагрудник Админа
Admin Leggings=Поножи Админа
Admin Boots=Ботинки Админа

View File

@@ -0,0 +1,5 @@
# textdomain: armor_admin
Admin Helmet=Шолом адміна
Admin Chestplate=Броня адміна
Admin Leggings=Штани адміна
Admin Boots=Взуття адміна

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 548 B

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 B

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 298 B

View File

@@ -1,5 +1,5 @@
# textdomain: armor_bronze
Bronze Helmet=Bronza Kasko
Bronze Chestplate=Bronza Brustkiraso
Bronze Chestplate=Bronza Kiraso
Bronze Leggings=Bronza Pantalono
Bronze Boots=Bronza Botoj
Bronze Boots=Bronzaj Botoj

View File

@@ -1,5 +1,5 @@
# textdomain: armor_bronze
Bronze Helmet=бронзовый шлем
Bronze Chestplate=бронзовый бронежилет
Bronze Leggings=бронзовые гамаши
Bronze Boots=бронзовые ботинки
Bronze Helmet=Бронзовый Шлем
Bronze Chestplate=Бронзовый Нагрудник
Bronze Leggings=Бронзовые Поножи
Bronze Boots=Бронзовые Ботинки

View File

@@ -0,0 +1,5 @@
# textdomain: armor_bronze
Bronze Helmet=Бронзовий шолом
Bronze Chestplate=Бронзова броня
Bronze Leggings=Бронзові штани
Bronze Boots=Бронзове взуття

Binary file not shown.

Before

Width:  |  Height:  |  Size: 937 B

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 273 B

View File

@@ -1,5 +1,5 @@
# textdomain: armor_cactus
Cactus Helmet=Kakta Kasko
Cactus Chestplate=Kakta Brustkiraso
Cactus Chestplate=Kakta Kiraso
Cactus Leggings=Kakta Pantalono
Cactus Boots=Kakta Botoj
Cactus Boots=Kaktaj Botoj

View File

@@ -1,5 +1,5 @@
# textdomain: armor_cactus
Cactus Helmet=кактусовый шлем
Cactus Chestplate=кактусовый бронежилет
Cactus Leggings=кактусовые гамаши
Cactus Boots=кактусовые ботинки
Cactus Helmet=Кактусовый Шлем
Cactus Chestplate=Кактусовый Нагрудник
Cactus Leggings=Кактусовые Поножи
Cactus Boots=Кактусовые Ботинки

View File

@@ -0,0 +1,5 @@
# textdomain: armor_cactus
Cactus Helmet=Кактусовий шолом
Cactus Chestplate=Кактусова броня
Cactus Leggings=Кактусові штани
Cactus Boots=Кактусове взуття

Binary file not shown.

Before

Width:  |  Height:  |  Size: 903 B

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 B

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 183 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 261 B

View File

@@ -1,5 +1,5 @@
# textdomain: armor_crystal
Crystal Helmet=Kristala Kasko
Crystal Chestplate=Kristala Brustkiraso
Crystal Chestplate=Kristala Kiraso
Crystal Leggings=Kristala Pantalono
Crystal Boots=Kristala Botoj
Crystal Boots=Kristalaj Botoj

View File

@@ -1,5 +1,5 @@
# textdomain: armor_crystal
Crystal Helmet=кристалловый шлем
Crystal Chestplate=кристалловый бронежилет
Crystal Leggings=кристалловые гамаши
Crystal Boots=кристалловые ботинки
Crystal Helmet=Кристальный Шлем
Crystal Chestplate=Кристальный Нагрудник
Crystal Leggings=Кристальные Поножи
Crystal Boots=Кристальные Ботинки

View File

@@ -0,0 +1,5 @@
# textdomain: armor_crystal
Crystal Helmet=Кришталевий шолом
Crystal Chestplate=Кришталева броня
Crystal Leggings=Кришталеві штани
Crystal Boots=Кришталеве взуття

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 B

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 494 B

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 834 B

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 B

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 B

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 268 B

View File

@@ -1,5 +1,5 @@
# textdomain: armor_diamond
Diamond Helmet=Diamanta Kasko
Diamond Chestplate=Diamanta Brustkiraso
Diamond Chestplate=Diamanta Kiraso
Diamond Leggings=Diamanta Pantalono
Diamond Boots=Diamanta Botoj
Diamond Boots=Diamantaj Botoj

View File

@@ -1,5 +1,5 @@
# textdomain: armor_diamond
Diamond Helmet=алмазный шлем
Diamond Chestplate=алмазный бронежилет
Diamond Leggings=алмазные гамаши
Diamond Boots=алмазные ботинки
Diamond Helmet=Алмазный Шлем
Diamond Chestplate=Алмазный Нагрудник
Diamond Leggings=Алмазные Поножи
Diamond Boots=Алмазные Ботинки

View File

@@ -0,0 +1,5 @@
# textdomain: armor_diamond
Diamond Helmet=Діамантовий шолом
Diamond Chestplate=Діамантова броня
Diamond Leggings=Діамантові штани
Diamond Boots=Діамантове взуття

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 872 B

After

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 264 B

Some files were not shown because too many files have changed in this diff Show More