parent
ac3ac1b3ca
commit
25efea2f73
|
@ -1 +0,0 @@
|
|||
default
|
|
@ -1,115 +0,0 @@
|
|||
classes = {
|
||||
mesh = {
|
||||
elf = "elf_character.x",
|
||||
human = "character.x",
|
||||
dwarf = "dwarf_character.x",
|
||||
},
|
||||
class = {},
|
||||
default = "human",
|
||||
file = minetest.get_worldpath().."/classes.mt",
|
||||
}
|
||||
|
||||
classes.load = function(self)
|
||||
local input = io.open(self.file, "r")
|
||||
local data = nil
|
||||
if input then
|
||||
data = input:read('*all')
|
||||
end
|
||||
if data and data ~= "" then
|
||||
lines = string.split(data, "\n")
|
||||
for _, line in ipairs(lines) do
|
||||
data = string.split(line, " ", 2)
|
||||
self.class[data[1]] = data[2]
|
||||
end
|
||||
io.close(input)
|
||||
end
|
||||
end
|
||||
|
||||
classes.save = function(self)
|
||||
local output = io.open(self.file,'w')
|
||||
for name, class in pairs(self.class) do
|
||||
if name and class then
|
||||
output:write(name.." "..class.."\n")
|
||||
end
|
||||
end
|
||||
io.close(output)
|
||||
end
|
||||
|
||||
classes.get_character_mesh = function(self, name)
|
||||
local mesh = ""
|
||||
local mod_path = minetest.get_modpath("3d_armor")
|
||||
if mod_path then
|
||||
mesh = "3d_armor_"
|
||||
end
|
||||
if classes.class[name] then
|
||||
return mesh..classes.mesh[classes.class[name]]
|
||||
end
|
||||
return mesh..classes.mesh[classes.default]
|
||||
end
|
||||
|
||||
classes.update_character_mesh = function(self, player)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
local name = player:get_player_name()
|
||||
if classes.class[name] then
|
||||
player:set_properties({
|
||||
visual = "mesh",
|
||||
mesh = self:get_character_mesh(name),
|
||||
visual_size = {x=1, y=1},
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
local default_class = minetest.setting_get("classes_default_class")
|
||||
if default_class then
|
||||
if classes.mesh[default_class] then
|
||||
classes.default = default_class
|
||||
end
|
||||
else
|
||||
minetest.setting_set("classes_default_class", classes.default)
|
||||
end
|
||||
classes:load()
|
||||
|
||||
minetest.register_privilege("class", "Player can change class.")
|
||||
|
||||
minetest.register_chatcommand("class", {
|
||||
params = "[class]",
|
||||
description = "Change or view character class.",
|
||||
func = function(name, param)
|
||||
if param == "" then
|
||||
minetest.chat_send_player(name, "Current character class: "..classes.class[name])
|
||||
return
|
||||
end
|
||||
if not minetest.check_player_privs(name, {class=true}) then
|
||||
minetest.chat_send_player(name, "Changing class requires the 'class' privilege!")
|
||||
return
|
||||
end
|
||||
if not classes.mesh[param] then
|
||||
local valid = ""
|
||||
for k,_ in pairs(classes.mesh) do
|
||||
valid = valid.." "..k
|
||||
end
|
||||
minetest.chat_send_player(name, "Invalid class '"..param.."', choose from:"..valid)
|
||||
return
|
||||
end
|
||||
if classes.class[name] == param then
|
||||
return
|
||||
end
|
||||
classes.class[name] = param
|
||||
classes:save()
|
||||
local player = minetest.env:get_player_by_name(name)
|
||||
classes:update_character_mesh(player)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
if not classes.class[name] then
|
||||
classes.class[name] = classes.default
|
||||
end
|
||||
minetest.after(0.5, function(player)
|
||||
classes:update_character_mesh(player)
|
||||
end, player)
|
||||
end)
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -131,11 +131,11 @@ if minetest.setting_getbool("creative_mode") then
|
|||
full_punch_interval = 0.5,
|
||||
max_drop_level = 3,
|
||||
groupcaps = {
|
||||
crumbly = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
||||
cracky = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
||||
snappy = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
||||
choppy = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
||||
oddly_breakable_by_hand = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3},
|
||||
crumbly = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=6},
|
||||
cracky = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=6},
|
||||
snappy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=6},
|
||||
choppy = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=6},
|
||||
oddly_breakable_by_hand = {times={[1]=0, [2]=0, [3]=0}, uses=0, maxlevel=3},
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -88,6 +88,18 @@ minetest.register_node("dwarves:glass", {
|
|||
sounds = default.node_sound_glass_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("dwarves:glass_vis", {
|
||||
description = "Invisible Glass",
|
||||
drawtype = "glasslike",
|
||||
tiles = {"default_glass_vis.png"},
|
||||
inventory_image = minetest.inventorycube("default_glass.png"),
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = true,
|
||||
groups = {snappy=3,cracky=3, level=1},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_tool("dwarves:pick_ebony", {
|
||||
description = "Ebony Pickaxe",
|
||||
inventory_image = "dwarves_tool_ebonypick.png",
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
Binary file not shown.
Binary file not shown.
|
@ -1,18 +1,64 @@
|
|||
local player_ges = 0
|
||||
local player_in_bed = 0
|
||||
local guy
|
||||
local hand
|
||||
local old_yaw = 0
|
||||
|
||||
local function get_dir(pos)
|
||||
local btop = "papyrus_bed:bed_top"
|
||||
if minetest.env:get_node({x=pos.x+1,y=pos.y,z=pos.z}).name == btop then
|
||||
return 7.9
|
||||
elseif minetest.env:get_node({x=pos.x-1,y=pos.y,z=pos.z}).name == btop then
|
||||
return 4.75
|
||||
elseif minetest.env:get_node({x=pos.x,y=pos.y,z=pos.z+1}).name == btop then
|
||||
return 3.15
|
||||
elseif minetest.env:get_node({x=pos.x,y=pos.y,z=pos.z-1}).name == btop then
|
||||
return 6.28
|
||||
end
|
||||
end
|
||||
|
||||
function plock(start, max, tick, player, yaw)
|
||||
if start+tick < max then
|
||||
player:set_look_pitch(-1.2)
|
||||
player:set_look_yaw(yaw)
|
||||
minetest.after(tick, plock, start+tick, max, tick, player, yaw)
|
||||
else
|
||||
player:set_look_pitch(0)
|
||||
if old_yaw ~= 0 then minetest.after(0.1+tick, function() player:set_look_yaw(old_yaw) end) end
|
||||
end
|
||||
end
|
||||
|
||||
function exit(pos)
|
||||
local npos = minetest.env:find_node_near(pos, 1, "papyrus_bed:bed_bottom")
|
||||
if npos ~= nil then pos = npos end
|
||||
if minetest.env:get_node({x=pos.x+1,y=pos.y,z=pos.z}).name == "air" then
|
||||
return {x=pos.x+1,y=pos.y,z=pos.z}
|
||||
elseif minetest.env:get_node({x=pos.x-1,y=pos.y,z=pos.z}).name == "air" then
|
||||
return {x=pos.x-1,y=pos.y,z=pos.z}
|
||||
elseif minetest.env:get_node({x=pos.x,y=pos.y,z=pos.z+1}).name == "air" then
|
||||
return {x=pos.x,y=pos.y,z=pos.z+1}
|
||||
elseif minetest.env:get_node({x=pos.x,y=pos.y,z=pos.z-1}).name == "air" then
|
||||
return {x=pos.x,y=pos.y,z=pos.z-1}
|
||||
else
|
||||
return {x=pos.x,y=pos.y,z=pos.z}
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("papyrus_bed:bed_bottom", {
|
||||
description = "Papyrus bed",
|
||||
description = "Bed",
|
||||
inventory_image = "papyrus_bed_bed.png",
|
||||
wield_image = "papyrus_bed_bed.png",
|
||||
wield_scale = {x=0.8,y=2.5,z=1.3},
|
||||
drawtype = "nodebox",
|
||||
tiles = {"papyrus_bed_bottom_above.png", "papyrus_bed_bottom_below.png", "papyrus_bed_bottom_side_right.png", "papyrus_bed_bottom_side_left.png", "papyrus_bed_brackets.png", "papyrus_bed_bottom_bottom.png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
stack_max = 1,
|
||||
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
-- bedspread
|
||||
-- papyrus_bedpread
|
||||
{-0.5, 0.3125, -0.5, 0.5, 0.4375, 0.5},
|
||||
-- frame and mattress
|
||||
{-0.5, -0.3125, -0.5, 0.5, 0.3125, 0.5},
|
||||
|
@ -27,52 +73,51 @@ minetest.register_node("papyrus_bed:bed_bottom", {
|
|||
{-0.5, -0.5, -0.5, 0.5, 0.5, 1.5},
|
||||
}
|
||||
},
|
||||
|
||||
on_construct = function(pos)
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local param2 = node.param2
|
||||
local npos = {x=pos.x, y=pos.y, z=pos.z}
|
||||
if param2 == 0 then
|
||||
node.name = "papyrus_bed:bed_top"
|
||||
pos.z = pos.z+1
|
||||
minetest.env:set_node(pos, node)
|
||||
npos.z = npos.z+1
|
||||
elseif param2 == 1 then
|
||||
node.name = "papyrus_bed:bed_top"
|
||||
pos.x = pos.x+1
|
||||
minetest.env:set_node(pos, node)
|
||||
npos.x = npos.x+1
|
||||
elseif param2 == 2 then
|
||||
node.name = "papyrus_bed:bed_top"
|
||||
pos.z = pos.z-1
|
||||
minetest.env:set_node(pos, node)
|
||||
npos.z = npos.z-1
|
||||
elseif param2 == 3 then
|
||||
node.name = "papyrus_bed:bed_top"
|
||||
pos.x = pos.x-1
|
||||
minetest.env:set_node(pos, node)
|
||||
npos.x = npos.x-1
|
||||
end
|
||||
end,
|
||||
|
||||
if minetest.registered_nodes[minetest.env:get_node(npos).name].buildable_to == true and minetest.env:get_node({x=npos.x, y=npos.y-1, z=npos.z}).name ~= "air" then
|
||||
minetest.env:set_node(npos, {name="papyrus_bed:bed_top", param2 = param2})
|
||||
else
|
||||
minetest.env:dig_node(pos)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
local node = minetest.env:get_node(pos)
|
||||
local param2 = node.param2
|
||||
if param2 == 0 then
|
||||
pos.z = pos.z+1
|
||||
minetest.env:remove_node(pos)
|
||||
elseif param2 == 1 then
|
||||
pos.x = pos.x+1
|
||||
minetest.env:remove_node(pos)
|
||||
elseif param2 == 2 then
|
||||
pos.z = pos.z-1
|
||||
minetest.env:remove_node(pos)
|
||||
elseif param2 == 3 then
|
||||
pos.x = pos.x-1
|
||||
minetest.env:remove_node(pos)
|
||||
end
|
||||
pos = minetest.env:find_node_near(pos, 1, "papyrus_bed:bed_top")
|
||||
if pos ~= nil then minetest.env:remove_node(pos) end
|
||||
end,
|
||||
|
||||
on_rightclick = function(pos, node, puncher)
|
||||
if not puncher:is_player() then
|
||||
|
||||
on_rightclick = function(pos, node, clicker, itemstack)
|
||||
if not clicker:is_player() then
|
||||
return
|
||||
end
|
||||
if puncher:get_wielded_item():get_name() == "" then
|
||||
|
||||
if minetest.env:get_timeofday() > 0.2 and minetest.env:get_timeofday() < 0.805 then
|
||||
minetest.chat_send_all("You can only sleep at night")
|
||||
return
|
||||
else
|
||||
clicker:set_physics_override(0,0,0)
|
||||
old_yaw = clicker:get_look_yaw()
|
||||
guy = clicker
|
||||
clicker:set_look_yaw(get_dir(pos))
|
||||
minetest.chat_send_all("Good night")
|
||||
plock(0,2,0.1,clicker, get_dir(pos))
|
||||
end
|
||||
|
||||
if not clicker:get_player_control().sneak then
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
local param2 = node.param2
|
||||
if param2 == 0 then
|
||||
|
@ -84,7 +129,7 @@ minetest.register_node("papyrus_bed:bed_bottom", {
|
|||
elseif param2 == 3 then
|
||||
pos.x = pos.x-1
|
||||
end
|
||||
if puncher:get_player_name() == meta:get_string("player") then
|
||||
if clicker:get_player_name() == meta:get_string("player") then
|
||||
if param2 == 0 then
|
||||
pos.x = pos.x-1
|
||||
elseif param2 == 1 then
|
||||
|
@ -95,13 +140,13 @@ minetest.register_node("papyrus_bed:bed_bottom", {
|
|||
pos.z = pos.z-1
|
||||
end
|
||||
pos.y = pos.y-0.5
|
||||
puncher:setpos(pos)
|
||||
clicker:setpos(pos)
|
||||
meta:set_string("player", "")
|
||||
player_in_bed = player_in_bed-1
|
||||
elseif meta:get_string("player") == "" then
|
||||
pos.y = pos.y-0.5
|
||||
puncher:setpos(pos)
|
||||
meta:set_string("player", puncher:get_player_name())
|
||||
clicker:setpos(pos)
|
||||
meta:set_string("player", clicker:get_player_name())
|
||||
player_in_bed = player_in_bed+1
|
||||
end
|
||||
end
|
||||
|
@ -150,40 +195,55 @@ minetest.register_craft({
|
|||
}
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(function(pl)
|
||||
player_ges = player_ges+1
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(pl)
|
||||
player_ges = player_ges-1
|
||||
end)
|
||||
papyrus_bed_player_spawns = {}
|
||||
local file = io.open(minetest.get_worldpath().."/papyrus_bed_player_spawns", "r")
|
||||
if file then
|
||||
papyrus_bed_player_spawns = minetest.deserialize(file:read("*all"))
|
||||
file:close()
|
||||
end
|
||||
|
||||
local timer = 0
|
||||
local wait = false
|
||||
minetest.register_globalstep(function(dtime)
|
||||
if timer<10 then
|
||||
if timer<2 then
|
||||
timer = timer+dtime
|
||||
return
|
||||
end
|
||||
timer = 0
|
||||
|
||||
if player_ges == player_in_bed and player_ges ~= 0 then
|
||||
local players = #minetest.get_connected_players()
|
||||
if players == player_in_bed and players ~= 0 then
|
||||
if minetest.env:get_timeofday() < 0.2 or minetest.env:get_timeofday() > 0.805 then
|
||||
if not wait then
|
||||
-- sound playback
|
||||
minetest.sound_play("papyrus_bed_snoring",{"papyrus_bed:bed", gain = 0.9, max_hear_distance = 10,})
|
||||
-- text message
|
||||
minetest.chat_send_all("Good night!")
|
||||
|
||||
minetest.after(2, function()
|
||||
minetest.env:set_timeofday(0.23)
|
||||
wait = false
|
||||
guy:set_physics_override(1,1,1)
|
||||
guy:setpos(exit(guy:getpos()))
|
||||
|
||||
end)
|
||||
wait = true
|
||||
for _,player in ipairs(minetest.get_connected_players()) do
|
||||
papyrus_bed_player_spawns[player:get_player_name()] = player:getpos()
|
||||
end
|
||||
local file = io.open(minetest.get_worldpath().."/papyrus_bed_player_spawns", "w")
|
||||
if file then
|
||||
file:write(minetest.serialize(papyrus_bed_player_spawns))
|
||||
file:close()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
if papyrus_bed_player_spawns[name] then
|
||||
player:setpos(papyrus_bed_player_spawns[name])
|
||||
return true
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"papyrus_bed:bed_bottom"},
|
||||
interval = 1,
|
||||
|
@ -220,85 +280,6 @@ minetest.register_abm({
|
|||
end
|
||||
})
|
||||
|
||||
beds_player_spawns = {}
|
||||
local file = io.open(minetest.get_worldpath().."/beds_player_spawns", "r")
|
||||
if file then
|
||||
beds_player_spawns = minetest.deserialize(file:read("*all"))
|
||||
file:close()
|
||||
if minetest.setting_get("log_mods") then
|
||||
minetest.log("action", "papyrus_bed loaded")
|
||||
end
|
||||
|
||||
local timer = 0
|
||||
local wait = false
|
||||
minetest.register_globalstep(function(dtime)
|
||||
if timer<2 then
|
||||
timer = timer+dtime
|
||||
return
|
||||
end
|
||||
timer = 0
|
||||
|
||||
local players = #minetest.get_connected_players()
|
||||
if players == player_in_bed and players ~= 0 then
|
||||
if minetest.env:get_timeofday() < 0.2 or minetest.env:get_timeofday() > 0.805 then
|
||||
if not wait then
|
||||
minetest.chat_send_all("Good night!!!")
|
||||
minetest.after(2, function()
|
||||
minetest.env:set_timeofday(0.23)
|
||||
wait = false
|
||||
end)
|
||||
wait = true
|
||||
for _,player in ipairs(minetest.get_connected_players()) do
|
||||
beds_player_spawns[player:get_player_name()] = player:getpos()
|
||||
end
|
||||
local file = io.open(minetest.get_worldpath().."/beds_player_spawns", "w")
|
||||
if file then
|
||||
file:write(minetest.serialize(beds_player_spawns))
|
||||
file:close()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
if beds_player_spawns[name] then
|
||||
player:setpos(beds_player_spawns[name])
|
||||
return true
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"papyrus_bed:bed_bottom"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node)
|
||||
local meta = minetest.env:get_meta(pos)
|
||||
if meta:get_string("player") ~= "" then
|
||||
local param2 = node.param2
|
||||
if param2 == 0 then
|
||||
pos.z = pos.z+1
|
||||
elseif param2 == 1 then
|
||||
pos.x = pos.x+1
|
||||
elseif param2 == 2 then
|
||||
pos.z = pos.z-1
|
||||
elseif param2 == 3 then
|
||||
pos.x = pos.x-1
|
||||
end
|
||||
local player = minetest.env:get_player_by_name(meta:get_string("player"))
|
||||
if player == nil then
|
||||
meta:set_string("player", "")
|
||||
player_in_bed = player_in_bed-1
|
||||
return
|
||||
end
|
||||
local player_pos = player:getpos()
|
||||
player_pos.x = math.floor(0.5+player_pos.x)
|
||||
player_pos.y = math.floor(0.5+player_pos.y)
|
||||
player_pos.z = math.floor(0.5+player_pos.z)
|
||||
if pos.x ~= player_pos.x or pos.y ~= player_pos.y or pos.z ~= player_pos.z then
|
||||
meta:set_string("player", "")
|
||||
player_in_bed = player_in_bed-1
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
Loading…
Reference in New Issue