Make casts meltable, make wooden and stone components be able to be turned into casts

This commit is contained in:
Evert Prants 2018-04-04 20:44:59 +03:00
parent 7b75a2e9d8
commit 0d89ef920a
Signed by: evert
GPG Key ID: 1688DA83D222D0B5
3 changed files with 71 additions and 51 deletions

View File

@ -9,7 +9,6 @@ metal_caster.max_metal = 16000
-- Use melter values -- Use melter values
metal_caster.spec = metal_melter.spec metal_caster.spec = metal_melter.spec
metal_caster.spec.cast = 288
metal_caster.casts = { metal_caster.casts = {
ingot_cast = {name = "Ingot Cast", result = "ingot", cost = metal_caster.spec.ingot, typenames = {"ingot"}}, ingot_cast = {name = "Ingot Cast", result = "ingot", cost = metal_caster.spec.ingot, typenames = {"ingot"}},
@ -98,35 +97,6 @@ function metal_caster.get_metal_caster_formspec(data)
default.get_hotbar_bg(0, 4.25) default.get_hotbar_bg(0, 4.25)
end end
local function find_castable(metal_name, cast_name)
local cast = metal_caster.casts[cast_name]
if not cast then return nil end
local types = metal_melter.melts[metal_name]
if not types then return nil end
local typeres = types[cast.result]
if not typeres then return nil end
if #typeres > 0 then
return typeres[1]
end
return nil
end
function metal_caster.get_cast_for_name(name)
for index, value in pairs(metal_caster.casts) do
local mod = value.mod or "metal_melter"
if name == mod..":"..index then
return index
end
end
return nil
end
-- Check to see if this cast is able to cast this metal type -- Check to see if this cast is able to cast this metal type
local function can_dig(pos, player) local function can_dig(pos, player)
@ -200,6 +170,18 @@ local function decrement_stack(stack)
return stack return stack
end end
local function in_table(t, n)
local found = nil
for _, v in pairs(t) do
if v == n then
found = v
end
end
return found
end
-- Get the corresponding cast for an item -- Get the corresponding cast for an item
local function get_cast_for(item) local function get_cast_for(item)
local cast = nil local cast = nil
@ -208,7 +190,7 @@ local function get_cast_for(item)
for metal, types in pairs(metal_melter.melts) do for metal, types in pairs(metal_melter.melts) do
if typename ~= nil then break end if typename ~= nil then break end
for t, items in pairs(types) do for t, items in pairs(types) do
if items[item] then if in_table(items, item) then
typename = t typename = t
break break
end end
@ -225,6 +207,36 @@ local function get_cast_for(item)
return typename, cast return typename, cast
end end
local function find_castable(metal_name, cast_name)
local cast = metal_caster.casts[cast_name]
if not cast then return nil end
local types = metal_melter.melts[metal_name]
if not types then return nil end
local typeres = types[cast.result]
if not typeres then return nil end
if #typeres > 0 then
return typeres[1]
end
return nil
end
local function get_cast_for_name(name)
for index, value in pairs(metal_caster.casts) do
local mod = value.mod or "metal_melter"
if name == mod..":"..index then
return index
end
end
return nil
end
local function caster_node_timer(pos, elapsed) local function caster_node_timer(pos, elapsed)
local refresh = false local refresh = false
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -295,7 +307,7 @@ local function caster_node_timer(pos, elapsed)
metal_type = fluidity.get_metal_for_fluid(metal) metal_type = fluidity.get_metal_for_fluid(metal)
local caststack = inv:get_stack("cast", 1):get_name() local caststack = inv:get_stack("cast", 1):get_name()
local castname = metal_caster.get_cast_for_name(caststack) local castname = get_cast_for_name(caststack)
if castname ~= nil then if castname ~= nil then
-- Cast metal using a cast -- Cast metal using a cast
local cast = metal_caster.casts[castname] local cast = metal_caster.casts[castname]
@ -392,9 +404,10 @@ end
-- Register a new cast -- Register a new cast
function metal_caster.register_cast(name, data) function metal_caster.register_cast(name, data)
local modname = data.mod or "metal_melter" local modname = data.mod or "metal_melter"
local castname = modname..":"..name
minetest.register_craftitem(modname..":"..name, { minetest.register_craftitem(castname, {
description = data.name, description = data.name,
inventory_image = "caster_"..name..".png", inventory_image = "caster_"..name..".png",
stack_max = 1, stack_max = 1,
@ -404,6 +417,8 @@ function metal_caster.register_cast(name, data)
if not metal_caster.casts[name] then if not metal_caster.casts[name] then
metal_caster.casts[name] = data metal_caster.casts[name] = data
end end
metal_melter.register_melt(castname, "gold", "cast")
end end
-- Register the caster -- Register the caster

View File

@ -3,10 +3,6 @@ metal_melter.melts = {}
-- fluidity.molten_metals - metals -- fluidity.molten_metals - metals
function metal_melter.register_melt(item, metal, type) function metal_melter.register_melt(item, metal, type)
if not fluidity.molten_metals[metal] then
return nil
end
if not metal_melter.melts[metal] then if not metal_melter.melts[metal] then
metal_melter.melts[metal] = {} metal_melter.melts[metal] = {}
end end

View File

@ -1,12 +1,18 @@
-- Melts metals using lava as a heat source -- Melts metals using lava as a heat source
-- Max lava that can be held by the melter
metal_melter.max_fuel = 8000 metal_melter.max_fuel = 8000
-- Max metal that can be held by the melter
metal_melter.max_metal = 16000 metal_melter.max_metal = 16000
-- How much metal is given for melting a typename (in millibuckets)
metal_melter.spec = { metal_melter.spec = {
ingot = 144, ingot = 144,
crystal = 144, crystal = 144,
block = 1296, block = 1296,
lump = 288, lump = 288,
cast = 288,
ore = 288 ore = 288
} }
@ -40,10 +46,6 @@ function metal_melter.get_metal_from_stack(stack)
return metal, metal_type return metal, metal_type
end end
function metal_melter.set_spec(specname, value)
metal_melter.spec[specname] = value
end
function metal_melter.get_metal_melter_formspec_default() function metal_melter.get_metal_melter_formspec_default()
return "size[8,8.5]".. return "size[8,8.5]"..
default.gui_bg.. default.gui_bg..
@ -242,15 +244,17 @@ local function melter_node_timer(pos, elapsed)
if input ~= "" then if input ~= "" then
local mt, t = metal_melter.get_metal_from_stack(input) local mt, t = metal_melter.get_metal_from_stack(input)
if mt then if mt then
local cnt = metal_melter.spec[t] local metal_name = fluidity.molten_metals[mt]
local heat_consume = math.floor(cnt / 2) if metal_name then
if metal_count + cnt <= metal_melter.max_metal and heat_count >= heat_consume then local cnt = metal_melter.spec[t]
local metal_name = fluidity.molten_metals[mt] local heat_consume = math.floor(cnt / 2)
metal = metal_name if metal_count + cnt <= metal_melter.max_metal and heat_count >= heat_consume then
metal_count = metal_count + cnt metal = metal_name
heat_count = heat_count - heat_consume metal_count = metal_count + cnt
inv:set_stack("input", 1, take_from_stack(inv:get_stack("input", 1), 1)) heat_count = heat_count - heat_consume
refresh = true inv:set_stack("input", 1, take_from_stack(inv:get_stack("input", 1), 1))
refresh = true
end
end end
end end
end end
@ -387,3 +391,8 @@ minetest.register_node("metal_melter:metal_melter_filled", {
allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take, allow_metadata_inventory_take = allow_metadata_inventory_take,
}) })
-- Set a spec
function metal_melter.set_spec(specname, value)
metal_melter.spec[specname] = value
end