2022-11-29 01:37:59 +01:00
local S = minetest.get_translator ( " vessels " )
local C = minetest.colorize
local F = minetest.formspec_escape
local function close_forms ( pos )
local players = minetest.get_connected_players ( )
local formname = " mcl_vessels_shelf:vessels_shelf_ " .. pos.x .. " _ " .. pos.y .. " _ " .. pos.z
for p = 1 , # players do
if vector.distance ( players [ p ] : get_pos ( ) , pos ) <= 30 then
minetest.close_formspec ( players [ p ] : get_player_name ( ) , formname )
end
end
end
local function drop_item_stack ( pos , stack )
if not stack or stack : is_empty ( ) then return end
local drop_offset = vector.new ( math.random ( ) - 0.5 , 0 , math.random ( ) - 0.5 )
minetest.add_item ( vector.add ( pos , drop_offset ) , stack )
end
function drop_items_from_meta_container ( listname )
return function ( pos , oldnode , oldmetadata )
if oldmetadata and oldmetadata.inventory then
-- process in after_dig_node callback
local main = oldmetadata.inventory . main
if not main then return end
for _ , stack in pairs ( main ) do
drop_item_stack ( pos , stack )
end
else
local meta = minetest.get_meta ( pos )
local inv = meta : get_inventory ( )
for i = 1 , inv : get_size ( " main " ) do
drop_item_stack ( pos , inv : get_stack ( " main " , i ) )
end
meta : from_table ( )
end
end
end
local drop_content = drop_items_from_meta_container ( " main " )
local function on_blast ( pos )
local node = minetest.get_node ( pos )
drop_content ( pos , node )
minetest.remove_node ( pos )
end
local function protection_check_move ( pos , from_list , from_index , to_list , to_index , count , player )
local name = player : get_player_name ( )
if minetest.is_protected ( pos , name ) then
minetest.record_protection_violation ( pos , name )
return 0
else
return count
end
end
2022-11-29 18:31:37 +01:00
local vessels = { " mcl_potions:glass_bottle " , " mcl_potions:dragon_breath " , " mcl_honey:honey_bottle " , " mcl_experience:bottle " ,
" mcl_potions:water " , " mcl_potions:water_lingering " , " mcl_potions:water_splash " ,
" mcl_potions:river_water " ,
" mcl_potions:awkward " , " mcl_potions:awkward_lingering " , " mcl_potions:awkward_splash " ,
" mcl_potions:mundane " , " mcl_potions:mundane_lingering " , " mcl_potions:mundane_splash " ,
" mcl_potions:thick " , " mcl_potions:thick_lingering " , " mcl_potions:thick_splash " ,
" mcl_potions:slowness " , " mcl_potions:slowness_plus " , " mcl_potions:slowness_splash " , " mcl_potions:slowness_lingering " , " mcl_potions:slowness_plus_lingering " , " mcl_potions:slowness_plus_splash " , " mcl_potions:slowness_2 " , " mcl_potions:slowness_2_splash " , " mcl_potions:slowness_2_lingering " ,
" mcl_potions:healing " , " mcl_potions:healing_plus " , " mcl_potions:healing_splash " , " mcl_potions:healing_lingering " , " mcl_potions:healing_plus_lingering " , " mcl_potions:healing_plus_splash " , " mcl_potions:healing_2 " , " mcl_potions:healing_2_splash " , " mcl_potions:healing_2_lingering " ,
" mcl_potions:night_vision " , " mcl_potions:night_vision_plus " , " mcl_potions:night_vision_splash " , " mcl_potions:night_vision_lingering " , " mcl_potions:night_vision_plus_lingering " , " mcl_potions:night_vision_plus_splash " , " mcl_potions:night_vision_2 " , " mcl_potions:night_vision_2_splash " , " mcl_potions:night_vision_2_lingering " ,
" mcl_potions:swiftness " , " mcl_potions:swiftness_plus " , " mcl_potions:swiftness_splash " , " mcl_potions:swiftness_lingering " , " mcl_potions:swiftness_plus_lingering " , " mcl_potions:swiftness_plus_splash " , " mcl_potions:swiftness_2 " , " mcl_potions:swiftness_2_splash " , " mcl_potions:swiftness_2_lingering " ,
" mcl_potions:fire_resistance " , " mcl_potions:fire_resistance_plus " , " mcl_potions:fire_resistance_splash " , " mcl_potions:fire_resistance_lingering " , " mcl_potions:fire_resistance_plus_lingering " , " mcl_potions:fire_resistance_plus_splash " , " mcl_potions:fire_resistance_2 " , " mcl_potions:fire_resistance_2_splash " , " mcl_potions:fire_resistance_2_lingering " ,
" mcl_potions:water_breathing " , " mcl_potions:water_breathing_plus " , " mcl_potions:water_breathing_splash " , " mcl_potions:water_breathing_lingering " , " mcl_potions:water_breathing_plus_lingering " , " mcl_potions:water_breathing_plus_splash " , " mcl_potions:water_breathing_2 " , " mcl_potions:water_breathing_2_splash " , " mcl_potions:water_breathing_2_lingering " ,
" mcl_potions:regeneration " , " mcl_potions:regeneration_plus " , " mcl_potions:regeneration_splash " , " mcl_potions:regeneration_lingering " , " mcl_potions:regeneration_plus_lingering " , " mcl_potions:regeneration_plus_splash " , " mcl_potions:regeneration_2 " , " mcl_potions:regeneration_2_splash " , " mcl_potions:regeneration_2_lingering " ,
" mcl_potions:poison " , " mcl_potions:poison_plus " , " mcl_potions:poison_splash " , " mcl_potions:poison_lingering " , " mcl_potions:poison_plus_lingering " , " mcl_potions:poison_plus_splash " , " mcl_potions:poison_2 " , " mcl_potions:poison_2_splash " , " mcl_potions:poison_2_lingering " ,
" mcl_potions:leaping " , " mcl_potions:leaping_plus " , " mcl_potions:leaping_splash " , " mcl_potions:leaping_lingering " , " mcl_potions:leaping_plus_lingering " , " mcl_potions:leaping_plus_splash " , " mcl_potions:leaping_2 " , " mcl_potions:leaping_2_splash " , " mcl_potions:leaping_2_lingering " ,
" mcl_potions:harming " , " mcl_potions:harming_plus " , " mcl_potions:harming_splash " , " mcl_potions:harming_lingering " , " mcl_potions:harming_plus_lingering " , " mcl_potions:harming_plus_splash " , " mcl_potions:harming_2 " , " mcl_potions:harming_2_splash " , " mcl_potions:harming_2_lingering " ,
" mcl_potions:invisibility " , " mcl_potions:invisibility_plus " , " mcl_potions:invisibility_splash " , " mcl_potions:invisibility_lingering " , " mcl_potions:invisibility_plus_lingering " , " mcl_potions:invisibility_plus_splash " , " mcl_potions:invisibility_2 " , " mcl_potions:invisibility_2_splash " , " mcl_potions:invisibility_2_lingering " ,
}
local function is_vessel ( tab , val )
for index , value in ipairs ( tab ) do
if value == val then
return true
end
end
return false
end
2022-11-29 01:37:59 +01:00
local function protection_check_put_take ( pos , listname , index , stack , player )
local name = player : get_player_name ( )
if minetest.is_protected ( pos , name ) then
minetest.record_protection_violation ( pos , name )
return 0
2022-11-29 18:31:37 +01:00
-- elseif minetest.get_item_group(stack:get_name(), "brewitem") ~= 0 or stack:get_name() == "mcl_honey:honey_bottle" or stack:get_name() == "mcl_experience:bottle" then
elseif is_vessel ( vessels , stack : get_name ( ) ) then
2022-11-29 01:37:59 +01:00
return stack : get_count ( )
else
return 0
end
end
local function vessels_shelf_gui ( pos , node , clicker )
local name = minetest.get_meta ( pos ) : get_string ( " name " )
if name == " " then
name = S ( " Vessels Shelf " )
end
local playername = clicker : get_player_name ( )
minetest.show_formspec ( playername ,
" mcl_vessels_shelf:vessels_shelf_ " .. pos.x .. " _ " .. pos.y .. " _ " .. pos.z ,
table.concat ( {
" size[9,8.75] " ,
" label[0,0; " .. F ( C ( " #313131 " , name ) ) .. " ] " ,
" list[nodemeta: " .. pos.x .. " , " .. pos.y .. " , " .. pos.z .. " ;main;0,0.5;9,3;] " ,
mcl_formspec.get_itemslot_bg ( 0 , 0.5 , 9 , 3 ) ,
" label[0,4.0; " .. F ( C ( " #313131 " , S ( " Inventory " ) ) ) .. " ] " ,
" list[current_player;main;0,4.5;9,3;9] " ,
mcl_formspec.get_itemslot_bg ( 0 , 4.5 , 9 , 3 ) ,
" list[current_player;main;0,7.74;9,1;] " ,
mcl_formspec.get_itemslot_bg ( 0 , 7.74 , 9 , 1 ) ,
" listring[nodemeta: " .. pos.x .. " , " .. pos.y .. " , " .. pos.z .. " ;main] " ,
" listring[current_player;main] " ,
} )
)
end
local function close_forms ( pos )
local players = minetest.get_connected_players ( )
local formname = " mcl_vessels_shelf:vessels_shelf_ " .. pos.x .. " _ " .. pos.y .. " _ " .. pos.z
for p = 1 , # players do
if vector.distance ( players [ p ] : get_pos ( ) , pos ) <= 30 then
minetest.close_formspec ( players [ p ] : get_player_name ( ) , formname )
end
end
end
minetest.register_node ( " mcl_vessels_shelf:vessels_shelf " , {
description = S ( " Vessels Shelf " ) ,
tiles = { " default_wood.png " , " default_wood.png " , " default_wood.png " ,
" default_wood.png " , " default_wood.png " , " vessels_shelf.png " } ,
stack_max = 64 ,
paramtype2 = " facedir " ,
is_ground_content = false ,
groups = {
handy = 1 , axey = 1 , deco_block = 1 , material_wood = 1 ,
flammable = 3 , fire_encouragement = 30 , fire_flammability = 20 , container = 1 } ,
drop = " mcl_vessels_shelf:vessels_shelf " ,
sound = wood_sound ,
_mcl_blast_resistance = 1.5 ,
_mcl_hardness = 1.5 ,
_mcl_silk_touch_drop = true ,
on_construct = function ( pos )
local meta = minetest.get_meta ( pos )
local inv = meta : get_inventory ( )
inv : set_size ( " main " , 9 * 3 )
end ,
after_place_node = function ( pos , placer , itemstack , pointed_thing )
minetest.get_meta ( pos ) : set_string ( " name " , itemstack : get_meta ( ) : get_string ( " name " ) )
end ,
allow_metadata_inventory_move = protection_check_move ,
allow_metadata_inventory_take = protection_check_put_take ,
allow_metadata_inventory_put = protection_check_put_take ,
on_metadata_inventory_move = function ( pos , from_list , from_index , to_list , to_index , count , player )
minetest.log ( " action " , player : get_player_name ( ) ..
" moves stuff in vessels shelf at " .. minetest.pos_to_string ( pos ) )
end ,
on_metadata_inventory_put = function ( pos , listname , index , stack , player )
minetest.log ( " action " , player : get_player_name ( ) ..
" moves stuff to vessels shelf at " .. minetest.pos_to_string ( pos ) )
end ,
on_metadata_inventory_take = function ( pos , listname , index , stack , player )
minetest.log ( " action " , player : get_player_name ( ) ..
" takes stuff from vessels shelf at " .. minetest.pos_to_string ( pos ) )
end ,
after_dig_node = drop_content ,
on_blast = on_blast ,
on_rightclick = vessels_shelf_gui ,
on_destruct = close_forms ,
} )
minetest.register_craft ( {
output = " mcl_vessels_shelf:vessels_shelf " ,
recipe = {
{ " group:wood " , " group:wood " , " group:wood " } ,
{ " mcl_potions:glass_bottle " , " mcl_potions:glass_bottle " , " mcl_potions:glass_bottle " } ,
{ " group:wood " , " group:wood " , " group:wood " } ,
}
} )
minetest.register_craft ( {
type = " fuel " ,
recipe = " mcl_vessels_shelf:vessels_shelf " ,
burntime = 15 ,
} )