Epic/mods/stations/station_jewelry.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
})