420 lines
16 KiB
Lua
420 lines
16 KiB
Lua
local jewelry_formspec =
|
|
'size[8,8.5]'..
|
|
'list[current_name;jewelry;.5,0;1,1;]'..
|
|
'list[current_name;crystal;1.5,0;1,1;]'..
|
|
'list[current_name;mese;3,0;1,1;]'..
|
|
'image[3,0;1,1;armor_mese_outline.png]'..
|
|
'list[current_name;orb;4,0;1,1;]'..
|
|
'image[4,0;1,1;armor_orb_outline.png]'..
|
|
'list[current_name;output;6,.5;1,1;]'..
|
|
'list[current_name;relics;1,3;6,1;]'..
|
|
'list[current_player;main;0,4.5;8,4;]'..
|
|
'button[5.75,1.55;1.5,.75;forge;Forge]'..
|
|
'textarea[.5,1;5.5,2.25;;;Currently gloves aren\'t working!\n'..
|
|
'Input a plain ring, amulet or pair of gloves, and a Gemstone with the perk you want added.'..
|
|
'\nYou\'ll also need a mese crystal and lava orb.'..
|
|
'\nRelics can be added to tweak the chances that control how powerful the outputted item will be.'..
|
|
' Relics are not typically consumed and can be used time and time again.]'..
|
|
'label[0,3;Relics\n--->]'
|
|
|
|
minetest.register_node('stations:jewelry', {
|
|
description = 'Jewelry Workshop',
|
|
drawtype = 'mesh',
|
|
mesh = 'stations_jewelry.obj',
|
|
tiles = {'stations_jewelry.png'},
|
|
use_texture_alpha = 'opaque',
|
|
sounds = default.node_sound_metal_defaults(),
|
|
paramtype2 = 'facedir',
|
|
paramtype = 'light',
|
|
selection_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{-.5, -.5, -.5, 1.5, .5, .5},
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = 'fixed',
|
|
{-.5, -.5, -.5, 1.5, .5, .5},
|
|
},
|
|
groups = {oddly_breakable_by_hand=3, cracky=1},
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size('main', 8*4)
|
|
inv:set_size('jewelry', 1)
|
|
inv:set_size('mese', 1)
|
|
inv:set_size('orb', 1)
|
|
inv:set_size('crystal', 1)
|
|
inv:set_size('output', 1)
|
|
inv:set_size('relics', 6)
|
|
meta:set_string('infotext', 'Jewelry Workshop')
|
|
meta:set_string('formspec', jewelry_formspec)
|
|
end,
|
|
after_place_node = function(pos, placer, itemstack)
|
|
if not epic.space_to_side(pos) then
|
|
minetest.remove_node(pos)
|
|
return itemstack
|
|
end
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
if inv:is_empty('jewelry') and inv:is_empty('mese') and inv:is_empty('orb')
|
|
and inv:is_empty('crystal') and inv:is_empty('output') then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
epic.remove_side_node(pos, oldnode)
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
local input = stack:get_name()
|
|
if listname == 'jewelry' then
|
|
if input == 'armor:ring_gol' or input == 'armor:ring_tit' --[[or input == 'armor:gloves']]
|
|
or input == 'armor:amulet_gol' or input == 'armor:amulet_tit' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'mese' then
|
|
if input == 'default:mese_crystal' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'orb' then
|
|
if input == 'mobs:lava_orb' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'crystal' then
|
|
if input == 'epic:float_crystal' or input == 'epic:bloodstone' or input == 'epic:huntite'
|
|
or input == 'ocean:prismarine_crystals' or input == 'epic:garnet' or input == 'quartz:quartz_crystal_piece' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'output' then
|
|
return 0
|
|
end
|
|
return 1
|
|
end,
|
|
allow_metadata_inventory_move = function(pos, listname, index, stack, player)
|
|
return 0
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
if inv:is_empty('jewelry') and inv:is_empty('mese') and inv:is_empty('orb')
|
|
and inv:is_empty('crystal') and inv:is_empty('output') and inv:is_empty ('relics') then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory(pos)
|
|
local output = inv:get_stack('output', 1)
|
|
local output_count = output:get_count()
|
|
if fields['forge'] and output_count == 0 then
|
|
local jewelry = inv:get_stack('jewelry', 1)
|
|
local mese = inv:get_stack('mese', 1)
|
|
local orb = inv:get_stack('orb', 1)
|
|
local crystal = inv:get_stack('crystal', 1)
|
|
local relics = inv:get_list('relics')
|
|
local jewelry_name = jewelry:get_name()
|
|
local mese_name = mese:get_name()
|
|
local orb_name = orb:get_name()
|
|
local crystal_name = crystal:get_name()
|
|
local perk = 'nothing'
|
|
if crystal_name == 'epic:float_crystal' then
|
|
perk = 'gravity'
|
|
elseif crystal_name == 'epic:bloodstone' then
|
|
perk = 'healing'
|
|
elseif crystal_name == 'epic:huntite' then
|
|
perk = 'fire'
|
|
elseif crystal_name == 'ocean:prismarine_crystals' then
|
|
perk = 'water'
|
|
elseif crystal_name == 'epic:garnet' then
|
|
perk = 'speed'
|
|
elseif crystal_name == 'quartz:quartz_crystal_piece' then
|
|
perk = 'jump'
|
|
end
|
|
local level = 0
|
|
if type(relics) == 'table' then
|
|
for i, stack in pairs(relics) do
|
|
local def = stack:get_definition()
|
|
if def.groups['relic_general'] then
|
|
level = level + def.groups['relic_general']
|
|
end
|
|
if def.groups['relic_'..perk] then
|
|
level = level + def.groups['relic_'..perk]
|
|
end
|
|
end
|
|
end
|
|
--If you're looking at the code to see how this works please don't spoil it for other players.
|
|
--If I expect that is going on, I'll be forced to change things around, and not release the code.
|
|
local random = math.random(0, 100)
|
|
local chance = random + level
|
|
local tier = 1
|
|
if chance < 0 then
|
|
tier = 0
|
|
elseif chance > 0 and chance <= 80 then
|
|
tier = 1
|
|
elseif chance > 80 and chance <= 90 then
|
|
tier = 2
|
|
elseif chance > 90 and chance <= 98 then
|
|
tier = 3
|
|
elseif chance > 98 and chance <= 100 then
|
|
tier = 4
|
|
end
|
|
local phase = moon_phases.get_phase()
|
|
local time_of_day = minetest.get_timeofday()
|
|
if phase == 4 and (time_of_day < .2 or time_of_day > .8) then
|
|
tier = tier + 1
|
|
end
|
|
if perk ~= 'nothing' and jewelry_name ~= '' and mese_name ~= '' and orb_name ~= '' and tier ~= 0 then
|
|
jewelry:take_item(1)
|
|
mese:take_item(1)
|
|
orb:take_item(1)
|
|
crystal:take_item(1)
|
|
inv:set_stack('jewelry', 1, jewelry)
|
|
inv:set_stack('mese', 1, mese)
|
|
inv:set_stack('orb', 1, orb)
|
|
inv:set_stack('crystal', 1, crystal)
|
|
inv:set_stack('output', 1, jewelry_name..'_'..perk..'_'..tier)
|
|
minetest.log("action", sender:get_player_name() .. " crafts "..jewelry_name..'_'..perk..'_'..tier)
|
|
else
|
|
jewelry:take_item(1)
|
|
mese:take_item(1)
|
|
orb:take_item(1)
|
|
crystal:take_item(1)
|
|
inv:set_stack('jewelry', 1, jewelry)
|
|
inv:set_stack('mese', 1, mese)
|
|
inv:set_stack('orb', 1, orb)
|
|
inv:set_stack('crystal', 1, crystal)
|
|
end
|
|
end
|
|
end,
|
|
on_rotate = function(pos, node)
|
|
return false
|
|
end,
|
|
})
|
|
|
|
minetest.register_node('stations:jewelry_locked', {
|
|
description = 'Jewelry Workshop (Locked)',
|
|
drawtype = 'mesh',
|
|
mesh = 'stations_jewelry.obj',
|
|
tiles = {'stations_jewelry.png'},
|
|
use_texture_alpha = 'opaque',
|
|
sounds = default.node_sound_metal_defaults(),
|
|
paramtype2 = 'facedir',
|
|
paramtype = 'light',
|
|
selection_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{-.5, -.5, -.5, 1.5, .5, .5},
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = 'fixed',
|
|
{-.5, -.5, -.5, 1.5, .5, .5},
|
|
},
|
|
groups = {oddly_breakable_by_hand=3, cracky=1},
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size('main', 8*4)
|
|
inv:set_size('jewelry', 1)
|
|
inv:set_size('mese', 1)
|
|
inv:set_size('orb', 1)
|
|
inv:set_size('crystal', 1)
|
|
inv:set_size('output', 1)
|
|
inv:set_size('relics', 6)
|
|
meta:set_string('infotext', 'Jewelry Workshop (Locked)')
|
|
meta:set_string('formspec', jewelry_formspec)
|
|
end,
|
|
after_place_node = function(pos, placer, itemstack)
|
|
if not epic.space_to_side(pos) then
|
|
minetest.remove_node(pos)
|
|
return itemstack
|
|
end
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
if inv:is_empty('jewelry') and inv:is_empty('mese') and inv:is_empty('orb')
|
|
and inv:is_empty('crystal') and inv:is_empty('output') then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
epic.remove_side_node(pos, oldnode)
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
local player_name = player:get_player_name()
|
|
if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player, 'protection_bypass') then
|
|
return 0
|
|
else
|
|
local input = stack:get_name()
|
|
if listname == 'jewelry' then
|
|
if input == 'armor:ring_gol' or input == 'armor:ring_tit' --[[or input == 'armor:gloves']]
|
|
or input == 'armor:amulet_gol' or input == 'armor:amulet_tit' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'mese' then
|
|
if input == 'default:mese_crystal' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'orb' then
|
|
if input == 'mobs:lava_orb' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'crystal' then
|
|
if input == 'epic:float_crystal' or input == 'epic:bloodstone' or input == 'epic:huntite'
|
|
or input == 'ocean:prismarine_crystals' or input == 'epic:garnet' or input == 'quartz:quartz_crystal_piece' then
|
|
return 99
|
|
else
|
|
return 0
|
|
end
|
|
elseif listname == 'output' then
|
|
return 0
|
|
else
|
|
return 1
|
|
end
|
|
end
|
|
end,
|
|
allow_metadata_inventory_move = function(pos, listname, index, stack, player)
|
|
return 0
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
if inv:is_empty('jewelry') and inv:is_empty('mese') and inv:is_empty('orb')
|
|
and inv:is_empty('crystal') and inv:is_empty('output') and inv:is_empty ('relics') then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local player_name = sender:get_player_name()
|
|
if not minetest.is_protected(pos, player_name) and not minetest.check_player_privs(sender, 'protection_bypass') then
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory(pos)
|
|
local output = inv:get_stack('output', 1)
|
|
local output_count = output:get_count()
|
|
if fields['forge'] and output_count == 0 then
|
|
local jewelry = inv:get_stack('jewelry', 1)
|
|
local mese = inv:get_stack('mese', 1)
|
|
local orb = inv:get_stack('orb', 1)
|
|
local crystal = inv:get_stack('crystal', 1)
|
|
local relics = inv:get_list('relics')
|
|
local jewelry_name = jewelry:get_name()
|
|
local mese_name = mese:get_name()
|
|
local orb_name = orb:get_name()
|
|
local crystal_name = crystal:get_name()
|
|
local perk = 'nothing'
|
|
if crystal_name == 'epic:float_crystal' then
|
|
perk = 'gravity'
|
|
elseif crystal_name == 'epic:bloodstone' then
|
|
perk = 'healing'
|
|
elseif crystal_name == 'epic:huntite' then
|
|
perk = 'fire'
|
|
elseif crystal_name == 'ocean:prismarine_crystals' then
|
|
perk = 'water'
|
|
elseif crystal_name == 'epic:garnet' then
|
|
perk = 'speed'
|
|
elseif crystal_name == 'quartz:quartz_crystal_piece' then
|
|
perk = 'jump'
|
|
end
|
|
local level = 0
|
|
if type(relics) == 'table' then
|
|
for i, stack in pairs(relics) do
|
|
local def = stack:get_definition()
|
|
if def.groups['relic_general'] then
|
|
level = level + def.groups['relic_general']
|
|
end
|
|
if def.groups['relic_'..perk] then
|
|
level = level + def.groups['relic_'..perk]
|
|
end
|
|
end
|
|
end
|
|
--If you're looking at the code to see how this works please don't spoil it for other players.
|
|
--If I expect that is going on, I'll be forced to change things around, and not release the code.
|
|
local random = math.random(0, 100)
|
|
local chance = random + level
|
|
local tier = 1
|
|
if chance < 0 then
|
|
tier = 0
|
|
elseif chance > 0 and chance <= 80 then
|
|
tier = 1
|
|
elseif chance > 80 and chance <= 90 then
|
|
tier = 2
|
|
elseif chance > 90 and chance <= 98 then
|
|
tier = 3
|
|
elseif chance > 98 and chance <= 100 then
|
|
tier = 4
|
|
end
|
|
local phase = moon_phases.get_phase()
|
|
local time_of_day = minetest.get_timeofday()
|
|
if phase == 4 and (time_of_day < .2 or time_of_day > .8) then
|
|
tier = tier + 1
|
|
end
|
|
if perk ~= 'nothing' and jewelry_name ~= '' and mese_name ~= '' and orb_name ~= '' and tier ~= 0 then
|
|
jewelry:take_item(1)
|
|
mese:take_item(1)
|
|
orb:take_item(1)
|
|
crystal:take_item(1)
|
|
inv:set_stack('jewelry', 1, jewelry)
|
|
inv:set_stack('mese', 1, mese)
|
|
inv:set_stack('orb', 1, orb)
|
|
inv:set_stack('crystal', 1, crystal)
|
|
inv:set_stack('output', 1, jewelry_name..'_'..perk..'_'..tier)
|
|
minetest.log("action", sender:get_player_name() .. " crafts "..jewelry_name..'_'..perk..'_'..tier)
|
|
else
|
|
jewelry:take_item(1)
|
|
mese:take_item(1)
|
|
orb:take_item(1)
|
|
crystal:take_item(1)
|
|
inv:set_stack('jewelry', 1, jewelry)
|
|
inv:set_stack('mese', 1, mese)
|
|
inv:set_stack('orb', 1, orb)
|
|
inv:set_stack('crystal', 1, crystal)
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
local player_name = player:get_player_name()
|
|
if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player, 'protection_bypass') then
|
|
return 0
|
|
else
|
|
return 99
|
|
end
|
|
end,
|
|
on_rotate = function(pos, node)
|
|
return false
|
|
end,
|
|
})
|
|
|
|
unified_inventory.register_craft_type("jewelry", {
|
|
description = "Jewelry Workshop",
|
|
icon = 'stations_jewelry_icon.png',
|
|
width = 4,
|
|
height = 1,
|
|
uses_crafting_grid = false
|
|
})
|