Run tools/strip_trailing_whitespace.sh

This commit is contained in:
Elias Fleckenstein 2022-05-26 07:29:28 +02:00
parent 6a054556cc
commit f6a40ffb78
No known key found for this signature in database
GPG Key ID: 06927A5199D6C9B2
27 changed files with 2380 additions and 2380 deletions

@ -603,7 +603,7 @@ function mcl_util.get_pointed_thing(player, liquid)
local look_dir = vector.multiply(player:get_look_dir(), 5) local look_dir = vector.multiply(player:get_look_dir(), 5)
local pos2 = vector.add(pos, look_dir) local pos2 = vector.add(pos, look_dir)
local ray = minetest.raycast(pos, pos2, false, liquid) local ray = minetest.raycast(pos, pos2, false, liquid)
if ray then if ray then
for pointed_thing in ray do for pointed_thing in ray do
return pointed_thing return pointed_thing

@ -1402,7 +1402,7 @@ end
-- should mob follow what I'm holding ? -- should mob follow what I'm holding ?
local follow_holding = function(self, clicker) local follow_holding = function(self, clicker)
if self.nofollow then return false end if self.nofollow then return false end
if mcl_mobs.invis[clicker:get_player_name()] then if mcl_mobs.invis[clicker:get_player_name()] then
return false return false
end end
@ -2307,7 +2307,7 @@ local function check_doors(self)
else else
if closed then def.on_rightclick(d,n,self) end if closed then def.on_rightclick(d,n,self) end
end end
end end
end end
end end
@ -2316,7 +2316,7 @@ end
-- returns true if mob has died -- returns true if mob has died
local do_states = function(self, dtime) local do_states = function(self, dtime)
if self.can_open_doors then check_doors(self) end if self.can_open_doors then check_doors(self) end
local yaw = self.object:get_yaw() or 0 local yaw = self.object:get_yaw() or 0
if self.state == "stand" then if self.state == "stand" then
@ -2386,7 +2386,7 @@ local do_states = function(self, dtime)
elseif self.current_target then elseif self.current_target then
go_to_pos(self,self.current_target) go_to_pos(self,self.current_target)
end end
if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then if self.current_target and not minetest.line_of_sight(self.object:get_pos(),self.current_target) then
self.waypoints=minetest.find_path(p,self._target,150,1,4) self.waypoints=minetest.find_path(p,self._target,150,1,4)
self.current_target = nil self.current_target = nil

@ -293,7 +293,7 @@ local professions = {
}, },
{ {
{ { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }}, { { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }},
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }}, { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }},
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }}, { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }},
{ { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }}, { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }},
@ -578,7 +578,7 @@ local function go_home(entity)
local b=entity._bed local b=entity._bed
if not b then return end if not b then return end
mcl_mobs:gopath(entity,b,function(entity,b) mcl_mobs:gopath(entity,b,function(entity,b)
if vector.distance(entity.object:get_pos(),b) < 2 then if vector.distance(entity.object:get_pos(),b) < 2 then
entity.state = "stand" entity.state = "stand"
set_velocity(entity,0) set_velocity(entity,0)
entity.object:set_pos(b) entity.object:set_pos(b)
@ -589,7 +589,7 @@ local function go_home(entity)
end end
return true return true
end end
end) end)
end end
----- JOBSITE LOGIC ----- JOBSITE LOGIC
@ -1315,7 +1315,7 @@ mcl_mobs:register_mob("mobs_mc:villager", {
if not self._player_scan_timer then if not self._player_scan_timer then
self._player_scan_timer = 0 self._player_scan_timer = 0
end end
self._player_scan_timer = self._player_scan_timer + dtime self._player_scan_timer = self._player_scan_timer + dtime
-- Check infrequently to keep CPU load low -- Check infrequently to keep CPU load low
if self._player_scan_timer > PLAYER_SCAN_INTERVAL then if self._player_scan_timer > PLAYER_SCAN_INTERVAL then

@ -24,7 +24,7 @@ local function check_player(player)
local name=player:get_player_name() local name=player:get_player_name()
if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then if mcl_worlds.has_dust(player:get_pos()) and not mcl_weather.nether_dust.particlespawners[name] then
return true return true
end end
end end
mcl_weather.nether_dust.add_particlespawners = function(player) mcl_weather.nether_dust.add_particlespawners = function(player)
@ -45,7 +45,7 @@ mcl_weather.nether_dust.delete_particlespawners = function(player)
for i=1,3 do for i=1,3 do
minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i]) minetest.delete_particlespawner(mcl_weather.nether_dust.particlespawners[name][i])
end end
mcl_weather.nether_dust.particlespawners[name]=nil mcl_weather.nether_dust.particlespawners[name]=nil
end end
end end

@ -165,7 +165,7 @@ function mcl_weather.rain.clear()
mcl_weather.rain.remove_sound(player) mcl_weather.rain.remove_sound(player)
mcl_weather.rain.remove_player(player) mcl_weather.rain.remove_player(player)
mcl_weather.remove_spawners_player(player) mcl_weather.remove_spawners_player(player)
end end
end end
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)

@ -26,8 +26,8 @@ local same_id = {
walls = { walls = {
"andesite", "brick", "cobble", "diorite", "endbricks", "andesite", "brick", "cobble", "diorite", "endbricks",
"granite", "mossycobble", "netherbrick", "prismarine", "granite", "mossycobble", "netherbrick", "prismarine",
"rednetherbrick", "redsandstone", "sandstone", "rednetherbrick", "redsandstone", "sandstone",
"stonebrick", "stonebrickmossy", "stonebrick", "stonebrickmossy",
}, },
wool = { wool = {
"black", "blue", "brown", "cyan", "green", "black", "blue", "brown", "cyan", "green",

@ -360,7 +360,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
end end
local stack_size = get_stack_size(player) local stack_size = get_stack_size(player)
-- Survival inventory slots -- Survival inventory slots
main_list = "list[current_player;main;0,3.75;9,3;9]".. main_list = "list[current_player;main;0,3.75;9,3;9]"..
mcl_formspec.get_itemslot_bg(0,3.75,9,3).. mcl_formspec.get_itemslot_bg(0,3.75,9,3)..
@ -394,7 +394,7 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size,
-- switch stack size button -- switch stack size button
"image_button[9,5;1,1;default_apple.png;__switch_stack;]".. "image_button[9,5;1,1;default_apple.png;__switch_stack;]"..
"label[9.4,5.4;".. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .."]".. "label[9.4,5.4;".. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .."]"..
"tooltip[__switch_stack;"..F(S("Switch stack size")).."]" "tooltip[__switch_stack;"..F(S("Switch stack size")).."]"
-- For shortcuts -- For shortcuts
listrings = listrings .. listrings = listrings ..

@ -1,236 +1,236 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
local F = minetest.formspec_escape local F = minetest.formspec_escape
mcl_inventory = {} mcl_inventory = {}
--local mod_player = minetest.get_modpath("mcl_player") --local mod_player = minetest.get_modpath("mcl_player")
--local mod_craftguide = minetest.get_modpath("mcl_craftguide") --local mod_craftguide = minetest.get_modpath("mcl_craftguide")
-- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left
function return_item(itemstack, dropper, pos, inv) function return_item(itemstack, dropper, pos, inv)
if dropper:is_player() then if dropper:is_player() then
-- Return to main inventory -- Return to main inventory
if inv:room_for_item("main", itemstack) then if inv:room_for_item("main", itemstack) then
inv:add_item("main", itemstack) inv:add_item("main", itemstack)
else else
-- Drop item on the ground -- Drop item on the ground
local v = dropper:get_look_dir() local v = dropper:get_look_dir()
local p = {x=pos.x, y=pos.y+1.2, z=pos.z} local p = {x=pos.x, y=pos.y+1.2, z=pos.z}
p.x = p.x+(math.random(1,3)*0.2) p.x = p.x+(math.random(1,3)*0.2)
p.z = p.z+(math.random(1,3)*0.2) p.z = p.z+(math.random(1,3)*0.2)
local obj = minetest.add_item(p, itemstack) local obj = minetest.add_item(p, itemstack)
if obj then if obj then
v.x = v.x*4 v.x = v.x*4
v.y = v.y*4 + 2 v.y = v.y*4 + 2
v.z = v.z*4 v.z = v.z*4
obj:set_velocity(v) obj:set_velocity(v)
obj:get_luaentity()._insta_collect = false obj:get_luaentity()._insta_collect = false
end end
end end
else else
-- Fallback for unexpected cases -- Fallback for unexpected cases
minetest.add_item(pos, itemstack) minetest.add_item(pos, itemstack)
end
return itemstack
end
-- Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left
function return_fields(player, name)
local inv = player:get_inventory()
local list = inv:get_list(name)
if not list then return end
for i,stack in ipairs(list) do
return_item(stack, player, player:get_pos(), inv)
stack:clear()
inv:set_stack(name, i, stack)
end
end
local function set_inventory(player, armor_change_only)
if minetest.is_creative_enabled(player:get_player_name()) then
if armor_change_only then
-- Stay on survival inventory plage if only the armor has been changed
mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv")
else
mcl_inventory.set_creative_formspec(player, 0, 1)
end
return
end
local inv = player:get_inventory()
inv:set_width("craft", 2)
inv:set_size("craft", 4)
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
local armor_slot_imgs = ""
for a=1,4 do
if inv:get_stack("armor", a+1):is_empty() then
armor_slot_imgs = armor_slot_imgs .. "image[0,"..(a-1)..";1,1;mcl_inventory_empty_armor_slot_"..armor_slots[a]..".png]"
end
end
if inv:get_stack("offhand", 1):is_empty() then
armor_slot_imgs = armor_slot_imgs .. "image[3,2;1,1;mcl_inventory_empty_armor_slot_shield.png]"
end
local form = "size[9,8.75]"..
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")..
--armor
"list[current_player;armor;0,0;1,1;1]"..
"list[current_player;armor;0,1;1,1;2]"..
"list[current_player;armor;0,2;1,1;3]"..
"list[current_player;armor;0,3;1,1;4]"..
mcl_formspec.get_itemslot_bg(0,0,1,1)..
mcl_formspec.get_itemslot_bg(0,1,1,1)..
mcl_formspec.get_itemslot_bg(0,2,1,1)..
mcl_formspec.get_itemslot_bg(0,3,1,1)..
"list[current_player;offhand;3,2;1,1]"..
mcl_formspec.get_itemslot_bg(3,2,1,1)..
armor_slot_imgs..
-- craft and inventory
"label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]"..
"list[current_player;craft;4,1;2,2]"..
"list[current_player;craftpreview;7,1.5;1,1;]"..
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
mcl_formspec.get_itemslot_bg(4,1,2,2)..
mcl_formspec.get_itemslot_bg(7,1.5,1,1)..
-- crafting guide button
"image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]"..
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
-- help button
"image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]"..
"tooltip[__mcl_doc;"..F(S("Help")).."]"..
-- skins button
"image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]"..
"tooltip[__mcl_skins;"..F(S("Select player skin")).."]"..
-- achievements button
"image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]"..
"tooltip[__mcl_achievements;"..F(S("Achievements")).."]"..
-- for shortcuts
"listring[current_player;main]"..
"listring[current_player;armor]"..
"listring[current_player;main]" ..
"listring[current_player;craft]" ..
"listring[current_player;main]"
player:set_inventory_formspec(form)
end
-- Drop items in craft grid and reset inventory on closing
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.quit then
return_fields(player,"craft")
return_fields(player,"enchanting_lapis")
return_fields(player,"enchanting_item")
if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then
set_inventory(player)
end
end
end)
if not minetest.is_creative_enabled("") then
function mcl_inventory.update_inventory_formspec(player)
set_inventory(player)
end
end
-- Drop crafting grid items on leaving
minetest.register_on_leaveplayer(function(player)
return_fields(player, "craft")
return_fields(player, "enchanting_lapis")
return_fields(player, "enchanting_item")
end)
minetest.register_on_joinplayer(function(player)
--init inventory
local inv = player:get_inventory()
inv:set_width("main", 9)
inv:set_size("main", 36)
inv:set_size("offhand", 1)
--set hotbar size
player:hud_set_hotbar_itemcount(9)
--add hotbar images
player:hud_set_hotbar_image("mcl_inventory_hotbar.png")
player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png")
local old_update_player = mcl_armor.update_player
function mcl_armor.update_player(player, info)
old_update_player(player, info)
set_inventory(player, true)
end
-- In Creative Mode, the initial inventory setup is handled in creative.lua
if not minetest.is_creative_enabled(player:get_player_name()) then
set_inventory(player)
end
--[[ Make sure the crafting grid is empty. Why? Because the player might have
items remaining in the crafting grid from the previous join; this is likely
when the server has been shutdown and the server didn't clean up the player
inventories. ]]
return_fields(player, "craft")
return_fields(player, "enchanting_item")
return_fields(player, "enchanting_lapis")
end)
dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua")
local mt_is_creative_enabled = minetest.is_creative_enabled
function minetest.is_creative_enabled(name)
if mt_is_creative_enabled(name) then return true end
local p = minetest.get_player_by_name(name)
if p then
return p:get_meta():get_string("gamemode") == "creative"
end
return false
end
local function in_table(n,h)
for k,v in pairs(h) do
if v == n then return true end
end
return false
end
local gamemodes = {
"survival",
"creative"
}
function mcl_inventory.player_set_gamemode(p,g)
local m = p:get_meta()
m:set_string("gamemode",g)
set_inventory(p)
end
minetest.register_chatcommand("gamemode",{
params = S("[<gamemode>] [<player>]"),
description = S("Change gamemode (survival/creative) for yourself or player"),
privs = { server = true },
func = function(n,param)
-- Full input validation ( just for @erlehmann <3 )
local p = minetest.get_player_by_name(n)
local args = param:split(" ")
if args[2] ~= nil then
p = minetest.get_player_by_name(args[2])
end
if not p then
return false, S("Player not online")
end
if args[1] ~= nil and not in_table(args[1],gamemodes) then
return false, S("Gamemode " .. args[1] .. " does not exist.")
elseif args[1] ~= nil then
mcl_inventory.player_set_gamemode(p,args[1])
end
--Result message - show effective game mode
local gm = p:get_meta():get_string("gamemode")
if gm == "" then gm = gamemodes[1] end
return true, S("Gamemode for player ")..n..S(": "..gm)
end end
}) return itemstack
end
-- Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left
function return_fields(player, name)
local inv = player:get_inventory()
local list = inv:get_list(name)
if not list then return end
for i,stack in ipairs(list) do
return_item(stack, player, player:get_pos(), inv)
stack:clear()
inv:set_stack(name, i, stack)
end
end
local function set_inventory(player, armor_change_only)
if minetest.is_creative_enabled(player:get_player_name()) then
if armor_change_only then
-- Stay on survival inventory plage if only the armor has been changed
mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv")
else
mcl_inventory.set_creative_formspec(player, 0, 1)
end
return
end
local inv = player:get_inventory()
inv:set_width("craft", 2)
inv:set_size("craft", 4)
local armor_slots = {"helmet", "chestplate", "leggings", "boots"}
local armor_slot_imgs = ""
for a=1,4 do
if inv:get_stack("armor", a+1):is_empty() then
armor_slot_imgs = armor_slot_imgs .. "image[0,"..(a-1)..";1,1;mcl_inventory_empty_armor_slot_"..armor_slots[a]..".png]"
end
end
if inv:get_stack("offhand", 1):is_empty() then
armor_slot_imgs = armor_slot_imgs .. "image[3,2;1,1;mcl_inventory_empty_armor_slot_shield.png]"
end
local form = "size[9,8.75]"..
"background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]"..
mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")..
--armor
"list[current_player;armor;0,0;1,1;1]"..
"list[current_player;armor;0,1;1,1;2]"..
"list[current_player;armor;0,2;1,1;3]"..
"list[current_player;armor;0,3;1,1;4]"..
mcl_formspec.get_itemslot_bg(0,0,1,1)..
mcl_formspec.get_itemslot_bg(0,1,1,1)..
mcl_formspec.get_itemslot_bg(0,2,1,1)..
mcl_formspec.get_itemslot_bg(0,3,1,1)..
"list[current_player;offhand;3,2;1,1]"..
mcl_formspec.get_itemslot_bg(3,2,1,1)..
armor_slot_imgs..
-- craft and inventory
"label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))).."]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))).."]"..
"list[current_player;craft;4,1;2,2]"..
"list[current_player;craftpreview;7,1.5;1,1;]"..
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
mcl_formspec.get_itemslot_bg(4,1,2,2)..
mcl_formspec.get_itemslot_bg(7,1.5,1,1)..
-- crafting guide button
"image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]"..
"tooltip[__mcl_craftguide;"..F(S("Recipe book")).."]"..
-- help button
"image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]"..
"tooltip[__mcl_doc;"..F(S("Help")).."]"..
-- skins button
"image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]"..
"tooltip[__mcl_skins;"..F(S("Select player skin")).."]"..
-- achievements button
"image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]"..
"tooltip[__mcl_achievements;"..F(S("Achievements")).."]"..
-- for shortcuts
"listring[current_player;main]"..
"listring[current_player;armor]"..
"listring[current_player;main]" ..
"listring[current_player;craft]" ..
"listring[current_player;main]"
player:set_inventory_formspec(form)
end
-- Drop items in craft grid and reset inventory on closing
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.quit then
return_fields(player,"craft")
return_fields(player,"enchanting_lapis")
return_fields(player,"enchanting_item")
if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then
set_inventory(player)
end
end
end)
if not minetest.is_creative_enabled("") then
function mcl_inventory.update_inventory_formspec(player)
set_inventory(player)
end
end
-- Drop crafting grid items on leaving
minetest.register_on_leaveplayer(function(player)
return_fields(player, "craft")
return_fields(player, "enchanting_lapis")
return_fields(player, "enchanting_item")
end)
minetest.register_on_joinplayer(function(player)
--init inventory
local inv = player:get_inventory()
inv:set_width("main", 9)
inv:set_size("main", 36)
inv:set_size("offhand", 1)
--set hotbar size
player:hud_set_hotbar_itemcount(9)
--add hotbar images
player:hud_set_hotbar_image("mcl_inventory_hotbar.png")
player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png")
local old_update_player = mcl_armor.update_player
function mcl_armor.update_player(player, info)
old_update_player(player, info)
set_inventory(player, true)
end
-- In Creative Mode, the initial inventory setup is handled in creative.lua
if not minetest.is_creative_enabled(player:get_player_name()) then
set_inventory(player)
end
--[[ Make sure the crafting grid is empty. Why? Because the player might have
items remaining in the crafting grid from the previous join; this is likely
when the server has been shutdown and the server didn't clean up the player
inventories. ]]
return_fields(player, "craft")
return_fields(player, "enchanting_item")
return_fields(player, "enchanting_lapis")
end)
dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua")
local mt_is_creative_enabled = minetest.is_creative_enabled
function minetest.is_creative_enabled(name)
if mt_is_creative_enabled(name) then return true end
local p = minetest.get_player_by_name(name)
if p then
return p:get_meta():get_string("gamemode") == "creative"
end
return false
end
local function in_table(n,h)
for k,v in pairs(h) do
if v == n then return true end
end
return false
end
local gamemodes = {
"survival",
"creative"
}
function mcl_inventory.player_set_gamemode(p,g)
local m = p:get_meta()
m:set_string("gamemode",g)
set_inventory(p)
end
minetest.register_chatcommand("gamemode",{
params = S("[<gamemode>] [<player>]"),
description = S("Change gamemode (survival/creative) for yourself or player"),
privs = { server = true },
func = function(n,param)
-- Full input validation ( just for @erlehmann <3 )
local p = minetest.get_player_by_name(n)
local args = param:split(" ")
if args[2] ~= nil then
p = minetest.get_player_by_name(args[2])
end
if not p then
return false, S("Player not online")
end
if args[1] ~= nil and not in_table(args[1],gamemodes) then
return false, S("Gamemode " .. args[1] .. " does not exist.")
elseif args[1] ~= nil then
mcl_inventory.player_set_gamemode(p,args[1])
end
--Result message - show effective game mode
local gm = p:get_meta():get_string("gamemode")
if gm == "" then gm = gamemodes[1] end
return true, S("Gamemode for player ")..n..S(": "..gm)
end
})

@ -133,7 +133,7 @@ local dispenserdef = {
if not stackdef then if not stackdef then
return return
end end
local iname = stack:get_name() local iname = stack:get_name()
local igroups = stackdef.groups local igroups = stackdef.groups

@ -90,9 +90,9 @@ for i=0,4 do
minetest.register_craft({ --TODO: Please change this crafting recipe once crying obsidian is implemented! minetest.register_craft({ --TODO: Please change this crafting recipe once crying obsidian is implemented!
output = "mcl_beds:respawn_anchor", output = "mcl_beds:respawn_anchor",
recipe = { recipe = {
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"},
{"mcl_nether:glowstone", "mcl_nether:glowstone", "mcl_nether:glowstone"}, {"mcl_nether:glowstone", "mcl_nether:glowstone", "mcl_nether:glowstone"},
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"} {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}
} }
}) })

@ -314,7 +314,7 @@ controls.register_on_press(function(player, key)
end end
wielded_item = on_place_bucket(wielded_item, player, pointed_thing, def) wielded_item = on_place_bucket(wielded_item, player, pointed_thing, def)
end end
player:set_wielded_item(wielded_item) player:set_wielded_item(wielded_item)
end) end)

@ -1,156 +1,156 @@
--[[ --[[
#!#!#!#Cake mod created by Jordan4ibanez#!#!# #!#!#!#Cake mod created by Jordan4ibanez#!#!#
#!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!# #!#!#!#Released under CC Attribution-ShareAlike 3.0 Unported #!#!#
]]-- ]]--
local CAKE_HUNGER_POINTS = 2 local CAKE_HUNGER_POINTS = 2
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"} local cake_texture = {"cake_top.png","cake_bottom.png","cake_inner.png","cake_side.png","cake_side.png","cake_side.png"}
local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16} local slice_1 = { -7/16, -8/16, -7/16, -5/16, 0/16, 7/16}
local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16} local slice_2 = { -7/16, -8/16, -7/16, -3/16, 0/16, 7/16}
local slice_3 = { -7/16, -8/16, -7/16, -1/16, 0/16, 7/16} local slice_3 = { -7/16, -8/16, -7/16, -1/16, 0/16, 7/16}
local slice_4 = { -7/16, -8/16, -7/16, 1/16, 0/16, 7/16} local slice_4 = { -7/16, -8/16, -7/16, 1/16, 0/16, 7/16}
local slice_5 = { -7/16, -8/16, -7/16, 3/16, 0/16, 7/16} local slice_5 = { -7/16, -8/16, -7/16, 3/16, 0/16, 7/16}
local slice_6 = { -7/16, -8/16, -7/16, 5/16, 0/16, 7/16} local slice_6 = { -7/16, -8/16, -7/16, 5/16, 0/16, 7/16}
local full_cake = { -7/16, -8/16, -7/16, 7/16, 0/16, 7/16} local full_cake = { -7/16, -8/16, -7/16, 7/16, 0/16, 7/16}
minetest.register_craft({ minetest.register_craft({
output = "mcl_cake:cake", output = "mcl_cake:cake",
recipe = { recipe = {
{"mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket"}, {"mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket", "mcl_mobitems:milk_bucket"},
{"mcl_core:sugar", "mcl_throwing:egg", "mcl_core:sugar"}, {"mcl_core:sugar", "mcl_throwing:egg", "mcl_core:sugar"},
{"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"}, {"mcl_farming:wheat_item", "mcl_farming:wheat_item", "mcl_farming:wheat_item"},
}, },
replacements = { replacements = {
{"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"},
{"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"},
{"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"}, {"mcl_mobitems:milk_bucket", "mcl_buckets:bucket_empty"},
}, },
}) })
minetest.register_node("mcl_cake:cake", { minetest.register_node("mcl_cake:cake", {
description = S("Cake"), description = S("Cake"),
_tt_help = S("With 7 tasty slices!").."\n"..S("Hunger points: +@1 per slice", CAKE_HUNGER_POINTS), _tt_help = S("With 7 tasty slices!").."\n"..S("Hunger points: +@1 per slice", CAKE_HUNGER_POINTS),
_doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."), _doc_items_longdesc = S("Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken."),
_doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."), _doc_items_usagehelp = S("Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full."),
tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"}, tiles = {"cake_top.png","cake_bottom.png","cake_side.png","cake_side.png","cake_side.png","cake_side.png"},
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
inventory_image = "cake.png", inventory_image = "cake.png",
wield_image = "cake.png", wield_image = "cake.png",
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
drawtype = "nodebox", drawtype = "nodebox",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = full_cake fixed = full_cake
}, },
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = full_cake fixed = full_cake
}, },
stack_max = 1, stack_max = 1,
groups = { groups = {
handy = 1, attached_node = 1, dig_by_piston = 1, comparator_signal = 14, handy = 1, attached_node = 1, dig_by_piston = 1, comparator_signal = 14,
cake = 7, food = 2, no_eat_delay = 1, compostability = 100 cake = 7, food = 2, no_eat_delay = 1, compostability = 100
}, },
drop = "", drop = "",
on_rightclick = function(pos, node, clicker, itemstack) on_rightclick = function(pos, node, clicker, itemstack)
-- Cake is subject to protection -- Cake is subject to protection
local name = clicker:get_player_name() local name = clicker:get_player_name()
if minetest.is_protected(pos, name) then if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name) minetest.record_protection_violation(pos, name)
return return
end end
local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) local newcake = minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"})
-- Check if we were allowed to eat -- Check if we were allowed to eat
if newcake:get_name() ~= "mcl_cake:cake" or minetest.is_creative_enabled(clicker:get_player_name()) then if newcake:get_name() ~= "mcl_cake:cake" or minetest.is_creative_enabled(clicker:get_player_name()) then
minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0}) minetest.add_node(pos,{type="node",name="mcl_cake:cake_6",param2=0})
end end
end, end,
sounds = mcl_sounds.node_sound_leaves_defaults(), sounds = mcl_sounds.node_sound_leaves_defaults(),
_food_particles = false, _food_particles = false,
_mcl_saturation = 0.4, _mcl_saturation = 0.4,
_mcl_blast_resistance = 0.5, _mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5, _mcl_hardness = 0.5,
}) })
local register_slice = function(level, nodebox, desc) local register_slice = function(level, nodebox, desc)
local this = "mcl_cake:cake_"..level local this = "mcl_cake:cake_"..level
local after_eat = "mcl_cake:cake_"..(level-1) local after_eat = "mcl_cake:cake_"..(level-1)
local on_rightclick local on_rightclick
if level > 1 then if level > 1 then
on_rightclick = function(pos, node, clicker, itemstack) on_rightclick = function(pos, node, clicker, itemstack)
local name = clicker:get_player_name() local name = clicker:get_player_name()
if minetest.is_protected(pos, name) then if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name) minetest.record_protection_violation(pos, name)
return return
end end
local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"}) local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack(after_eat), ItemStack(this), clicker, {type="nothing"})
-- Check if we were allowed to eat -- Check if we were allowed to eat
if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then
minetest.add_node(pos,{type="node",name=after_eat,param2=0}) minetest.add_node(pos,{type="node",name=after_eat,param2=0})
end end
end end
else else
-- Last slice -- Last slice
on_rightclick = function(pos, node, clicker, itemstack) on_rightclick = function(pos, node, clicker, itemstack)
local name = clicker:get_player_name() local name = clicker:get_player_name()
if minetest.is_protected(pos, name) then if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name) minetest.record_protection_violation(pos, name)
return return
end end
local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"}) local newcake = minetest.do_item_eat(CAKE_HUNGER_POINTS, ItemStack("mcl:cake:cake 0"), ItemStack("mcl_cake:cake_1"), clicker, {type="nothing"})
-- Check if we were allowed to eat -- Check if we were allowed to eat
if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then if newcake:get_name() ~= this or minetest.is_creative_enabled(clicker:get_player_name()) then
minetest.remove_node(pos) minetest.remove_node(pos)
minetest.check_for_falling(pos) minetest.check_for_falling(pos)
end end
end end
end end
minetest.register_node(this, { minetest.register_node(this, {
description = desc, description = desc,
_doc_items_create_entry = false, _doc_items_create_entry = false,
tiles = cake_texture, tiles = cake_texture,
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
drawtype = "nodebox", drawtype = "nodebox",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = nodebox, fixed = nodebox,
}, },
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = nodebox, fixed = nodebox,
}, },
groups = { groups = {
handy = 1, attached_node = 1, not_in_creative_inventory = 1, handy = 1, attached_node = 1, not_in_creative_inventory = 1,
dig_by_piston = 1, cake = level, comparator_signal = level * 2, dig_by_piston = 1, cake = level, comparator_signal = level * 2,
food = 2, no_eat_delay = 1 food = 2, no_eat_delay = 1
}, },
drop = "", drop = "",
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
sounds = mcl_sounds.node_sound_leaves_defaults(), sounds = mcl_sounds.node_sound_leaves_defaults(),
_food_particles = false, _food_particles = false,
_mcl_saturation = 0.4, _mcl_saturation = 0.4,
_mcl_blast_resistance = 0.5, _mcl_blast_resistance = 0.5,
_mcl_hardness = 0.5, _mcl_hardness = 0.5,
}) })
if minetest.get_modpath("doc") then if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", "mcl_cake:cake", "nodes", "mcl_cake:cake_"..level) doc.add_entry_alias("nodes", "mcl_cake:cake", "nodes", "mcl_cake:cake_"..level)
end end
end end
register_slice(6, slice_6, S("Cake (6 Slices Left)")) register_slice(6, slice_6, S("Cake (6 Slices Left)"))
register_slice(5, slice_5, S("Cake (5 Slices Left)")) register_slice(5, slice_5, S("Cake (5 Slices Left)"))
register_slice(4, slice_4, S("Cake (4 Slices Left)")) register_slice(4, slice_4, S("Cake (4 Slices Left)"))
register_slice(3, slice_3, S("Cake (3 Slices Left)")) register_slice(3, slice_3, S("Cake (3 Slices Left)"))
register_slice(2, slice_2, S("Cake (2 Slices Left)")) register_slice(2, slice_2, S("Cake (2 Slices Left)"))
register_slice(1, slice_1, S("Cake (1 Slice Left)")) register_slice(1, slice_1, S("Cake (1 Slice Left)"))

@ -1,70 +1,70 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
local formspec_escape = minetest.formspec_escape local formspec_escape = minetest.formspec_escape
local show_formspec = minetest.show_formspec local show_formspec = minetest.show_formspec
local C = minetest.colorize local C = minetest.colorize
local text_color = "#313131" local text_color = "#313131"
local itemslot_bg = mcl_formspec.get_itemslot_bg local itemslot_bg = mcl_formspec.get_itemslot_bg
mcl_crafting_table = {} mcl_crafting_table = {}
function mcl_crafting_table.show_crafting_form(player) function mcl_crafting_table.show_crafting_form(player)
player:get_inventory():set_width("craft", 3) player:get_inventory():set_width("craft", 3)
player:get_inventory():set_size("craft", 9) player:get_inventory():set_size("craft", 9)
show_formspec(player:get_player_name(), "main", show_formspec(player:get_player_name(), "main",
"size[9,8.75]".. "size[9,8.75]"..
"image[4.7,1.5;1.5,1;gui_crafting_arrow.png]".. "image[4.7,1.5;1.5,1;gui_crafting_arrow.png]"..
"label[0,4;"..formspec_escape(C(text_color, S("Inventory"))).."]".. "label[0,4;"..formspec_escape(C(text_color, S("Inventory"))).."]"..
"list[current_player;main;0,4.5;9,3;9]".. "list[current_player;main;0,4.5;9,3;9]"..
itemslot_bg(0,4.5,9,3).. itemslot_bg(0,4.5,9,3)..
"list[current_player;main;0,7.74;9,1;]".. "list[current_player;main;0,7.74;9,1;]"..
itemslot_bg(0,7.74,9,1).. itemslot_bg(0,7.74,9,1)..
"label[1.75,0;"..formspec_escape(C(text_color, S("Crafting"))).."]".. "label[1.75,0;"..formspec_escape(C(text_color, S("Crafting"))).."]"..
"list[current_player;craft;1.75,0.5;3,3;]".. "list[current_player;craft;1.75,0.5;3,3;]"..
itemslot_bg(1.75,0.5,3,3).. itemslot_bg(1.75,0.5,3,3)..
"list[current_player;craftpreview;6.1,1.5;1,1;]".. "list[current_player;craftpreview;6.1,1.5;1,1;]"..
itemslot_bg(6.1,1.5,1,1).. itemslot_bg(6.1,1.5,1,1)..
"image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]".. "image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]"..
"tooltip[__mcl_craftguide;"..formspec_escape(S("Recipe book")).."]".. "tooltip[__mcl_craftguide;"..formspec_escape(S("Recipe book")).."]"..
"listring[current_player;main]".. "listring[current_player;main]"..
"listring[current_player;craft]" "listring[current_player;craft]"
) )
end end
minetest.register_node("mcl_crafting_table:crafting_table", { minetest.register_node("mcl_crafting_table:crafting_table", {
description = S("Crafting Table"), description = S("Crafting Table"),
_tt_help = S("3×3 crafting grid"), _tt_help = S("3×3 crafting grid"),
_doc_items_longdesc = S("A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts."), _doc_items_longdesc = S("A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts."),
_doc_items_usagehelp = S("Rightclick the crafting table to access the 3×3 crafting grid."), _doc_items_usagehelp = S("Rightclick the crafting table to access the 3×3 crafting grid."),
_doc_items_hidden = false, _doc_items_hidden = false,
is_ground_content = false, is_ground_content = false,
tiles = {"crafting_workbench_top.png", "default_wood.png", "crafting_workbench_side.png", tiles = {"crafting_workbench_top.png", "default_wood.png", "crafting_workbench_side.png",
"crafting_workbench_side.png", "crafting_workbench_front.png", "crafting_workbench_front.png"}, "crafting_workbench_side.png", "crafting_workbench_front.png", "crafting_workbench_front.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1}, groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1},
on_rightclick = function(pos, node, player, itemstack) on_rightclick = function(pos, node, player, itemstack)
if not player:get_player_control().sneak then if not player:get_player_control().sneak then
mcl_crafting_table.show_crafting_form(player) mcl_crafting_table.show_crafting_form(player)
end end
end, end,
sounds = mcl_sounds.node_sound_wood_defaults(), sounds = mcl_sounds.node_sound_wood_defaults(),
_mcl_blast_resistance = 2.5, _mcl_blast_resistance = 2.5,
_mcl_hardness = 2.5, _mcl_hardness = 2.5,
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_crafting_table:crafting_table", output = "mcl_crafting_table:crafting_table",
recipe = { recipe = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"group:wood", "group:wood"} {"group:wood", "group:wood"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "mcl_crafting_table:crafting_table", recipe = "mcl_crafting_table:crafting_table",
burntime = 15, burntime = 15,
}) })
minetest.register_alias("crafting:workbench", "mcl_crafting_table:crafting_table") minetest.register_alias("crafting:workbench", "mcl_crafting_table:crafting_table")
minetest.register_alias("mcl_inventory:workbench", "mcl_crafting_table:crafting_table") minetest.register_alias("mcl_inventory:workbench", "mcl_crafting_table:crafting_table")

File diff suppressed because it is too large Load Diff

@ -1,231 +1,231 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
-- Wrapper around mintest.pointed_thing_to_face_pos. -- Wrapper around mintest.pointed_thing_to_face_pos.
local function get_fpos(placer, pointed_thing) local function get_fpos(placer, pointed_thing)
local fpos local fpos
-- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if -- Workaround: minetest.pointed_thing_to_face_pos crashes in MT 0.4.16 if
-- pointed_thing.under and pointed_thing.above are equal -- pointed_thing.under and pointed_thing.above are equal
-- FIXME: Remove this when MT got fixed. -- FIXME: Remove this when MT got fixed.
if not vector.equals(pointed_thing.under, pointed_thing.above) then if not vector.equals(pointed_thing.under, pointed_thing.above) then
-- The happy case: Everything is normal -- The happy case: Everything is normal
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
fpos = finepos.y % 1 fpos = finepos.y % 1
else else
-- Fallback if both above and under are equal -- Fallback if both above and under are equal
fpos = 0 fpos = 0
end end
return fpos return fpos
end end
---- Trapdoor ---- ---- Trapdoor ----
local on_rotate local on_rotate
if minetest.get_modpath("screwdriver") then if minetest.get_modpath("screwdriver") then
on_rotate = function(pos, node, user, mode, param2) on_rotate = function(pos, node, user, mode, param2)
-- Flip trapdoor vertically -- Flip trapdoor vertically
if mode == screwdriver.ROTATE_AXIS then if mode == screwdriver.ROTATE_AXIS then
local minor = node.param2 local minor = node.param2
if node.param2 >= 20 then if node.param2 >= 20 then
minor = node.param2 - 20 minor = node.param2 - 20
if minor == 3 then if minor == 3 then
minor = 1 minor = 1
elseif minor == 1 then elseif minor == 1 then
minor = 3 minor = 3
end end
node.param2 = minor node.param2 = minor
else else
if minor == 3 then if minor == 3 then
minor = 1 minor = 1
elseif minor == 1 then elseif minor == 1 then
minor = 3 minor = 3
end end
node.param2 = minor node.param2 = minor
node.param2 = node.param2 + 20 node.param2 = node.param2 + 20
end end
minetest.set_node(pos, node) minetest.set_node(pos, node)
return true return true
end end
end end
end end
function mcl_doors:register_trapdoor(name, def) function mcl_doors:register_trapdoor(name, def)
local groups = table.copy(def.groups) local groups = table.copy(def.groups)
if groups == nil then if groups == nil then
groups = {} groups = {}
end end
groups.mesecon_ignore_opaque_dig = 1 groups.mesecon_ignore_opaque_dig = 1
if not def.sound_open then if not def.sound_open then
def.sound_open = "doors_door_open" def.sound_open = "doors_door_open"
end end
if not def.sound_close then if not def.sound_close then
def.sound_close = "doors_door_close" def.sound_close = "doors_door_close"
end end
local function punch(pos) local function punch(pos)
local me = minetest.get_node(pos) local me = minetest.get_node(pos)
local tmp_node local tmp_node
-- Close -- Close
if minetest.get_item_group(me.name, "trapdoor") == 2 then if minetest.get_item_group(me.name, "trapdoor") == 2 then
minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true)
tmp_node = {name=name, param1=me.param1, param2=me.param2} tmp_node = {name=name, param1=me.param1, param2=me.param2}
-- Open -- Open
else else
minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true)
tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2}
end end
minetest.set_node(pos, tmp_node) minetest.set_node(pos, tmp_node)
end end
local on_rightclick local on_rightclick
if not def.only_redstone_can_open then if not def.only_redstone_can_open then
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
punch(pos) punch(pos)
end end
end end
-- Default help texts -- Default help texts
local longdesc, usagehelp, tt_help local longdesc, usagehelp, tt_help
longdesc = def._doc_items_longdesc longdesc = def._doc_items_longdesc
if not longdesc then if not longdesc then
if def.only_redstone_can_open then if def.only_redstone_can_open then
longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.")
else else
longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.")
end end
end end
usagehelp = def._doc_items_usagehelp usagehelp = def._doc_items_usagehelp
if not usagehelp and not def.only_redstone_can_open then if not usagehelp and not def.only_redstone_can_open then
usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.")
end end
if def.only_redstone_can_open then if def.only_redstone_can_open then
tt_help = S("Openable by redstone power") tt_help = S("Openable by redstone power")
else else
tt_help = S("Openable by players and redstone power") tt_help = S("Openable by players and redstone power")
end end
-- Closed trapdoor -- Closed trapdoor
local tile_front = def.tile_front local tile_front = def.tile_front
local tile_side = def.tile_side local tile_side = def.tile_side
if not tile_side then if not tile_side then
tile_side = tile_front tile_side = tile_front
end end
local tiles_closed = { local tiles_closed = {
tile_front, tile_front,
tile_front .. "^[transformFY", tile_front .. "^[transformFY",
tile_side, tile_side, tile_side, tile_side,
tile_side, tile_side, tile_side, tile_side,
} }
local groups_closed = groups local groups_closed = groups
groups_closed.trapdoor = 1 groups_closed.trapdoor = 1
groups_closed.deco_block = 1 groups_closed.deco_block = 1
minetest.register_node(name, { minetest.register_node(name, {
description = def.description, description = def.description,
_tt_help = tt_help, _tt_help = tt_help,
_doc_items_longdesc = longdesc, _doc_items_longdesc = longdesc,
_doc_items_usagehelp = usagehelp, _doc_items_usagehelp = usagehelp,
drawtype = "nodebox", drawtype = "nodebox",
tiles = tiles_closed, tiles = tiles_closed,
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true,
inventory_image = def.inventory_image, inventory_image = def.inventory_image,
wield_image = def.wield_image, wield_image = def.wield_image,
is_ground_content = false, is_ground_content = false,
paramtype = "light", paramtype = "light",
stack_max = 64, stack_max = 64,
paramtype2 = "facedir", paramtype2 = "facedir",
sunlight_propagates = true, sunlight_propagates = true,
groups = groups_closed, groups = groups_closed,
_mcl_hardness = def._mcl_hardness, _mcl_hardness = def._mcl_hardness,
_mcl_blast_resistance = def._mcl_blast_resistance, _mcl_blast_resistance = def._mcl_blast_resistance,
sounds = def.sounds, sounds = def.sounds,
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},}, {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},},
}, },
mesecons = {effector = { mesecons = {effector = {
action_on = (function(pos, node) action_on = (function(pos, node)
punch(pos) punch(pos)
end), end),
}}, }},
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local p0 = pointed_thing.under local p0 = pointed_thing.under
local p1 = pointed_thing.above local p1 = pointed_thing.above
local param2 = 0 local param2 = 0
local placer_pos = placer:get_pos() local placer_pos = placer:get_pos()
if placer_pos then if placer_pos then
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
end end
local fpos = get_fpos(placer, pointed_thing) local fpos = get_fpos(placer, pointed_thing)
--local origname = itemstack:get_name() --local origname = itemstack:get_name()
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
or (fpos < -0.5 and fpos > -0.999999999) then or (fpos < -0.5 and fpos > -0.999999999) then
param2 = param2 + 20 param2 = param2 + 20
if param2 == 21 then if param2 == 21 then
param2 = 23 param2 = 23
elseif param2 == 23 then elseif param2 == 23 then
param2 = 21 param2 = 21
end end
end end
return minetest.item_place(itemstack, placer, pointed_thing, param2) return minetest.item_place(itemstack, placer, pointed_thing, param2)
end, end,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
on_rotate = on_rotate, on_rotate = on_rotate,
}) })
-- Open trapdoor -- Open trapdoor
local groups_open = table.copy(groups) local groups_open = table.copy(groups)
local tiles_open = { local tiles_open = {
tile_side, tile_side,
tile_side .. "^[transformR180", tile_side .. "^[transformR180",
tile_side .. "^[transformR270", tile_side .. "^[transformR270",
tile_side .. "^[transformR90", tile_side .. "^[transformR90",
tile_front .. "^[transform46", tile_front .. "^[transform46",
tile_front .. "^[transformFY", tile_front .. "^[transformFY",
} }
groups_open.trapdoor = 2 groups_open.trapdoor = 2
groups_open.not_in_creative_inventory = 1 groups_open.not_in_creative_inventory = 1
minetest.register_node(name.."_open", { minetest.register_node(name.."_open", {
drawtype = "nodebox", drawtype = "nodebox",
tiles = tiles_open, tiles = tiles_open,
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true,
is_ground_content = false, is_ground_content = false,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
-- TODO: Implement Minecraft behaviour: Climbable if directly above -- TODO: Implement Minecraft behaviour: Climbable if directly above
-- ladder w/ matching orientation. -- ladder w/ matching orientation.
-- Current behavour: Always climbable -- Current behavour: Always climbable
climbable = true, climbable = true,
sunlight_propagates = true, sunlight_propagates = true,
pointable = true, pointable = true,
groups = groups_open, groups = groups_open,
_mcl_hardness = def._mcl_hardness, _mcl_hardness = def._mcl_hardness,
_mcl_blast_resistance = def._mcl_blast_resistance, _mcl_blast_resistance = def._mcl_blast_resistance,
sounds = def.sounds, sounds = def.sounds,
drop = name, drop = name,
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5}
}, },
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
mesecons = {effector = { mesecons = {effector = {
action_off = (function(pos, node) action_off = (function(pos, node)
punch(pos) punch(pos)
end), end),
}}, }},
on_rotate = on_rotate, on_rotate = on_rotate,
}) })
if minetest.get_modpath("doc") then if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", name, "nodes", name.."_open") doc.add_entry_alias("nodes", name, "nodes", name.."_open")
end end
end end

@ -1,9 +1,9 @@
mcl_doors = {} mcl_doors = {}
local this = minetest.get_current_modname() local this = minetest.get_current_modname()
local path = minetest.get_modpath(this) local path = minetest.get_modpath(this)
dofile(path.."/api_doors.lua") -- Doors API dofile(path.."/api_doors.lua") -- Doors API
dofile(path.."/api_trapdoors.lua") -- Trapdoors API dofile(path.."/api_trapdoors.lua") -- Trapdoors API
dofile(path.."/register.lua") -- Register builtin doors and trapdoors dofile(path.."/register.lua") -- Register builtin doors and trapdoors
dofile(path.."/alias.lua") -- Legacy aliases dofile(path.."/alias.lua") -- Legacy aliases

@ -1,275 +1,275 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
local function create_soil(pos, inv) local function create_soil(pos, inv)
if pos == nil then if pos == nil then
return false return false
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local name = node.name local name = node.name
local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
if minetest.get_item_group(name, "cultivatable") == 2 then if minetest.get_item_group(name, "cultivatable") == 2 then
if above.name == "air" then if above.name == "air" then
node.name = "mcl_farming:soil" node.name = "mcl_farming:soil"
minetest.set_node(pos, node) minetest.set_node(pos, node)
minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true) minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true)
return true return true
end end
elseif minetest.get_item_group(name, "cultivatable") == 1 then elseif minetest.get_item_group(name, "cultivatable") == 1 then
if above.name == "air" then if above.name == "air" then
node.name = "mcl_core:dirt" node.name = "mcl_core:dirt"
minetest.set_node(pos, node) minetest.set_node(pos, node)
minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true)
return true return true
end end
end end
return false return false
end end
local hoe_on_place_function = function(wear_divisor) local hoe_on_place_function = function(wear_divisor)
return function(itemstack, user, pointed_thing) return function(itemstack, user, pointed_thing)
-- Call on_rightclick if the pointed node defines it -- Call on_rightclick if the pointed node defines it
local node = minetest.get_node(pointed_thing.under) local node = minetest.get_node(pointed_thing.under)
if user and not user:get_player_control().sneak then if user and not user:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack
end end
end end
if minetest.is_protected(pointed_thing.under, user:get_player_name()) then if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
minetest.record_protection_violation(pointed_thing.under, user:get_player_name()) minetest.record_protection_violation(pointed_thing.under, user:get_player_name())
return itemstack return itemstack
end end
if create_soil(pointed_thing.under, user:get_inventory()) then if create_soil(pointed_thing.under, user:get_inventory()) then
if not minetest.is_creative_enabled(user:get_player_name()) then if not minetest.is_creative_enabled(user:get_player_name()) then
itemstack:add_wear(65535/wear_divisor) itemstack:add_wear(65535/wear_divisor)
end end
return itemstack return itemstack
end end
end end
end end
local uses = { local uses = {
wood = 60, wood = 60,
stone = 132, stone = 132,
iron = 251, iron = 251,
gold = 33, gold = 33,
diamond = 1562, diamond = 1562,
} }
local hoe_tt = S("Turns block into farmland") local hoe_tt = S("Turns block into farmland")
local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.") local hoe_longdesc = S("Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.")
local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.") local hoe_usagehelp = S("Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.")
minetest.register_tool("mcl_farming:hoe_wood", { minetest.register_tool("mcl_farming:hoe_wood", {
description = S("Wood Hoe"), description = S("Wood Hoe"),
_tt_help = hoe_tt.."\n"..S("Uses: @1", uses.wood), _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.wood),
_doc_items_longdesc = hoe_longdesc, _doc_items_longdesc = hoe_longdesc,
_doc_items_usagehelp = hoe_usagehelp, _doc_items_usagehelp = hoe_usagehelp,
_doc_items_hidden = false, _doc_items_hidden = false,
inventory_image = "farming_tool_woodhoe.png", inventory_image = "farming_tool_woodhoe.png",
wield_scale = mcl_vars.tool_wield_scale, wield_scale = mcl_vars.tool_wield_scale,
on_place = hoe_on_place_function(uses.wood), on_place = hoe_on_place_function(uses.wood),
groups = { tool=1, hoe=1, enchantability=15 }, groups = { tool=1, hoe=1, enchantability=15 },
tool_capabilities = { tool_capabilities = {
full_punch_interval = 1, full_punch_interval = 1,
damage_groups = { fleshy = 1, }, damage_groups = { fleshy = 1, },
punch_attack_uses = uses.wood, punch_attack_uses = uses.wood,
}, },
_repair_material = "group:wood", _repair_material = "group:wood",
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
_mcl_diggroups = { _mcl_diggroups = {
hoey = { speed = 2, level = 1, uses = 60 } hoey = { speed = 2, level = 1, uses = 60 }
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_wood", output = "mcl_farming:hoe_wood",
recipe = { recipe = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"", "mcl_core:stick"}, {"", "mcl_core:stick"},
{"", "mcl_core:stick"} {"", "mcl_core:stick"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_wood", output = "mcl_farming:hoe_wood",
recipe = { recipe = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"mcl_core:stick", ""}, {"mcl_core:stick", ""},
{"mcl_core:stick", ""} {"mcl_core:stick", ""}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "mcl_farming:hoe_wood", recipe = "mcl_farming:hoe_wood",
burntime = 10, burntime = 10,
}) })
minetest.register_tool("mcl_farming:hoe_stone", { minetest.register_tool("mcl_farming:hoe_stone", {
description = S("Stone Hoe"), description = S("Stone Hoe"),
_tt_help = hoe_tt.."\n"..S("Uses: @1", uses.stone), _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.stone),
_doc_items_longdesc = hoe_longdesc, _doc_items_longdesc = hoe_longdesc,
_doc_items_usagehelp = hoe_usagehelp, _doc_items_usagehelp = hoe_usagehelp,
inventory_image = "farming_tool_stonehoe.png", inventory_image = "farming_tool_stonehoe.png",
wield_scale = mcl_vars.tool_wield_scale, wield_scale = mcl_vars.tool_wield_scale,
on_place = hoe_on_place_function(uses.stone), on_place = hoe_on_place_function(uses.stone),
groups = { tool=1, hoe=1, enchantability=5 }, groups = { tool=1, hoe=1, enchantability=5 },
tool_capabilities = { tool_capabilities = {
full_punch_interval = 0.5, full_punch_interval = 0.5,
damage_groups = { fleshy = 1, }, damage_groups = { fleshy = 1, },
punch_attack_uses = uses.stone, punch_attack_uses = uses.stone,
}, },
_repair_material = "group:cobble", _repair_material = "group:cobble",
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
_mcl_diggroups = { _mcl_diggroups = {
hoey = { speed = 4, level = 3, uses = 132 } hoey = { speed = 4, level = 3, uses = 132 }
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_stone", output = "mcl_farming:hoe_stone",
recipe = { recipe = {
{"group:cobble", "group:cobble"}, {"group:cobble", "group:cobble"},
{"", "mcl_core:stick"}, {"", "mcl_core:stick"},
{"", "mcl_core:stick"} {"", "mcl_core:stick"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_stone", output = "mcl_farming:hoe_stone",
recipe = { recipe = {
{"group:cobble", "group:cobble"}, {"group:cobble", "group:cobble"},
{"mcl_core:stick", ""}, {"mcl_core:stick", ""},
{"mcl_core:stick", ""} {"mcl_core:stick", ""}
} }
}) })
minetest.register_tool("mcl_farming:hoe_iron", { minetest.register_tool("mcl_farming:hoe_iron", {
description = S("Iron Hoe"), description = S("Iron Hoe"),
_tt_help = hoe_tt.."\n"..S("Uses: @1", uses.iron), _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.iron),
_doc_items_longdesc = hoe_longdesc, _doc_items_longdesc = hoe_longdesc,
_doc_items_usagehelp = hoe_usagehelp, _doc_items_usagehelp = hoe_usagehelp,
inventory_image = "farming_tool_steelhoe.png", inventory_image = "farming_tool_steelhoe.png",
wield_scale = mcl_vars.tool_wield_scale, wield_scale = mcl_vars.tool_wield_scale,
on_place = hoe_on_place_function(uses.iron), on_place = hoe_on_place_function(uses.iron),
groups = { tool=1, hoe=1, enchantability=14 }, groups = { tool=1, hoe=1, enchantability=14 },
tool_capabilities = { tool_capabilities = {
-- 1/3 -- 1/3
full_punch_interval = 0.33333333, full_punch_interval = 0.33333333,
damage_groups = { fleshy = 1, }, damage_groups = { fleshy = 1, },
punch_attack_uses = uses.iron, punch_attack_uses = uses.iron,
}, },
_repair_material = "mcl_core:iron_ingot", _repair_material = "mcl_core:iron_ingot",
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
_mcl_diggroups = { _mcl_diggroups = {
hoey = { speed = 6, level = 4, uses = 251 } hoey = { speed = 6, level = 4, uses = 251 }
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_iron", output = "mcl_farming:hoe_iron",
recipe = { recipe = {
{"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, {"mcl_core:iron_ingot", "mcl_core:iron_ingot"},
{"", "mcl_core:stick"}, {"", "mcl_core:stick"},
{"", "mcl_core:stick"} {"", "mcl_core:stick"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_iron", output = "mcl_farming:hoe_iron",
recipe = { recipe = {
{"mcl_core:iron_ingot", "mcl_core:iron_ingot"}, {"mcl_core:iron_ingot", "mcl_core:iron_ingot"},
{"mcl_core:stick", ""}, {"mcl_core:stick", ""},
{"mcl_core:stick", ""} {"mcl_core:stick", ""}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_core:iron_nugget", output = "mcl_core:iron_nugget",
recipe = "mcl_farming:hoe_iron", recipe = "mcl_farming:hoe_iron",
cooktime = 10, cooktime = 10,
}) })
minetest.register_tool("mcl_farming:hoe_gold", { minetest.register_tool("mcl_farming:hoe_gold", {
description = S("Golden Hoe"), description = S("Golden Hoe"),
_tt_help = hoe_tt.."\n"..S("Uses: @1", uses.gold), _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.gold),
_doc_items_longdesc = hoe_longdesc, _doc_items_longdesc = hoe_longdesc,
_doc_items_usagehelp = hoe_usagehelp, _doc_items_usagehelp = hoe_usagehelp,
inventory_image = "farming_tool_goldhoe.png", inventory_image = "farming_tool_goldhoe.png",
wield_scale = mcl_vars.tool_wield_scale, wield_scale = mcl_vars.tool_wield_scale,
on_place = hoe_on_place_function(uses.gold), on_place = hoe_on_place_function(uses.gold),
groups = { tool=1, hoe=1, enchantability=22 }, groups = { tool=1, hoe=1, enchantability=22 },
tool_capabilities = { tool_capabilities = {
full_punch_interval = 1, full_punch_interval = 1,
damage_groups = { fleshy = 1, }, damage_groups = { fleshy = 1, },
punch_attack_uses = uses.gold, punch_attack_uses = uses.gold,
}, },
_repair_material = "mcl_core:gold_ingot", _repair_material = "mcl_core:gold_ingot",
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
_mcl_diggroups = { _mcl_diggroups = {
hoey = { speed = 12, level = 2, uses = 33 } hoey = { speed = 12, level = 2, uses = 33 }
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_gold", output = "mcl_farming:hoe_gold",
recipe = { recipe = {
{"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, {"mcl_core:gold_ingot", "mcl_core:gold_ingot"},
{"", "mcl_core:stick"}, {"", "mcl_core:stick"},
{"", "mcl_core:stick"} {"", "mcl_core:stick"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_gold", output = "mcl_farming:hoe_gold",
recipe = { recipe = {
{"mcl_core:gold_ingot", "mcl_core:gold_ingot"}, {"mcl_core:gold_ingot", "mcl_core:gold_ingot"},
{"mcl_core:stick", ""}, {"mcl_core:stick", ""},
{"mcl_core:stick", ""} {"mcl_core:stick", ""}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_core:gold_nugget", output = "mcl_core:gold_nugget",
recipe = "mcl_farming:hoe_gold", recipe = "mcl_farming:hoe_gold",
cooktime = 10, cooktime = 10,
}) })
minetest.register_tool("mcl_farming:hoe_diamond", { minetest.register_tool("mcl_farming:hoe_diamond", {
description = S("Diamond Hoe"), description = S("Diamond Hoe"),
_tt_help = hoe_tt.."\n"..S("Uses: @1", uses.diamond), _tt_help = hoe_tt.."\n"..S("Uses: @1", uses.diamond),
_doc_items_longdesc = hoe_longdesc, _doc_items_longdesc = hoe_longdesc,
_doc_items_usagehelp = hoe_usagehelp, _doc_items_usagehelp = hoe_usagehelp,
inventory_image = "farming_tool_diamondhoe.png", inventory_image = "farming_tool_diamondhoe.png",
wield_scale = mcl_vars.tool_wield_scale, wield_scale = mcl_vars.tool_wield_scale,
on_place = hoe_on_place_function(uses.diamond), on_place = hoe_on_place_function(uses.diamond),
groups = { tool=1, hoe=1, enchantability=10 }, groups = { tool=1, hoe=1, enchantability=10 },
tool_capabilities = { tool_capabilities = {
full_punch_interval = 0.25, full_punch_interval = 0.25,
damage_groups = { fleshy = 1, }, damage_groups = { fleshy = 1, },
punch_attack_uses = uses.diamond, punch_attack_uses = uses.diamond,
}, },
_repair_material = "mcl_core:diamond", _repair_material = "mcl_core:diamond",
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
_mcl_diggroups = { _mcl_diggroups = {
hoey = { speed = 8, level = 5, uses = 1562 } hoey = { speed = 8, level = 5, uses = 1562 }
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_diamond", output = "mcl_farming:hoe_diamond",
recipe = { recipe = {
{"mcl_core:diamond", "mcl_core:diamond"}, {"mcl_core:diamond", "mcl_core:diamond"},
{"", "mcl_core:stick"}, {"", "mcl_core:stick"},
{"", "mcl_core:stick"} {"", "mcl_core:stick"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_farming:hoe_diamond", output = "mcl_farming:hoe_diamond",
recipe = { recipe = {
{"mcl_core:diamond", "mcl_core:diamond"}, {"mcl_core:diamond", "mcl_core:diamond"},
{"mcl_core:stick", ""}, {"mcl_core:stick", ""},
{"mcl_core:stick", ""} {"mcl_core:stick", ""}
} }
}) })

@ -1,306 +1,306 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
-- Node box -- Node box
local p = {-2/16, -0.5, -2/16, 2/16, 0.5, 2/16} local p = {-2/16, -0.5, -2/16, 2/16, 0.5, 2/16}
local x1 = {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16} --oben(quer) -x local x1 = {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16} --oben(quer) -x
local x12 = {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16} --unten(quer) -x local x12 = {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16} --unten(quer) -x
local x2 = {2/16, 4/16, -1/16, 0.5, 7/16, 1/16} --oben(quer) x local x2 = {2/16, 4/16, -1/16, 0.5, 7/16, 1/16} --oben(quer) x
local x22 = {2/16, -2/16, -1/16, 0.5, 1/16, 1/16} --unten(quer) x local x22 = {2/16, -2/16, -1/16, 0.5, 1/16, 1/16} --unten(quer) x
local z1 = {-1/16, 4/16, -0.5, 1/16, 7/16, -2/16} --oben(quer) -z local z1 = {-1/16, 4/16, -0.5, 1/16, 7/16, -2/16} --oben(quer) -z
local z12 = {-1/16, -2/16, -0.5, 1/16, 1/16, -2/16} --unten(quer) -z local z12 = {-1/16, -2/16, -0.5, 1/16, 1/16, -2/16} --unten(quer) -z
local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z local z2 = {-1/16, 4/16, 2/16, 1/16, 7/16, 0.5} --oben(quer) z
local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z local z22 = {-1/16, -2/16, 2/16, 1/16, 1/16, 0.5} --unten(quer) z
-- Collision box -- Collision box
local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16} local cp = {-2/16, -0.5, -2/16, 2/16, 1.01, 2/16}
local cx1 = {-0.5, -0.5, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x local cx1 = {-0.5, -0.5, -2/16, -2/16, 1.01, 2/16} --unten(quer) -x
local cx2 = {2/16, -0.5, -2/16, 0.5, 1.01, 2/16} --unten(quer) x local cx2 = {2/16, -0.5, -2/16, 0.5, 1.01, 2/16} --unten(quer) x
local cz1 = {-2/16, -0.5, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z local cz1 = {-2/16, -0.5, -0.5, 2/16, 1.01, -2/16} --unten(quer) -z
local cz2 = {-2/16, -0.5, 2/16, 2/16, 1.01, 0.5} --unten(quer) z local cz2 = {-2/16, -0.5, 2/16, 2/16, 1.01, 0.5} --unten(quer) z
mcl_fences = {} mcl_fences = {}
function mcl_fences.register_fence(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds) function mcl_fences.register_fence(id, fence_name, texture, groups, hardness, blast_resistance, connects_to, sounds)
local cgroups = table.copy(groups) local cgroups = table.copy(groups)
if cgroups == nil then cgroups = {} end if cgroups == nil then cgroups = {} end
cgroups.fence = 1 cgroups.fence = 1
cgroups.deco_block = 1 cgroups.deco_block = 1
if connects_to == nil then if connects_to == nil then
connects_to = {} connects_to = {}
else else
connects_to = table.copy(connects_to) connects_to = table.copy(connects_to)
end end
local fence_id = minetest.get_current_modname()..":"..id local fence_id = minetest.get_current_modname()..":"..id
table.insert(connects_to, "group:solid") table.insert(connects_to, "group:solid")
table.insert(connects_to, "group:fence_gate") table.insert(connects_to, "group:fence_gate")
table.insert(connects_to, fence_id) table.insert(connects_to, fence_id)
minetest.register_node(fence_id, { minetest.register_node(fence_id, {
description = fence_name, description = fence_name,
_doc_items_longdesc = S("Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump."), _doc_items_longdesc = S("Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump."),
tiles = {texture}, tiles = {texture},
inventory_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", inventory_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126",
wield_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126", wield_image = "mcl_fences_fence_mask.png^" .. texture .. "^mcl_fences_fence_mask.png^[makealpha:255,126,126",
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
groups = cgroups, groups = cgroups,
stack_max = 64, stack_max = 64,
sunlight_propagates = true, sunlight_propagates = true,
drawtype = "nodebox", drawtype = "nodebox",
connect_sides = { "front", "back", "left", "right" }, connect_sides = { "front", "back", "left", "right" },
connects_to = connects_to, connects_to = connects_to,
node_box = { node_box = {
type = "connected", type = "connected",
fixed = {p}, fixed = {p},
connect_front = {z1,z12}, connect_front = {z1,z12},
connect_back = {z2,z22,}, connect_back = {z2,z22,},
connect_left = {x1,x12}, connect_left = {x1,x12},
connect_right = {x2,x22}, connect_right = {x2,x22},
}, },
collision_box = { collision_box = {
type = "connected", type = "connected",
fixed = {cp}, fixed = {cp},
connect_front = {cz1}, connect_front = {cz1},
connect_back = {cz2,}, connect_back = {cz2,},
connect_left = {cx1}, connect_left = {cx1},
connect_right = {cx2}, connect_right = {cx2},
}, },
sounds = sounds, sounds = sounds,
_mcl_blast_resistance = blast_resistance, _mcl_blast_resistance = blast_resistance,
_mcl_hardness = hardness, _mcl_hardness = hardness,
}) })
return fence_id return fence_id
end end
function mcl_fences.register_fence_gate(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) function mcl_fences.register_fence_gate(id, fence_gate_name, texture, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close)
local meta2 local meta2
local state2 = 0 local state2 = 0
local function update_gate(pos, node) local function update_gate(pos, node)
minetest.set_node(pos, node) minetest.set_node(pos, node)
end end
local gate_id = minetest.get_current_modname()..":"..id.."_gate" local gate_id = minetest.get_current_modname()..":"..id.."_gate"
local open_gate_id = gate_id .. "_open" local open_gate_id = gate_id .. "_open"
if not sound_open then if not sound_open then
sound_open = "doors_fencegate_open" sound_open = "doors_fencegate_open"
end end
if not sound_close then if not sound_close then
sound_close = "doors_fencegate_close" sound_close = "doors_fencegate_close"
end end
if not sound_gain_open then if not sound_gain_open then
sound_gain_open = 0.3 sound_gain_open = 0.3
end end
if not sound_gain_close then if not sound_gain_close then
sound_gain_close = 0.3 sound_gain_close = 0.3
end end
local function punch_gate(pos, node) local function punch_gate(pos, node)
meta2 = minetest.get_meta(pos) meta2 = minetest.get_meta(pos)
state2 = meta2:get_int("state") state2 = meta2:get_int("state")
local tmp_node2 local tmp_node2
if state2 == 1 then if state2 == 1 then
state2 = 0 state2 = 0
minetest.sound_play(sound_close, {gain = sound_gain_close, max_hear_distance = 10, pos = pos}, true) minetest.sound_play(sound_close, {gain = sound_gain_close, max_hear_distance = 10, pos = pos}, true)
tmp_node2 = {name=gate_id, param1=node.param1, param2=node.param2} tmp_node2 = {name=gate_id, param1=node.param1, param2=node.param2}
else else
state2 = 1 state2 = 1
minetest.sound_play(sound_open, {gain = sound_gain_open, max_hear_distance = 10, pos = pos}, true) minetest.sound_play(sound_open, {gain = sound_gain_open, max_hear_distance = 10, pos = pos}, true)
tmp_node2 = {name=open_gate_id, param1=node.param1, param2=node.param2} tmp_node2 = {name=open_gate_id, param1=node.param1, param2=node.param2}
end end
update_gate(pos, tmp_node2) update_gate(pos, tmp_node2)
meta2:set_int("state", state2) meta2:set_int("state", state2)
end end
local on_rotate local on_rotate
if minetest.get_modpath("screwdriver") then if minetest.get_modpath("screwdriver") then
on_rotate = screwdriver.rotate_simple on_rotate = screwdriver.rotate_simple
end end
local cgroups = table.copy(groups) local cgroups = table.copy(groups)
if cgroups == nil then cgroups = {} end if cgroups == nil then cgroups = {} end
cgroups.fence_gate = 1 cgroups.fence_gate = 1
cgroups.deco_block = 1 cgroups.deco_block = 1
cgroups.mesecon_ignore_opaque_dig = 1 cgroups.mesecon_ignore_opaque_dig = 1
cgroups.mesecon_effector_on = 1 cgroups.mesecon_effector_on = 1
cgroups.fence_gate = 1 cgroups.fence_gate = 1
minetest.register_node(open_gate_id, { minetest.register_node(open_gate_id, {
tiles = {texture}, tiles = {texture},
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
groups = cgroups, groups = cgroups,
drop = gate_id, drop = gate_id,
drawtype = "nodebox", drawtype = "nodebox",
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss {-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss
{6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss {6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss
{-0.5, 4/16, 1/16, -6/16, 7/16, 6/16}, --oben-links(quer) x {-0.5, 4/16, 1/16, -6/16, 7/16, 6/16}, --oben-links(quer) x
{-0.5, -2/16, 1/16, -6/16, 1/16, 6/16}, --unten-links(quer) x {-0.5, -2/16, 1/16, -6/16, 1/16, 6/16}, --unten-links(quer) x
{6/16, 4/16, 1/16, 0.5, 7/16, 0.5}, --oben-rechts(quer) x {6/16, 4/16, 1/16, 0.5, 7/16, 0.5}, --oben-rechts(quer) x
{6/16, -2/16, 1/16, 0.5, 1/16, 0.5}, --unten-rechts(quer) x {6/16, -2/16, 1/16, 0.5, 1/16, 0.5}, --unten-rechts(quer) x
{-0.5, -2/16, 6/16, -6/16, 7/16, 0.5}, --mitte links {-0.5, -2/16, 6/16, -6/16, 7/16, 0.5}, --mitte links
{6/16, 1/16, 0.5, 0.5, 4/16, 6/16}, --mitte rechts {6/16, 1/16, 0.5, 0.5, 4/16, 6/16}, --mitte rechts
} }
}, },
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate {-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate
} }
}, },
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
punch_gate(pos, node) punch_gate(pos, node)
end, end,
mesecons = {effector = { mesecons = {effector = {
action_off = (function(pos, node) action_off = (function(pos, node)
punch_gate(pos, node) punch_gate(pos, node)
end), end),
}}, }},
on_rotate = on_rotate, on_rotate = on_rotate,
sounds = sounds, sounds = sounds,
_mcl_blast_resistance = blast_resistance, _mcl_blast_resistance = blast_resistance,
_mcl_hardness = hardness, _mcl_hardness = hardness,
}) })
local cgroups_closed = table.copy(cgroups) local cgroups_closed = table.copy(cgroups)
cgroups_closed.mesecon_effector_on = nil cgroups_closed.mesecon_effector_on = nil
cgroups_closed.mesecon_effector_off = nil cgroups_closed.mesecon_effector_off = nil
minetest.register_node(gate_id, { minetest.register_node(gate_id, {
description = fence_gate_name, description = fence_gate_name,
_tt_help = S("Openable by players and redstone power"), _tt_help = S("Openable by players and redstone power"),
_doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."),
_doc_items_usagehelp = S("Right-click the fence gate to open or close it."), _doc_items_usagehelp = S("Right-click the fence gate to open or close it."),
tiles = {texture}, tiles = {texture},
inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", inventory_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126",
wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126", wield_image = "mcl_fences_fence_gate_mask.png^" .. texture .. "^mcl_fences_fence_gate_mask.png^[makealpha:255,126,126",
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
stack_max = 64, stack_max = 64,
paramtype2 = "facedir", paramtype2 = "facedir",
sunlight_propagates = true, sunlight_propagates = true,
walkable = true, walkable = true,
groups = cgroups_closed, groups = cgroups_closed,
drawtype = "nodebox", drawtype = "nodebox",
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss {-0.5, -3/16, -1/16, -6/16, 0.5, 1/16}, --links abschluss
{6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss {6/16, -3/16, -1/16, 0.5, 0.5, 1/16}, --rechts abschluss
{-2/16, -2/16, -1/16, 0, 7/16, 1/16}, --mitte links {-2/16, -2/16, -1/16, 0, 7/16, 1/16}, --mitte links
{0, -2/16, -1/16, 2/16, 7/16, 1/16}, --mitte rechts {0, -2/16, -1/16, 2/16, 7/16, 1/16}, --mitte rechts
{-0.5, 4/16, -1/16, -2/16, 7/16, 1/16}, --oben(quer) -z {-0.5, 4/16, -1/16, -2/16, 7/16, 1/16}, --oben(quer) -z
{-0.5, -2/16, -1/16, -2/16, 1/16, 1/16}, --unten(quer) -z {-0.5, -2/16, -1/16, -2/16, 1/16, 1/16}, --unten(quer) -z
{2/16, 4/16, -1/16, 0.5, 7/16, 1/16}, --oben(quer) z {2/16, 4/16, -1/16, 0.5, 7/16, 1/16}, --oben(quer) z
{2/16, -2/16, -1/16, 0.5, 1/16, 1/16}, --unten(quer) z {2/16, -2/16, -1/16, 0.5, 1/16, 1/16}, --unten(quer) z
} }
}, },
collision_box = { collision_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -3/16, -2/16, 0.5, 1, 2/16}, --gate {-0.5, -3/16, -2/16, 0.5, 1, 2/16}, --gate
} }
}, },
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = { fixed = {
{-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate {-0.5, -3/16, -1/16, 0.5, 0.5, 1/16}, --gate
} }
}, },
on_construct = function(pos) on_construct = function(pos)
meta2 = minetest.get_meta(pos) meta2 = minetest.get_meta(pos)
meta2:set_int("state", 0) meta2:set_int("state", 0)
state2 = 0 state2 = 0
end, end,
mesecons = {effector = { mesecons = {effector = {
action_on = (function(pos, node) action_on = (function(pos, node)
punch_gate(pos, node) punch_gate(pos, node)
end), end),
}}, }},
on_rotate = on_rotate, on_rotate = on_rotate,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
punch_gate(pos, node) punch_gate(pos, node)
end, end,
sounds = sounds, sounds = sounds,
_mcl_blast_resistance = blast_resistance, _mcl_blast_resistance = blast_resistance,
_mcl_hardness = hardness, _mcl_hardness = hardness,
}) })
if minetest.get_modpath("doc") then if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", gate_id, "nodes", open_gate_id) doc.add_entry_alias("nodes", gate_id, "nodes", open_gate_id)
end end
return gate_id, open_gate_id return gate_id, open_gate_id
end end
function mcl_fences.register_fence_and_fence_gate(id, fence_name, fence_gate_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close, texture_fence_gate) function mcl_fences.register_fence_and_fence_gate(id, fence_name, fence_gate_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close, texture_fence_gate)
if texture_fence_gate == nil then if texture_fence_gate == nil then
texture_fence_gate = texture_fence texture_fence_gate = texture_fence
end end
local fence_id = mcl_fences.register_fence(id, fence_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds) local fence_id = mcl_fences.register_fence(id, fence_name, texture_fence, groups, hardness, blast_resistance, connects_to, sounds)
local gate_id, open_gate_id = mcl_fences.register_fence_gate(id, fence_gate_name, texture_fence_gate, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close) local gate_id, open_gate_id = mcl_fences.register_fence_gate(id, fence_gate_name, texture_fence_gate, groups, hardness, blast_resistance, sounds, sound_open, sound_close, sound_gain_open, sound_gain_close)
return fence_id, gate_id, open_gate_id return fence_id, gate_id, open_gate_id
end end
local wood_groups = {handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20} local wood_groups = {handy=1,axey=1, flammable=2,fence_wood=1, fire_encouragement=5, fire_flammability=20}
local wood_connect = {"group:fence_wood"} local wood_connect = {"group:fence_wood"}
local wood_sounds = mcl_sounds.node_sound_wood_defaults() local wood_sounds = mcl_sounds.node_sound_wood_defaults()
local woods = { local woods = {
{"", S("Oak Fence"), S("Oak Fence Gate"), "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"}, {"", S("Oak Fence"), S("Oak Fence Gate"), "mcl_fences_fence_oak.png", "mcl_fences_fence_gate_oak.png", "mcl_core:wood"},
{"spruce", S("Spruce Fence"), S("Spruce Fence Gate"), "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"}, {"spruce", S("Spruce Fence"), S("Spruce Fence Gate"), "mcl_fences_fence_spruce.png", "mcl_fences_fence_gate_spruce.png", "mcl_core:sprucewood"},
{"birch", S("Birch Fence"), S("Birch Fence Gate"), "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"}, {"birch", S("Birch Fence"), S("Birch Fence Gate"), "mcl_fences_fence_birch.png", "mcl_fences_fence_gate_birch.png", "mcl_core:birchwood"},
{"jungle", S("Jungle Fence"), S("Jungle Fence Gate"), "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"}, {"jungle", S("Jungle Fence"), S("Jungle Fence Gate"), "mcl_fences_fence_jungle.png", "mcl_fences_fence_gate_jungle.png", "mcl_core:junglewood"},
{"dark_oak", S("Dark Oak Fence"), S("Dark Oak Fence Gate"), "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"}, {"dark_oak", S("Dark Oak Fence"), S("Dark Oak Fence Gate"), "mcl_fences_fence_big_oak.png", "mcl_fences_fence_gate_big_oak.png", "mcl_core:darkwood"},
{"acacia", S("Acacia Fence"), S("Acacia Fence Gate"), "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"}, {"acacia", S("Acacia Fence"), S("Acacia Fence Gate"), "mcl_fences_fence_acacia.png", "mcl_fences_fence_gate_acacia.png", "mcl_core:acaciawood"},
} }
for w=1, #woods do for w=1, #woods do
local wood = woods[w] local wood = woods[w]
local id, id_gate local id, id_gate
if wood[1] == "" then if wood[1] == "" then
id = "fence" id = "fence"
id_gate = "fence_gate" id_gate = "fence_gate"
else else
id = wood[1].."_fence" id = wood[1].."_fence"
id_gate = wood[1].."_fence_gate" id_gate = wood[1].."_fence_gate"
end end
mcl_fences.register_fence_and_fence_gate(id, wood[2], wood[3], wood[4], wood_groups, 2, 15, wood_connect, wood_sounds) mcl_fences.register_fence_and_fence_gate(id, wood[2], wood[3], wood[4], wood_groups, 2, 15, wood_connect, wood_sounds)
minetest.register_craft({ minetest.register_craft({
output = "mcl_fences:"..id.." 3", output = "mcl_fences:"..id.." 3",
recipe = { recipe = {
{wood[6], "mcl_core:stick", wood[6]}, {wood[6], "mcl_core:stick", wood[6]},
{wood[6], "mcl_core:stick", wood[6]}, {wood[6], "mcl_core:stick", wood[6]},
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_fences:"..id_gate, output = "mcl_fences:"..id_gate,
recipe = { recipe = {
{"mcl_core:stick", wood[6], "mcl_core:stick"}, {"mcl_core:stick", wood[6], "mcl_core:stick"},
{"mcl_core:stick", wood[6], "mcl_core:stick"}, {"mcl_core:stick", wood[6], "mcl_core:stick"},
} }
}) })
end end
-- Nether Brick Fence (without fence gate!) -- Nether Brick Fence (without fence gate!)
mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults())
minetest.register_craft({ minetest.register_craft({
output = "mcl_fences:nether_brick_fence 6", output = "mcl_fences:nether_brick_fence 6",
recipe = { recipe = {
{"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"},
{"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"}, {"mcl_nether:nether_brick", "mcl_nether:netherbrick", "mcl_nether:nether_brick"},
} }
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "group:fence_wood", recipe = "group:fence_wood",
burntime = 15, burntime = 15,
}) })

@ -1,6 +1,6 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
-- Loom Code. Used to craft banner designs easier. Still needs a GUI. https://minecraft.fandom.com/wiki/Loom -- Loom Code. Used to craft banner designs easier. Still needs a GUI. https://minecraft.fandom.com/wiki/Loom
minetest.register_node("mcl_loom:loom", { minetest.register_node("mcl_loom:loom", {
description = S("Loom"), description = S("Loom"),
_tt_help = S("Used to create banner designs"), _tt_help = S("Used to create banner designs"),
@ -13,7 +13,7 @@ minetest.register_node("mcl_loom:loom", {
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {choppy=1, deco_block=1, material_wood=1, flammable=1} groups = {choppy=1, deco_block=1, material_wood=1, flammable=1}
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_loom:loom", output = "mcl_loom:loom",

@ -1,447 +1,447 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
minetest.register_craftitem("mcl_mobitems:rotten_flesh", { minetest.register_craftitem("mcl_mobitems:rotten_flesh", {
description = S("Rotten Flesh"), description = S("Rotten Flesh"),
_tt_help = minetest.colorize(mcl_colors.YELLOW, S("80% chance of food poisoning")), _tt_help = minetest.colorize(mcl_colors.YELLOW, S("80% chance of food poisoning")),
_doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while."), _doc_items_longdesc = S("Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while."),
inventory_image = "mcl_mobitems_rotten_flesh.png", inventory_image = "mcl_mobitems_rotten_flesh.png",
wield_image = "mcl_mobitems_rotten_flesh.png", wield_image = "mcl_mobitems_rotten_flesh.png",
on_place = minetest.item_eat(4), on_place = minetest.item_eat(4),
on_secondary_use = minetest.item_eat(4), on_secondary_use = minetest.item_eat(4),
groups = { food = 2, eatable = 4 }, groups = { food = 2, eatable = 4 },
_mcl_saturation = 0.8, _mcl_saturation = 0.8,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:mutton", { minetest.register_craftitem("mcl_mobitems:mutton", {
description = S("Raw Mutton"), description = S("Raw Mutton"),
_doc_items_longdesc = S("Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value."), _doc_items_longdesc = S("Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value."),
inventory_image = "mcl_mobitems_mutton_raw.png", inventory_image = "mcl_mobitems_mutton_raw.png",
wield_image = "mcl_mobitems_mutton_raw.png", wield_image = "mcl_mobitems_mutton_raw.png",
on_place = minetest.item_eat(2), on_place = minetest.item_eat(2),
on_secondary_use = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2),
groups = { food = 2, eatable = 2, smoker_cookable = 1 }, groups = { food = 2, eatable = 2, smoker_cookable = 1 },
_mcl_saturation = 1.2, _mcl_saturation = 1.2,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:cooked_mutton", { minetest.register_craftitem("mcl_mobitems:cooked_mutton", {
description = S("Cooked Mutton"), description = S("Cooked Mutton"),
_doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."),
inventory_image = "mcl_mobitems_mutton_cooked.png", inventory_image = "mcl_mobitems_mutton_cooked.png",
wield_image = "mcl_mobitems_mutton_cooked.png", wield_image = "mcl_mobitems_mutton_cooked.png",
on_place = minetest.item_eat(6), on_place = minetest.item_eat(6),
on_secondary_use = minetest.item_eat(6), on_secondary_use = minetest.item_eat(6),
groups = { food = 2, eatable = 6 }, groups = { food = 2, eatable = 6 },
_mcl_saturation = 9.6, _mcl_saturation = 9.6,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:beef", { minetest.register_craftitem("mcl_mobitems:beef", {
description = S("Raw Beef"), description = S("Raw Beef"),
_doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."),
inventory_image = "mcl_mobitems_beef_raw.png", inventory_image = "mcl_mobitems_beef_raw.png",
wield_image = "mcl_mobitems_beef_raw.png", wield_image = "mcl_mobitems_beef_raw.png",
on_place = minetest.item_eat(3), on_place = minetest.item_eat(3),
on_secondary_use = minetest.item_eat(3), on_secondary_use = minetest.item_eat(3),
groups = { food = 2, eatable = 3, smoker_cookable = 1 }, groups = { food = 2, eatable = 3, smoker_cookable = 1 },
_mcl_saturation = 1.8, _mcl_saturation = 1.8,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:cooked_beef", { minetest.register_craftitem("mcl_mobitems:cooked_beef", {
description = S("Steak"), description = S("Steak"),
_doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."),
inventory_image = "mcl_mobitems_beef_cooked.png", inventory_image = "mcl_mobitems_beef_cooked.png",
wield_image = "mcl_mobitems_beef_cooked.png", wield_image = "mcl_mobitems_beef_cooked.png",
on_place = minetest.item_eat(8), on_place = minetest.item_eat(8),
on_secondary_use = minetest.item_eat(8), on_secondary_use = minetest.item_eat(8),
groups = { food = 2, eatable = 8 }, groups = { food = 2, eatable = 8 },
_mcl_saturation = 12.8, _mcl_saturation = 12.8,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:chicken", { minetest.register_craftitem("mcl_mobitems:chicken", {
description = S("Raw Chicken"), description = S("Raw Chicken"),
_tt_help = minetest.colorize(mcl_colors.YELLOW, S("30% chance of food poisoning")), _tt_help = minetest.colorize(mcl_colors.YELLOW, S("30% chance of food poisoning")),
_doc_items_longdesc = S("Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value."), _doc_items_longdesc = S("Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value."),
inventory_image = "mcl_mobitems_chicken_raw.png", inventory_image = "mcl_mobitems_chicken_raw.png",
wield_image = "mcl_mobitems_chicken_raw.png", wield_image = "mcl_mobitems_chicken_raw.png",
on_place = minetest.item_eat(2), on_place = minetest.item_eat(2),
on_secondary_use = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2),
groups = { food = 2, eatable = 2, smoker_cookable = 1 }, groups = { food = 2, eatable = 2, smoker_cookable = 1 },
_mcl_saturation = 1.2, _mcl_saturation = 1.2,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:cooked_chicken", { minetest.register_craftitem("mcl_mobitems:cooked_chicken", {
description = S("Cooked Chicken"), description = S("Cooked Chicken"),
_doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."),
inventory_image = "mcl_mobitems_chicken_cooked.png", inventory_image = "mcl_mobitems_chicken_cooked.png",
wield_image = "mcl_mobitems_chicken_cooked.png", wield_image = "mcl_mobitems_chicken_cooked.png",
on_place = minetest.item_eat(6), on_place = minetest.item_eat(6),
on_secondary_use = minetest.item_eat(6), on_secondary_use = minetest.item_eat(6),
groups = { food = 2, eatable = 6 }, groups = { food = 2, eatable = 6 },
_mcl_saturation = 7.2, _mcl_saturation = 7.2,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:porkchop", { minetest.register_craftitem("mcl_mobitems:porkchop", {
description = S("Raw Porkchop"), description = S("Raw Porkchop"),
_doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."),
inventory_image = "mcl_mobitems_porkchop_raw.png", inventory_image = "mcl_mobitems_porkchop_raw.png",
wield_image = "mcl_mobitems_porkchop_raw.png", wield_image = "mcl_mobitems_porkchop_raw.png",
on_place = minetest.item_eat(3), on_place = minetest.item_eat(3),
on_secondary_use = minetest.item_eat(3), on_secondary_use = minetest.item_eat(3),
groups = { food = 2, eatable = 3, smoker_cookable = 1 }, groups = { food = 2, eatable = 3, smoker_cookable = 1 },
_mcl_saturation = 1.8, _mcl_saturation = 1.8,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { minetest.register_craftitem("mcl_mobitems:cooked_porkchop", {
description = S("Cooked Porkchop"), description = S("Cooked Porkchop"),
_doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."), _doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."),
inventory_image = "mcl_mobitems_porkchop_cooked.png", inventory_image = "mcl_mobitems_porkchop_cooked.png",
wield_image = "mcl_mobitems_porkchop_cooked.png", wield_image = "mcl_mobitems_porkchop_cooked.png",
on_place = minetest.item_eat(8), on_place = minetest.item_eat(8),
on_secondary_use = minetest.item_eat(8), on_secondary_use = minetest.item_eat(8),
groups = { food = 2, eatable = 8 }, groups = { food = 2, eatable = 8 },
_mcl_saturation = 12.8, _mcl_saturation = 12.8,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:rabbit", { minetest.register_craftitem("mcl_mobitems:rabbit", {
description = S("Raw Rabbit"), description = S("Raw Rabbit"),
_doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."),
inventory_image = "mcl_mobitems_rabbit_raw.png", inventory_image = "mcl_mobitems_rabbit_raw.png",
wield_image = "mcl_mobitems_rabbit_raw.png", wield_image = "mcl_mobitems_rabbit_raw.png",
on_place = minetest.item_eat(3), on_place = minetest.item_eat(3),
on_secondary_use = minetest.item_eat(3), on_secondary_use = minetest.item_eat(3),
groups = { food = 2, eatable = 3, smoker_cookable = 1 }, groups = { food = 2, eatable = 3, smoker_cookable = 1 },
_mcl_saturation = 1.8, _mcl_saturation = 1.8,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { minetest.register_craftitem("mcl_mobitems:cooked_rabbit", {
description = S("Cooked Rabbit"), description = S("Cooked Rabbit"),
_doc_items_longdesc = S("This is a food item which can be eaten."), _doc_items_longdesc = S("This is a food item which can be eaten."),
inventory_image = "mcl_mobitems_rabbit_cooked.png", inventory_image = "mcl_mobitems_rabbit_cooked.png",
wield_image = "mcl_mobitems_rabbit_cooked.png", wield_image = "mcl_mobitems_rabbit_cooked.png",
on_place = minetest.item_eat(5), on_place = minetest.item_eat(5),
on_secondary_use = minetest.item_eat(5), on_secondary_use = minetest.item_eat(5),
groups = { food = 2, eatable = 5 }, groups = { food = 2, eatable = 5 },
_mcl_saturation = 6.0, _mcl_saturation = 6.0,
stack_max = 64, stack_max = 64,
}) })
-- Reset food poisoning and status effects -- Reset food poisoning and status effects
local function drink_milk(itemstack, player, pointed_thing) local function drink_milk(itemstack, player, pointed_thing)
local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing)
-- Check if we were allowed to drink this (eat delay check) -- Check if we were allowed to drink this (eat delay check)
if mcl_hunger.active and (bucket:get_name() ~= "mcl_mobitems:milk_bucket" or minetest.is_creative_enabled(player:get_player_name())) then if mcl_hunger.active and (bucket:get_name() ~= "mcl_mobitems:milk_bucket" or minetest.is_creative_enabled(player:get_player_name())) then
mcl_hunger.stop_poison(player) mcl_hunger.stop_poison(player)
end end
mcl_potions._reset_player_effects(player) mcl_potions._reset_player_effects(player)
return bucket return bucket
end end
minetest.register_craftitem("mcl_mobitems:milk_bucket", { minetest.register_craftitem("mcl_mobitems:milk_bucket", {
description = S("Milk"), description = S("Milk"),
_tt_help = minetest.colorize(mcl_colors.GREEN, S("Removes all status effects")), _tt_help = minetest.colorize(mcl_colors.GREEN, S("Removes all status effects")),
_doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points."), _doc_items_longdesc = S("Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points."),
_doc_items_usagehelp = S("Use the placement key to drink the milk."), _doc_items_usagehelp = S("Use the placement key to drink the milk."),
inventory_image = "mcl_mobitems_bucket_milk.png", inventory_image = "mcl_mobitems_bucket_milk.png",
wield_image = "mcl_mobitems_bucket_milk.png", wield_image = "mcl_mobitems_bucket_milk.png",
on_place = drink_milk, on_place = drink_milk,
on_secondary_use = drink_milk, on_secondary_use = drink_milk,
stack_max = 1, stack_max = 1,
groups = { food = 3, can_eat_when_full = 1 }, groups = { food = 3, can_eat_when_full = 1 },
}) })
minetest.register_craftitem("mcl_mobitems:spider_eye", { minetest.register_craftitem("mcl_mobitems:spider_eye", {
description = S("Spider Eye"), description = S("Spider Eye"),
_tt_help = minetest.colorize(mcl_colors.YELLOW, S("Poisonous")), _tt_help = minetest.colorize(mcl_colors.YELLOW, S("Poisonous")),
_doc_items_longdesc = S("Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly."), _doc_items_longdesc = S("Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly."),
inventory_image = "mcl_mobitems_spider_eye.png", inventory_image = "mcl_mobitems_spider_eye.png",
wield_image = "mcl_mobitems_spider_eye.png", wield_image = "mcl_mobitems_spider_eye.png",
on_place = minetest.item_eat(2), on_place = minetest.item_eat(2),
on_secondary_use = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2),
groups = { food = 2, eatable = 2, brewitem = 1 }, groups = { food = 2, eatable = 2, brewitem = 1 },
_mcl_saturation = 3.2, _mcl_saturation = 3.2,
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:bone", { minetest.register_craftitem("mcl_mobitems:bone", {
description = S("Bone"), description = S("Bone"),
_doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."), _doc_items_longdesc = S("Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient."),
_doc_items_usagehelp = S("Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it."), _doc_items_usagehelp = S("Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it."),
inventory_image = "mcl_mobitems_bone.png", inventory_image = "mcl_mobitems_bone.png",
stack_max = 64, stack_max = 64,
groups = { craftitem=1 }, groups = { craftitem=1 },
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
}) })
minetest.register_craftitem("mcl_mobitems:string",{ minetest.register_craftitem("mcl_mobitems:string",{
description = S("String"), description = S("String"),
_doc_items_longdesc = S("Strings are used in crafting."), _doc_items_longdesc = S("Strings are used in crafting."),
inventory_image = "mcl_mobitems_string.png", inventory_image = "mcl_mobitems_string.png",
stack_max = 64, stack_max = 64,
groups = { craftitem = 1 }, groups = { craftitem = 1 },
}) })
minetest.register_craftitem("mcl_mobitems:blaze_rod", { minetest.register_craftitem("mcl_mobitems:blaze_rod", {
description = S("Blaze Rod"), description = S("Blaze Rod"),
_doc_items_longdesc = S("This is a crafting component dropped from dead blazes."), _doc_items_longdesc = S("This is a crafting component dropped from dead blazes."),
wield_image = "mcl_mobitems_blaze_rod.png", wield_image = "mcl_mobitems_blaze_rod.png",
inventory_image = "mcl_mobitems_blaze_rod.png", inventory_image = "mcl_mobitems_blaze_rod.png",
groups = { craftitem = 1 }, groups = { craftitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:blaze_powder", { minetest.register_craftitem("mcl_mobitems:blaze_powder", {
description = S("Blaze Powder"), description = S("Blaze Powder"),
_doc_items_longdesc = S("This item is mainly used for crafting."), _doc_items_longdesc = S("This item is mainly used for crafting."),
wield_image = "mcl_mobitems_blaze_powder.png", wield_image = "mcl_mobitems_blaze_powder.png",
inventory_image = "mcl_mobitems_blaze_powder.png", inventory_image = "mcl_mobitems_blaze_powder.png",
groups = { craftitem = 1, brewitem = 1 }, groups = { craftitem = 1, brewitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:magma_cream", { minetest.register_craftitem("mcl_mobitems:magma_cream", {
description = S("Magma Cream"), description = S("Magma Cream"),
_doc_items_longdesc = S("Magma cream is a crafting component."), _doc_items_longdesc = S("Magma cream is a crafting component."),
wield_image = "mcl_mobitems_magma_cream.png", wield_image = "mcl_mobitems_magma_cream.png",
inventory_image = "mcl_mobitems_magma_cream.png", inventory_image = "mcl_mobitems_magma_cream.png",
groups = { craftitem = 1, brewitem = 1 }, groups = { craftitem = 1, brewitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:ghast_tear", { minetest.register_craftitem("mcl_mobitems:ghast_tear", {
description = S("Ghast Tear"), description = S("Ghast Tear"),
_doc_items_longdesc = S("Place this item in an item frame as decoration."), _doc_items_longdesc = S("Place this item in an item frame as decoration."),
wield_image = "mcl_mobitems_ghast_tear.png", wield_image = "mcl_mobitems_ghast_tear.png",
inventory_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png",
groups = { brewitem = 1 }, groups = { brewitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:nether_star", { minetest.register_craftitem("mcl_mobitems:nether_star", {
description = S("Nether Star"), description = S("Nether Star"),
_doc_items_longdesc = S("A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration."), _doc_items_longdesc = S("A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration."),
wield_image = "mcl_mobitems_nether_star.png", wield_image = "mcl_mobitems_nether_star.png",
inventory_image = "mcl_mobitems_nether_star.png", inventory_image = "mcl_mobitems_nether_star.png",
-- TODO: Reveal item when it's useful -- TODO: Reveal item when it's useful
groups = { craftitem = 1, not_in_creative_inventory = 1 }, groups = { craftitem = 1, not_in_creative_inventory = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:leather", { minetest.register_craftitem("mcl_mobitems:leather", {
description = S("Leather"), description = S("Leather"),
_doc_items_longdesc = S("Leather is a versatile crafting component."), _doc_items_longdesc = S("Leather is a versatile crafting component."),
wield_image = "mcl_mobitems_leather.png", wield_image = "mcl_mobitems_leather.png",
inventory_image = "mcl_mobitems_leather.png", inventory_image = "mcl_mobitems_leather.png",
groups = { craftitem = 1 }, groups = { craftitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:feather", { minetest.register_craftitem("mcl_mobitems:feather", {
description = S("Feather"), description = S("Feather"),
_doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."), _doc_items_longdesc = S("Feathers are used in crafting and are dropped from chickens."),
wield_image = "mcl_mobitems_feather.png", wield_image = "mcl_mobitems_feather.png",
inventory_image = "mcl_mobitems_feather.png", inventory_image = "mcl_mobitems_feather.png",
groups = { craftitem = 1 }, groups = { craftitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:rabbit_hide", { minetest.register_craftitem("mcl_mobitems:rabbit_hide", {
description = S("Rabbit Hide"), description = S("Rabbit Hide"),
_doc_items_longdesc = S("Rabbit hide is used to create leather."), _doc_items_longdesc = S("Rabbit hide is used to create leather."),
wield_image = "mcl_mobitems_rabbit_hide.png", wield_image = "mcl_mobitems_rabbit_hide.png",
inventory_image = "mcl_mobitems_rabbit_hide.png", inventory_image = "mcl_mobitems_rabbit_hide.png",
groups = { craftitem = 1 }, groups = { craftitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:rabbit_foot", { minetest.register_craftitem("mcl_mobitems:rabbit_foot", {
description = S("Rabbit's Foot"), description = S("Rabbit's Foot"),
_doc_items_longdesc = S("Must be your lucky day! Place this item in an item frame for decoration."), _doc_items_longdesc = S("Must be your lucky day! Place this item in an item frame for decoration."),
wield_image = "mcl_mobitems_rabbit_foot.png", wield_image = "mcl_mobitems_rabbit_foot.png",
inventory_image = "mcl_mobitems_rabbit_foot.png", inventory_image = "mcl_mobitems_rabbit_foot.png",
groups = { brewitem = 1 }, groups = { brewitem = 1 },
stack_max = 64, stack_max = 64,
}) })
minetest.register_craftitem("mcl_mobitems:saddle", { minetest.register_craftitem("mcl_mobitems:saddle", {
description = S("Saddle"), description = S("Saddle"),
_tt_help = S("Can be placed on animals to ride them"), _tt_help = S("Can be placed on animals to ride them"),
_doc_items_longdesc = S("Saddles can be put on some animals in order to mount them."), _doc_items_longdesc = S("Saddles can be put on some animals in order to mount them."),
_doc_items_usagehelp = S("Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again."), _doc_items_usagehelp = S("Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again."),
wield_image = "mcl_mobitems_saddle.png", wield_image = "mcl_mobitems_saddle.png",
inventory_image = "mcl_mobitems_saddle.png", inventory_image = "mcl_mobitems_saddle.png",
groups = { transport = 1 }, groups = { transport = 1 },
stack_max = 1, stack_max = 1,
}) })
minetest.register_craftitem("mcl_mobitems:rabbit_stew", { minetest.register_craftitem("mcl_mobitems:rabbit_stew", {
description = S("Rabbit Stew"), description = S("Rabbit Stew"),
_doc_items_longdesc = S("Rabbit stew is a very nutricious food item."), _doc_items_longdesc = S("Rabbit stew is a very nutricious food item."),
wield_image = "mcl_mobitems_rabbit_stew.png", wield_image = "mcl_mobitems_rabbit_stew.png",
inventory_image = "mcl_mobitems_rabbit_stew.png", inventory_image = "mcl_mobitems_rabbit_stew.png",
stack_max = 1, stack_max = 1,
on_place = minetest.item_eat(10, "mcl_core:bowl"), on_place = minetest.item_eat(10, "mcl_core:bowl"),
on_secondary_use = minetest.item_eat(10, "mcl_core:bowl"), on_secondary_use = minetest.item_eat(10, "mcl_core:bowl"),
groups = { food = 3, eatable = 10 }, groups = { food = 3, eatable = 10 },
_mcl_saturation = 12.0, _mcl_saturation = 12.0,
}) })
minetest.register_craftitem("mcl_mobitems:shulker_shell", { minetest.register_craftitem("mcl_mobitems:shulker_shell", {
description = S("Shulker Shell"), description = S("Shulker Shell"),
_doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."), _doc_items_longdesc = S("Shulker shells are used in crafting. They are dropped from dead shulkers."),
inventory_image = "mcl_mobitems_shulker_shell.png", inventory_image = "mcl_mobitems_shulker_shell.png",
groups = { craftitem = 1 }, groups = { craftitem = 1 },
}) })
minetest.register_craftitem("mcl_mobitems:slimeball", { minetest.register_craftitem("mcl_mobitems:slimeball", {
description = S("Slimeball"), description = S("Slimeball"),
_doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."), _doc_items_longdesc = S("Slimeballs are used in crafting. They are dropped from slimes."),
inventory_image = "mcl_mobitems_slimeball.png", inventory_image = "mcl_mobitems_slimeball.png",
groups = { craftitem = 1 }, groups = { craftitem = 1 },
}) })
minetest.register_craftitem("mcl_mobitems:gunpowder", { minetest.register_craftitem("mcl_mobitems:gunpowder", {
description = S("Gunpowder"), description = S("Gunpowder"),
_doc_items_longdesc = doc.sub.items.temp.craftitem, _doc_items_longdesc = doc.sub.items.temp.craftitem,
inventory_image = "default_gunpowder.png", inventory_image = "default_gunpowder.png",
stack_max = 64, stack_max = 64,
groups = { craftitem=1, brewitem = 1 }, groups = { craftitem=1, brewitem = 1 },
}) })
minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { minetest.register_tool("mcl_mobitems:carrot_on_a_stick", {
description = S("Carrot on a Stick"), description = S("Carrot on a Stick"),
_tt_help = S("Lets you ride a saddled pig"), _tt_help = S("Lets you ride a saddled pig"),
_doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them."), _doc_items_longdesc = S("A carrot on a stick can be used on saddled pigs to ride them."),
_doc_items_usagehelp = S("Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick."), _doc_items_usagehelp = S("Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick."),
wield_image = "mcl_mobitems_carrot_on_a_stick.png", wield_image = "mcl_mobitems_carrot_on_a_stick.png",
inventory_image = "mcl_mobitems_carrot_on_a_stick.png", inventory_image = "mcl_mobitems_carrot_on_a_stick.png",
groups = { transport = 1 }, groups = { transport = 1 },
_mcl_toollike_wield = true, _mcl_toollike_wield = true,
}) })
----------- -----------
-- Crafting -- Crafting
----------- -----------
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:leather", output = "mcl_mobitems:leather",
recipe = { recipe = {
{ "mcl_mobitems:rabbit_hide", "mcl_mobitems:rabbit_hide" }, { "mcl_mobitems:rabbit_hide", "mcl_mobitems:rabbit_hide" },
{ "mcl_mobitems:rabbit_hide", "mcl_mobitems:rabbit_hide" }, { "mcl_mobitems:rabbit_hide", "mcl_mobitems:rabbit_hide" },
} }
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:blaze_powder 2", output = "mcl_mobitems:blaze_powder 2",
recipe = {{"mcl_mobitems:blaze_rod"}}, recipe = {{"mcl_mobitems:blaze_rod"}},
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:rabbit_stew", output = "mcl_mobitems:rabbit_stew",
recipe = { recipe = {
{ "", "mcl_mobitems:cooked_rabbit", "", }, { "", "mcl_mobitems:cooked_rabbit", "", },
{ "group:mushroom", "mcl_farming:potato_item_baked", "mcl_farming:carrot_item", }, { "group:mushroom", "mcl_farming:potato_item_baked", "mcl_farming:carrot_item", },
{ "", "mcl_core:bowl", "", }, { "", "mcl_core:bowl", "", },
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:rabbit_stew", output = "mcl_mobitems:rabbit_stew",
recipe = { recipe = {
{ "", "mcl_mobitems:cooked_rabbit", "", }, { "", "mcl_mobitems:cooked_rabbit", "", },
{ "mcl_farming:carrot_item", "mcl_farming:potato_item_baked", "group:mushroom", }, { "mcl_farming:carrot_item", "mcl_farming:potato_item_baked", "group:mushroom", },
{ "", "mcl_core:bowl", "", }, { "", "mcl_core:bowl", "", },
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:carrot_on_a_stick", output = "mcl_mobitems:carrot_on_a_stick",
recipe = { recipe = {
{ "mcl_fishing:fishing_rod", "", }, { "mcl_fishing:fishing_rod", "", },
{ "", "mcl_farming:carrot_item" }, { "", "mcl_farming:carrot_item" },
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:carrot_on_a_stick", output = "mcl_mobitems:carrot_on_a_stick",
recipe = { recipe = {
{ "", "mcl_fishing:fishing_rod", }, { "", "mcl_fishing:fishing_rod", },
{ "mcl_farming:carrot_item", "" }, { "mcl_farming:carrot_item", "" },
}, },
}) })
minetest.register_craft({ minetest.register_craft({
type = "shapeless", type = "shapeless",
output = "mcl_mobitems:magma_cream", output = "mcl_mobitems:magma_cream",
recipe = {"mcl_mobitems:blaze_powder", "mcl_mobitems:slimeball"}, recipe = {"mcl_mobitems:blaze_powder", "mcl_mobitems:slimeball"},
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_mobitems:cooked_mutton", output = "mcl_mobitems:cooked_mutton",
recipe = "mcl_mobitems:mutton", recipe = "mcl_mobitems:mutton",
cooktime = 10, cooktime = 10,
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_mobitems:cooked_rabbit", output = "mcl_mobitems:cooked_rabbit",
recipe = "mcl_mobitems:rabbit", recipe = "mcl_mobitems:rabbit",
cooktime = 10, cooktime = 10,
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_mobitems:cooked_chicken", output = "mcl_mobitems:cooked_chicken",
recipe = "mcl_mobitems:chicken", recipe = "mcl_mobitems:chicken",
cooktime = 10, cooktime = 10,
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_mobitems:cooked_beef", output = "mcl_mobitems:cooked_beef",
recipe = "mcl_mobitems:beef", recipe = "mcl_mobitems:beef",
cooktime = 10, cooktime = 10,
}) })
minetest.register_craft({ minetest.register_craft({
type = "cooking", type = "cooking",
output = "mcl_mobitems:cooked_porkchop", output = "mcl_mobitems:cooked_porkchop",
recipe = "mcl_mobitems:porkchop", recipe = "mcl_mobitems:porkchop",
cooktime = 10, cooktime = 10,
}) })
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "mcl_mobitems:blaze_rod", recipe = "mcl_mobitems:blaze_rod",
burntime = 120, burntime = 120,
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_mobitems:slimeball 9", output = "mcl_mobitems:slimeball 9",
recipe = {{"mcl_core:slimeblock"}}, recipe = {{"mcl_core:slimeblock"}},
}) })
minetest.register_craft({ minetest.register_craft({
output = "mcl_core:slimeblock", output = "mcl_core:slimeblock",
recipe = {{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}, recipe = {{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",},
{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}, {"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",},
{"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}}, {"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}},
}) })
minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing) minetest.register_on_item_eat(function (hp_change, replace_with_item, itemstack, user, pointed_thing)
-- poisoning with spider eye -- poisoning with spider eye
if itemstack:get_name() == "mcl_mobitems:spider_eye" then if itemstack:get_name() == "mcl_mobitems:spider_eye" then
mcl_potions.poison_func(user, 1, 4) mcl_potions.poison_func(user, 1, 4)
end end
end ) end )

@ -90,7 +90,7 @@ minetest.register_entity("mcl_shields:shield_entity", {
local color = minetest.registered_items[item]._shield_color local color = minetest.registered_items[item]._shield_color
if color then if color then
shield_texture = "mcl_shield_base_nopattern.png^(mcl_shield_pattern_base.png^[colorize:" .. color .. ")" shield_texture = "mcl_shield_base_nopattern.png^(mcl_shield_pattern_base.png^[colorize:" .. color .. ")"
end end
end end
end end
@ -128,7 +128,7 @@ mcl_damage.register_modifier(function(obj, damage, reason)
local type = reason.type local type = reason.type
local damager = reason.direct local damager = reason.direct
local blocking, shieldstack = mcl_shields.is_blocking(obj) local blocking, shieldstack = mcl_shields.is_blocking(obj)
if not (obj:is_player() and blocking and mcl_shields.types[type] and damager) then if not (obj:is_player() and blocking and mcl_shields.types[type] and damager) then
return return
end end
@ -275,7 +275,7 @@ local function handle_blocking(player)
player_shield.blocking = 2 player_shield.blocking = 2
end end
elseif shield_in_offhand then elseif shield_in_offhand then
local offhand_can_block = (wielded_item(player) == "" or not mcl_util.get_pointed_thing(player, true)) local offhand_can_block = (wielded_item(player) == "" or not mcl_util.get_pointed_thing(player, true))
and (minetest.get_item_group(wielded_item(player), "bow") ~= 1 and minetest.get_item_group(wielded_item(player), "crossbow") ~= 1) and (minetest.get_item_group(wielded_item(player), "bow") ~= 1 and minetest.get_item_group(wielded_item(player), "crossbow") ~= 1)
if not offhand_can_block then if not offhand_can_block then

@ -46,7 +46,7 @@ mcl_damage.register_modifier(function(obj, damage, reason)
-- Effects -- Effects
minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true) minetest.sound_play({name = "mcl_totems_totem", gain = 1}, {pos=ppos, max_hear_distance = 16}, true)
for i = 1, 4 do for i = 1, 4 do
for c = 1, #particle_colors do for c = 1, #particle_colors do
minetest.add_particlespawner({ minetest.add_particlespawner({

@ -2096,7 +2096,7 @@ local function basic(vm, data, data2, emin, emax, area, minp, maxp, blockseed)
lvm_used = true lvm_used = true
end end
end end
-- Set param2 (=color) of sugar cane -- Set param2 (=color) of sugar cane
nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:reeds"}) nodes = minetest.find_nodes_in_area(minp, maxp, {"mcl_core:reeds"})
for n=1, #nodes do for n=1, #nodes do

@ -234,7 +234,7 @@ end
function settlements.place_schematics(settlement_info, pr) function settlements.place_schematics(settlement_info, pr)
local building_all_info local building_all_info
--attempt to place one belltower in the center of the village - this doesn't always work out great but it's a lot better than doing it first or last. --attempt to place one belltower in the center of the village - this doesn't always work out great but it's a lot better than doing it first or last.
local belltower = table.remove(settlement_info,math.floor(#settlement_info/2)) local belltower = table.remove(settlement_info,math.floor(#settlement_info/2))
if belltower then if belltower then
@ -251,10 +251,10 @@ function settlements.place_schematics(settlement_info, pr)
pr pr
) )
end end
for i, built_house in ipairs(settlement_info) do for i, built_house in ipairs(settlement_info) do
local is_last = i == #settlement_info local is_last = i == #settlement_info
for j, schem in ipairs(settlements.schematic_table) do for j, schem in ipairs(settlements.schematic_table) do
if settlement_info[i]["name"] == schem["name"] then if settlement_info[i]["name"] == schem["name"] then
building_all_info = schem building_all_info = schem

@ -26,7 +26,7 @@ for _, action in pairs({"grant", "revoke"}) do
end end
local meta = player:get_meta() local meta = player:get_meta()
if priv == "fly" then if priv == "fly" then
meta:set_int("mcl_privs:fly_changed", 1) meta:set_int("mcl_privs:fly_changed", 1)
end end

@ -1,57 +1,57 @@
local random = math.random local random = math.random
local ipairs = ipairs local ipairs = ipairs
mcl_death_drop = {} mcl_death_drop = {}
mcl_death_drop.registered_dropped_lists = {} mcl_death_drop.registered_dropped_lists = {}
function mcl_death_drop.register_dropped_list(inv, listname, drop) function mcl_death_drop.register_dropped_list(inv, listname, drop)
table.insert(mcl_death_drop.registered_dropped_lists, {inv = inv, listname = listname, drop = drop}) table.insert(mcl_death_drop.registered_dropped_lists, {inv = inv, listname = listname, drop = drop})
end end
mcl_death_drop.register_dropped_list("PLAYER", "main", true) mcl_death_drop.register_dropped_list("PLAYER", "main", true)
mcl_death_drop.register_dropped_list("PLAYER", "craft", true) mcl_death_drop.register_dropped_list("PLAYER", "craft", true)
mcl_death_drop.register_dropped_list("PLAYER", "armor", true) mcl_death_drop.register_dropped_list("PLAYER", "armor", true)
mcl_death_drop.register_dropped_list("PLAYER", "offhand", true) mcl_death_drop.register_dropped_list("PLAYER", "offhand", true)
minetest.register_on_dieplayer(function(player) minetest.register_on_dieplayer(function(player)
local keep = minetest.settings:get_bool("mcl_keepInventory", false) local keep = minetest.settings:get_bool("mcl_keepInventory", false)
if keep == false then if keep == false then
-- Drop inventory, crafting grid and armor -- Drop inventory, crafting grid and armor
local playerinv = player:get_inventory() local playerinv = player:get_inventory()
local pos = player:get_pos() local pos = player:get_pos()
-- No item drop if in deep void -- No item drop if in deep void
local _, void_deadly = mcl_worlds.is_in_void(pos) local _, void_deadly = mcl_worlds.is_in_void(pos)
for l=1,#mcl_death_drop.registered_dropped_lists do for l=1,#mcl_death_drop.registered_dropped_lists do
local inv = mcl_death_drop.registered_dropped_lists[l].inv local inv = mcl_death_drop.registered_dropped_lists[l].inv
if inv == "PLAYER" then if inv == "PLAYER" then
inv = playerinv inv = playerinv
elseif type(inv) == "function" then elseif type(inv) == "function" then
inv = inv(player) inv = inv(player)
end end
local listname = mcl_death_drop.registered_dropped_lists[l].listname local listname = mcl_death_drop.registered_dropped_lists[l].listname
local drop = mcl_death_drop.registered_dropped_lists[l].drop local drop = mcl_death_drop.registered_dropped_lists[l].drop
if inv then if inv then
for i, stack in ipairs(inv:get_list(listname)) do for i, stack in ipairs(inv:get_list(listname)) do
local x = random(0, 9)/3 local x = random(0, 9)/3
local z = random(0, 9)/3 local z = random(0, 9)/3
pos.x = pos.x + x pos.x = pos.x + x
pos.z = pos.z + z pos.z = pos.z + z
if not void_deadly and drop and not mcl_enchanting.has_enchantment(stack, "curse_of_vanishing") then if not void_deadly and drop and not mcl_enchanting.has_enchantment(stack, "curse_of_vanishing") then
local def = minetest.registered_items[stack:get_name()] local def = minetest.registered_items[stack:get_name()]
if def and def.on_drop then if def and def.on_drop then
stack = def.on_drop(stack, player, pos) stack = def.on_drop(stack, player, pos)
end end
minetest.add_item(pos, stack) minetest.add_item(pos, stack)
end end
pos.x = pos.x - x pos.x = pos.x - x
pos.z = pos.z - z pos.z = pos.z - z
end end
inv:set_list(listname, {}) inv:set_list(listname, {})
end end
end end
mcl_armor.update(player) mcl_armor.update(player)
end end
end) end)

@ -473,10 +473,10 @@ function mcl_spawn.get_player_spawn_pos(player)
player:get_meta():set_string("mcl_beds:spawn", "") player:get_meta():set_string("mcl_beds:spawn", "")
minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked, and you had no charged respawn anchor!")) minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked, and you had no charged respawn anchor!"))
return mcl_spawn.get_world_spawn_pos(), false return mcl_spawn.get_world_spawn_pos(), false
end end
end end
end end
-- Find spawning position on/near the bed free of solid or damaging blocks iterating a square spiral 15x15: -- Find spawning position on/near the bed free of solid or damaging blocks iterating a square spiral 15x15: