dresser/init.lua

201 lines
5.6 KiB
Lua
Raw Permalink Normal View History

2016-11-02 00:04:57 -07:00
--[[ Dresser mod for Minetest
skins.txt, inside world directory,
2016-11-02 03:21:44 -07:00
is formatted as `name:description'
(without the quotes), and is auto-
generated.
2016-11-02 00:04:57 -07:00
Copyright 2016 James Stevenson (everamzah)
Licensed under the LGPL 3.0, see LICENSE.
Textures licensed separately, see README.]]
2016-11-02 03:21:44 -07:00
local dresser = {} -- Position of Dresser as a string.
2016-10-31 00:11:38 -07:00
local skin_db = {}
2016-11-01 22:57:50 -07:00
local mod_name = minetest.get_current_modname()
2016-11-02 03:21:44 -07:00
local world_path = minetest.get_worldpath()
2016-11-01 22:57:50 -07:00
2016-10-31 00:11:38 -07:00
local load = function ()
2016-11-02 03:21:44 -07:00
local fh, err = io.open(world_path .. "/skins.txt", "r")
2016-10-31 00:11:38 -07:00
if err then
2016-11-02 00:04:57 -07:00
skin_db = {{"sam", "Sam"}, {"c55", "Celeron55"}}
2016-11-01 22:57:50 -07:00
minetest.log("action", "[" .. mod_name .. "] No skins.txt found! Loading default skins.")
2016-11-02 03:21:44 -07:00
local fh, err = io.open(world_path .. "/skins.txt", "w")
if err then
minetest.log("action", "[" .. mod_name .. "] Unable to write skins.txt!")
return
end
fh:write("sam:Sam\nc55:Celeron55")
minetest.log("action", "[" .. mod_name .. "] Created skins.txt.")
2016-10-31 00:11:38 -07:00
return
end
while true do
local line = fh:read()
if line == nil then
break
end
local paramlist = string.split(line, ":")
local w = {
paramlist[1],
paramlist[2]
}
table.insert(skin_db, w)
end
fh:close()
2016-11-02 03:21:44 -07:00
minetest.log("action", "[" .. mod_name .. "] " .. table.getn(skin_db) .. " skins loaded.")
2016-10-31 00:11:38 -07:00
end
2016-11-02 03:21:44 -07:00
load()
2016-10-31 00:11:38 -07:00
local function get_skin(player)
local skin = player:get_properties().textures[1]
return skin
end
local function show_formspec(name, skin, spos)
2016-11-02 03:21:44 -07:00
minetest.show_formspec(name, "dresser:dresser",
2016-10-31 00:11:38 -07:00
"size[8,8.5]" ..
default.gui_bg_img ..
default.gui_slots ..
2016-11-02 03:21:44 -07:00
"label[0,1;Skin]" ..
2016-10-31 00:11:38 -07:00
"list[detached:skin_" .. name .. ";main;0,1.5;1,1]" ..
2016-11-02 00:04:57 -07:00
"image[0.75,0.1;4,4;dresser_skin_" .. skin .. "_item.png]" ..
2016-11-02 03:21:44 -07:00
"label[4,0;Storage]" ..
2016-10-31 00:11:38 -07:00
"list[nodemeta:" .. spos .. ";main;4,0.5;4,3]" ..
"list[current_player;main;0,4.25;8,1;]" ..
"list[current_player;main;0,5.5;8,3;8]" ..
2016-11-01 23:30:33 -07:00
default.get_hotbar_bg(0, 4.25))
2016-10-31 00:11:38 -07:00
end
2016-11-02 03:21:44 -07:00
-- Dresser node and its craft recipe:
2016-10-31 00:11:38 -07:00
minetest.register_node("dresser:dresser", {
2016-11-02 00:04:57 -07:00
description = "Dresser",
2016-10-31 00:11:38 -07:00
paramtype2 = "facedir",
tiles = {
2016-11-01 23:02:29 -07:00
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"dresser_dresser.png",
"dresser_dresser.png",
2016-10-31 00:11:38 -07:00
},
sounds = default.node_sound_wood_defaults(),
2016-11-02 03:21:44 -07:00
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
2016-10-31 00:11:38 -07:00
on_construct = function(pos)
local meta = minetest.get_meta(pos)
2016-11-02 00:04:57 -07:00
meta:set_string("infotext", "Dresser")
2016-10-31 00:11:38 -07:00
local inv = meta:get_inventory()
inv:set_size("main", 4 * 3)
end,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
2016-11-02 03:21:44 -07:00
dresser[clicker:get_player_name()] = spos
2016-10-31 00:11:38 -07:00
local skin
local current_skin = get_skin(clicker)
for _, v in pairs(skin_db) do
2016-11-02 00:04:57 -07:00
if current_skin == "dresser_skin_" .. v[1] .. ".png" then
2016-10-31 00:11:38 -07:00
skin = v[1]
elseif not skin then
2016-11-02 00:04:57 -07:00
skin = "sam"
2016-10-31 00:11:38 -07:00
end
end
2016-11-02 03:21:44 -07:00
show_formspec(clicker:get_player_name(), skin, spos)
2016-10-31 00:11:38 -07:00
end,
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if minetest.get_item_group(stack:get_name(), "skin") == 1 then
return 1
else
return 0
end
2016-11-02 03:48:11 -07:00
end,
can_dig = function(pos)
return minetest.get_inventory({type = "node", pos = pos}):is_empty("main")
end,
2016-10-31 00:11:38 -07:00
})
minetest.register_craft({
output = "dresser:dresser",
recipe = {
{"group:wood", "group:stick", "group:wood"},
{"group:wood", "group:wool", "group:wood"},
{"group:wood", "group:wool", "group:wood"},
}
})
2016-11-02 03:21:44 -07:00
-- Register skin craftitems.
2016-10-31 00:11:38 -07:00
for _, v in pairs(skin_db) do
minetest.register_craftitem("dresser:skin_" .. v[1], {
description = v[2],
2016-11-02 00:04:57 -07:00
inventory_image = "dresser_skin_" .. v[1] .. "_item.png",
2016-10-31 00:11:38 -07:00
groups = {skin = 1},
stack_max = 1
})
end
2016-11-02 03:21:44 -07:00
---[[
2016-10-31 00:11:38 -07:00
minetest.register_on_newplayer(function(player)
local name = player:get_player_name()
minetest.after(0.1, function ()
local inv = minetest.get_inventory{type = "player", name = name}
2016-11-02 00:04:57 -07:00
inv:set_stack("skin", 1, {name = "dresser:skin_sam"})
2016-10-31 00:11:38 -07:00
local detached = minetest.get_inventory{type = "detached", name = "skin_" .. name}
2016-11-02 00:04:57 -07:00
detached:set_stack("main", 1, {name = "dresser:skin_sam"})
2016-10-31 00:11:38 -07:00
end)
end)
2016-11-02 03:21:44 -07:00
--]]
2016-10-31 00:11:38 -07:00
2016-11-02 03:21:44 -07:00
minetest.register_on_joinplayer(function(player)
-- FIXME Old players missing the skin inventory do not receive their skin
2016-10-31 00:11:38 -07:00
local skin_inv = player:get_inventory()
skin_inv:set_size("skin", 1)
for _, v in pairs(skin_db) do
if skin_inv:contains_item("skin", {name = "dresser:skin_" .. v[1]}) then
2016-11-02 00:04:57 -07:00
player:set_properties({textures = {"dresser_skin_" .. v[1] .. ".png"}})
2016-10-31 00:11:38 -07:00
end
end
local skin = minetest.create_detached_inventory("skin_" .. player:get_player_name(), {
allow_put = function(inv, listname, index, stack, player)
if minetest.get_item_group(stack:get_name(), "skin") == 1 then
return 1
else
return 0
end
end,
allow_take = function(inv, listname, index, stack, player)
return 0
end,
on_put = function(inv, listname, index, stack, player)
local name = player:get_player_name()
for _, v in pairs(skin_db) do
if stack:get_name() == "dresser:skin_" .. v[1] then
2016-11-02 00:04:57 -07:00
player:set_properties({textures = {"dresser_skin_" .. v[1] .. ".png"}})
2016-10-31 00:11:38 -07:00
skin_inv:set_stack("skin", 1, {name = "dresser:skin_" .. v[1]})
return show_formspec(name, v[1], dresser[player:get_player_name()])
end
end
2016-11-02 03:21:44 -07:00
end,
},
player:get_player_name() ) -- fix hang due to data leak
2016-10-31 00:11:38 -07:00
skin:set_size("main", 1)
for _, v in pairs(skin_db) do
if skin_inv:contains_item("skin", {name = "dresser:skin_" .. v[1]}) then
skin:set_stack("main", 1, {name = "dresser:skin_" .. v[1]})
end
end
end)
minetest.register_on_leaveplayer(function(player)
dresser[player:get_player_name()] = nil
end)