forked from VoxeLibre/VoxeLibre
Merge pull request 'Colored Leather Armor' (#4024) from AFCMS/MineClone2:colored-leather-2 into master
Reviewed-on: MineClone2/MineClone2#4024 Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
This commit is contained in:
commit
87abd0f4dc
|
@ -103,10 +103,10 @@ local function get_armor_texture(textures, name, modname, itemname, itemstring)
|
||||||
end
|
end
|
||||||
|
|
||||||
if overlay == "" then return core_armor_texture end -- key not present; armor not trimmed
|
if overlay == "" then return core_armor_texture end -- key not present; armor not trimmed
|
||||||
|
|
||||||
return core_armor_texture .. overlay
|
return core_armor_texture .. overlay
|
||||||
end
|
end
|
||||||
|
|
||||||
return func
|
return func
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -129,6 +129,7 @@ function mcl_armor.register_set(def)
|
||||||
local groups = table.copy(groups)
|
local groups = table.copy(groups)
|
||||||
groups["armor_" .. name] = 1
|
groups["armor_" .. name] = 1
|
||||||
groups["combat_armor_" .. name] = 1
|
groups["combat_armor_" .. name] = 1
|
||||||
|
groups["armor_" .. def.name] = 1
|
||||||
groups.armor = 1
|
groups.armor = 1
|
||||||
groups.combat_armor = 1
|
groups.combat_armor = 1
|
||||||
groups.mcl_armor_points = def.points[name]
|
groups.mcl_armor_points = def.points[name]
|
||||||
|
@ -326,12 +327,12 @@ end
|
||||||
tt.register_snippet(function(itemstring, toolcaps, stack)
|
tt.register_snippet(function(itemstring, toolcaps, stack)
|
||||||
if not stack then return nil end
|
if not stack then return nil end
|
||||||
local meta = stack:get_meta()
|
local meta = stack:get_meta()
|
||||||
if not mcl_armor.is_trimmed(stack) then return nil end
|
if not mcl_armor.is_trimmed(stack) then return nil end
|
||||||
-- we need to get the part of the overlay image between the overlay begin ( and the trim name end _
|
-- we need to get the part of the overlay image between the overlay begin ( and the trim name end _
|
||||||
-- we COULD easily store this info in meta, but that would bloat the meta storage, as the same few values would be stored over and over again on every trimmed item
|
-- we COULD easily store this info in meta, but that would bloat the meta storage, as the same few values would be stored over and over again on every trimmed item
|
||||||
-- this is fine here as this code gets only executed when you put armor and a trim in a smithing table
|
-- this is fine here as this code gets only executed when you put armor and a trim in a smithing table
|
||||||
local full_overlay = meta:get_string("mcl_armor:trim_overlay")
|
local full_overlay = meta:get_string("mcl_armor:trim_overlay")
|
||||||
local trim_name = full_overlay:match("%((.-)%_")
|
local trim_name = full_overlay:match("%((.-)%_")
|
||||||
return "Upgrade:\n " .. trim_name:gsub("^%l", string.upper) .. " Armor Trim"
|
return "Upgrade:\n " .. trim_name:gsub("^%l", string.upper) .. " Armor Trim"
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -339,4 +340,4 @@ function mcl_armor.is_trimmed(itemstack)
|
||||||
-- this meta value will be there for every trimmed armor piece
|
-- this meta value will be there for every trimmed armor piece
|
||||||
-- remember, get_string returns "" if the key doesn't exist
|
-- remember, get_string returns "" if the key doesn't exist
|
||||||
return itemstack:get_meta():get_string("mcl_armor:trim_overlay") ~= ""
|
return itemstack:get_meta():get_string("mcl_armor:trim_overlay") ~= ""
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,5 +71,6 @@ dofile(modpath .. "/api.lua")
|
||||||
dofile(modpath .. "/player.lua")
|
dofile(modpath .. "/player.lua")
|
||||||
dofile(modpath .. "/damage.lua")
|
dofile(modpath .. "/damage.lua")
|
||||||
dofile(modpath .. "/register.lua")
|
dofile(modpath .. "/register.lua")
|
||||||
|
dofile(modpath .. "/leather.lua")
|
||||||
dofile(modpath .. "/alias.lua")
|
dofile(modpath .. "/alias.lua")
|
||||||
dofile(modpath .. "/trims.lua")
|
dofile(modpath .. "/trims.lua")
|
||||||
|
|
|
@ -0,0 +1,207 @@
|
||||||
|
local C = minetest.colorize
|
||||||
|
|
||||||
|
local colors = {
|
||||||
|
-- { ID, decription, wool, dye }
|
||||||
|
{ "red", "Red", "mcl_dye:red", "#951d1d" },
|
||||||
|
{ "blue", "Blue", "mcl_dye:blue", "#2a2c94" },
|
||||||
|
{ "cyan", "Cyan", "mcl_dye:cyan", "#0d7d8e" },
|
||||||
|
{ "grey", "Grey", "mcl_dye:dark_grey", "#363a3f" },
|
||||||
|
{ "silver", "Light Grey", "mcl_dye:grey", "#818177" },
|
||||||
|
{ "black", "Black", "mcl_dye:black", "#020307" },
|
||||||
|
{ "yellow", "Yellow", "mcl_dye:yellow", "#f2b410" },
|
||||||
|
{ "green", "Green", "mcl_dye:dark_green", "#495d20" },
|
||||||
|
{ "magenta", "Magenta", "mcl_dye:magenta", "#ae2ea4" },
|
||||||
|
{ "orange", "Orange", "mcl_dye:orange", "#e36501" },
|
||||||
|
{ "purple", "Purple", "mcl_dye:violet", "#681ba1" },
|
||||||
|
{ "brown", "Brown", "mcl_dye:brown", "#623b1a" },
|
||||||
|
{ "pink", "Pink", "mcl_dye:pink", "#d66691" },
|
||||||
|
{ "lime", "Lime", "mcl_dye:green", "#60ad13" },
|
||||||
|
{ "light_blue", "Light Blue", "mcl_dye:lightblue", "#1f8eca" },
|
||||||
|
{ "white", "White", "mcl_dye:white", "#d1d7d8" },
|
||||||
|
}
|
||||||
|
|
||||||
|
local function color_string_to_table(colorstring)
|
||||||
|
return {
|
||||||
|
r = tonumber(colorstring:sub(2,3), 16), -- 16 as second parameter allows hexadecimal
|
||||||
|
g = tonumber(colorstring:sub(4,5), 16),
|
||||||
|
b = tonumber(colorstring:sub(6,7), 16),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function av(a, b)
|
||||||
|
return (a + b)/2
|
||||||
|
end
|
||||||
|
|
||||||
|
local function calculate_color(first, last)
|
||||||
|
return {
|
||||||
|
r = av(first.r, last.r),
|
||||||
|
g = av(first.g, last.g),
|
||||||
|
b = av(first.b, last.b),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_texture_function(texture)
|
||||||
|
local function get_texture(_, itemstack)
|
||||||
|
local out
|
||||||
|
local color = itemstack:get_meta():get_string("mcl_armor:color")
|
||||||
|
if color == "" or color == nil then
|
||||||
|
out = texture
|
||||||
|
else
|
||||||
|
out = texture.."^[hsl:0:100:50^[multiply:"..color
|
||||||
|
end
|
||||||
|
|
||||||
|
if mcl_enchanting.is_enchanted(itemstack:get_name()) then
|
||||||
|
return out..mcl_enchanting.overlay
|
||||||
|
else
|
||||||
|
return out
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return get_texture
|
||||||
|
end
|
||||||
|
|
||||||
|
function mcl_armor.colorize_leather_armor(itemstack, colorstring)
|
||||||
|
if not itemstack or minetest.get_item_group(itemstack:get_name(), "armor_leather") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local color = color_string_to_table(colorstring)
|
||||||
|
colorstring = minetest.colorspec_to_colorstring(color)
|
||||||
|
local meta = itemstack:get_meta()
|
||||||
|
local old_color = meta:get_string("mcl_armor:color")
|
||||||
|
if old_color == colorstring then return
|
||||||
|
elseif old_color ~= "" then
|
||||||
|
color = calculate_color(
|
||||||
|
color_string_to_table(minetest.colorspec_to_colorstring(old_color)),
|
||||||
|
color
|
||||||
|
)
|
||||||
|
colorstring = minetest.colorspec_to_colorstring(color)
|
||||||
|
end
|
||||||
|
meta:set_string("mcl_armor:color", colorstring)
|
||||||
|
meta:set_string("inventory_image",
|
||||||
|
itemstack:get_definition().inventory_image .. "^[hsl:0:100:50^[multiply:" .. colorstring
|
||||||
|
)
|
||||||
|
tt.reload_itemstack_description(itemstack)
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
|
||||||
|
function mcl_armor.wash_leather_armor(itemstack)
|
||||||
|
if not itemstack or minetest.get_item_group(itemstack:get_name(), "armor_leather") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = itemstack:get_meta()
|
||||||
|
meta:set_string("mcl_armor:color", "")
|
||||||
|
meta:set_string("inventory_image", "")
|
||||||
|
tt.reload_itemstack_description(itemstack)
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
|
||||||
|
mcl_armor.register_set({
|
||||||
|
name = "leather",
|
||||||
|
description = "Leather",
|
||||||
|
descriptions = {
|
||||||
|
head = "Cap",
|
||||||
|
torso = "Tunic",
|
||||||
|
legs = "Pants",
|
||||||
|
},
|
||||||
|
durability = 80,
|
||||||
|
enchantability = 15,
|
||||||
|
points = {
|
||||||
|
head = 1,
|
||||||
|
torso = 3,
|
||||||
|
legs = 2,
|
||||||
|
feet = 1,
|
||||||
|
},
|
||||||
|
textures = {
|
||||||
|
head = get_texture_function("mcl_armor_helmet_leather.png"),
|
||||||
|
torso = get_texture_function("mcl_armor_chestplate_leather.png"),
|
||||||
|
legs = get_texture_function("mcl_armor_leggings_leather.png"),
|
||||||
|
feet = get_texture_function("mcl_armor_boots_leather.png"),
|
||||||
|
},
|
||||||
|
craft_material = "mcl_mobitems:leather",
|
||||||
|
})
|
||||||
|
|
||||||
|
tt.register_priority_snippet(function(_, _, itemstack)
|
||||||
|
if not itemstack or minetest.get_item_group(itemstack:get_name(), "armor_leather") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local color = itemstack:get_meta():get_string("mcl_armor:color")
|
||||||
|
if color and color ~= "" then
|
||||||
|
local text = C(mcl_colors.GRAY, "Dyed: "..color)
|
||||||
|
return text, false
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
for name, element in pairs(mcl_armor.elements) do
|
||||||
|
local modname = minetest.get_current_modname()
|
||||||
|
local itemname = modname .. ":" .. element.name .. "_leather"
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "shapeless",
|
||||||
|
output = itemname,
|
||||||
|
recipe = {
|
||||||
|
itemname,
|
||||||
|
"group:dye",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
local ench_itemname = itemname .. "_enchanted"
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "shapeless",
|
||||||
|
output = ench_itemname,
|
||||||
|
recipe = {
|
||||||
|
ench_itemname,
|
||||||
|
"group:dye",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
local function colorizing_crafting(itemstack, player, old_craft_grid, craft_inv)
|
||||||
|
if minetest.get_item_group(itemstack:get_name(), "armor_leather") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local found_la = nil
|
||||||
|
local dye_color = nil
|
||||||
|
for _, item in pairs(old_craft_grid) do
|
||||||
|
local name = item:get_name()
|
||||||
|
if name == "" then
|
||||||
|
-- continue
|
||||||
|
elseif minetest.get_item_group(name, "armor_leather") > 0 then
|
||||||
|
if found_la then return end
|
||||||
|
found_la = item
|
||||||
|
elseif minetest.get_item_group(name, "dye") > 0 then
|
||||||
|
if dye_color then return end
|
||||||
|
for _, row in pairs(colors) do
|
||||||
|
if row[3] == name then dye_color = row[4] end
|
||||||
|
end
|
||||||
|
else return end
|
||||||
|
end
|
||||||
|
|
||||||
|
return mcl_armor.colorize_leather_armor(found_la, dye_color) or ItemStack()
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_craft_predict(colorizing_crafting)
|
||||||
|
minetest.register_on_craft(colorizing_crafting)
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_chatcommand("color_leather", {
|
||||||
|
params = "<color>",
|
||||||
|
description = "Colorize a piece of leather armor, or wash it",
|
||||||
|
privs = {debug = true},
|
||||||
|
func = function(name, param)
|
||||||
|
local player = minetest.get_player_by_name(name)
|
||||||
|
if player then
|
||||||
|
local item = player:get_wielded_item()
|
||||||
|
if not item or minetest.get_item_group(item:get_name(), "armor_leather") == 0 then
|
||||||
|
return false, "Not leather armor."
|
||||||
|
end
|
||||||
|
if param == "wash" then
|
||||||
|
player:set_wielded_item(mcl_armor.wash_leather_armor(item))
|
||||||
|
return true, "Washed."
|
||||||
|
end
|
||||||
|
local colorstring = minetest.colorspec_to_colorstring(param)
|
||||||
|
if not colorstring then return false, "Invalid color" end
|
||||||
|
player:set_wielded_item(mcl_armor.colorize_leather_armor(item, colorstring))
|
||||||
|
return true, "Done: " .. colorstring
|
||||||
|
else
|
||||||
|
return false, "Player isn't online"
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
|
@ -1,5 +1,5 @@
|
||||||
name = mcl_armor
|
name = mcl_armor
|
||||||
author = stu
|
author = stu
|
||||||
description = Adds craftable armor that is visible to other players.
|
description = Adds craftable armor that is visible to other players.
|
||||||
depends = mcl_core, mcl_player, mcl_enchanting, mcl_damage, mcl_grindstone
|
depends = mcl_core, mcl_player, mcl_enchanting, mcl_damage, mcl_colors, mcl_grindstone
|
||||||
optional_depends = mcl_fire, ethereal, bakedclay
|
optional_depends = mcl_fire, ethereal, bakedclay
|
||||||
|
|
|
@ -1,24 +1,5 @@
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
mcl_armor.register_set({
|
|
||||||
name = "leather",
|
|
||||||
description = "Leather",
|
|
||||||
descriptions = {
|
|
||||||
head = "Cap",
|
|
||||||
torso = "Tunic",
|
|
||||||
legs = "Pants",
|
|
||||||
},
|
|
||||||
durability = 80,
|
|
||||||
enchantability = 15,
|
|
||||||
points = {
|
|
||||||
head = 1,
|
|
||||||
torso = 3,
|
|
||||||
legs = 2,
|
|
||||||
feet = 1,
|
|
||||||
},
|
|
||||||
craft_material = "mcl_mobitems:leather",
|
|
||||||
})
|
|
||||||
|
|
||||||
mcl_armor.register_set({
|
mcl_armor.register_set({
|
||||||
name = "gold",
|
name = "gold",
|
||||||
description = "Golden",
|
description = "Golden",
|
||||||
|
|
|
@ -94,6 +94,14 @@ local function register_filled_cauldron(water_level, description, liquid)
|
||||||
drop = "mcl_cauldrons:cauldron",
|
drop = "mcl_cauldrons:cauldron",
|
||||||
_mcl_hardness = 2,
|
_mcl_hardness = 2,
|
||||||
_mcl_blast_resistance = 2,
|
_mcl_blast_resistance = 2,
|
||||||
|
on_rightclick = function(pos, node, player, itemstack)
|
||||||
|
local outcome = mcl_armor.wash_leather_armor(itemstack)
|
||||||
|
if outcome then
|
||||||
|
minetest.sound_play("mcl_potions_bottle_pour",
|
||||||
|
{pos=pos, gain=0.5, max_hear_range=16},true)
|
||||||
|
end
|
||||||
|
return outcome
|
||||||
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Add entry aliases for the Help
|
-- Add entry aliases for the Help
|
||||||
|
|
Loading…
Reference in New Issue