master
root 2022-03-14 23:45:45 +01:00
parent 2f8dd7de66
commit 389cd284e4
42 changed files with 974 additions and 66 deletions

View File

@ -1,4 +1,66 @@
local modname = ... local S, modname = ...
local singleplayer
if minetest.is_singleplayer() then
singleplayer = true
else
singleplayer = false
end
local multiplayer_timeofday = nil
local default_hours = 8
local _contexts = {}
local function get_context(name)
local context = _contexts[name] or {}
_contexts[name] = context
return context
end
local function compose_formspec(player_name, await)
local players_sleeping = 0
if not(singleplayer) then
players_sleeping = playerz.count_sleeping()
end
local formspec
if singleplayer or not(await) then
local context = get_context(player_name)
local hours = context.hours or tonumber(default_hours)
local timeofday = minetest.get_timeofday()
local btn_dawn_dusk, img_dawn_dusk, lbl_dawn_dusk
if timeofday > 0.2 and timeofday < 0.805 then
lbl_dawn_dusk = S("Dusk")
btn_dawn_dusk = "btn_dusk"
img_dawn_dusk = "moon.png^[transformR180"
else
lbl_dawn_dusk = S("Dawn")
btn_dawn_dusk = "btn_dawn"
img_dawn_dusk = "sun_icon.png"
end
formspec = [[
formspec_version[5]
size[6,4.25]
image[2,0;1,1;clock_white.png]
label[3,0.5;]]..helper.to_clock()..[[]
image_button_exit[2,1.75;2,1;;btn_hours;]]..hours.." "..S("Hours")..[[]
image_button_exit[1.5,3;1,1;]]..img_dawn_dusk..[[;]]..btn_dawn_dusk..[[;]]..lbl_dawn_dusk..[[]
button_exit[3.5,3;2,1;btn_leave;]]..S("Leave Bed")..[[]
scrollbaroptions[min=1;max=12;smallstep=1;largestep=12]
scrollbar[0.5,1;5,0.5;;scrollbar;]]..hours..[[]
]]
else --awaiting formspec
formspec = [[
formspec_version[5]
size[6,4.25]
label[0.5,0.5;]]..S("Players sleeping")..": "..tostring(players_sleeping)..[[]
label[0.5,1;]]..S("Connected players")..": "..tostring(playerz.count)..[[]
label[0.5,1.5;]]..S("Required players to sleep")..": "..tostring(math.floor(playerz.count/2)+ 1)..[[]
button_exit[3.5,3;2,1;btn_leave;]]..S("Leave Bed")..[[]
]]
end
return formspec
end
local function get_look_yaw(pos) local function get_look_yaw(pos)
local rotation = minetest.get_node(pos).param2 local rotation = minetest.get_node(pos).param2
@ -16,41 +78,91 @@ local function get_look_yaw(pos)
end end
end end
local function unmark_bed(pos) function bedz.check_bed(pos)
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node_or_nil(pos)
if not node then if (not node) or (minetest.get_node_group(node.name, "bed") == 0) then --not a bed
return return false
else
return true
end end
if minetest.get_node_group(node.name, "bed") == 0 then --not a bed
return
end end
local function unmark_bed(pos)
if bedz.check_bed(pos) then
minetest.get_meta(pos):set_string("bedside", "") --unmark the bed minetest.get_meta(pos):set_string("bedside", "") --unmark the bed
end end
end
local function rest_player(player, rest)
local hp = player:get_hp()
hp = hp + (rest * 0.5)
player:set_hp(hp)
end
local function stop_sleep(player) local function stop_sleep(player)
local meta = player:get_meta() local meta = player:get_meta()
local player_name = player:get_player_name()
unmark_bed(minetest.string_to_pos(meta:get_string("bedz:bed_pos"))) unmark_bed(minetest.string_to_pos(meta:get_string("bedz:bed_pos")))
playerphysics.remove_physics_factor(player, "speed", "bedz") playerphysics.remove_physics_factor(player, "speed", "bedz")
playerphysics.remove_physics_factor(player, "jump", "bedz") playerphysics.remove_physics_factor(player, "jump", "bedz")
playerphysics.remove_physics_factor(player, "gravity", "bedz") playerphysics.remove_physics_factor(player, "gravity", "bedz")
playerz.set_status(player, "normal") playerz.set_status(player, "normal")
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
minetest.close_formspec(player_name, "bedz:form")
--playerz.player_attached[player_name] = false
end end
minetest.register_on_dieplayer(function(player, reason) local function awake(player, rest)
if playerz.get_status(player) == "sleep" then if playerz.get_status(player) == "sleep" then
stop_sleep(player) stop_sleep(player, rest)
if rest then
rest_player(player, rest)
end
return true
else
return false
end end
end)
minetest.register_on_leaveplayer(function(player)
if playerz.get_status(player) == "sleep" then
stop_sleep(player)
end end
end)
local function awake(player) local function close_all_forms()
stop_sleep(player) for _, _player in ipairs(minetest.get_connected_players()) do
if playerz.get_status(_player) == "sleep" then
awake(_player, nil)
minetest.close_formspec(_player:get_player_name(), "bedz:form")
end
end
end
local function calculate_hours(timeofday)
local current_hour = helper.what_hour()
--minetest.chat_send_all(tostring(current_hour))
local hour = helper.what_hour(timeofday)
--minetest.chat_send_all(tostring(hour))
local hours
if (current_hour > hour) then
hours = 24 - current_hour + hour
else
hours = hour - current_hour
end
return tostring(hours)
end
local function multiplayer_sleep()
local players_sleeping = playerz.count_sleeping()
local slept
if multiplayer_timeofday and (players_sleeping > (playerz.count / 2)) then
local hours = calculate_hours(multiplayer_timeofday)
minetest.set_timeofday(multiplayer_timeofday)
for _, _player in ipairs(minetest.get_connected_players()) do
minetest.chat_send_player(_player:get_player_name(), "You have slept".." "..hours.." ".."hours")
awake(_player, hours) --awake all players
end
multiplayer_timeofday = nil
slept = true
else
slept = false
end
return slept, players_sleeping
end end
local function sleep(pos, player) local function sleep(pos, player)
@ -58,7 +170,7 @@ local function sleep(pos, player)
local meta_bed = minetest.get_meta(pos) local meta_bed = minetest.get_meta(pos)
meta_bed:set_string("bedside", player_name) --mark the bed meta_bed:set_string("bedside", player_name) --mark the bed
--playerz.player_attached[player_name] = true
-- physics, eye_offset, etc -- physics, eye_offset, etc
player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0})
local yaw, param2 = get_look_yaw(pos) local yaw, param2 = get_look_yaw(pos)
@ -66,16 +178,30 @@ local function sleep(pos, player)
local dir = minetest.facedir_to_dir(param2) local dir = minetest.facedir_to_dir(param2)
local player_pos = { local player_pos = {
x = pos.x + dir.x / 3, x = pos.x + dir.x / 3,
y = pos.y + 0.07, y = pos.y + 0.31,
z = pos.z + dir.z / 3 z = pos.z + dir.z / 3
} }
playerz.set_status(player, "sleep")
playerphysics.add_physics_factor(player, "speed", "bedz", 0) playerphysics.add_physics_factor(player, "speed", "bedz", 0)
playerphysics.add_physics_factor(player, "jump", "bedz", 0) playerphysics.add_physics_factor(player, "jump", "bedz", 0)
playerphysics.add_physics_factor(player, "gravity", "bedz", 0) playerphysics.add_physics_factor(player, "gravity", "bedz", 0)
player:set_pos(player_pos) player:set_pos(player_pos)
player:get_meta():set_string("bedz:bed_pos", minetest.pos_to_string(pos)) player:get_meta():set_string("bedz:bed_pos", minetest.pos_to_string(pos))
playerz.set_status(player, "sleep")
local await
if singleplayer or (playerz.count == 1) then
await = false
else
local slept, players_sleeping = multiplayer_sleep()
if slept then
return
end
if (players_sleeping) == 1 and not(multiplayer_timeofday) then
await = false
else
await = true
end
end
minetest.show_formspec(player_name , "bedz:form", compose_formspec(player_name, await))
end end
local function use_bed(pos, player) local function use_bed(pos, player)
@ -105,9 +231,9 @@ local function use_bed(pos, player)
end end
if bedside == player_name then if bedside == player_name then
return false, "You are already in bed" return false, S("You are already in bed")
elseif not(bedside == "") then elseif not(bedside == "") then
return false, "This bed is already occupied" return false, S("This bed is already occupied")
end end
--Sleep --Sleep
@ -115,8 +241,6 @@ local function use_bed(pos, player)
return true return true
end end
--minetest.chat_send_all("test")
local function place_bed(bed_name, placer, pointed_thing) local function place_bed(bed_name, placer, pointed_thing)
local above_pos = pointed_thing.above local above_pos = pointed_thing.above
local placer_dir = vector.round(placer:get_look_dir()) local placer_dir = vector.round(placer:get_look_dir())
@ -138,7 +262,8 @@ function bedz.register_bed(name, def)
description = def.description, description = def.description,
inventory_image = def.inventory_image or "", inventory_image = def.inventory_image or "",
wield_image = def.wield_image or def.inventory_image, wield_image = def.wield_image or def.inventory_image,
drawtype = "nodebox", drawtype = "mesh",
mesh = "bedz_simple_bed.obj",
tiles = def.tiles, tiles = def.tiles,
use_texture_alpha = "clip", use_texture_alpha = "clip",
paramtype = "light", paramtype = "light",
@ -147,10 +272,6 @@ function bedz.register_bed(name, def)
stack_max = 1, stack_max = 1,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1},
sounds = sound.wood(), sounds = sound.wood(),
node_box = {
type = "fixed",
fixed = def.nodebox,
},
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = def.selectionbox, fixed = def.selectionbox,
@ -175,9 +296,80 @@ function bedz.register_bed(name, def)
if not(bedside == "") then if not(bedside == "") then
local player = minetest.get_player_by_name(bedside) local player = minetest.get_player_by_name(bedside)
if player then if player then
stop_sleep(player) stop_sleep(player, nil)
end end
end end
end end
}) })
end end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "bedz:form" then
return
end
local player_name = player:get_player_name()
local context = get_context(player_name)
local new_timeofday = nil
if fields.btn_dawn then
new_timeofday = 0.23
elseif fields.btn_dusk then
new_timeofday = 0.805
elseif fields.btn_hours then
local sleep_hours = tonumber(context.hours) or default_hours
local hours = sleep_hours/24
local timeofday = minetest.get_timeofday()
if (timeofday+hours) > 1 then
timeofday = (timeofday + hours) - 1
else
timeofday = timeofday + hours
end
new_timeofday = timeofday
elseif fields.quit then
awake(player, nil)
if not singleplayer then
multiplayer_timeofday = nil
close_all_forms()
end
return
elseif fields.scrollbar then
local scrollbar = minetest.explode_scrollbar_event(fields.scrollbar)
if scrollbar.type == "CHG" then
context.hours = scrollbar.value
minetest.show_formspec(player_name, "bedz:form", compose_formspec(player_name))
return
end
end
if singleplayer or (playerz.count == 1) then
--singleplayer or only one player in multiplayer
local hours = calculate_hours(new_timeofday)
minetest.chat_send_player(player_name, S("You have slept").." "..hours.." "
..S("hours"))
minetest.set_timeofday(new_timeofday)
awake(player, hours)
else --multiplayer, #players>1
if new_timeofday then --set the multiplayer new timeofday for the first time
multiplayer_timeofday = new_timeofday
end
local slept = multiplayer_sleep()
if slept then
return
else --awating formspec
minetest.show_formspec(player_name, "bedz:form", compose_formspec(player_name, true))
end
end
end)
--Player Status
minetest.register_on_dieplayer(function(player, reason)
awake(player, nil)
end)
minetest.register_on_leaveplayer(function(player)
awake(player, nil)
_contexts[player:get_player_name()] = nil
end)
minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
return awake(player, nil)
end)

View File

@ -2,20 +2,22 @@ local S = ...
bedz.register_bed("simple_bed", { bedz.register_bed("simple_bed", {
description= S("Bed"), description= S("Bed"),
nodebox = { mesh = "bedz_simple_bed.obj",
{-0.5, -0.125, -0.5, 0.5, 0.125, 1.5}, -- NodeBox1
{-0.4375, -0.5, -0.4375, -0.3125, -0.125, -0.3125}, -- NodeBox2
{-0.4375, 0.125, 1.3125, -0.3125, 0.5, 1.4375}, -- NodeBox3
{0.3125, 0.125, 1.3125, 0.4375, 0.5, 1.4375}, -- NodeBox4
{-0.3125, 0.25, 1.3125, 0.3125, 0.375, 1.4375}, -- NodeBox5
{0.3125, -0.5, -0.4375, 0.4375, -0.125, -0.3125}, -- NodeBox6
{-0.4375, -0.5, 1.3125, -0.3125, -0.125, 1.4375}, -- NodeBox7
{0.3125, -0.5, 1.3125, 0.4375, -0.125, 1.4375}, -- NodeBox8
},
tiles = { tiles = {
"treez_cherry_tree_wood.png", "bedz_simple_bed.png",
}, },
selectionbox = { selectionbox = {
{-0.5, -0.5, -0.5, 0.5, 0.125, 1.5}, {-0.5, -0.5, -0.5, 0.5, 0.125, 1.5},
}, },
inventory_image = "bedz_simple_bed_inv.png",
})
minetest.register_craft({
output = "bedz:simple_bed",
type = "shaped",
recipe = {
{"group:wood", "",
"treez:stick"},{"treez:stick", "", ""},
{"", "", ""},
}
}) })

View File

@ -3,5 +3,6 @@ bedz = {}
local modname = minetest.get_current_modname() local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname) local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname) local S = minetest.get_translator(modname)
assert(loadfile(modpath .. "/api.lua"))(modname) assert(loadfile(modpath .. "/api.lua"))(S,modname)
assert(loadfile(modpath .. "/beds.lua"))(S) assert(loadfile(modpath .. "/beds.lua"))(S)
assert(loadfile(modpath .. "/spawn.lua"))()

View File

@ -1,2 +1,10 @@
# textdomain: bedz # textdomain: bedz
Bed=Cama Bed=Cama
Dawn=Amanecer
Dusk=Atardecer
Hours=Horas
hours=horas
Leave Bed=Abandonar cama
This bed is already occupied=Esta cama ya está ocupada
You are already in bed=Ya estás en cama
You have slept=Has dormido

BIN
mods/bedz/models/bed.nbe Normal file

Binary file not shown.

13
mods/bedz/models/bedz.mtl Normal file
View File

@ -0,0 +1,13 @@
# Blender MTL File: 'simple_bed.blend'
# Material Count: 1
newmtl none
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd /opt/minetest/games/samz/mods/bedz/textures/bedz_simple_bed.png

View File

@ -0,0 +1,13 @@
# Blender MTL File: 'simple_bed.blend'
# Material Count: 1
newmtl none
Ns 225.000000
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.450000
d 1.000000
illum 2
map_Kd /opt/minetest/games/samz/mods/bedz/textures/bedz_simple_bed.png

View File

@ -0,0 +1,273 @@
# Blender v2.83.5 OBJ File: 'simple_bed.blend'
# www.blender.org
mtllib bedz_simple_bed.mtl
o bed_converted_out
v 0.500000 -0.125000 -0.500000
v 0.500000 -0.125000 1.500000
v 0.500000 0.125000 1.500000
v 0.500000 0.125000 -0.500000
v -0.500000 -0.125000 -0.500000
v -0.500000 -0.125000 1.500000
v -0.500000 0.125000 1.500000
v -0.500000 0.125000 -0.500000
v 0.437500 -0.500000 -0.437500
v 0.437500 -0.500000 -0.312500
v 0.437500 -0.125000 -0.312500
v 0.437500 -0.125000 -0.437500
v 0.312500 -0.500000 -0.437500
v 0.312500 -0.500000 -0.312500
v 0.312500 -0.125000 -0.312500
v 0.312500 -0.125000 -0.437500
v 0.437500 0.125000 1.312500
v 0.437500 0.125000 1.437468
v 0.437500 0.500000 1.437468
v 0.437500 0.500000 1.312500
v 0.312500 0.125000 1.312500
v 0.312500 0.125000 1.437468
v 0.312500 0.500000 1.437468
v 0.312500 0.500000 1.312500
v -0.312500 0.125000 1.312500
v -0.312500 0.125000 1.437500
v -0.312500 0.500000 1.437500
v -0.312500 0.500000 1.312500
v -0.437500 0.125000 1.312500
v -0.437500 0.125000 1.437500
v -0.437500 0.500000 1.437500
v -0.437500 0.500000 1.312500
v 0.312500 0.250000 1.312500
v 0.312500 0.250000 1.437500
v 0.312500 0.375000 1.437500
v 0.312500 0.375000 1.312500
v -0.312500 0.250000 1.312500
v -0.312500 0.250000 1.437500
v -0.312500 0.375000 1.437500
v -0.312500 0.375000 1.312500
v -0.312500 -0.500000 -0.437500
v -0.312500 -0.500000 -0.312500
v -0.312500 -0.125000 -0.312500
v -0.312500 -0.125000 -0.437500
v -0.437500 -0.500000 -0.437500
v -0.437500 -0.500000 -0.312500
v -0.437500 -0.125000 -0.312500
v -0.437500 -0.125000 -0.437500
v 0.437500 -0.500000 1.312500
v 0.437500 -0.500000 1.437500
v 0.437500 -0.125000 1.437500
v 0.437500 -0.125000 1.312500
v 0.312500 -0.500000 1.312500
v 0.312500 -0.500000 1.437500
v 0.312500 -0.125000 1.437500
v 0.312500 -0.125000 1.312500
v -0.312500 -0.500000 1.312500
v -0.312500 -0.500000 1.437500
v -0.312500 -0.125000 1.437500
v -0.312500 -0.125000 1.312500
v -0.437500 -0.500000 1.312500
v -0.437500 -0.500000 1.437500
v -0.437500 -0.125000 1.437500
v -0.437500 -0.125000 1.312500
vt 0.468750 0.000000
vt 0.468750 1.000000
vt 0.593750 1.000000
vt 0.593750 0.000000
vt 0.468750 0.000000
vt 0.468750 1.000000
vt 0.593750 1.000000
vt 0.593750 0.000000
vt 0.468750 0.062500
vt 0.593750 0.062500
vt 0.593750 0.500000
vt 0.468750 0.500000
vt 0.000000 0.437500
vt 0.000000 0.312500
vt 0.500000 0.312500
vt 0.500000 0.437500
vt 0.500000 0.000000
vt 0.500000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.500000 1.000000
vt 0.500000 0.000000
vt 0.312500 0.812500
vt 0.375000 0.812500
vt 0.375000 1.000000
vt 0.312500 1.000000
vt 0.093750 0.812500
vt 0.156250 0.812500
vt 0.156250 1.000000
vt 0.093750 1.000000
vt 0.125000 0.812500
vt 0.125000 1.000000
vt 0.062500 1.000000
vt 0.062500 0.812500
vt 0.500000 0.812500
vt 0.500000 1.000000
vt 0.437500 1.000000
vt 0.437500 0.812500
vt 0.218750 0.593750
vt 0.218750 0.531250
vt 0.281250 0.531250
vt 0.281250 0.593750
vt 0.437500 0.187500
vt 0.375000 0.187500
vt 0.375000 0.000000
vt 0.437500 0.000000
vt 0.093750 0.187500
vt 0.031250 0.187500
vt 0.031250 0.000000
vt 0.093750 0.000000
vt 0.062500 0.187500
vt 0.062500 0.000000
vt 0.125000 0.000000
vt 0.125000 0.187500
vt 0.218750 0.187500
vt 0.218750 0.000000
vt 0.281250 0.000000
vt 0.281250 0.187500
vt 0.187500 0.750000
vt 0.187500 0.687500
vt 0.250000 0.687500
vt 0.250000 0.750000
vt 0.187500 0.187500
vt 0.125000 0.187500
vt 0.125000 0.000000
vt 0.187500 0.000000
vt 0.093750 0.687500
vt 0.031250 0.687500
vt 0.031250 0.500000
vt 0.093750 0.500000
vt 0.375000 0.687500
vt 0.375000 0.500000
vt 0.437500 0.500000
vt 0.437500 0.687500
vt 0.218750 0.468750
vt 0.218750 0.656250
vt 0.156250 0.656250
vt 0.156250 0.468750
vt 0.062500 0.625000
vt 0.062500 0.562500
vt 0.125000 0.562500
vt 0.125000 0.625000
vt 0.062500 0.312500
vt 0.125000 0.312500
vt 0.125000 0.625000
vt 0.062500 0.625000
vt 0.062500 0.687500
vt 0.125000 0.687500
vt 0.125000 1.000000
vt 0.062500 1.000000
vt 0.375000 0.312500
vt 0.437500 0.312500
vt 0.437500 0.625000
vt 0.375000 0.625000
vt 0.281250 0.562500
vt 0.343750 0.562500
vt 0.343750 0.875000
vt 0.281250 0.875000
vt 0.343750 0.593750
vt 0.406250 0.593750
vt 0.406250 0.781250
vt 0.343750 0.781250
vt 0.156250 0.812500
vt 0.093750 0.812500
vt 0.093750 0.625000
vt 0.156250 0.625000
vt 0.312500 0.812500
vt 0.312500 0.625000
vt 0.375000 0.625000
vt 0.375000 0.812500
vt 0.218750 0.812500
vt 0.218750 0.625000
vt 0.281250 0.625000
vt 0.281250 0.812500
vt 0.343750 0.218750
vt 0.343750 0.156250
vt 0.406250 0.156250
vt 0.406250 0.218750
vt 0.312500 0.531250
vt 0.375000 0.531250
vt 0.375000 0.718750
vt 0.312500 0.718750
vt 0.406250 0.531250
vt 0.468750 0.531250
vt 0.468750 0.718750
vt 0.406250 0.718750
vt 0.343750 0.531250
vt 0.343750 0.718750
vt 0.281250 0.718750
vt 0.281250 0.531250
vt 0.125000 0.531250
vt 0.125000 0.718750
vt 0.062500 0.718750
vt 0.062500 0.531250
vt 0.312500 0.375000
vt 0.312500 0.312500
vt 0.375000 0.312500
vt 0.375000 0.375000
vt 0.375000 0.250000
vt 0.437500 0.250000
vt 0.437500 0.437500
vt 0.375000 0.437500
vt 0.312500 0.250000
vt 0.375000 0.250000
vt 0.375000 0.437500
vt 0.312500 0.437500
vt 0.500000 0.250000
vt 0.500000 0.437500
vt 0.437500 0.437500
vt 0.437500 0.250000
vt 0.125000 0.250000
vt 0.125000 0.437500
vt 0.062500 0.437500
vt 0.062500 0.250000
vt 0.156250 0.406250
vt 0.156250 0.343750
vt 0.218750 0.343750
vt 0.218750 0.406250
vn -1.0000 0.0000 0.0000
vn 0.0000 0.0000 1.0000
vn 0.0000 -1.0000 -0.0000
usemtl none
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/1 6/6/1 7/7/1 8/8/1
f 1/9/2 4/10/2 8/11/2 5/12/2
f 2/13/2 3/14/2 7/15/2 6/16/2
f 1/17/3 2/18/3 6/19/3 5/20/3
f 4/21/3 3/22/3 7/23/3 8/24/3
f 9/25/1 10/26/1 11/27/1 12/28/1
f 13/29/1 14/30/1 15/31/1 16/32/1
f 9/33/2 12/34/2 16/35/2 13/36/2
f 10/37/2 11/38/2 15/39/2 14/40/2
f 9/41/3 10/42/3 14/43/3 13/44/3
f 17/45/1 18/46/1 19/47/1 20/48/1
f 21/49/1 22/50/1 23/51/1 24/52/1
f 17/53/2 20/54/2 24/55/2 21/56/2
f 18/57/2 19/58/2 23/59/2 22/60/2
f 20/61/3 19/62/3 23/63/3 24/64/3
f 25/65/1 26/66/1 27/67/1 28/68/1
f 29/69/1 30/70/1 31/71/1 32/72/1
f 25/73/2 28/74/2 32/75/2 29/76/2
f 26/77/2 27/78/2 31/79/2 30/80/2
f 28/81/3 27/82/3 31/83/3 32/84/3
f 33/85/2 36/86/2 40/87/2 37/88/2
f 34/89/2 35/90/2 39/91/2 38/92/2
f 33/93/3 34/94/3 38/95/3 37/96/3
f 36/97/3 35/98/3 39/99/3 40/100/3
f 41/101/1 42/102/1 43/103/1 44/104/1
f 45/105/1 46/106/1 47/107/1 48/108/1
f 41/109/2 44/110/2 48/111/2 45/112/2
f 42/113/2 43/114/2 47/115/2 46/116/2
f 41/117/3 42/118/3 46/119/3 45/120/3
f 49/121/1 50/122/1 51/123/1 52/124/1
f 53/125/1 54/126/1 55/127/1 56/128/1
f 49/129/2 52/130/2 56/131/2 53/132/2
f 50/133/2 51/134/2 55/135/2 54/136/2
f 49/137/3 50/138/3 54/139/3 53/140/3
f 57/141/1 58/142/1 59/143/1 60/144/1
f 61/145/1 62/146/1 63/147/1 64/148/1
f 57/149/2 60/150/2 64/151/2 61/152/2
f 58/153/2 59/154/2 63/155/2 62/156/2
f 57/157/3 58/158/3 62/159/3 61/160/3

Binary file not shown.

Binary file not shown.

Binary file not shown.

14
mods/bedz/spawn.lua Normal file
View File

@ -0,0 +1,14 @@
minetest.register_on_respawnplayer(function(player)
local pos_str = player:get_meta():get_string("bedz:bed_pos") --get the bed pos
if pos_str == "" then
return false
end
local pos = minetest.string_to_pos(pos_str)
if bedz.check_bed(pos) then --if bed exists
pos = vector.new(pos.x, pos.y + 1, pos.z)
player:set_pos(pos)
return true
else
return false
end
end)

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

213
mods/farmz/api.lua Normal file
View File

@ -0,0 +1,213 @@
local S, modname = ...
-- Grow Timer
local function start_grow(pos, _time)
local timer = minetest.get_node_timer(pos)
timer:start(_time)
end
--Plow Node
local function remove_soil(pos)
if helper.in_group(pos, "soil") then
minetest.remove_node(pos)
end
end
minetest.register_node("farmz:plow", {
description = S("Plowed Soil"),
drawtype = "nodebox" ,
paramtype = "light",
node_box = helper.nodebox.flat,
walkable = false,
tiles = {"farmz_plow.png"},
buildable_to = true,
groups = {crumbly = 3, dirt = 1, plow = 1, not_in_creative_inventory = 1},
sounds = sound.dirt(),
after_destruct = function(pos, oldnode)
--destroy the soil under
local node = minetest.get_node_or_nil(pos)
if node and node.name == "air" then
remove_soil({x=pos.x, y=pos.y-1, z=pos.z})
end
end
})
farmz.hoe_use = function(itemstack, user, pointed_thing)
-- check if pointing at a node
if not(pointed_thing) or (pointed_thing.type ~= "node") then
return
end
local node_under = minetest.get_node(pointed_thing.under)
local pos_above = {x=pointed_thing.under.x, y=pointed_thing.under.y+1, z=pointed_thing.under.z}
local node_above = minetest.get_node(pos_above)
-- return if any of the nodes is not registered
if not(minetest.registered_nodes[node_under.name]) or not minetest.registered_nodes[node_above.name] then
return
end
-- check if the node above the pointed thing is air
if node_above.name ~= "air" then
return
end
-- check if pointing at soil
if minetest.get_item_group(node_under.name, "soil") ~= 1 then
return
end
local player_name = user and user:get_player_name() or ""
if minetest.is_protected(pointed_thing.under, player_name) then
minetest.record_protection_violation(pointed_thing.under, player_name)
return
end
if minetest.is_protected(pointed_thing.above, player_name) then
minetest.record_protection_violation(pointed_thing.above, player_name)
return
end
-- put the above node into soil and play sound
minetest.set_node(pos_above, {name = "farmz:plow"})
minetest.sound_play("default_dig_crumbly", {
pos = pointed_thing.under,
gain = 0.5,
}, true)
return itemstack
end
function farmz.register_hoe(name, def)
local hoe_name = modname..":"..name
minetest.register_tool(hoe_name, {
description = def.description,
inventory_image = def.inventory_image,
wield_image = def.wield_image or def.inventory_image,
on_use = function(itemstack, user, pointed_thing)
return farmz.hoe_use(itemstack, user, pointed_thing)
end,
groups = def.groups,
sound = {breaks = "default_tool_breaks"},
})
end
function farmz.register_plant(name, def)
local plant_name = modname..":"..name
for i = 1,2 do
local description = ""
local _type = ""
local _plant_name = ""
local texture = modname.."_"..name
if i == 1 then
_type = "plant"
_plant_name = plant_name.."_plant"
texture = modname.."_"..name.."_plant.png"
description = def.description.." "..S("Plant")
else
_type = "sprout"
_plant_name = plant_name.."_sprout"
texture = modname.."_"..name.."_sprout.png"
description = def.description.." "..S("Plant").." ".."("..S("Sprout")..")"
end
minetest.register_node(_plant_name, {
description = description,
inventory_image = def.inventory_image or texture,
wield_image = def.wield_image or def.inventory_image or texture,
drawtype = "nodebox",
paramtype = "light",
walkable = false,
node_box = helper.nodebox.plant,
tiles = {
"farmz_plow.png",
"farmz_plow.png",
texture,
},
selection_box = {
type = "fixed",
fixed = def.box,
},
buildable_to = true,
groups = {crumbly = 1, plant = 1, not_in_creative_inventory = 1},
sounds = sound.dirt(),
after_place_node = function(pos, placer, itemstack, pointed_thing)
if i == 2 then
start_grow(pos, def.grow_time)
end
end,
on_timer = function(pos)
minetest.set_node(pos, {name = plant_name.."_plant"})
return false
end,
after_destruct = function(pos, oldnode)
--destroy the soil under
local node = minetest.get_node_or_nil(pos)
if node and node.name == "air" then
minetest.swap_node(pos, {name="farmz:plow"})
end
end
})
end
local seed_name = plant_name.."_seed"
local seed_name_soil = seed_name.."_soil"
local seed_texture = modname.."_"..name.."_seed.png"
minetest.register_craftitem(seed_name, {
description = def.description.." ".."("..S("Seed")..")",
inventory_image = seed_texture,
groups = {seed = 1},
on_use = function(itemstack, user, pointed_thing)
-- check if pointing at a node
if not(pointed_thing) or (pointed_thing.type ~= "node") then
return
end
local pos = pointed_thing.under
local node = minetest.get_node(pos)
-- return if any of the nodes is not registered
if not(minetest.registered_nodes[node.name]) then
return
end
if node.name == "farmz:plow" then
minetest.set_node(pos, {name = seed_name_soil})
start_grow(pos, def.grow_time)
end
itemstack:take_item(1)
return itemstack
end
})
minetest.register_node(seed_name_soil, {
description = def.description.." ".."("..S("Seed Soil")..")",
drawtype = "nodebox",
paramtype = "light",
walkable = false,
node_box = helper.nodebox.flat,
tiles = {"farmz_plow.png^"..seed_texture},
buildable_to = true,
groups = {crumbly = 3, dirt = 1, plow = 1, not_in_creative_inventory = 1},
sounds = sound.dirt(),
after_place_node = function(pos, placer, itemstack, pointed_thing)
start_grow(pos, def.grow_time)
end,
on_timer = function(pos)
minetest.set_node(pos, {name = plant_name.."_sprout"})
start_grow(pos, def.grow_time)
return false
end,
after_destruct = function(pos, oldnode)
--destroy the soil under
local node = minetest.get_node_or_nil(pos)
if node and node.name == "air" then
remove_soil({x=pos.x, y=pos.y-1, z=pos.z})
end
end
})
end

23
mods/farmz/grasses.lua Normal file
View File

@ -0,0 +1,23 @@
local S = ...
-- Grasses
minetest.register_node("farmz:grass", {
description = S("Grass"),
drawtype = "plantlike",
waving = 1,
tiles = {"farmz_grass.png"},
inventory_image = "farmz_grass.png",
wield_image = "farmz_grass.png",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
buildable_to = true,
groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1,
normal_grass = 1, flammable = 1},
sounds = sound:leaves(),
selection_box = {
type = "fixed",
fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16},
},
})

5
mods/farmz/hoes.lua Normal file
View File

@ -0,0 +1,5 @@
local S = ...
farmz.register_hoe("stone_Hoe" ,{
description = S("Stone Hoe"),
})

10
mods/farmz/init.lua Normal file
View File

@ -0,0 +1,10 @@
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname)
farmz = {}
assert(loadfile(modpath .. "/api.lua"))(S,modname)
assert(loadfile(modpath .. "/hoes.lua"))(S)
assert(loadfile(modpath .. "/grasses.lua"))(S)
assert(loadfile(modpath .. "/plants.lua"))(S)

View File

@ -0,0 +1,8 @@
# textdomain: farmz
Plant=Planta
Plowed Soil=Tierra arada
Seed=Semilla
Seed Soil=Cultivo con semillas
Sprout=brote
Wheat=Trigo

3
mods/farmz/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = farmz
description = Farming
depends = helper

7
mods/farmz/plants.lua Normal file
View File

@ -0,0 +1,7 @@
local S = ...
farmz.register_plant("wheat", {
description = S("Wheat"),
box = {-4/16, -0.5, -4/16, 4/16, 4/16, 4/16},
grow_time = 5,
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

View File

@ -1,5 +1,15 @@
helper = {} helper = {}
helper.vector = {} helper.vector = {}
helper.nodebox = {}
function helper.in_group(pos, group)
local node = minetest.get_node_or_nil(pos)
if (not node) or (minetest.get_node_group(node.name, group) == 0) then
return false
else
return true
end
end
function helper.get_nodedef_field(nodename, fieldname) function helper.get_nodedef_field(nodename, fieldname)
if not minetest.registered_nodes[nodename] then if not minetest.registered_nodes[nodename] then
@ -7,3 +17,43 @@ function helper.get_nodedef_field(nodename, fieldname)
end end
return minetest.registered_nodes[nodename][fieldname] return minetest.registered_nodes[nodename][fieldname]
end end
function helper.to_clock(timeofday)
local seconds = math.round(24000*(timeofday or minetest.get_timeofday())*3.6)
if seconds <= 0 then
return "00:00"
else
local hours = string.format("%02.f", math.floor(seconds/3600))
local mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)))
--secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60));
return hours..":"..mins
end
end
function helper.what_hour(timeofday)
local seconds = math.round(24000*(timeofday or minetest.get_timeofday())*3.6)
if seconds <= 0 then
return 0
else
local hours = math.floor(seconds/3600)
return hours
end
end
-- Nodeboxes
helper.nodebox.flat = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.499, 0.5}, -- Flat Plane
},
}
helper.nodebox.plant = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.499, 0.5}, -- Flat Plane
{-0.5, -0.5, 0.0, 0.5, 0.5, 0.0},
{0, -0.5, -0.5, 0, 0.5, 0.5},
}
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

View File

@ -348,3 +348,24 @@ minetest.register_decoration({
place_offset_y = -1, place_offset_y = -1,
flags = "place_center_x, place_center_z, force_placement", flags = "place_center_x, place_center_z, force_placement",
}) })
-- Grasses
minetest.register_decoration({
name = "farmz:grass",
decoration = "farmz:grass",
deco_type = "simple",
place_on = {"nodez:dirt_with_grass"},
sidelen = 16,
noise_params = {
offset = 0.015,
scale = 0.045,
spread = {x = 200, y = 200, z = 200},
seed = 32559,
octaves = 3,
persist = 0.6
},
biomes = {"forest"},
y_max = mapgen.biomes.peaky_mountain_height,
y_min = 1,
})

View File

@ -1,3 +1,3 @@
name = mapgen name = mapgen
description = Minimal map generator description = Minimal map generator
depends = nodez depends = nodez, farmz

View File

@ -1,10 +1,26 @@
local S = ... local S, farmz_mod = ...
local function remove_plow(pos)
if helper.in_group(pos, "plow") or helper.in_group(pos, "plant") then
minetest.swap_node(pos, {name="air"})
end
end
local function destroy_plow(pos)
if not farmz_mod then
return
end
remove_plow({x=pos.x, y=pos.y+1, z=pos.z})
end
minetest.register_node("nodez:dirt", { minetest.register_node("nodez:dirt", {
description = S("Dirt"), description = S("Dirt"),
tiles = {"nodez_dirt.png"}, tiles = {"nodez_dirt.png"},
groups = {crumbly=3, dirt=1, soil=1}, groups = {crumbly=3, dirt=1, soil=1},
sounds = sound.dirt(), sounds = sound.dirt(),
on_destruct = function(pos)
destroy_plow(pos)
end
}) })
minetest.register_node("nodez:dirt_with_grass", { minetest.register_node("nodez:dirt_with_grass", {
@ -16,6 +32,9 @@ minetest.register_node("nodez:dirt_with_grass", {
tileable_vertical = false}}, tileable_vertical = false}},
groups = {crumbly=3, dirt=1, soil=1}, groups = {crumbly=3, dirt=1, soil=1},
sounds = sound.dirt(), sounds = sound.dirt(),
on_destruct = function(pos)
destroy_plow(pos)
end
}) })
--Snow --Snow
@ -30,6 +49,9 @@ minetest.register_node("nodez:dirt_with_snow", {
sounds = sound.dirt({ sounds = sound.dirt({
footstep = {name = "sound_snow_footstep", gain = 0.2}, footstep = {name = "sound_snow_footstep", gain = 0.2},
}), }),
on_destruct = function(pos)
destroy_plow(pos)
end
}) })
--Pottery --Pottery

View File

@ -1 +0,0 @@
local S = ...

View File

@ -8,9 +8,14 @@ local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname) local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname) local S = minetest.get_translator(modname)
assert(loadfile(modpath .. "/dirt.lua"))(S) local farmz_mod
if minetest.get_modpath("farmz") ~= nil then
farmz_mod = true
end
assert(loadfile(modpath .. "/dirt.lua"))(S, farmz_mod)
assert(loadfile(modpath .. "/gems.lua"))(S) assert(loadfile(modpath .. "/gems.lua"))(S)
assert(loadfile(modpath .. "/grass.lua"))(S)
assert(loadfile(modpath .. "/metals.lua"))(S) assert(loadfile(modpath .. "/metals.lua"))(S)
assert(loadfile(modpath .. "/mese.lua"))(S) assert(loadfile(modpath .. "/mese.lua"))(S)
assert(loadfile(modpath .. "/lava.lua"))(S) assert(loadfile(modpath .. "/lava.lua"))(S)

View File

@ -1,2 +1,3 @@
name = nodez name = nodez
description = Contains basic nodes for mapgen description = Contains basic nodes for mapgen
depends = farmz

View File

@ -25,6 +25,7 @@ local player_textures = {}
local player_anim = {} local player_anim = {}
local player_sneak = {} local player_sneak = {}
playerz.player_attached = {} playerz.player_attached = {}
playerz.count = 0 --Total number of connected players
function playerz.get_animation(player) function playerz.get_animation(player)
local name = player:get_player_name() local name = player:get_player_name()
@ -180,15 +181,6 @@ function playerz.set_animation(player, anim_name, speed)
player:set_animation(anim, speed or model.animation_speed, animation_blend) player:set_animation(anim, speed or model.animation_speed, animation_blend)
end end
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
player_model[name] = nil
player_anim[name] = nil
player_textures[name] = nil
player_sneak[name] = nil
playerz.player_attached[name] = nil
end)
-- Localize for better performance. -- Localize for better performance.
local player_set_animation = playerz.set_animation local player_set_animation = playerz.set_animation
local player_attached = playerz.player_attached local player_attached = playerz.player_attached
@ -196,7 +188,7 @@ local player_attached = playerz.player_attached
-- Prevent knockback for attached players -- Prevent knockback for attached players
local old_calculate_knockback = minetest.calculate_knockback local old_calculate_knockback = minetest.calculate_knockback
function minetest.calculate_knockback(player, ...) function minetest.calculate_knockback(player, ...)
if player_attached[player:get_player_name()] then if player_attached[player:get_player_name()] or playerz.is_sleeping(player) then
return 0 return 0
end end
return old_calculate_knockback(player, ...) return old_calculate_knockback(player, ...)
@ -387,6 +379,26 @@ function playerz.compose_face(base_texture, scale)
}) })
end end
--Sleep functions
function playerz.count_sleeping()
local count = 0
for _, player in pairs(minetest.get_connected_players()) do
if playerz.get_status(player) == "sleep" then
count = count + 1
end
end
return count
end
function playerz.is_sleeping(player)
if playerz.get_status(player) == "sleep" then
return true
else
return false
end
end
--Level functions --Level functions
function playerz.lvl_up(player) function playerz.lvl_up(player)
local meta = player:get_meta() local meta = player:get_meta()
@ -415,6 +427,26 @@ function playerz.reset_lvl(player, level)
player:get_meta():set_int("level", 0) player:get_meta():set_int("level", 0)
end end
--Player Register Functions
minetest.register_on_dieplayer(function(player, reason)
playerz.set_status(player, "dead")
end)
minetest.register_on_respawnplayer(function(player)
playerz.set_status(player, "normal")
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
player_model[name] = nil
player_anim[name] = nil
player_textures[name] = nil
player_sneak[name] = nil
playerz.player_attached[name] = nil
playerz.count = playerz.count - 1
end)
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "playerz:gender" then if formname ~= "playerz:gender" then
return return

View File

@ -28,14 +28,6 @@ playerz.register_model("character.b3d", {
}) })
minetest.register_on_dieplayer(function(player, reason)
playerz.set_status(player, "dead")
end)
minetest.register_on_respawnplayer(function(player)
playerz.set_status(player, "normal")
end)
-- Update appearance when the player joins -- Update appearance when the player joins
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
@ -64,4 +56,5 @@ minetest.register_on_joinplayer(function(player)
-- Set hotbar textures -- Set hotbar textures
player:hud_set_hotbar_image("playerz_hotbar.png") player:hud_set_hotbar_image("playerz_hotbar.png")
player:hud_set_hotbar_selected_image("playerz_hotbar_selected.png") player:hud_set_hotbar_selected_image("playerz_hotbar_selected.png")
playerz.count = playerz.count + 1
end) end)

View File

@ -4,7 +4,7 @@ local S = ...
minetest.register_craftitem("treez:stick", { minetest.register_craftitem("treez:stick", {
description = S("Stick"), description = S("Stick"),
inventory_image = "treez_stick.png", inventory_image = "treez_stick.png",
groups = {stick = 1, wood=1, flammable = 3} groups = {stick = 1, flammable = 3}
}) })
minetest.register_craft({ minetest.register_craft({