farming
|
@ -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)
|
||||||
|
|
|
@ -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", "", ""},
|
||||||
|
{"", "", ""},
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -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"))()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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)
|
After Width: | Height: | Size: 735 B |
After Width: | Height: | Size: 588 B |
After Width: | Height: | Size: 615 B |
|
@ -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
|
|
@ -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},
|
||||||
|
},
|
||||||
|
})
|
|
@ -0,0 +1,5 @@
|
||||||
|
local S = ...
|
||||||
|
|
||||||
|
farmz.register_hoe("stone_Hoe" ,{
|
||||||
|
description = S("Stone Hoe"),
|
||||||
|
})
|
|
@ -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)
|
|
@ -0,0 +1,8 @@
|
||||||
|
# textdomain: farmz
|
||||||
|
Plant=Planta
|
||||||
|
Plowed Soil=Tierra arada
|
||||||
|
Seed=Semilla
|
||||||
|
Seed Soil=Cultivo con semillas
|
||||||
|
Sprout=brote
|
||||||
|
Wheat=Trigo
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
name = farmz
|
||||||
|
description = Farming
|
||||||
|
depends = helper
|
|
@ -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,
|
||||||
|
})
|
After Width: | Height: | Size: 506 B |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 686 B |
After Width: | Height: | Size: 537 B |
After Width: | Height: | Size: 554 B |
|
@ -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},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
After Width: | Height: | Size: 543 B |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 5.4 KiB |
After Width: | Height: | Size: 583 B |
|
@ -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,
|
||||||
|
})
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
name = mapgen
|
name = mapgen
|
||||||
description = Minimal map generator
|
description = Minimal map generator
|
||||||
depends = nodez
|
depends = nodez, farmz
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
local S = ...
|
|
|
@ -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)
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
name = nodez
|
name = nodez
|
||||||
description = Contains basic nodes for mapgen
|
description = Contains basic nodes for mapgen
|
||||||
|
depends = farmz
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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({
|
||||||
|
|