a couple of small things

creative, item_drop sounds, classes removed
master
Mitori Itoshiki 2013-06-08 17:59:39 +04:00
parent ac3ac1b3ca
commit 25efea2f73
14 changed files with 5487 additions and 28271 deletions

View File

@ -1 +0,0 @@
default

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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
})