Namespacing pt. 1
1
mods/ip_terumet/description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Terumetal v3.0 - Make life easier with alloys and heat machinery!
|
||||
328
mods/ip_terumet/init.lua
Normal file
@@ -0,0 +1,328 @@
|
||||
--[[ Terumet v3.0
|
||||
|
||||
Mod for open-source voxel game Minetest (https://www.minetest.net/)
|
||||
Written for Minetest version 5.0.0
|
||||
Now also supports Minetest 0.4.17
|
||||
|
||||
Creates a new ore in the world which can be used to make useful alloys
|
||||
and heat-powered machines.
|
||||
|
||||
By Terumoc [https://github.com/Terumoc]
|
||||
and with contributions from:
|
||||
> obl3pplifp (https://github.com/obl3pplifp) for bug reports, information, ideas, and other considerable contributions
|
||||
> RSL-Redstonier [https://github.com/RSL-Redstonier]
|
||||
> Chem871 [https://github.com/Chemguy99] for many ideas and requests
|
||||
|
||||
BIG Thanks to all contributors for their input!
|
||||
|
||||
]]--
|
||||
|
||||
--[[ Copyright (C) 2017-2019 Terumoc (Scott Horvath)
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. ]]
|
||||
|
||||
terumet = {}
|
||||
terumet.version = {major=3, minor=0, patch=0}
|
||||
local ver = terumet.version
|
||||
terumet.version_text = ver.major .. '.' .. ver.minor .. '.' .. ver.patch
|
||||
terumet.mod_name = "terumet"
|
||||
|
||||
-- this isn't the suggested way to check for game version but... it works for my purposes
|
||||
terumet.legacy = minetest.get_version().string:find('0.4')
|
||||
|
||||
if terumet.legacy then
|
||||
minetest.log('[terumet] MTv0.4.* detected - in legacy mode!')
|
||||
end
|
||||
|
||||
terumet.RAND = PcgRandom(os.time())
|
||||
|
||||
local FMT = string.format
|
||||
minetest.register_chatcommand( 'item_info', {
|
||||
params = '',
|
||||
description = 'Get a complete description of the ItemStack in your hand',
|
||||
privs = {debug=true},
|
||||
func = function(name)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if player then
|
||||
local witem = player:get_wielded_item()
|
||||
if witem:is_empty() then
|
||||
return true, "You're not holding anything."
|
||||
else
|
||||
local def = witem:get_definition()
|
||||
local wear = witem:get_wear()
|
||||
local wear_pct = FMT('%.1f%%', wear / 65535 * 100.0)
|
||||
if def then
|
||||
return true, FMT('%s "%s" #%s/%s w:%s (%s)',
|
||||
minetest.colorize('#ff0', witem:get_name()),
|
||||
def.description,
|
||||
witem:get_count(),
|
||||
minetest.colorize('#0ff', def.stack_max),
|
||||
minetest.colorize('#f0f', wear),
|
||||
minetest.colorize('#f0f', wear_pct)
|
||||
)
|
||||
else
|
||||
return true, FMT('*NO DEF* %s #%s w:%s (%s)',
|
||||
minetest.colorize('#ff0', witem:get_name()),
|
||||
witem:get_count(),
|
||||
minetest.colorize('#f0f', wear),
|
||||
minetest.colorize('#f0f', wear_pct)
|
||||
)
|
||||
end
|
||||
end
|
||||
else
|
||||
return false, "You aren't a player somehow, sorry?!"
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
function terumet.chance(pct)
|
||||
if pct <= 0 then return false end
|
||||
if pct >= 100 then return true end
|
||||
return terumet.RAND:next(1,100) <= pct
|
||||
end
|
||||
|
||||
-- function for a node's on_blast callback to be removed with a pct% chance
|
||||
function terumet.blast_chance(pct, id)
|
||||
return function(pos)
|
||||
if terumet.chance(pct) then
|
||||
minetest.remove_node(pos)
|
||||
return {id}
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- empty function useful for where a callback is necessary but using nil would cause undesired default behavior
|
||||
terumet.NO_FUNCTION = function() end
|
||||
terumet.EMPTY = {}
|
||||
terumet.ZERO_XYZ = {x=0,y=0,z=0}
|
||||
|
||||
function terumet.recipe_3x3(i)
|
||||
return {
|
||||
{i, i, i}, {i, i, i}, {i, i, i}
|
||||
}
|
||||
end
|
||||
|
||||
function terumet.recipe_box(outer, inner)
|
||||
return {
|
||||
{outer, outer, outer}, {outer, inner, outer}, {outer, outer, outer}
|
||||
}
|
||||
end
|
||||
|
||||
function terumet.recipe_plus(i)
|
||||
return {
|
||||
{'', i, ''}, {i, i, i}, {'', i, ''}
|
||||
}
|
||||
end
|
||||
|
||||
function terumet.random_velocity(max_tenths)
|
||||
return {
|
||||
x = terumet.RAND:next(-max_tenths,max_tenths) / 10,
|
||||
y = terumet.RAND:next(-max_tenths,max_tenths) / 10,
|
||||
z = terumet.RAND:next(-max_tenths,max_tenths) / 10
|
||||
}
|
||||
end
|
||||
|
||||
function terumet.particle_stream(pointA, pointB, density, particle_data, player)
|
||||
local dist_vector = {x=(pointB.x-pointA.x), y=(pointB.y-pointA.y), z=(pointB.z-pointA.z)}
|
||||
local dist = vector.length(dist_vector)
|
||||
local pcount = dist * density
|
||||
if pcount < 1 then return end -- guard against div/0
|
||||
local step = {x=(dist_vector.x/pcount), y=(dist_vector.y/pcount), z=(dist_vector.z/pcount)}
|
||||
local ppos = vector.new(pointA)
|
||||
for _ = 1,pcount do
|
||||
ppos = util3d.pos_plus(ppos, step)
|
||||
minetest.add_particle{
|
||||
pos = vector.new(ppos),
|
||||
velocity=terumet.random_velocity(5),
|
||||
expirationtime=(particle_data.expiration or 1),
|
||||
size=(particle_data.size or 1),
|
||||
glow=(particle_data.glow or 1),
|
||||
playername=player,
|
||||
texture=particle_data.texture,
|
||||
animation=particle_data.animation
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
function terumet.format_time(t)
|
||||
return string.format('%.1f s', t or 0)
|
||||
end
|
||||
|
||||
function terumet.do_lua_file(name)
|
||||
dofile(minetest.get_modpath(terumet.mod_name) .. '/' .. name .. '.lua')
|
||||
end
|
||||
|
||||
-- create a copy of node groups from an unlit machine for lit version of machine
|
||||
function terumet.create_lit_node_groups(unlit_groups)
|
||||
local new_groups = {not_in_creative_inventory=1}
|
||||
for k,v in pairs(unlit_groups) do new_groups[k] = v end
|
||||
return new_groups
|
||||
end
|
||||
|
||||
function terumet.itemstack_desc(stack)
|
||||
local stack_desc = stack:get_definition().description
|
||||
-- use only what is before a newline if one is in the description
|
||||
if stack_desc:find('\n') then stack_desc = stack_desc:match('(.*)\n') end
|
||||
if stack:get_count() > 1 then
|
||||
return string.format('%s (x%d)', stack_desc, stack:get_count())
|
||||
else
|
||||
return stack_desc
|
||||
end
|
||||
end
|
||||
|
||||
-- given a table with 'group:XXX' keys and a node/item definition with groups, return the
|
||||
-- (first) value in the table where node/item has a group key of XXX, otherwise nil
|
||||
function terumet.match_group_key(table, def)
|
||||
if not def then return nil end
|
||||
for group_name,_ in pairs(def.groups) do
|
||||
local grp_key = 'group:'..group_name
|
||||
if table[grp_key] then
|
||||
return table[grp_key]
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
function terumet.id(id, number)
|
||||
if number then
|
||||
return string.format('%s:%s %d', terumet.mod_name, id, number)
|
||||
else
|
||||
return string.format('%s:%s', terumet.mod_name, id)
|
||||
end
|
||||
end
|
||||
|
||||
function terumet.give_player_item(pos, player, stack)
|
||||
local inv = player:get_inventory()
|
||||
local leftover = inv:add_item("main", stack)
|
||||
if leftover and not leftover:is_empty() then
|
||||
minetest.item_drop(leftover, player, player:get_pos())
|
||||
end
|
||||
end
|
||||
|
||||
function terumet.tex(id)
|
||||
-- accepts both base ids (assuming this mod) and full mod ids
|
||||
-- ex: terumet.tex('ingot_raw') -> 'terumet_ingot_raw.png'
|
||||
-- terumet.tex('default:cobble') -> 'default_cobble.png'
|
||||
if id:match(':') then
|
||||
return string.format('%s.png', id:gsub(':', '_'))
|
||||
else
|
||||
return string.format('%s_%s.png', terumet.mod_name, id)
|
||||
end
|
||||
end
|
||||
|
||||
function terumet.item_desc(name, xinfo)
|
||||
if xinfo then
|
||||
return string.format("%s\n%s", name, minetest.colorize(terumet.options.misc.TIP_COLOR, xinfo))
|
||||
else
|
||||
return name
|
||||
end
|
||||
end
|
||||
|
||||
function terumet.crystal_tex(color)
|
||||
return string.format('%s^[multiply:%s', terumet.tex('item_cryst'), color)
|
||||
end
|
||||
|
||||
function terumet.tex_comp(base_tex, overlay_id)
|
||||
return base_tex .. '^' .. terumet.tex(overlay_id)
|
||||
end
|
||||
|
||||
function terumet.tex_trans(id, rot)
|
||||
return terumet.tex(id) .. '^[transform' .. rot
|
||||
end
|
||||
|
||||
local HEAR_DIST = 12
|
||||
terumet.squishy_node_sounds = {
|
||||
footstep = {name='terumet_squish_step', max_hear_distance=HEAR_DIST},
|
||||
dig = {name='terumet_squish_dig', max_hear_distance=HEAR_DIST},
|
||||
dug = {name='terumet_squish_dug', max_hear_distance=HEAR_DIST},
|
||||
place = {name='terumet_squish_place', max_hear_distance=HEAR_DIST},
|
||||
}
|
||||
|
||||
terumet.do_lua_file('util3d')
|
||||
|
||||
terumet.do_lua_file('interop/terumet_api')
|
||||
terumet.do_lua_file('options')
|
||||
terumet.do_lua_file('material/reg_alloy')
|
||||
|
||||
|
||||
-- reg_alloy(name, id, block hardness level, repair material value)
|
||||
terumet.reg_alloy('Terucopper', 'tcop', 1, 20)
|
||||
terumet.reg_alloy('Terutin', 'ttin', 1, 15)
|
||||
terumet.reg_alloy('Terusteel', 'tste', 2, 40)
|
||||
terumet.reg_alloy('Terugold', 'tgol', 3, 80)
|
||||
terumet.reg_alloy('Coreglass', 'cgls', 4, 120)
|
||||
terumet.reg_alloy('Teruchalcum', 'tcha', 2, 60)
|
||||
|
||||
terumet.do_lua_file('material/ceramic')
|
||||
--terumet.do_lua_file('material/thermese')
|
||||
terumet.do_lua_file('material/coil')
|
||||
--terumet.do_lua_file('material/crushed')
|
||||
--terumet.do_lua_file('material/pwood')
|
||||
--terumet.do_lua_file('material/tglass')
|
||||
terumet.do_lua_file('material/rebar')
|
||||
terumet.do_lua_file('material/misc')
|
||||
terumet.do_lua_file('material/crystallized')
|
||||
--terumet.do_lua_file('material/battery')
|
||||
|
||||
local id = terumet.id
|
||||
|
||||
-- register raw terumetal ingot as weak repair-material
|
||||
terumet.register_repair_material(id('ingot_raw'), 10)
|
||||
|
||||
--terumet.do_lua_file('tool/reg_tools')
|
||||
|
||||
local sword_opts = terumet.options.tools.sword_damage
|
||||
|
||||
|
||||
--terumet.do_lua_file('tool/ore_saw')
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- register repairable default tools and materials
|
||||
-- {value of 1 item, item id}:
|
||||
local dmv_values = {
|
||||
steel={10, 'default:steel_ingot'},
|
||||
bronze={30, 'default:bronze_ingot'},
|
||||
mese={90, 'default:mese_crystal'},
|
||||
diamond={100, 'default:diamond'}
|
||||
}
|
||||
|
||||
for dmat, v in pairs(dmv_values) do
|
||||
terumet.register_repairable_item("default:pick_"..dmat, v[1]*3)
|
||||
terumet.register_repairable_item("default:axe_"..dmat, v[1]*3)
|
||||
terumet.register_repairable_item("default:shovel_"..dmat, v[1])
|
||||
terumet.register_repairable_item("default:sword_"..dmat, v[1]*2)
|
||||
terumet.register_repair_material(v[2], v[1])
|
||||
end
|
||||
|
||||
terumet.do_lua_file('material/concrete')
|
||||
terumet.do_lua_file('material/coalproc')
|
||||
|
||||
--experimental stuff
|
||||
--terumet.do_lua_file('material/meson')
|
||||
|
||||
local INTEROPS = {'3d_armor', 'doors', 'unified_inventory', 'tubelib', 'dungeon_loot', 'moreores', 'farming', 'extra'}
|
||||
for _,mod in ipairs(INTEROPS) do
|
||||
if minetest.get_modpath(mod) then terumet.do_lua_file('interop/'..mod) end
|
||||
end
|
||||
|
||||
local vacfood_options = terumet.options.vac_oven.VAC_FOOD
|
||||
if vacfood_options and vacfood_options.ACTIVE then terumet.do_lua_file('material/vacfood') end
|
||||
|
||||
terumet.do_lua_file('interop/crusher_misc')
|
||||
219
mods/ip_terumet/interop/3d_armor.lua
Normal file
@@ -0,0 +1,219 @@
|
||||
-- add armor when 3darmor mod is also active
|
||||
local opts = terumet.options.armor
|
||||
|
||||
local function gen_armor_groups(type, data)
|
||||
local grps = {
|
||||
armor_use=data.uses,
|
||||
armor_heal=(data.heal or 0),
|
||||
armor_water=(data.breathing or 0),
|
||||
armor_fire=data.fire,
|
||||
physics_speed=(data.speed or 0),
|
||||
physics_gravity=(data.gravity or 0),
|
||||
physics_jump=(data.jump or 0),
|
||||
}
|
||||
grps[type]=1
|
||||
return grps
|
||||
end
|
||||
|
||||
local function reg_recipe_boots(id, mat)
|
||||
minetest.register_craft{output=id, recipe={
|
||||
{mat, '', mat},
|
||||
{mat, '', mat}
|
||||
}}
|
||||
end
|
||||
|
||||
local function reg_recipe_legs(id, mat)
|
||||
minetest.register_craft{output=id, recipe={
|
||||
{mat, mat, mat},
|
||||
{mat, '', mat},
|
||||
{mat, '', mat}
|
||||
}}
|
||||
end
|
||||
|
||||
local function reg_recipe_chest(id, mat)
|
||||
minetest.register_craft{output=id, recipe={
|
||||
{mat, '', mat},
|
||||
{mat, mat, mat},
|
||||
{mat, mat, mat}
|
||||
}}
|
||||
end
|
||||
|
||||
local function reg_recipe_helm(id, mat)
|
||||
minetest.register_craft{output=id, recipe={
|
||||
{mat, mat, mat},
|
||||
{mat, '', mat},
|
||||
}}
|
||||
end
|
||||
|
||||
local function reg_terumet_armor(data)
|
||||
if not data or not data.suffix or not data.mat then error('Missing data on registering Terumetal armor') end
|
||||
data.uses = data.uses or 500
|
||||
data.mrv = data.mrv or 10 -- material repair value of 1x mat
|
||||
data.dgroups = data.dgroups or {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
|
||||
data.name = data.name or data.suffix
|
||||
|
||||
local low_def = data.total_def / 6
|
||||
local hi_def = data.total_def / 3
|
||||
|
||||
data.heal = data.total_heal / 4
|
||||
data.speed = data.weight / -100
|
||||
data.gravity = data.weight / 50
|
||||
|
||||
local boots_id = terumet.id('armboots_'..data.suffix)
|
||||
armor:register_armor(boots_id, {
|
||||
description = terumet.item_desc(data.name..' Boots', data.xinfo),
|
||||
inventory_image = terumet.tex('invboots_'..data.suffix),
|
||||
texture = terumet.tex('armboots_'..data.suffix),
|
||||
preview = terumet.tex('prvboots_'..data.suffix),
|
||||
groups = gen_armor_groups('armor_feet', data),
|
||||
armor_groups = {fleshy=low_def},
|
||||
damage_groups = data.dgroups,
|
||||
})
|
||||
reg_recipe_boots(boots_id, data.mat)
|
||||
terumet.register_repairable_item(boots_id, data.mrv*4)
|
||||
|
||||
local helm_id = terumet.id('armhelm_'..data.suffix)
|
||||
armor:register_armor(helm_id, {
|
||||
description= terumet.item_desc(data.name..' Helmet', data.xinfo),
|
||||
inventory_image = terumet.tex('invhelm_'..data.suffix),
|
||||
texture = terumet.tex('armhelm_'..data.suffix),
|
||||
preview = terumet.tex('prvhelm_'..data.suffix),
|
||||
groups = gen_armor_groups('armor_head', data),
|
||||
armor_groups = {fleshy=low_def},
|
||||
damage_groups = data.dgroups,
|
||||
})
|
||||
reg_recipe_helm(helm_id, data.mat)
|
||||
terumet.register_repairable_item(helm_id, data.mrv*5)
|
||||
|
||||
local chest_id = terumet.id('armchest_'..data.suffix)
|
||||
armor:register_armor(chest_id, {
|
||||
description= terumet.item_desc(data.name..' Chestpiece', data.xinfo),
|
||||
inventory_image = terumet.tex('invchest_'..data.suffix),
|
||||
texture = terumet.tex('armchest_'..data.suffix),
|
||||
preview = terumet.tex('prvchest_'..data.suffix),
|
||||
groups = gen_armor_groups('armor_torso', data),
|
||||
armor_groups = {fleshy=hi_def},
|
||||
damage_groups = data.dgroups,
|
||||
})
|
||||
reg_recipe_chest(chest_id, data.mat)
|
||||
terumet.register_repairable_item(chest_id, data.mrv*8)
|
||||
|
||||
local legs_id = terumet.id('armlegs_'..data.suffix)
|
||||
armor:register_armor(legs_id, {
|
||||
description= terumet.item_desc(data.name..' Leggings', data.xinfo),
|
||||
inventory_image = terumet.tex('invlegs_'..data.suffix),
|
||||
texture = terumet.tex('armlegs_'..data.suffix),
|
||||
preview = terumet.tex('prvlegs_'..data.suffix),
|
||||
groups = gen_armor_groups('armor_legs', data),
|
||||
armor_groups = {fleshy=hi_def},
|
||||
damage_groups = data.dgroups,
|
||||
})
|
||||
reg_recipe_legs(legs_id, data.mat)
|
||||
terumet.register_repairable_item(legs_id, data.mrv*7)
|
||||
end
|
||||
|
||||
-- enable terumet bracers
|
||||
if opts.BRACERS then
|
||||
-- I would love to colorize every texture rather than require a seperate armor & preview texture for every bracer
|
||||
-- but it seems that 3d_armor textures do NOT support texture generation with ^ layering and ^[multiply :(
|
||||
local function bracer_inv_texture(color)
|
||||
if color then
|
||||
return string.format('(%s^(%s^[multiply:%s))', terumet.tex('invbrcr_base'), terumet.tex('invbrcr_color'), color)
|
||||
else
|
||||
return terumet.tex('invbrcr_base')
|
||||
end
|
||||
end
|
||||
|
||||
local function core_texture(color)
|
||||
return string.format('%s^[multiply:%s', terumet.tex('item_brcrcrys'), color)
|
||||
end
|
||||
|
||||
table.insert(armor.elements, "terumet_brcr")
|
||||
|
||||
local brcrcrys_id = terumet.id('item_brcrcrys')
|
||||
minetest.register_craftitem( brcrcrys_id, {
|
||||
description = 'Blank Bracer Core',
|
||||
inventory_image = terumet.tex(brcrcrys_id)
|
||||
})
|
||||
-- add vulcan crystallizer recipe for blank bracer core
|
||||
terumet.options.vulcan.recipes[opts.BRACER_CRYSTAL_ITEM] = {brcrcrys_id, 2}
|
||||
|
||||
local function reg_terumet_band(data)
|
||||
if not data or not data.suffix then error('Missing data on registering Terumetal bracer') end
|
||||
data.uses = data.uses or 500
|
||||
data.def = data.def or 0
|
||||
data.dgroups = data.dgroups or {cracky=3, snappy=3, choppy=3, crumbly=3, level=1}
|
||||
data.name = data.name or data.suffix
|
||||
-- generate groups now to update xinfo if necessary before registering it
|
||||
local groups = gen_armor_groups('armor_terumet_brcr', data)
|
||||
|
||||
local band_id = terumet.id('brcr_'..data.suffix)
|
||||
armor:register_armor(band_id, {
|
||||
description= terumet.item_desc(data.name..' Bracers', data.xinfo),
|
||||
inventory_image = bracer_inv_texture(data.color),
|
||||
texture = terumet.tex('armbrcr_'..data.suffix),
|
||||
preview = terumet.tex('prvbrcr_'..data.suffix),
|
||||
groups = groups,
|
||||
armor_groups = {fleshy=data.def},
|
||||
damage_groups = data.dgroups,
|
||||
on_equip = data.on_equip,
|
||||
on_unequip = data.on_unequip,
|
||||
on_damage = data.on_damage,
|
||||
on_punched = data.on_punched
|
||||
})
|
||||
|
||||
if data.mat then
|
||||
local ecryst_id = terumet.id('item_brcrcrys_'..data.suffix)
|
||||
minetest.register_craftitem( ecryst_id, {
|
||||
description = data.name..' Bracer Core',
|
||||
inventory_image = core_texture(data.color)
|
||||
})
|
||||
|
||||
terumet.register_alloy_recipe{result=ecryst_id, flux=4, time=10.0, input={brcrcrys_id, data.mat}}
|
||||
|
||||
terumet.register_alloy_recipe{result=band_id, flux=0, time=120.0, input={terumet.id('brcr_base'), ecryst_id .. ' 8'}}
|
||||
else
|
||||
local metal = terumet.id('item_cryst_raw')
|
||||
local coil = terumet.id('item_coil_tgol')
|
||||
minetest.register_craft{output=band_id, recipe={
|
||||
{coil, metal, coil},
|
||||
{metal, metal, metal},
|
||||
{coil, metal, coil}
|
||||
}}
|
||||
end
|
||||
|
||||
terumet.register_repairable_item(band_id, data.rep or 80)
|
||||
end
|
||||
|
||||
reg_terumet_band{suffix='base', name='Terumetal', xinfo='No effects', def=5, uses=500, rep=80}
|
||||
|
||||
for band_id, band_data in pairs(opts.BRACERS) do
|
||||
if (not band_data.fire) or armor.config.fire_protect then
|
||||
band_data.suffix = band_id
|
||||
reg_terumet_band(band_data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not armor.config.fire_protect then
|
||||
minetest.log('warning', 'terumet: fire protection on armor will not function - 3d_armor fire protection option not activated')
|
||||
end
|
||||
|
||||
-- 3d_armor fire protection notes: total fire protection must meet or exceed the following values to be immune
|
||||
-- torches = 1, fire = 3, lava = 5
|
||||
-- this seems to be the only effect it has
|
||||
|
||||
reg_terumet_armor{suffix='cgls', name='Coreglass', mat=terumet.id('ingot_cgls'),
|
||||
mrv=120, total_def=78, total_heal=36, weight=3, xinfo='Weight +3', uses=120, fire=0.75} -- 2 pcs = immune to torches, 4 pcs = immune to fire
|
||||
reg_terumet_armor{suffix='tcha', name='Teruchalcum', mat=terumet.id('ingot_tcha'),
|
||||
mrv=60, total_def=64, total_heal=8, weight=2, xinfo='Weight +2', uses=260}
|
||||
reg_terumet_armor{suffix='tste', name='Terusteel', mat=terumet.id('ingot_tste'),
|
||||
mrv=40, total_def=56, total_heal=12, weight=1, xinfo='Weight +1', uses=190}
|
||||
reg_terumet_armor{suffix='tcop', name='Terucopper', mat=terumet.id('ingot_tcop'),
|
||||
mrv=20, total_def=45, total_heal=4, weight=0, uses=280}
|
||||
reg_terumet_armor{suffix='tgol', name='Terugold', mat=terumet.id('ingot_tgol'),
|
||||
mrv=80, total_def=24, total_heal=65, weight=-1, xinfo='Weight -1', uses=720}
|
||||
reg_terumet_armor{suffix='ttin', name='Terutin', mat=terumet.id('ingot_ttin'),
|
||||
mrv=21, total_def=38, total_heal=24, weight=-2, xinfo='Weight -2', uses=410, fire=0.34, breathing=.1} -- 3 pcs = immune to torches
|
||||
reg_terumet_armor{suffix='rsuit', name='Vulcansuit', mat=terumet.id('item_rsuitmat'),
|
||||
mrv=180, total_def=78, total_heal=50, weight=-3, xinfo='Weight -3', uses=120, fire=1} -- 1 pc = immune to torches, 3 pcs = immune to fire
|
||||
47
mods/ip_terumet/interop/crusher_misc.lua
Normal file
@@ -0,0 +1,47 @@
|
||||
-- add crushing recipes for various mods if they are active
|
||||
|
||||
local function add_crush(item, result)
|
||||
terumet.options.crusher.recipes[item] = result
|
||||
end
|
||||
|
||||
|
||||
if minetest.get_modpath('bushes') then
|
||||
add_crush('bushes:BushLeaves1', 'terumet:item_dust_bio')
|
||||
add_crush('bushes:BushLeaves2', 'terumet:item_dust_bio')
|
||||
end
|
||||
|
||||
if minetest.get_modpath('dryplants') then
|
||||
add_crush('dryplants:grass', 'terumet:item_dust_bio')
|
||||
end
|
||||
|
||||
if minetest.get_modpath('vines') then
|
||||
add_crush('vines:vines', 'terumet:item_dust_bio')
|
||||
end
|
||||
|
||||
if minetest.get_modpath('farming') then
|
||||
-- small crops turn into 2 biomatter
|
||||
local small_crops = {
|
||||
'wheat', 'peas', 'barley', 'beans', 'pepper', 'beetroot', 'chili_pepper', 'blueberries',
|
||||
'cucumber', 'grapes', 'garlic', 'onion', 'pea_pod', 'pineapple_ring', 'pineapple_top', 'potato',
|
||||
'raspberries', 'tomato', 'corn', 'rhubarb'
|
||||
}
|
||||
|
||||
for _,crop in ipairs(small_crops) do
|
||||
local crop_id = 'farming:'..crop
|
||||
if minetest.registered_items[crop_id] then
|
||||
add_crush(crop_id, 'terumet:item_dust_bio 2')
|
||||
end
|
||||
end
|
||||
|
||||
-- big crops turn into 5 biomatter
|
||||
local big_crops = {
|
||||
'pumpkin', 'pineapple', 'melon_8'
|
||||
}
|
||||
|
||||
for _,crop in ipairs(big_crops) do
|
||||
local crop_id = 'farming'..crop
|
||||
if minetest.registered_items[crop_id] then
|
||||
add_crush(crop_id, 'terumet:item_dust_bio 5')
|
||||
end
|
||||
end
|
||||
end
|
||||
79
mods/ip_terumet/interop/doors.lua
Normal file
@@ -0,0 +1,79 @@
|
||||
-- order door type can be converted
|
||||
local type_order = {'full', 'mesh', 'slat', 'vert'}
|
||||
local type_names = {
|
||||
full='Solid %s Door',
|
||||
mesh='Meshed %s Door',
|
||||
slat='Slatted %s Door',
|
||||
vert='Fancy %s Door'
|
||||
}
|
||||
|
||||
local materials = {
|
||||
tcop={
|
||||
item=terumet.id('ingot_tcop'),
|
||||
name='Terucopper',
|
||||
level=1
|
||||
},
|
||||
ttin={
|
||||
item=terumet.id('ingot_ttin'),
|
||||
name='Terutin',
|
||||
level=1
|
||||
},
|
||||
tste={
|
||||
item=terumet.id('ingot_tste'),
|
||||
name='Terusteel',
|
||||
level=2
|
||||
},
|
||||
tcha={
|
||||
item=terumet.id('ingot_tcha'),
|
||||
name='Teruchalcum',
|
||||
level=2
|
||||
},
|
||||
tgol={
|
||||
item=terumet.id('ingot_tgol'),
|
||||
name='Terugold',
|
||||
level=3
|
||||
},
|
||||
cgls={
|
||||
item=terumet.id('ingot_cgls'),
|
||||
name='Coreglass',
|
||||
level=4
|
||||
}
|
||||
}
|
||||
|
||||
for mat_id, mat_data in pairs(materials) do
|
||||
local first_door_id = nil
|
||||
local prev_door_id = nil
|
||||
for _, type_id in pairs(type_order) do
|
||||
local type_name = type_names[type_id]
|
||||
local door_id = terumet.id(string.format('door%s_%s', type_id, mat_id))
|
||||
local door_tex = terumet.tex(string.format('door%s_%s', type_id, mat_id))
|
||||
local door_invtex = terumet.tex(string.format('dinv%s_%s', type_id, mat_id))
|
||||
local door_recipe = nil
|
||||
if not prev_door_id then
|
||||
door_recipe = {
|
||||
{mat_data.item, mat_data.item},
|
||||
{mat_data.item, mat_data.item},
|
||||
{mat_data.item, mat_data.item}
|
||||
}
|
||||
end
|
||||
doors.register(door_id, {
|
||||
tiles = {{name = door_tex, backface_culling = true}},
|
||||
description = string.format(type_name, mat_data.name),
|
||||
inventory_image = door_invtex,
|
||||
protected = true,
|
||||
groups = {cracky = 1, level = mat_data.level},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
sound_open = 'doors_steel_door_open',
|
||||
sound_close = 'doors_steel_door_close',
|
||||
recipe = door_recipe
|
||||
})
|
||||
|
||||
if prev_door_id then
|
||||
minetest.register_craft{ type='shapeless', output=door_id, recipe={prev_door_id} }
|
||||
end
|
||||
|
||||
if not first_door_id then first_door_id = door_id end
|
||||
prev_door_id = door_id
|
||||
end
|
||||
minetest.register_craft{ type='shapeless', output=first_door_id, recipe={prev_door_id} }
|
||||
end
|
||||
44
mods/ip_terumet/interop/dungeon_loot.lua
Normal file
@@ -0,0 +1,44 @@
|
||||
|
||||
local rloot = dungeon_loot.register
|
||||
local id = terumet.id
|
||||
|
||||
local BOTTOM = -32768
|
||||
local TOP = 32768
|
||||
|
||||
-- still a WIP on balance/items put into loot
|
||||
|
||||
rloot{name=id('item_col_raw'), chance=0.8, count={1,9}, y={-64, TOP}}
|
||||
rloot{name=id('item_col_tcop'), chance=0.8, count={1,9}, y={-512, 32}}
|
||||
rloot{name=id('item_col_tgol'), chance=0.8, count={1,9}, y={BOTTOM, 0}}
|
||||
|
||||
rloot{name=id('lump_raw'), chance=0.8, count={2,6}, y={0, TOP}}
|
||||
rloot{name=id('ingot_raw'), chance=0.7, count={1,4}, y={0, TOP}}
|
||||
rloot{name=id('lump_raw'), chance=0.85, count={1,12}}
|
||||
rloot{name=id('ingot_raw'), chance=0.75, count={1,9}}
|
||||
|
||||
rloot{name=id('item_glue'), chance=0.95, count={3,24}, y={-16, TOP}}
|
||||
rloot{name=id('item_coke'), chance=0.85, count={1,10}, y={-128, -32}}
|
||||
rloot{name=id('item_tarball'), chance=0.75, count={1,10}, y={BOTTOM, -96}}
|
||||
|
||||
rloot{name=id('block_pwood'), chance=0.85, count={8,24}, y={-16, TOP}}
|
||||
rloot{name=id('block_conmix'), chance=0.65, count={8,24}, y={-64, 128}}
|
||||
rloot{name=id('block_asphalt'), chance=0.75, count={8,24}, y={-128, -48}}
|
||||
|
||||
rloot{name=id('item_ceramic'), chance=0.65, count={2,10}, y={-8, TOP}}
|
||||
rloot{name=id('item_ceramic'), chance=0.85, count={6,24}, y={-256, -8}}
|
||||
rloot{name=id('block_ceramic'), chance=0.45, count={1,3}, y={BOTTOM, -128}}
|
||||
|
||||
rloot{name=id('item_batt_cop_full'), chance=0.10, y={-128, 0}}
|
||||
rloot{name=id('item_batt_therm_full'), chance=0.05, y={BOTTOM, -128}}
|
||||
|
||||
rloot{name=id('item_htglass'), chance=0.5, count={1,3}, y={-128, 0}}
|
||||
rloot{name=id('item_entropy'), chance=0.2, y={BOTTOM, -128}}
|
||||
|
||||
rloot{name=id('repmat_drop'), chance=0.5, count={1,24}, y={BOTTOM, -8}}
|
||||
|
||||
-- TODO: weight alloys by value
|
||||
for _,alloy_data in pairs(terumet.alloys) do
|
||||
rloot{name=alloy_data.ingot, chance=0.30, count={1,2}, y={-24, TOP}}
|
||||
rloot{name=alloy_data.ingot, chance=0.50, count={1,5}, y={-128, 0}}
|
||||
rloot{name=alloy_data.ingot, chance=0.70, count={3,9}, y={BOTTOM, -96}}
|
||||
end
|
||||
14
mods/ip_terumet/interop/extra.lua
Normal file
@@ -0,0 +1,14 @@
|
||||
local food_opts = terumet.options.vac_oven.VAC_FOOD
|
||||
|
||||
-- add farming foods to vac-food whitelist if it's active
|
||||
if food_opts and food_opts.ACTIVE then
|
||||
local foods = {
|
||||
'potato_crisps', 'french_fries', 'onion_rings', 'blooming_onion', 'fish_sticks', 'grilled_patty', 'hamburger', 'cheeseburger',
|
||||
'corn_dog', 'meatloaf', 'flour_tortilla', 'taco', 'super_taco', 'quesadilla', 'pepperoni', 'garlic_bread', 'spaghetti', 'lasagna', 'cheese_pizza',
|
||||
'salsa', 'pepperoni_pizza', 'deluxe_pizza', 'pineapple_pizza', 'cornbread'
|
||||
}
|
||||
|
||||
for _,id in ipairs(foods) do
|
||||
food_opts.WHITELIST[string.format('extra:%s', id)]=1
|
||||
end
|
||||
end
|
||||
13
mods/ip_terumet/interop/farming.lua
Normal file
@@ -0,0 +1,13 @@
|
||||
local food_opts = terumet.options.vac_oven.VAC_FOOD
|
||||
|
||||
-- add farming foods to vac-food whitelist if it's active
|
||||
if food_opts and food_opts.ACTIVE then
|
||||
local foods = {
|
||||
'baked_potato', 'potato_salad', 'pumpkin_bread', 'toast_sandwich', 'donut', 'donut_chocolate', 'donut_apple', 'porridge', 'turkish_delight',
|
||||
'chili_bowl', 'rhubarb_pie', 'garlic_bread', 'muffin_blueberry', 'chocolate_dark'
|
||||
}
|
||||
|
||||
for _,id in ipairs(foods) do
|
||||
food_opts.WHITELIST[string.format('farming:%s', id)]=1
|
||||
end
|
||||
end
|
||||
7
mods/ip_terumet/interop/mesecons.lua
Normal file
@@ -0,0 +1,7 @@
|
||||
-- interop bugfix with Mesecons/piston mod
|
||||
-- fix for https://github.com/Terumoc/terumet/issues/16
|
||||
|
||||
terumet.machine.register_on_new_machine_node(function (id, def)
|
||||
-- register every terumetal machine node as a "stopper" for pistons
|
||||
mesecon.register_mvps_stopper(id, true)
|
||||
end)
|
||||
22
mods/ip_terumet/interop/moreores.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
local crys_mithril = terumet.register_crystal{
|
||||
suffix='mith',
|
||||
color='#6161d5',
|
||||
name='Crystallized Mithril',
|
||||
cooking_result='moreores:mithril_ingot'
|
||||
}
|
||||
terumet.register_vulcan_result('moreores:mithril_lump', crys_mithril)
|
||||
terumet.register_vulcan_result('moreores:mineral_mithril', crys_mithril, 1)
|
||||
|
||||
local crys_silver = terumet.register_crystal{
|
||||
suffix='silv',
|
||||
color='#d3fffb',
|
||||
name='Crystallized Silver',
|
||||
cooking_result='moreores:silver_ingot'
|
||||
}
|
||||
terumet.register_vulcan_result('moreores:silver_lump', crys_silver)
|
||||
terumet.register_vulcan_result('moreores:mineral_silver', crys_silver, 1)
|
||||
|
||||
|
||||
terumet.crystal_ids.mitril = crys_mithril
|
||||
terumet.crystal_ids.silver = crys_silver
|
||||
234
mods/ip_terumet/interop/terumet_api.lua
Normal file
@@ -0,0 +1,234 @@
|
||||
-- API for other mods to interface with this mod
|
||||
|
||||
|
||||
-- register an external block for use in making heatline versions and/or reinforced versions
|
||||
-- if you wish to exclude one or the other, pass {heatline=true} or {reinforced=true} as 3rd argument
|
||||
|
||||
|
||||
-- register an item that provide Repair Material to Equipment Reformer
|
||||
-- value = repair material value provided by 1 item
|
||||
function terumet.register_repair_material(id, value)
|
||||
-- TODO error checking
|
||||
terumet.options.repm.repair_mats[id] = value
|
||||
end
|
||||
|
||||
-- register a tool that can be repaired in Equipment Reformer
|
||||
-- needed_mat = amount of repair material value to repair fully worn tool
|
||||
function terumet.register_repairable_item(id, needed_mat)
|
||||
-- TODO error checking
|
||||
terumet.options.repm.repairable[id] = needed_mat
|
||||
end
|
||||
|
||||
-- register a new alloy smelter recipe
|
||||
-- required data keys and descriptions:
|
||||
local ALLOY_REQUIRED = {
|
||||
result='[itemstack string] what will be output',
|
||||
input='[table, 1-4 stacks] table of itemstacks consumed as input',
|
||||
time='[float] time in seconds to process',
|
||||
flux='[integer] amount of terumetal flux consumed from tank',
|
||||
}
|
||||
function terumet.register_alloy_recipe(data)
|
||||
if not data then
|
||||
error('terumet.register_alloy_recipe: no recipe data provided')
|
||||
end
|
||||
for req_key, desc in pairs(ALLOY_REQUIRED) do
|
||||
if not data[req_key] then
|
||||
error(string.format('terumet.register_alloy_recipe: recipe data is missing required key %s: %s', req_key, desc))
|
||||
end
|
||||
end
|
||||
if type(data.input) ~= 'table' or #data.input < 1 or #data.input > 4 then
|
||||
error('terumet.register_alloy_recipe: invalid input; must be a table of 1-4 itemstack strings (inclusive)')
|
||||
end
|
||||
table.insert(terumet.options.smelter.recipes, 1, data)
|
||||
end
|
||||
|
||||
-- TODO error checking
|
||||
function terumet.register_vacoven_recipe(data)
|
||||
table.insert(terumet.options.vac_oven.recipes, data)
|
||||
end
|
||||
|
||||
-- register a new crystallized material with the provided data
|
||||
-- ID of created item will be 'terumet:item_cryst_<SUFFIX>'
|
||||
-- IMPORTANT NOTE: a single source item can only be defined as a single crystal
|
||||
-- for example, trying to add a new crystal for 'default:copper_lump' will override the default one
|
||||
--
|
||||
-- required data keys and descriptions:
|
||||
local CRYSTAL_REQUIRED = {
|
||||
suffix='[string] ID suffix for crystallized item',
|
||||
color='[colorspec] minetest colorspec for crystallized item color',
|
||||
name='[string] name of crystallized item',
|
||||
cooking_result='[itemstack string] result of cooking crystallized item',
|
||||
}
|
||||
|
||||
|
||||
function terumet.register_crystal(data)
|
||||
local this_func = 'terumet.register_crystal'
|
||||
if not data then
|
||||
error(this_func..': no data provided')
|
||||
end
|
||||
for req_key, desc in pairs(CRYSTAL_REQUIRED) do
|
||||
if not data[req_key] then
|
||||
error(string.format('%s: data missing required key %s: %s', this_func, req_key, desc))
|
||||
end
|
||||
end
|
||||
local crys_id = terumet.id('item_cryst_'..data.suffix)
|
||||
minetest.register_craftitem( crys_id, {
|
||||
description = data.name,
|
||||
inventory_image = terumet.crystal_tex(data.color),
|
||||
})
|
||||
minetest.register_craft{ type = 'cooking',
|
||||
output = data.cooking_result,
|
||||
recipe = crys_id,
|
||||
cooktime = 5
|
||||
}
|
||||
return crys_id -- returns crystal item ID
|
||||
end
|
||||
|
||||
-- register an item that can be put into crystal vulcanizer
|
||||
-- requires source item and result, optionally include integer modifier
|
||||
-- by default creates 2 result items, but count_modifier is added to that value
|
||||
-- +1 more result item if vulcanizer has upgrade
|
||||
function terumet.register_vulcan_result(source, result, count_modifier, specialized)
|
||||
count_modifier = count_modifier or 0
|
||||
local this_func = 'terumet.register_vulcan_result'
|
||||
if not source then error(this_func..': no source item provided') end
|
||||
if not result then error(this_func..': no result item provided') end
|
||||
local count = 2 + count_modifier
|
||||
if( count < 1 ) then count = 1 end
|
||||
terumet.options.vulcan.recipes[source] = {result, count, specialized}
|
||||
end
|
||||
|
||||
-- register that a node can generate heat when extracted by the Environmental Entropy Extraction Heater (EEE Heater)
|
||||
local ENTROPIC_REQUIRED = {
|
||||
node='[string] id of node that can be extracted',
|
||||
hu_per_s='[integer] number of heat units extracted per second',
|
||||
extract_time='[float] total amount of time to extract this node',
|
||||
}
|
||||
-- optional keys:
|
||||
-- change_to: [string] what node this node will change into after extraction - if nil, the node will not change and thus can be extracted over and over (like air by default)
|
||||
function terumet.register_entropic_node(data)
|
||||
if not data then
|
||||
error('terumet.register_entropic_node: no data provided')
|
||||
end
|
||||
for req_key, desc in pairs(ENTROPIC_REQUIRED) do
|
||||
if not data[req_key] then
|
||||
error(string.format('terumet.register_entropic_node: data is missing required key %s: %s', req_key, desc))
|
||||
end
|
||||
end
|
||||
terumet.options.heater.entropy.EFFECTS[data.node] = {hu_per_s=data.hu_per_s, extract_time=data.extract_time, change_to=data.change_to}
|
||||
end
|
||||
|
||||
|
||||
local STANDARD_INV_LISTS = {'in', 'out', 'fuel', 'upgrade'}
|
||||
local EXTERNAL_MACHINES = {}
|
||||
local MACHINE_REQUIRED = {
|
||||
name='[string] Name of machine',
|
||||
node_tiles='[minetest tiles definition] Tiles for machine node',
|
||||
heat_max='[integer] Base maximum heat units that can be stored by machine',
|
||||
input_slots='[integer, 0-4 expected] Size of input inventory',
|
||||
output_slots='[integer, 0-4 expected] Size of output inventory',
|
||||
has_fuel_slot='[boolean] Whether machine has direct fuel slot',
|
||||
upgrade_slots='[integer, 0-6 expected] Size of upgrade inventory',
|
||||
tick_time='[float] Time in seconds between machine ticks',
|
||||
tick_function='[fn(machine_state, dt) -> boolean] Function called when machine ticks. Return true to tick again in tick_time seconds.'
|
||||
}
|
||||
-- optional keys:
|
||||
-- heat_provider: [boolean] true if machine generates/provides heat to adjacent machines
|
||||
-- heat_transfer: [integer] Maximum amount of heat machine can send in 1 tick
|
||||
-- node_name: [string] name to give machine's node. if not provided, uses same as 'name'
|
||||
-- node_param2: [string] param2 to give machine's node (same as minetest's nodedef param2 setting: facedir/none/etc. )
|
||||
-- custom_init: [fn(pos, meta, inv) -> nil] custom initialization for setting inventories or other metadata of a new machine
|
||||
-- custom_write: [fn(machine_state)] function to call when saving machine state to metadata
|
||||
-- custom_read: [fn(machine_state)] function to call when reading machine state from metadata
|
||||
-- -- machine formspec options --
|
||||
-- <basic>
|
||||
-- machinefs_theme: [string] definition of background/listcolors for machine's formspec
|
||||
-- machinefs_func: [fn(machine_state) -> string] custom function that returns formspec definition for main area above inventory in interface
|
||||
-- -- <OR advanced> --
|
||||
-- custom_fsdef: [fsdef table] entire customized formspec definition table for machine to use, see terumet/machine/machine.lua:build_fs for more information
|
||||
-- [IMPORTANT] => using custom_fsdef completely overrides use of machinefs_* funcs and default formspec so everything must be defined
|
||||
|
||||
function terumet.register_heat_machine( id, data )
|
||||
if not data then
|
||||
error('terumet.register_heat_machine: no data provided')
|
||||
end
|
||||
for req_key, desc in pairs(MACHINE_REQUIRED) do
|
||||
if not data[req_key] then
|
||||
error(string.format('terumet.register_heat_machine: data is missing required key %s: %s', req_key, desc))
|
||||
end
|
||||
end
|
||||
|
||||
local machine_tm_class = {
|
||||
name = data.name,
|
||||
timer = data.tick_time,
|
||||
fsdef = data.custom_fsdef or {
|
||||
control_buttons = {
|
||||
terumet.machine.buttondefs.HEAT_XFER_TOGGLE,
|
||||
},
|
||||
machine = data.machinefs_func or terumet.NO_FUNCTION,
|
||||
input = {data.input_slots > 0},
|
||||
output = {data.output_slots > 0},
|
||||
fuel_slot = {data.fuel_slot},
|
||||
theme = data.machinefs_theme,
|
||||
},
|
||||
default_heat_xfer = (data.heat_provider and terumet.machine.HEAT_XFER_MODE.PROVIDE_ONLY) or terumet.machine.HEAT_XFER_MODE.ACCEPT,
|
||||
get_drop_contents = function(machine)
|
||||
local drops = {}
|
||||
for _,std_list in ipairs(STANDARD_INV_LISTS) do
|
||||
default.get_inventory_drops(machine.pos, std_list, drops)
|
||||
end
|
||||
return drops
|
||||
end
|
||||
}
|
||||
|
||||
local node_def = terumet.machine.nodedef{
|
||||
description = data.node_name or data.name,
|
||||
tiles = data.node_tiles,
|
||||
param2 = data.node_param2,
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if data.upgrade_slots > 0 then inv:set_size('upgrade', data.upgrade_slots) end
|
||||
if data.input_slots > 0 then inv:set_size('in', data.input_slots) end
|
||||
if data.output_slots > 0 then inv:set_size('out', data.output_slots) end
|
||||
if data.has_fuel_slot then inv:set_size('fuel', 1) end
|
||||
if data.custom_init then data.custom_init(pos, meta, inv) end
|
||||
local init = {
|
||||
class = machine_tm_class,
|
||||
state = 0,
|
||||
state_time = 0,
|
||||
heat_level = 0,
|
||||
max_heat = data.heat_max,
|
||||
status_text = 'New',
|
||||
inv = inv,
|
||||
meta = meta,
|
||||
pos = pos,
|
||||
}
|
||||
terumet.machine.write_state(pos, init)
|
||||
terumet.machine.set_timer(init)
|
||||
end,
|
||||
on_timer = function(pos, dt)
|
||||
local machine = terumet.machine.tick_read_state(pos)
|
||||
local re_tick = false
|
||||
if not terumet.machine.check_overheat(machine, data.heat_max) then
|
||||
re_tick = data.tick_function(machine, dt)
|
||||
if machine.heat_xfer_mode == terumet.machine.HEAT_XFER_MODE.PROVIDE_ONLY then
|
||||
terumet.machine.push_heat_adjacent(machine, data.heat_transfer or 50)
|
||||
end
|
||||
|
||||
if data.has_fuel_slot then
|
||||
terumet.machine.process_fuel(machine)
|
||||
re_tick = not machine.need_heat
|
||||
end
|
||||
end
|
||||
-- write status back to meta
|
||||
terumet.machine.write_state(pos, machine)
|
||||
return re_tick
|
||||
end,
|
||||
_terumach_class = machine_tm_class
|
||||
}
|
||||
|
||||
minetest.register_node( id, node_def )
|
||||
|
||||
EXTERNAL_MACHINES[id] = data
|
||||
end
|
||||
52
mods/ip_terumet/interop/tubelib.lua
Normal file
@@ -0,0 +1,52 @@
|
||||
local tube = 'tubelib:tubeS'
|
||||
if tubelib.version < 2.0 then
|
||||
tube = 'tubelib:tube1'
|
||||
end
|
||||
|
||||
terumet.register_machine_upgrade('tubelib', 'Tube Support Upgrade', {terumet.id('item_upg_base'), tube}, nil, 'simple', 'Allows machine to interface with tubelib tubes')
|
||||
|
||||
local machine_check = function(machine, player_name)
|
||||
return machine and terumet.machine.has_upgrade(machine, 'tubelib')
|
||||
---terumet.machine.has_auth(machine, player_name)
|
||||
end
|
||||
|
||||
local PUSH_FUNC = function(pos, side, item, player_name)
|
||||
local machine = terumet.machine.readonly_state(pos)
|
||||
if machine_check(machine) then
|
||||
local result = tubelib.put_item(machine.meta, 'in', item)
|
||||
if result then machine.class.on_inventory_change(machine) end
|
||||
return result
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local TUBELIB_MACHINE_DEF = {
|
||||
on_pull_item = function(pos, side, player_name)
|
||||
local machine = terumet.machine.readonly_state(pos)
|
||||
if machine_check(machine) then
|
||||
return tubelib.get_item(machine.meta, 'out')
|
||||
end
|
||||
return nil
|
||||
end,
|
||||
on_push_item = PUSH_FUNC,
|
||||
on_unpull_item = PUSH_FUNC
|
||||
}
|
||||
|
||||
terumet.machine.register_on_place(function (pos, machine, placer)
|
||||
tubelib.add_node(pos, machine.class.name)
|
||||
end)
|
||||
|
||||
terumet.machine.register_on_remove(function (pos, machine)
|
||||
tubelib.remove_node(pos)
|
||||
end)
|
||||
|
||||
tubelib.register_node(terumet.id('mach_asmelt'), {terumet.id('mach_asmelt_lit')}, TUBELIB_MACHINE_DEF)
|
||||
tubelib.register_node(terumet.id('mach_htfurn'), {terumet.id('mach_htfurn_lit')}, TUBELIB_MACHINE_DEF)
|
||||
tubelib.register_node(terumet.id('mach_lavam'), {terumet.id('mach_lavam_lit')}, TUBELIB_MACHINE_DEF)
|
||||
tubelib.register_node(terumet.id('mach_htr_furnace'), {terumet.id('mach_htr_furnace_lit')}, TUBELIB_MACHINE_DEF)
|
||||
tubelib.register_node(terumet.id('mach_crusher'), {terumet.id('mach_crusher_lit')}, TUBELIB_MACHINE_DEF)
|
||||
--oops: mese garden has no upgrade slots... consider adding it if support for other upgrades is added in future
|
||||
--tubelib.register_node(terumet.id('mach_meseg'), terumet.EMPTY, TUBELIB_MACHINE_DEF)
|
||||
tubelib.register_node(terumet.id('mach_repm'), terumet.EMPTY, TUBELIB_MACHINE_DEF)
|
||||
tubelib.register_node(terumet.id('mach_vulcan'), terumet.EMPTY, TUBELIB_MACHINE_DEF)
|
||||
|
||||
163
mods/ip_terumet/interop/unified_inventory.lua
Normal file
@@ -0,0 +1,163 @@
|
||||
local function add_terumet_recipes()
|
||||
-- add each defined alloy recipe to UnInv
|
||||
for _, recipe in pairs(terumet.options.smelter.recipes) do
|
||||
local listed = {}
|
||||
for i=1,#recipe.input do listed[#listed+1] = recipe.input[i] end
|
||||
if recipe.flux > 0 then
|
||||
listed[#listed+1] = terumet.id('uninv_flux_req', recipe.flux)
|
||||
end
|
||||
listed[#listed+1] = terumet.id('uninv_time_req', math.ceil(recipe.time))
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_alloy',
|
||||
output = recipe.result,
|
||||
items = listed
|
||||
}
|
||||
end
|
||||
|
||||
-- add each defined vacuum oven recipe (1 entry for each output)
|
||||
for _, recipe in ipairs(terumet.options.vac_oven.recipes) do
|
||||
local time = terumet.id('uninv_time_req', math.ceil(recipe.time))
|
||||
for _, output in ipairs(recipe.results) do
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_vacoven',
|
||||
output = output,
|
||||
items = {recipe.input, time}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
-- add each defined flux source to UnInv
|
||||
for source, details in pairs(terumet.options.smelter.FLUX_ITEMS) do
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_alloy',
|
||||
output = terumet.id('uninv_flux_req'),
|
||||
items = {source, terumet.id('uninv_time_req', math.ceil(details.time))}
|
||||
}
|
||||
end
|
||||
|
||||
-- add each crusher recipe to UnInv
|
||||
for source, result in pairs(terumet.options.crusher.recipes) do
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_crush',
|
||||
output = result,
|
||||
items = {source}
|
||||
}
|
||||
end
|
||||
|
||||
-- add each repair material to UnInv
|
||||
for id, repmatval in pairs(terumet.options.repm.repair_mats) do
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_repmat',
|
||||
output = terumet.id('uninv_repmat', repmatval),
|
||||
items = {id}
|
||||
}
|
||||
end
|
||||
|
||||
-- add each repairable tool to UnInv
|
||||
for id, rmreq in pairs(terumet.options.repm.repairable) do
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_repair',
|
||||
output = id,
|
||||
items = {id, terumet.id('uninv_repmat', rmreq)}
|
||||
}
|
||||
end
|
||||
|
||||
-- add each crystal vulcanizer recipe to UnInv
|
||||
for source, result in pairs(terumet.options.vulcan.recipes) do
|
||||
--minetest.log(string.format('%s => %s x %s', source or 'NIL', result[1] or 'NIL', result[2] or 'NIL'))
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_vulcan',
|
||||
output = result[1] .. ' ' .. result[2],
|
||||
items = {source}
|
||||
}
|
||||
end
|
||||
|
||||
-- add each valid ore for ore saw to UnInv
|
||||
for node, _ in pairs(terumet.options.ore_saw.VALID_ORES) do
|
||||
unified_inventory.register_craft{
|
||||
type = 'terumet_ore_saw',
|
||||
output = node,
|
||||
items = {node}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
-- dummy item to display amount of flux needed to alloy
|
||||
minetest.register_craftitem( terumet.id('uninv_flux_req'), {
|
||||
description = "terumetal flux (in smelter tank)",
|
||||
inventory_image = terumet.tex('uninv_flux_req'),
|
||||
groups={not_in_creative_inventory=1}
|
||||
})
|
||||
|
||||
-- dummy item to display amount of time needed to alloy
|
||||
minetest.register_craftitem( terumet.id('uninv_time_req'), {
|
||||
description = "time (seconds)",
|
||||
inventory_image = terumet.tex('uninv_time_req'),
|
||||
groups={not_in_creative_inventory=1}
|
||||
})
|
||||
|
||||
-- dummy item to display amount of repair material
|
||||
minetest.register_craftitem( terumet.id('uninv_repmat'), {
|
||||
description = "repair material value",
|
||||
inventory_image = terumet.tex('uninv_repmat'),
|
||||
groups={not_in_creative_inventory=1}
|
||||
})
|
||||
|
||||
-- register terumetal alloying with UnInv
|
||||
unified_inventory.register_craft_type( 'terumet_alloy', {
|
||||
description = 'Terumetal Alloy Smelting',
|
||||
icon = 'terumet_asmelt_front_lit.png',
|
||||
width=3,
|
||||
height=2,
|
||||
})
|
||||
|
||||
-- register crushing with UnInv
|
||||
unified_inventory.register_craft_type( 'terumet_crush', {
|
||||
description = 'Expansion Crusher',
|
||||
icon = 'terumet_crush_front_lit.png',
|
||||
width=1,
|
||||
height=1,
|
||||
})
|
||||
|
||||
-- register repair materials with UnInv
|
||||
unified_inventory.register_craft_type( 'terumet_repmat', {
|
||||
description = 'Equipment Reformer\n(material)',
|
||||
icon = 'terumet_repm_front.png',
|
||||
width=1,
|
||||
height=1,
|
||||
})
|
||||
|
||||
-- register tool repair with UnInv
|
||||
unified_inventory.register_craft_type( 'terumet_repair', {
|
||||
description = 'Equipment Reformer\n(for 100% wear)',
|
||||
icon = 'terumet_repm_front.png',
|
||||
width=2,
|
||||
height=1,
|
||||
})
|
||||
|
||||
-- register crystal vulcanizing with UnInv
|
||||
unified_inventory.register_craft_type( 'terumet_vulcan', {
|
||||
description = 'Crystal Vulcanizer',
|
||||
icon = 'terumet_vulcan_front.png',
|
||||
width=1,
|
||||
height=1,
|
||||
})
|
||||
|
||||
-- register ore saw gathering
|
||||
unified_inventory.register_craft_type( 'terumet_ore_saw', {
|
||||
description = 'Ore-cutting Saw',
|
||||
icon = 'terumet_tool_ore_saw.png^[transformFX',
|
||||
width=1,
|
||||
height=1,
|
||||
})
|
||||
|
||||
-- register vacuum oven with UnInv
|
||||
unified_inventory.register_craft_type( 'terumet_vacoven', {
|
||||
description = 'Vacuum Oven',
|
||||
icon = 'terumet_vacoven_front.png',
|
||||
width=3,
|
||||
height=2,
|
||||
})
|
||||
|
||||
-- call after all mods are loaded to catch new submod recipes/changes
|
||||
minetest.after(0.01, function() add_terumet_recipes() end)
|
||||
23
mods/ip_terumet/material/ceramic.lua
Normal file
@@ -0,0 +1,23 @@
|
||||
local cplate_id = terumet.id('item_ceramic')
|
||||
local cblock_id = terumet.id('block_ceramic')
|
||||
|
||||
minetest.register_craftitem( cplate_id, {
|
||||
description = 'Teruceramic Plate',
|
||||
inventory_image = terumet.tex(cplate_id)
|
||||
})
|
||||
|
||||
minetest.register_node( cblock_id, {
|
||||
description = 'Teruceramic Block',
|
||||
tiles = {terumet.tex(cblock_id)},
|
||||
is_ground_content = false,
|
||||
groups={cracky=1, level=1, puts_out_fire=1},
|
||||
sounds = default.node_sound_glass_defaults()
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = cblock_id,
|
||||
recipe = terumet.recipe_3x3(cplate_id)
|
||||
}
|
||||
|
||||
minetest.register_craft{ type = 'shapeless', output = terumet.id('item_ceramic', 9),
|
||||
recipe = {cblock_id}
|
||||
}
|
||||
120
mods/ip_terumet/material/coalproc.lua
Normal file
@@ -0,0 +1,120 @@
|
||||
local coke_id = terumet.id('item_coke')
|
||||
|
||||
minetest.register_craftitem( coke_id, {
|
||||
description = 'Coke Lump',
|
||||
inventory_image = terumet.tex(coke_id),
|
||||
groups = {coal = 1, flammable = 1},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = coke_id,
|
||||
burntime = 80,
|
||||
})
|
||||
|
||||
local coke_block_id = terumet.id('block_coke')
|
||||
|
||||
minetest.register_node( coke_block_id, {
|
||||
description = 'Coke Block',
|
||||
tiles = {terumet.tex(coke_block_id)},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = coke_block_id,
|
||||
burntime = 740,
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = coke_block_id,
|
||||
recipe = terumet.recipe_3x3(coke_id)
|
||||
}
|
||||
|
||||
minetest.register_craft{ type = 'shapeless', output = coke_id .. ' 9',
|
||||
recipe = {coke_block_id},
|
||||
}
|
||||
|
||||
local tarball_id = terumet.id('item_tarball')
|
||||
|
||||
minetest.register_craftitem( tarball_id, {
|
||||
description = 'Tarball',
|
||||
inventory_image = terumet.tex(tarball_id),
|
||||
groups = {glue=1}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = tarball_id,
|
||||
burntime = 30,
|
||||
})
|
||||
|
||||
local tarblock_id = terumet.id('block_tar')
|
||||
|
||||
minetest.register_node( tarblock_id, {
|
||||
description = 'Tar Block',
|
||||
tiles = {terumet.tex(tarblock_id)},
|
||||
is_ground_content = false,
|
||||
groups = {level=2, crumbly=2, cracky=1, snappy=2, choppy=2, disable_jump=1, fall_damage_add_percent=-100},
|
||||
sounds = terumet.squishy_node_sounds
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craft{ output = tarblock_id,
|
||||
recipe = terumet.recipe_box(tarball_id, '')
|
||||
}
|
||||
|
||||
minetest.register_craft{ type = 'shapeless', output = tarball_id .. ' 8', recipe = {tarblock_id} }
|
||||
|
||||
local prerubber_id = terumet.id('item_prerub')
|
||||
|
||||
minetest.register_craftitem( prerubber_id, {
|
||||
description = 'Bio-tar Mixture',
|
||||
inventory_image = terumet.tex(prerubber_id)
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = prerubber_id,
|
||||
recipe = {
|
||||
{'', tarball_id, ''},
|
||||
{tarball_id, 'terumet:item_dust_bio', tarball_id},
|
||||
{'', tarball_id, ''}
|
||||
}
|
||||
}
|
||||
|
||||
local rubber_bar_id = terumet.id('item_rubber')
|
||||
|
||||
terumet.options.vulcan.recipes[prerubber_id] = {rubber_bar_id, 1}
|
||||
|
||||
minetest.register_craftitem( rubber_bar_id, {
|
||||
description = 'Synthetic Rubber Bar',
|
||||
inventory_image = terumet.tex(rubber_bar_id)
|
||||
})
|
||||
|
||||
local rsuit_mat = terumet.id('item_rsuitmat')
|
||||
|
||||
minetest.register_craftitem( rsuit_mat, {
|
||||
description = 'Vulcansuit Plate',
|
||||
inventory_image = terumet.tex(rsuit_mat)
|
||||
})
|
||||
|
||||
terumet.register_alloy_recipe{result=rsuit_mat, flux=8, time=20.0, input={rubber_bar_id, 'terumet:ingot_cgls', 'terumet:item_ceramic'}}
|
||||
|
||||
local asphalt_id = terumet.id('block_asphalt')
|
||||
|
||||
minetest.register_node( asphalt_id, {
|
||||
description = 'Asphalt Block',
|
||||
tiles = {terumet.tex(asphalt_id)},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 3, crumbly = 1, level = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = asphalt_id..' 8',
|
||||
recipe = terumet.recipe_box('default:gravel', tarball_id)
|
||||
})
|
||||
|
||||
|
||||
walls.register(terumet.id('wall_asphalt'), 'Asphalt Wall', terumet.tex(asphalt_id), asphalt_id, default.node_sound_stone_defaults())
|
||||
stairs.register_stair_and_slab('asphalt', asphalt_id, {cracky = 3, crumbly = 1, level = 1}, {terumet.tex(asphalt_id)}, 'Asphalt Stair', 'Asphalt Slab', default.node_sound_stone_defaults(), false )
|
||||
20
mods/ip_terumet/material/coil.lua
Normal file
@@ -0,0 +1,20 @@
|
||||
local reg_coil = function(name, mat)
|
||||
local coil_id = terumet.id('item_coil_'..mat)
|
||||
minetest.register_craftitem( coil_id, {
|
||||
description = name,
|
||||
inventory_image = terumet.tex(coil_id)
|
||||
})
|
||||
local ingot_id = terumet.id('ingot_'..mat)
|
||||
minetest.register_craft{ output=coil_id .. ' 3',
|
||||
recipe = {
|
||||
{ingot_id},
|
||||
{ingot_id},
|
||||
{ingot_id},
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
reg_coil('Pure Terumetal Coil', 'raw')
|
||||
reg_coil('Terucopper Coil', 'tcop')
|
||||
reg_coil('Terugold Coil', 'tgol')
|
||||
|
||||
152
mods/ip_terumet/material/concrete.lua
Normal file
@@ -0,0 +1,152 @@
|
||||
local CONCRETE_COLORS = {
|
||||
'#FFF',--white
|
||||
'#AAA',--grey
|
||||
'#666',--dark grey
|
||||
'#333',--black
|
||||
'#722ed4',--violet
|
||||
'#2e56d4',--blue
|
||||
'#5484ac',--cyan
|
||||
'#135918',--dark green
|
||||
'#3ad42e',--green
|
||||
'#d4c12e',--yellow
|
||||
'#592e13',--brown
|
||||
'#d4652e',--orange
|
||||
'#d42e2e',--red
|
||||
'#d80481',--magenta
|
||||
'#ff7272',--pink
|
||||
}
|
||||
local mix_base = terumet.id('block_conmix')
|
||||
local block_base = terumet.id('block_con')
|
||||
|
||||
local FMT = string.format
|
||||
|
||||
local function mix_id(dye_index)
|
||||
return FMT("%s_%s", mix_base, dye.dyes[dye_index][1])
|
||||
end
|
||||
function terumet.concrete_block_id(dye_index)
|
||||
return FMT("%s_%s", block_base, dye.dyes[dye_index][1])
|
||||
end
|
||||
|
||||
local NAMEFORMATS = {
|
||||
mix="%s Concrete Mix",
|
||||
block="%s Concrete Block",
|
||||
door="%s Concrete Door",
|
||||
wall="%s Concrete Wall",
|
||||
stair="%s Concrete Stair",
|
||||
slab="%s Concrete Slab"
|
||||
}
|
||||
|
||||
local function make_name(name, dye_index)
|
||||
return FMT(NAMEFORMATS[name], dye.dyes[dye_index][2])
|
||||
end
|
||||
|
||||
local function texture(base, dye_index)
|
||||
return FMT("%s^[multiply:%s", base, CONCRETE_COLORS[dye_index])
|
||||
end
|
||||
local function mix_texture(dye_index)
|
||||
return texture(terumet.tex('block_conmix'), dye_index)
|
||||
end
|
||||
local function block_texture(dye_index)
|
||||
return texture(terumet.tex('block_con'), dye_index)
|
||||
end
|
||||
local function door_texture(dye_index)
|
||||
return texture(terumet.tex('door_con'), dye_index)
|
||||
end
|
||||
local function door_item_texture(dye_index)
|
||||
return texture(terumet.tex('dinv_con'), dye_index)
|
||||
end
|
||||
|
||||
local HARDEN_LIST = {}
|
||||
local MIXES_LIST = {}
|
||||
|
||||
for index,dye_info in ipairs(dye.dyes) do
|
||||
local con_id = 'con_'..dye_info[1]
|
||||
|
||||
minetest.register_node(mix_id(index), {
|
||||
description = make_name('mix', index),
|
||||
tiles = {mix_texture(index)},
|
||||
is_ground_content = false,
|
||||
groups = {crumbly=2},
|
||||
--sounds = default.node_sound_sand_defaults(),
|
||||
})
|
||||
|
||||
local block_id = terumet.concrete_block_id(index)
|
||||
|
||||
minetest.register_node(block_id, {
|
||||
description = make_name('block', index),
|
||||
tiles = {block_texture(index)},
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2, level = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
||||
if index ~= 1 then
|
||||
local dye_id = "group:dye,color_"..dye_info[1]
|
||||
local basic_powder = mix_id(1)
|
||||
minetest.register_craft{
|
||||
output = mix_id(index)..' 8',
|
||||
recipe = terumet.recipe_box(basic_powder, dye_id)
|
||||
}
|
||||
|
||||
minetest.register_craft{
|
||||
output = mix_id(index)..' 8',
|
||||
recipe = terumet.recipe_box(basic_powder, 'dye:'..dye_info[1])
|
||||
}
|
||||
end
|
||||
|
||||
HARDEN_LIST[mix_id(index)] = block_id
|
||||
table.insert(MIXES_LIST, mix_id(index))
|
||||
|
||||
|
||||
walls.register(terumet.id('wall_'..con_id), make_name('wall', index), block_texture(index), block_id, default.node_sound_stone_defaults())
|
||||
|
||||
doors.register(terumet.id('door_'..con_id), {
|
||||
tiles = {{name = door_texture(index), backface_culling = true}},
|
||||
description = make_name('door', index),
|
||||
inventory_image = door_item_texture(index),
|
||||
protected = true,
|
||||
groups = {cracky = 2, level = 1},
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
sound_open = 'doors_steel_door_open',
|
||||
sound_close = 'doors_steel_door_close',
|
||||
recipe = {
|
||||
{block_id},
|
||||
{'doors:door_steel'},
|
||||
{block_id},
|
||||
}
|
||||
})
|
||||
|
||||
stairs.register_stair_and_slab(con_id, block_id,
|
||||
{cracky = 2, level = 1},
|
||||
{block_texture(index)},
|
||||
make_name('stair',index), make_name('slab', index),
|
||||
default.node_sound_stone_defaults(),
|
||||
false
|
||||
)
|
||||
end
|
||||
|
||||
minetest.register_abm{
|
||||
label = 'Concrete mix hardening',
|
||||
nodenames = MIXES_LIST,
|
||||
neighbors = {'default:water_source', 'default:water_flowing'},
|
||||
interval = 3.0, -- Run every 3 seconds
|
||||
chance = 1, -- always
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local harden_id = HARDEN_LIST[node.name]
|
||||
if harden_id then
|
||||
minetest.set_node(pos, {name = harden_id})
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
local gravel_id = 'default:gravel'
|
||||
local any_sand = 'group:sand'
|
||||
|
||||
minetest.register_craft{
|
||||
output = mix_id(1)..' 8',
|
||||
recipe = {
|
||||
{any_sand, gravel_id, any_sand},
|
||||
{gravel_id, '', gravel_id},
|
||||
{any_sand, gravel_id, any_sand}
|
||||
}
|
||||
}
|
||||
96
mods/ip_terumet/material/crushed.lua
Normal file
@@ -0,0 +1,96 @@
|
||||
local biomat_item = terumet.id('item_dust_bio')
|
||||
local biomat_block = terumet.id('block_dust_bio')
|
||||
|
||||
local woodmulch_item = terumet.id('item_dust_wood')
|
||||
|
||||
local glue_item = terumet.id('item_glue')
|
||||
|
||||
minetest.register_craftitem( terumet.id('item_dust_ob'), {
|
||||
description = 'Obsidian Grit',
|
||||
inventory_image = terumet.tex('item_dust_ob')
|
||||
})
|
||||
|
||||
-- ========================================================
|
||||
|
||||
minetest.register_craftitem( woodmulch_item, {
|
||||
description = 'Wood Mulch',
|
||||
inventory_image = terumet.tex('item_dust_wood')
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = 'fuel',
|
||||
recipe = woodmulch_item,
|
||||
burntime = 10,
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = 'default:paper',
|
||||
type = 'shapeless',
|
||||
recipe = {'bucket:bucket_water', woodmulch_item, woodmulch_item},
|
||||
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
|
||||
}
|
||||
|
||||
-- =======================================================
|
||||
|
||||
minetest.register_craftitem( biomat_item, {
|
||||
description = 'Biomatter',
|
||||
inventory_image = terumet.tex('item_dust_bio')
|
||||
})
|
||||
|
||||
minetest.register_craft{
|
||||
type = 'fuel',
|
||||
recipe = biomat_item,
|
||||
burntime = 30,
|
||||
}
|
||||
|
||||
minetest.register_node( biomat_block, {
|
||||
description = 'Biomatter Block',
|
||||
tiles = {terumet.tex('block_dust_bio')},
|
||||
is_ground_content = false,
|
||||
groups={crumbly=3, oddly_breakable_by_hand=2, flammable=1},
|
||||
sounds = default.node_sound_leaves_defaults()
|
||||
})
|
||||
|
||||
minetest.register_craft{
|
||||
type = 'fuel',
|
||||
recipe = biomat_block,
|
||||
burntime = 280,
|
||||
}
|
||||
|
||||
minetest.register_craft{ output = biomat_block,
|
||||
recipe = terumet.recipe_3x3(biomat_item)
|
||||
}
|
||||
|
||||
minetest.register_craft{ output = biomat_item..' 9',
|
||||
type = 'shapeless',
|
||||
recipe = {biomat_block}
|
||||
}
|
||||
|
||||
minetest.register_craft{ output = 'default:torch 4',
|
||||
recipe = { {biomat_item},
|
||||
{'group:stick'}}
|
||||
}
|
||||
-- =======================================================
|
||||
|
||||
minetest.register_craftitem( glue_item, {
|
||||
description = 'Plant Glue',
|
||||
groups = {glue=1},
|
||||
inventory_image = terumet.tex('item_glue')
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = glue_item,
|
||||
type = 'shapeless',
|
||||
recipe = {'bucket:bucket_water', biomat_item},
|
||||
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
|
||||
}
|
||||
|
||||
minetest.register_craft{ output = glue_item .. ' 9',
|
||||
type = 'shapeless',
|
||||
recipe = {'bucket:bucket_water', biomat_block},
|
||||
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
|
||||
}
|
||||
|
||||
minetest.register_craft{ output = glue_item .. ' 8',
|
||||
type = 'shapeless',
|
||||
recipe = {'bucket:bucket_water', 'farming:flour'},
|
||||
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
|
||||
}
|
||||
88
mods/ip_terumet/material/crystallized.lua
Normal file
@@ -0,0 +1,88 @@
|
||||
local id=terumet.id
|
||||
local opts = terumet.options.vulcan
|
||||
|
||||
local crys_terumetal = terumet.register_crystal{
|
||||
suffix='raw',
|
||||
color='#a33d57',
|
||||
name='Crystallized Terumetal',
|
||||
cooking_result=id('ingot_raw')
|
||||
}
|
||||
terumet.register_vulcan_result(id('lump_raw'), crys_terumetal, nil, true) -- 4th arg indicates it is a terumetal specialized recipe
|
||||
terumet.register_vulcan_result(id('ore_raw'), crys_terumetal, 1, true)
|
||||
terumet.register_vulcan_result(id('ore_raw_desert'), crys_terumetal, 2, true)
|
||||
|
||||
local crys_copper = terumet.register_crystal{
|
||||
suffix='copper',
|
||||
color='#ec923a',
|
||||
name='Crystallized Copper',
|
||||
cooking_result='default:copper_ingot'
|
||||
}
|
||||
terumet.register_vulcan_result('default:copper_lump', crys_copper)
|
||||
terumet.register_vulcan_result('default:stone_with_copper', crys_copper, 1)
|
||||
|
||||
local crys_tin = terumet.register_crystal{
|
||||
suffix='tin',
|
||||
color='#dddddd',
|
||||
name='Crystallized Tin',
|
||||
cooking_result='default:tin_ingot'
|
||||
}
|
||||
terumet.register_vulcan_result('default:tin_lump', crys_tin )
|
||||
terumet.register_vulcan_result('default:stone_with_tin', crys_tin, 1)
|
||||
|
||||
local crys_iron = terumet.register_crystal{
|
||||
suffix='iron',
|
||||
color='#ffdcb5',
|
||||
name='Crystallized Iron',
|
||||
cooking_result='default:steel_ingot'
|
||||
}
|
||||
terumet.register_vulcan_result('default:iron_lump', crys_iron)
|
||||
terumet.register_vulcan_result('default:stone_with_iron', crys_iron, 1)
|
||||
|
||||
local crys_gold = terumet.register_crystal{
|
||||
suffix='gold',
|
||||
color='#ffcb15',
|
||||
name='Crystallized Gold',
|
||||
cooking_result='default:gold_ingot'
|
||||
}
|
||||
terumet.register_vulcan_result('default:gold_lump', crys_gold)
|
||||
terumet.register_vulcan_result('default:stone_with_gold', crys_gold, 1)
|
||||
|
||||
local crys_ob = terumet.register_crystal{
|
||||
suffix='ob',
|
||||
color='#351569',
|
||||
name='Crystallized Obsidian',
|
||||
cooking_result='default:obsidian'
|
||||
}
|
||||
if opts.LIMIT_OBSIDIAN then
|
||||
terumet.register_vulcan_result('default:obsidian', crys_ob, -1)
|
||||
else
|
||||
terumet.register_vulcan_result('default:obsidian', crys_ob)
|
||||
end
|
||||
|
||||
local crys_mese = terumet.register_crystal{
|
||||
suffix='mese',
|
||||
color='#fffb81',
|
||||
name='Crystallized Mese',
|
||||
cooking_result='default:mese_crystal'
|
||||
}
|
||||
terumet.register_vulcan_result('default:stone_with_mese', crys_mese)
|
||||
|
||||
local crys_dia = terumet.register_crystal{
|
||||
suffix='dia',
|
||||
color='#66f6ff',
|
||||
name='Crystallized Diamond',
|
||||
cooking_result='default:diamond'
|
||||
}
|
||||
terumet.register_vulcan_result('default:stone_with_diamond', crys_dia)
|
||||
|
||||
-- outside mods can access ids of default crystallized materials through terumet.crystal_ids
|
||||
terumet.crystal_ids = {
|
||||
terumetal=crys_terumetal,
|
||||
copper=crys_copper,
|
||||
tin=crys_tin,
|
||||
iron=crys_iron,
|
||||
gold=crys_gold,
|
||||
obsidian=crys_ob,
|
||||
mese=crys_mese,
|
||||
diamond=crys_dia
|
||||
}
|
||||
26
mods/ip_terumet/material/entropy.lua
Normal file
@@ -0,0 +1,26 @@
|
||||
local ent_crystal_id = terumet.id('item_entropy')
|
||||
local ent_matrix_id = terumet.id('block_entropy')
|
||||
|
||||
minetest.register_craftitem( ent_crystal_id, {
|
||||
description = 'Entropic Crystal',
|
||||
inventory_image = terumet.tex(ent_crystal_id)
|
||||
})
|
||||
|
||||
minetest.register_node( ent_matrix_id, {
|
||||
description = 'Entropic Matrix\nPlace directly above EEE Heater',
|
||||
tiles = {terumet.tex(ent_matrix_id)},
|
||||
is_ground_content = false,
|
||||
groups={cracky=1, level=2},
|
||||
sounds = default.node_sound_glass_defaults()
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = ent_crystal_id,
|
||||
recipe = {
|
||||
{ terumet.id('item_dust_ob'), terumet.id('item_cryst_mese'), terumet.id('item_dust_ob') },
|
||||
{ terumet.id('item_cryst_mese'), terumet.id('item_cryst_dia'), terumet.id('item_cryst_mese') },
|
||||
{ terumet.id('item_dust_ob'), terumet.id('item_cryst_mese'), terumet.id('item_dust_ob') },
|
||||
}}
|
||||
|
||||
minetest.register_craft{ output = ent_matrix_id,
|
||||
recipe = terumet.recipe_box(ent_crystal_id, 'default:diamondblock')
|
||||
}
|
||||
41
mods/ip_terumet/material/meson.lua
Normal file
@@ -0,0 +1,41 @@
|
||||
local ingot_id = terumet.id('ingot_meson')
|
||||
local meson_color = '#be61ff'
|
||||
|
||||
minetest.register_craftitem( ingot_id, {
|
||||
description = 'Fused Meson Ingot',
|
||||
inventory_image = terumet.tex(ingot_id),
|
||||
groups = {ingot = 1},
|
||||
})
|
||||
|
||||
local toolstat = {times={1.3, 1.1, 0.9}, uses=0, maxlevel=5}
|
||||
|
||||
minetest.register_tool( terumet.id('tool_meson'), {
|
||||
description = minetest.colorize(meson_color, 'Fused Meson Omni-tool'),
|
||||
inventory_image = terumet.tex('tool_meson'),
|
||||
wield_scale={x=1.8, y=1.8, z=1.4},
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1.0,
|
||||
max_drop_level = 99,
|
||||
groupcaps = {
|
||||
cracky = toolstat,
|
||||
crumbly = toolstat,
|
||||
choppy = toolstat,
|
||||
snappy = toolstat,
|
||||
},
|
||||
damage_groups = {fleshy=4},
|
||||
},
|
||||
})
|
||||
|
||||
--[[
|
||||
Meson Fusion Reactor
|
||||
|
||||
Accepts items that yield repair material to create a critical mass. This mass is then superheated and Meson Fusion is attempted.
|
||||
|
||||
The chance of successful fusion is based on:
|
||||
- The quality of materials used (the fewer items used -> higher chance)
|
||||
- The time taken to reach the necessary heat (less time -> higher chance)
|
||||
|
||||
For 1 attempt at fusion the following is needed:
|
||||
60 x 50 = 3500 RMP (repair material points) -- This averages to approx. 50 between alloyed iron and gold.
|
||||
500000 HU -- assuming an average of 10000/second, averages to 50 seconds
|
||||
]]
|
||||
64
mods/ip_terumet/material/misc.lua
Normal file
@@ -0,0 +1,64 @@
|
||||
|
||||
local htg_id = terumet.id('item_htglass')
|
||||
minetest.register_craftitem( htg_id, {
|
||||
description = 'Heat-transference Glass',
|
||||
inventory_image = terumet.tex(htg_id)
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = htg_id .. ' 3',
|
||||
recipe = {
|
||||
{'', 'default:obsidian_glass', ''},
|
||||
{terumet.id('item_cryst_tin'), terumet.id('item_glue'), terumet.id('item_cryst_tin')},
|
||||
{'', terumet.id('item_dust_ob'), ''}
|
||||
}
|
||||
}
|
||||
|
||||
-- =============================================
|
||||
|
||||
local emit_id = terumet.id('item_heatunit')
|
||||
|
||||
minetest.register_craftitem( emit_id, {
|
||||
description = 'High Energy Alpha-wave Transmission Unit',
|
||||
inventory_image = terumet.tex(emit_id)
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = emit_id,
|
||||
recipe = {
|
||||
{terumet.id('ingot_tgol'), 'default:obsidian_glass', terumet.id('ingot_tgol')},
|
||||
{terumet.id('item_thermese'), 'default:mese_crystal', terumet.id('item_thermese')},
|
||||
{terumet.id('item_ceramic'), terumet.id('item_coil_tgol'), terumet.id('item_ceramic')}
|
||||
}
|
||||
}
|
||||
|
||||
-- =============================================
|
||||
|
||||
local press_id = terumet.id('item_press')
|
||||
minetest.register_craftitem( press_id, {
|
||||
description = 'Terutin Expansion Press',
|
||||
inventory_image = terumet.tex(press_id)
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = press_id,
|
||||
recipe = {
|
||||
{'default:stone', terumet.id('block_ttin'), 'default:stone'},
|
||||
{terumet.id('ingot_tcha'), terumet.id('ingot_tcha'), terumet.id('ingot_tcha')},
|
||||
{terumet.id('ingot_ttin'), terumet.id('ingot_ttin'), terumet.id('ingot_ttin')}
|
||||
}
|
||||
}
|
||||
|
||||
-- =============================================
|
||||
|
||||
local cryscham_id = terumet.id('item_cryscham')
|
||||
minetest.register_craftitem( cryscham_id, {
|
||||
description = 'Crystal Growth Chamber',
|
||||
inventory_image = terumet.tex(cryscham_id)
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = cryscham_id,
|
||||
recipe = {
|
||||
{'default:obsidian_glass', 'default:obsidian_glass', 'default:obsidian_glass'},
|
||||
{terumet.id('item_dust_ob'), terumet.id('item_dust_ob'), terumet.id('item_dust_ob')},
|
||||
{terumet.id('ingot_tcha'), 'bucket:bucket_water', terumet.id('ingot_tcha')}
|
||||
},
|
||||
replacements={{'bucket:bucket_water','bucket:bucket_empty'}}
|
||||
}
|
||||
34
mods/ip_terumet/material/pwood.lua
Normal file
@@ -0,0 +1,34 @@
|
||||
local pwood_ytex = terumet.tex('block_pwood')
|
||||
local pwood_xztex = terumet.tex('block_pwood_sides')
|
||||
local pwood_tiles = {pwood_ytex, pwood_ytex, pwood_xztex}
|
||||
|
||||
local pwood_id = terumet.id('block_pwood')
|
||||
|
||||
minetest.register_node(pwood_id, {
|
||||
description = "Pressed Wood",
|
||||
tiles = pwood_tiles,
|
||||
is_ground_content = false,
|
||||
groups = {choppy = 2, oddly_breakable_by_hand = 2},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = pwood_id..' 16',
|
||||
recipe = terumet.recipe_box(terumet.id('item_dust_wood'), 'group:glue'),
|
||||
}
|
||||
|
||||
if minetest.get_modpath('stairs') then
|
||||
stairs.register_stair_and_slab(
|
||||
'terumet_pwood',
|
||||
pwood_id,
|
||||
{choppy = 2, oddly_breakable_by_hand = 2},
|
||||
pwood_tiles,
|
||||
'Pressed Wood Stair',
|
||||
'Pressed Wood Slab',
|
||||
default.node_sound_wood_defaults()
|
||||
)
|
||||
end
|
||||
|
||||
if minetest.get_modpath('walls') then
|
||||
walls.register(terumet.id('walls_pwood'), 'Pressed Wood Wall', pwood_tiles,
|
||||
pwood_id, default.node_sound_stone_defaults())
|
||||
end
|
||||
16
mods/ip_terumet/material/raw.lua
Normal file
@@ -0,0 +1,16 @@
|
||||
local id = terumet.id
|
||||
local tex = terumet.tex
|
||||
|
||||
local function items(item, count)
|
||||
return item .. ' ' .. count
|
||||
end
|
||||
|
||||
local ore_stone = id('ore_raw')
|
||||
local ore_stone_dense = id('ore_dense_raw')
|
||||
|
||||
local ore_desert_stone = id('ore_raw_desert')
|
||||
local ore_desert_stone_dense = id('ore_raw_desert_dense')
|
||||
|
||||
local lump = id('lump_raw')
|
||||
local ingot = id('ingot_raw')
|
||||
local block = id('block_raw')
|
||||
82
mods/ip_terumet/material/rebar.lua
Normal file
@@ -0,0 +1,82 @@
|
||||
local rebar_id = terumet.id('item_rebar')
|
||||
|
||||
minetest.register_craftitem( rebar_id, {
|
||||
description = 'Teruchalcum Rebar',
|
||||
inventory_image = terumet.tex('item_rebar'),
|
||||
})
|
||||
|
||||
minetest.register_craft{ output=rebar_id..' 5', recipe=terumet.recipe_plus('terumet:ingot_tcha') }
|
||||
|
||||
local desc = {'Reinforced %s', 'Double-reinforced %s', 'Triple-reinforced %s'}
|
||||
local blchance = {40, 20, 3}
|
||||
|
||||
local function reinf_block_id(code, rlv)
|
||||
return minetest.get_current_modname()..':reinf_block_'..code..rlv
|
||||
end
|
||||
|
||||
function terumet.register_reinforced_block(base, code)
|
||||
local base_def = minetest.registered_nodes[base]
|
||||
if not base_def then error('base '..base..' is not defined') end
|
||||
|
||||
for rlv = 1,3 do
|
||||
local def = {}
|
||||
for k,v in pairs(base_def) do
|
||||
if k == 'groups' then
|
||||
def.groups = {}
|
||||
for gk,gv in pairs(v) do
|
||||
if not terumet.options.misc.BLOCK_REMOVE_GROUPS[gk] then
|
||||
def.groups[gk]=gv
|
||||
end
|
||||
end
|
||||
else
|
||||
def[k] = v
|
||||
end
|
||||
end
|
||||
if not base_def.groups then
|
||||
def.groups = {level=(rlv+1)}
|
||||
else
|
||||
def.groups.level = (base_def.groups.level or 1) + rlv
|
||||
end
|
||||
local id = reinf_block_id(code, rlv)
|
||||
|
||||
def.description = string.format(desc[rlv], base_def.description)
|
||||
|
||||
local visibility = terumet.options.cosmetic.REINFORCING_VISIBLE
|
||||
if visibility then
|
||||
local tileov = terumet.tex('blockov_rebar'..rlv)
|
||||
if visibility == 1 then
|
||||
def.overlay_tiles = {tileov, tileov, '', '', '', ''}
|
||||
else
|
||||
def.overlay_tiles = {tileov}
|
||||
end
|
||||
end
|
||||
|
||||
def.on_blast = terumet.blast_chance(blchance[rlv], id)
|
||||
|
||||
minetest.register_node(id, def)
|
||||
|
||||
local recbase
|
||||
if rlv == 1 then
|
||||
recbase = base
|
||||
minetest.register_craft{ output=id..' 4', recipe = {
|
||||
{rebar_id, recbase, rebar_id},
|
||||
{recbase, '', recbase},
|
||||
{rebar_id, recbase, rebar_id}
|
||||
}}
|
||||
elseif rlv == 2 then
|
||||
recbase = reinf_block_id(code, 1)
|
||||
minetest.register_craft{ output=id..' 4', recipe = {
|
||||
{rebar_id, recbase, rebar_id},
|
||||
{recbase, '', recbase},
|
||||
{rebar_id, recbase, rebar_id}
|
||||
}}
|
||||
else
|
||||
recbase = reinf_block_id(code, 2)
|
||||
minetest.register_craft{ output=id..' 4', recipe = {
|
||||
{rebar_id, recbase, rebar_id},
|
||||
{recbase, '', recbase},
|
||||
{rebar_id, recbase, rebar_id}
|
||||
}}
|
||||
end
|
||||
end
|
||||
end
|
||||
35
mods/ip_terumet/material/reg_alloy.lua
Normal file
@@ -0,0 +1,35 @@
|
||||
local id = terumet.id
|
||||
local tex = terumet.tex
|
||||
|
||||
terumet.alloys = {}
|
||||
|
||||
function terumet.reg_alloy(name, alloy_id, block_level, repairmat_value)
|
||||
local ingot_id = 'ingot_' .. alloy_id
|
||||
local block_id = 'block_' .. alloy_id
|
||||
|
||||
minetest.register_craftitem( id(ingot_id), {
|
||||
description = name .. ' Ingot',
|
||||
inventory_image = tex(ingot_id),
|
||||
groups = {ingot=1}
|
||||
})
|
||||
|
||||
minetest.register_node( id(block_id), {
|
||||
description = name .. ' Block',
|
||||
tiles = {tex(block_id)},
|
||||
is_ground_content = false,
|
||||
groups = {cracky=1, level=block_level},
|
||||
--sounds = default.node_sound_metal_defaults()
|
||||
})
|
||||
|
||||
minetest.register_craft{ output = id(block_id),
|
||||
recipe = terumet.recipe_3x3(id(ingot_id))
|
||||
}
|
||||
|
||||
minetest.register_craft{ type = 'shapeless', output = id(ingot_id, 9),
|
||||
recipe = {id(block_id)}
|
||||
}
|
||||
|
||||
terumet.alloys[alloy_id] = {ingot=id(ingot_id), block=id(block_id)}
|
||||
|
||||
terumet.register_repair_material(id(ingot_id), repairmat_value)
|
||||
end
|
||||
38
mods/ip_terumet/material/tglass.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
local tglass_id = terumet.id('block_tglass')
|
||||
|
||||
local tiles, glowtiles
|
||||
|
||||
if terumet.options.cosmetic.CLEAR_GLASS then
|
||||
tiles = {terumet.tex('block_tglass_frame'), terumet.tex('blank')}
|
||||
glowtiles = {terumet.tex('block_tglassglow_frame'), terumet.tex('blank')}
|
||||
else
|
||||
tiles = {terumet.tex('block_tglass_frame'), terumet.tex('block_tglass_streak')}
|
||||
glowtiles = {terumet.tex('block_tglassglow_frame'), terumet.tex('block_tglassglow_streak')}
|
||||
end
|
||||
|
||||
minetest.register_node(tglass_id, {
|
||||
description = 'Terumetal Glass',
|
||||
drawtype= 'glasslike_framed_optional',
|
||||
paramtype = "light",
|
||||
tiles = tiles,
|
||||
is_ground_content = false,
|
||||
sunlight_propagates = true,
|
||||
groups = {cracky = 1, level = 2},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
on_blast = terumet.blast_chance(30, tglass_id),
|
||||
})
|
||||
|
||||
local tglass_glow_id = tglass_id..'glow'
|
||||
|
||||
minetest.register_node(tglass_glow_id, {
|
||||
description = 'Terumetal Glow Glass',
|
||||
drawtype= 'glasslike_framed_optional',
|
||||
paramtype = "light",
|
||||
tiles = glowtiles,
|
||||
is_ground_content = false,
|
||||
sunlight_propagates = true,
|
||||
light_source=13,
|
||||
groups = {cracky = 1, level = 2},
|
||||
sounds = default.node_sound_glass_defaults(),
|
||||
on_blast = terumet.blast_chance(15, tglass_glow_id),
|
||||
})
|
||||
97
mods/ip_terumet/material/vacfood.lua
Normal file
@@ -0,0 +1,97 @@
|
||||
--[[
|
||||
Adds food to the vacuum oven recipes:
|
||||
* Upgrades food items - vacuum two food items to create a condensed and packaged version that restores 3 times as much health/stamina.
|
||||
* Food items are items that are of the group "food_*" and have an on_use (presumably minetest.item_eat)
|
||||
* To ensure all food items are seen, any mods that add foods must be added as a dependent mod to Terumet - by default only "farming" is
|
||||
]]--
|
||||
local options = terumet.options.vac_oven.VAC_FOOD
|
||||
local FMT = string.format
|
||||
local generated_vacfoods = {}
|
||||
|
||||
local function make_vacfood_image(img)
|
||||
return FMT('[combine:32x32:0,0=%s:8,8=%s', terumet.tex('item_vacfood'), img)
|
||||
end
|
||||
|
||||
local function make_vacfood(item_id)
|
||||
local def = minetest.registered_items[item_id]
|
||||
if generated_vacfoods[item_id] or (not def) then return end
|
||||
local mod, item = item_id:match('^(%S+):(%S+)')
|
||||
if mod and item then
|
||||
local vf_id = terumet.id(FMT('vacf_%s_%s', mod, item))
|
||||
local image
|
||||
if def.inventory_image and def.inventory_image ~= '' then
|
||||
image = make_vacfood_image(def.inventory_image)
|
||||
elseif def.tiles and def.tiles[1] and def.tiles[1] ~= '' then
|
||||
image = make_vacfood_image(def.tiles[1])
|
||||
else
|
||||
image = terumet.tex('item_vacfood')
|
||||
end
|
||||
|
||||
local item_sound
|
||||
if def.sound then
|
||||
item_sound = table.copy(def.sound)
|
||||
else
|
||||
item_sound = {}
|
||||
end
|
||||
item_sound.eat = 'terumet_eat_vacfood'
|
||||
|
||||
minetest.register_craftitem(vf_id, {
|
||||
description = 'Vacuum-packed ' .. def.description,
|
||||
inventory_image = image,
|
||||
sound=item_sound,
|
||||
_terumet_vacfood = true,
|
||||
on_use = def.on_use,
|
||||
})
|
||||
|
||||
terumet.register_vacoven_recipe{
|
||||
input=item_id..' 2',
|
||||
results={vf_id},
|
||||
time=4.0
|
||||
}
|
||||
|
||||
generated_vacfoods[item_id]=vf_id
|
||||
else
|
||||
minetest.log('warning', FMT('terumet: valid item "%s" was selected for vacfood but mod or item-id did not parse properly', item_id))
|
||||
end
|
||||
end
|
||||
|
||||
if options.AUTO_GENERATE then
|
||||
for id,def in pairs(minetest.registered_items) do
|
||||
local blacklisted = false
|
||||
if options.BLACKLIST then
|
||||
blacklisted = options.BLACKLIST[id]
|
||||
if not blacklisted then
|
||||
blacklisted = terumet.match_group_key(options.BLACKLIST, def)
|
||||
end
|
||||
end
|
||||
if not blacklisted then
|
||||
local is_food = false
|
||||
for group,_ in pairs(def.groups) do
|
||||
if def.on_use and group:match('^food_') then
|
||||
is_food = true
|
||||
break
|
||||
end
|
||||
end
|
||||
if is_food then make_vacfood(id) end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if options.WHITELIST then
|
||||
for id,_ in pairs(options.WHITELIST) do
|
||||
make_vacfood(id)
|
||||
end
|
||||
end
|
||||
-- add a wrapper to core function of do_item_eat which triples hp_change value of items with _terumet_vacfood flag
|
||||
-- there's no way to read what value individual food items are calling minetest.item_eat() with, so this is the next best way to multiply the value
|
||||
|
||||
local old_item_eat = core.do_item_eat
|
||||
|
||||
core.do_item_eat = function(hp_change, replace_with_item, itemstack, ...)
|
||||
local def = itemstack:get_definition()
|
||||
if def and def._terumet_vacfood then
|
||||
return old_item_eat(hp_change * 3, replace_with_item, itemstack, ...)
|
||||
else
|
||||
return old_item_eat(hp_change, replace_with_item, itemstack, ...)
|
||||
end
|
||||
end
|
||||
4
mods/ip_terumet/mod.conf
Normal file
@@ -0,0 +1,4 @@
|
||||
name=terumet
|
||||
description=Terumetal v3.0 - Make life easier with alloys and heat machinery!
|
||||
depends=walls, stairs, doors, dye
|
||||
optional_depends=unified_inventory,tubelib,stairs,doors,tnt,mesecons,dungeon_loot,bushes,dryplants,vines,mobs_animal,main,extra
|
||||
512
mods/ip_terumet/options.lua
Normal file
@@ -0,0 +1,512 @@
|
||||
terumet.options = {}
|
||||
|
||||
terumet.options.protection = {
|
||||
-- List of potential external mods that will handle machine protection in lieu of the default owner system
|
||||
-- If any of these mods are found on load, the default protection system will NOT be active
|
||||
-- and all machine protection will be based on mintest.is_protected implemented by external mods
|
||||
-- (1 has no specific meaning, only to provide a value)
|
||||
EXTERNAL_MODS = {
|
||||
['areas']=1
|
||||
}
|
||||
}
|
||||
|
||||
terumet.options.cosmetic = {
|
||||
-- Set to false/nil for Terumetal Glass to be streaky similar to default Minetest glass
|
||||
CLEAR_GLASS = true,
|
||||
-- Style of reinforced blocks:
|
||||
-- 1 = rebar on top/bottom only
|
||||
-- 2 = rebar on all faces
|
||||
-- false/nil = not visible (reinforced blocks look exact same as original block)
|
||||
REINFORCING_VISIBLE = 1,
|
||||
-- Set to false/nil for heatline blocks to not have visible ports
|
||||
BLOCK_HEATLINE_VISIBLE = true,
|
||||
}
|
||||
|
||||
terumet.options.misc = {
|
||||
-- Groups to remove from converted blocks (heatline/reinforced blocks)
|
||||
-- ex: 'wood' prevents wood planks with heatlines/reinforcing from being used as wood in general recipes
|
||||
-- if any other groups cause problems when transferred over to a block, add it here
|
||||
-- (1 has no specific meaning, only to provide a value)
|
||||
BLOCK_REMOVE_GROUPS = {
|
||||
['wood']=1,
|
||||
['stone']=1,
|
||||
['flammable']=1,
|
||||
},
|
||||
|
||||
-- text color for additional info on items
|
||||
TIP_COLOR = '#ffa2ba',
|
||||
}
|
||||
|
||||
terumet.options.tools = {
|
||||
--
|
||||
-- TOOL SETTINGS
|
||||
--
|
||||
sword_damage = {
|
||||
-- damage inflicted by each type of sword
|
||||
TERUMETAL = 6,
|
||||
COPPER_ALLOY = 8,
|
||||
IRON_ALLOY = 9,
|
||||
GOLD_ALLOY = 7,
|
||||
BRONZE_ALLOY = 10,
|
||||
COREGLASS = 12
|
||||
},
|
||||
|
||||
-- Comment out/remove this section to disable all upgraded tools
|
||||
UPGRADES = {
|
||||
-- comment out/remove a single line to disable that upgrade
|
||||
rng = {color='#ffda00', nametag='Kinetic', xinfo='Longer reach', item='terumet:item_cryst_mese 3', time=20.0, flux=8, repmult=1.5, effect=8}, -- effect=new range
|
||||
spd = {color='#4aeffd', nametag='Expert', xinfo='Faster speed', item='terumet:item_cryst_dia 3', time=20.0, flux=8, repmult=2, effect=0.8}, -- effect=multiplier to tool speeds
|
||||
dur = {color='#68905a', nametag='Durable', xinfo='Degrades slower', item='terumet:item_rubber 3', time=20.0, flux=8, repmult=1.5, effect=1.6}, -- effect=multiplier to tool uses
|
||||
}
|
||||
}
|
||||
|
||||
terumet.options.machine = {
|
||||
--
|
||||
-- GENERAL MACHINE SETTINGS
|
||||
--
|
||||
-- Heat sources that can be used in fuel slots of machines
|
||||
BASIC_HEAT_SOURCES = {
|
||||
['bucket:bucket_lava']={ hus=20000, return_item='bucket:bucket_empty' },
|
||||
},
|
||||
-- Whether machines emit smoke particles or not while working
|
||||
PARTICLES = true,
|
||||
-- Text descriptions of heat transfer modes of machines
|
||||
HEAT_TRANSFER_MODE_NAMES = {
|
||||
[0]='Disabled',
|
||||
[1]='Accept',
|
||||
[2]='Provide',
|
||||
},
|
||||
-- Sounds played by machines, (nil to disable)
|
||||
OVERHEAT_SOUND = 'terumet_venting', -- when overheating and discharging
|
||||
HEATIN_SOUND = 'terumet_heatin', -- when accepting heat from an item/battery
|
||||
HEATOUT_SOUND = 'terumet_heatout', -- when depositing heat in a battery
|
||||
|
||||
DEFAULT_INPUT_SIDE = 3,
|
||||
DEFAULT_OUTPUT_SIDE = 4,
|
||||
|
||||
-- tooltip colors for machine items
|
||||
TIP_HU_COLOR = '#ff9d15',
|
||||
TIP_PERCENT_COLOR = '#ffdcac',
|
||||
}
|
||||
|
||||
terumet.options.heater = {
|
||||
furnace={
|
||||
--
|
||||
-- FURNACE HEATER SETTINGS
|
||||
--
|
||||
-- Maximum HUs Furnace Heater can store
|
||||
MAX_HEAT = 10000,
|
||||
-- Maximum HUs Furnace Heater can transfer per tick
|
||||
HEAT_TRANSFER_RATE = 500,
|
||||
-- HU generation per second of burn time
|
||||
GEN_HUPS = 100
|
||||
},
|
||||
solar={
|
||||
--
|
||||
-- SOLAR HEATER SETTINGS
|
||||
--
|
||||
-- Maximum HUs Solar Heater can store
|
||||
MAX_HEAT = 40000,
|
||||
-- HUs Solar Heater generates per second based on sunlight level
|
||||
SOLAR_HUPS = { 0, 0, 0, 0, 0, 10, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60 },
|
||||
-- Maximum HUs Solar Heater can transfer per tick
|
||||
HEAT_TRANSFER_RATE = 1000,
|
||||
},
|
||||
entropy={
|
||||
--
|
||||
-- ENTROPIC HEATER SETTINGS
|
||||
--
|
||||
MAX_HEAT = 200000,
|
||||
HEAT_TRANSFER_RATE = 5000,
|
||||
-- the maximum extent the heater "scans" from the main machine
|
||||
MAX_RANGE = {x=5, y=5, z=5},
|
||||
-- if a node time is not defined, use this time
|
||||
DEFAULT_DRAIN_TIME = 1.0,
|
||||
EFFECTS = {
|
||||
['default:water_source']={change='default:ice', time=5.0, hups=1000},
|
||||
['default:water_flowing']={change='default:ice', time=2.5, hups=1200},
|
||||
['default:lava_source']={change='default:obsidian', time=2.0, hups=10000},
|
||||
['default:lava_flowing']={change='default:obsidian', time=1.0, hups=5000},
|
||||
['default:dirt_with_grass']={change='default:dirt', hups=1000},
|
||||
['default:sandstone']={change='default:sand', hups=3000},
|
||||
['default:silver_sandstone']={change='default:silver_sand', hups=3000},
|
||||
['default:stone']={change='default:cobble', time=3.0, hups=1000},
|
||||
['default:cobble']={change='default:gravel', time=3.0, hups=800},
|
||||
['default:gravel']={change='default:silver_sand', time=3.0, hups=500},
|
||||
['default:coalblock']={change='default:stone_with_coal', time=60.0, hups=1500},
|
||||
['default:stone_with_coal']={change='default:stone', time=10.0, hups=1500},
|
||||
['default:mossycobble']={change='default:cobble', time=15.0, hups=500},
|
||||
['default:clay']={change='default:dirt', time=5.0, hups=500},
|
||||
['default:cactus']={change='air', time=10.0, hups=2000},
|
||||
['default:papyrus']={change='air', time=20.0, hups=2000},
|
||||
['group:flora']={change='default:dry_shrub', time=6.0, hups=150},
|
||||
['default:dry_shrub']={change='air', time=3.0, hups=1500},
|
||||
['fire:basic_flame']={change='air', time=0.5, hups=10000},
|
||||
['fire:permanent_flame']={change='air', time=0.5, hups=10000},
|
||||
['air']={time=1.0, hups=500},
|
||||
['group:tree']={change='air', time=12.0, hups=3000},
|
||||
['group:sapling']={change='air', time=4.0, hups=4000},
|
||||
['group:wood']={change='air', time=9.0, hups=1000},
|
||||
['group:leaves']={change='air', time=4.0, hups=2000},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
terumet.options.crusher = {
|
||||
--
|
||||
-- CRUSHER SETTINGS
|
||||
--
|
||||
|
||||
MAX_HEAT = 5000,
|
||||
|
||||
HEAT_HUPS = 150,
|
||||
TIME_HEATING = 4.0, -- in sec.
|
||||
TIME_COOLING = 6.0, -- in sec.
|
||||
|
||||
recipes = {
|
||||
['default:stone']='default:cobble',
|
||||
['default:cobble']='default:gravel',
|
||||
['default:gravel']='default:silver_sand',
|
||||
['default:obsidian']='default:obsidian_shard 9',
|
||||
['default:obsidian_shard']='terumet:item_dust_ob',
|
||||
['default:sandstone']='default:sand',
|
||||
['default:silver_sandstone']='default:silver_sand',
|
||||
['default:coalblock']='default:coal_lump 9',
|
||||
['default:apple']='terumet:item_dust_bio 2',
|
||||
['default:papyrus']='terumet:item_dust_bio 3',
|
||||
['group:flora']='terumet:item_dust_bio',
|
||||
['group:leaves']='terumet:item_dust_bio',
|
||||
['group:sapling']='terumet:item_dust_bio',
|
||||
['group:tree']='terumet:item_dust_wood 4',
|
||||
['group:wood']='terumet:item_dust_wood 1',
|
||||
}
|
||||
}
|
||||
|
||||
terumet.options.thermobox = {
|
||||
--
|
||||
-- THERMOBOX SETTINGS
|
||||
--
|
||||
MAX_HEAT = 200000,
|
||||
HEAT_TRANSFER_RATE = 2500
|
||||
}
|
||||
|
||||
terumet.options.thermdist = {
|
||||
--
|
||||
-- THERMAL DISTRIBUTOR SETTINGS
|
||||
MAX_HEAT = 20000,
|
||||
HEAT_TRANSFER_RATE = 2500
|
||||
}
|
||||
|
||||
terumet.options.heatline = {
|
||||
--
|
||||
-- HEATLINE SETTINGS
|
||||
--
|
||||
-- Maximum HUs heatline input can contain
|
||||
MAX_HEAT = 50000,
|
||||
-- Maximum distance over a heatline input can send (in blocks of heatline)
|
||||
-- when a heatline extends beyond this, it will occasionally display smoke particles to warn
|
||||
MAX_DIST = 36,
|
||||
-- Every RECHECK_LINKS_TIMER seconds, recheck the heatline network on an input
|
||||
RECHECK_LINKS_TIMER = 4.0,
|
||||
-- Max heat transferred every tick (divided among all connected machines in order of distance)
|
||||
HEAT_TRANSFER_MAX = 2500,
|
||||
-- whether /heatlines chat command is available to list all heatline network info
|
||||
DEBUG_CHAT_COMMAND = false,
|
||||
}
|
||||
|
||||
terumet.options.heat_ray = {
|
||||
--
|
||||
-- HEAT RAY EMITTER SETTINGS
|
||||
--
|
||||
-- Maximum HUs emitter can contain
|
||||
MAX_HEAT = 20000,
|
||||
-- HUs sent in one ray
|
||||
SEND_AMOUNT = 10000,
|
||||
-- maximum number of nodes emitter will seek before giving up
|
||||
MAX_DISTANCE = 1000,
|
||||
-- set to zero to disable particle display of ray
|
||||
RAY_PARTICLES_PER_NODE = 6
|
||||
}
|
||||
|
||||
terumet.options.smelter = {
|
||||
--
|
||||
-- TERUMETAL ALLOY SMELTER SETTINGS
|
||||
--
|
||||
-- Maximum HUs smelter can contain
|
||||
MAX_HEAT = 20000,
|
||||
-- Amount of flux value (FV) one item is worth
|
||||
FLUX_VALUE = 2,
|
||||
-- Maximum stored FV of an alloy smelter's flux tank
|
||||
-- NOTE: if FLUX_MAXIMUM / FLUX_VALUE > 99, flux could be lost on breaking a smelter
|
||||
-- (only a maximum of 1 stack of Crystallized Terumetal will be dropped)
|
||||
-- also if stored flux < FLUX_VALUE, that amount will be lost (minimum 1 Crystallized Terumetal dropped)
|
||||
FLUX_MAXIMUM = 100,
|
||||
-- Heat expended per second melting flux
|
||||
MELT_HUPS = 20,
|
||||
-- Heat expended per second alloying
|
||||
ALLOY_HUPS = 10,
|
||||
-- Default items usable as flux
|
||||
FLUX_ITEMS = {
|
||||
['terumet:lump_raw']={time=3.0},
|
||||
['terumet:ingot_raw']={time=2.0},
|
||||
['terumet:item_cryst_raw']={time=1.0},
|
||||
},
|
||||
-- Default alloy-making recipes
|
||||
recipes = {
|
||||
-- Standard Bronze
|
||||
-- Note these are first in the recipe list to override single terucopper/terutin if all elements for bronze are available
|
||||
{result='default:bronze_ingot 9', flux=0, time=8.0, input={'default:copper_lump 8', 'default:tin_lump'}},
|
||||
{result='default:bronze_ingot 9', flux=0, time=6.0, input={'default:copper_ingot 8', 'default:tin_ingot'}},
|
||||
{result='default:bronzeblock 9', flux=0, time=40.5, input={'default:copperblock 8', 'default:tinblock'}},
|
||||
{result='default:bronze_ingot 9', flux=0, time=2.0, input={'terumet:item_cryst_copper 8', 'terumet:item_cryst_tin'}},
|
||||
-- Terumetal Glass
|
||||
{result='terumet:block_tglass 4', flux=1, time=8.0, input={'default:glass 4', 'default:silver_sand'}},
|
||||
-- Terumetal Glow Glass
|
||||
{result='terumet:block_tglassglow 4', flux=1, time=8.0, input={'terumet:block_tglass 4', 'default:mese_crystal'}},
|
||||
-- Teruchalchum
|
||||
{result='terumet:ingot_tcha 3', flux=9, time=6.0, input={'default:bronze_ingot', 'default:tin_lump 2'}},
|
||||
{result='terumet:ingot_tcha 3', flux=9, time=4.0, input={'default:bronze_ingot', 'default:tin_ingot 2'}},
|
||||
{result='terumet:block_tcha 3', flux=75, time=54.0, input={'default:bronzeblock', 'default:tinblock 2'}},
|
||||
{result='terumet:ingot_tcha 3', flux=9, time=3.0, input={'default:bronze_ingot', 'terumet:item_cryst_tin 2'}},
|
||||
-- Terucopper
|
||||
{result='terumet:ingot_tcop', flux=1, time=3.0, input={'default:copper_lump'}},
|
||||
{result='terumet:ingot_tcop', flux=1, time=2.5, input={'default:copper_ingot'}},
|
||||
{result='terumet:block_tcop', flux=8, time=22.5, input={'default:copperblock'}},
|
||||
{result='terumet:ingot_tcop', flux=1, time=1.0, input={'terumet:item_cryst_copper'}},
|
||||
-- Terutin
|
||||
{result='terumet:ingot_ttin', flux=1, time=2.0, input={'default:tin_lump'}},
|
||||
{result='terumet:ingot_ttin', flux=1, time=1.5, input={'default:tin_ingot'}},
|
||||
{result='terumet:block_ttin', flux=8, time=15.0, input={'default:tinblock'}},
|
||||
{result='terumet:ingot_ttin', flux=1, time=0.5, input={'terumet:item_cryst_tin'}},
|
||||
-- Terusteel
|
||||
{result='terumet:ingot_tste', flux=2, time=4.5, input={'default:iron_lump'}},
|
||||
{result='terumet:ingot_tste', flux=2, time=3.5, input={'default:steel_ingot'}},
|
||||
{result='terumet:block_tste', flux=16, time=31.5, input={'default:steelblock'}},
|
||||
{result='terumet:ingot_tste', flux=2, time=2.0, input={'terumet:item_cryst_iron'}},
|
||||
-- Terugold
|
||||
{result='terumet:ingot_tgol', flux=3, time=5.0, input={'default:gold_lump'}},
|
||||
{result='terumet:ingot_tgol', flux=3, time=4.0, input={'default:gold_ingot'}},
|
||||
{result='terumet:block_tgol', flux=25, time=36.0, input={'default:goldblock'}},
|
||||
{result='terumet:ingot_tgol', flux=3, time=2.5, input={'terumet:item_cryst_gold'}},
|
||||
-- Coreglass
|
||||
{result='terumet:ingot_cgls', flux=5, time=10.0, input={'default:diamond', 'default:obsidian_shard'}},
|
||||
{result='terumet:block_cgls', flux=30, time=90.0, input={'default:diamondblock', 'default:obsidian'}},
|
||||
{result='terumet:ingot_cgls', flux=5, time=5.0, input={'terumet:item_cryst_dia', 'terumet:item_cryst_ob'}},
|
||||
-- Teruceramic
|
||||
{result='terumet:item_ceramic', flux=2, time=3.0, input={'default:clay_lump'}},
|
||||
-- Thermese
|
||||
{result='terumet:item_thermese', flux=4, time=8.0, input={'default:mese_crystal'}},
|
||||
},
|
||||
}
|
||||
|
||||
terumet.options.furnace = {
|
||||
--
|
||||
-- HIGH-TEMP FURNACE SETTINGS
|
||||
--
|
||||
-- Maximum HUs ht-furnace can contain
|
||||
MAX_HEAT = 30000,
|
||||
-- Heat cost per second
|
||||
COOK_HUPS = 100,
|
||||
-- Multiplier applied to normal cooking time
|
||||
-- NOTE: This multiplier is ignored for battery heating
|
||||
TIME_MULT = 0.5,
|
||||
}
|
||||
|
||||
terumet.options.vac_oven = {
|
||||
--
|
||||
-- VACUUM OVEN SETTINGS
|
||||
--
|
||||
-- Maximum HUs machine can contain
|
||||
MAX_HEAT = 100000,
|
||||
-- HU cost per tick of cooking
|
||||
COOK_HUPS = 500,
|
||||
|
||||
recipes = {
|
||||
{results={'terumet:item_tarball 4', 'terumet:item_coke'}, time=10.0, input='default:coal_lump'},
|
||||
{results={'terumet:item_tarball 40', 'terumet:block_coke'}, time=80.0, input='default:coalblock'},
|
||||
},
|
||||
|
||||
VAC_FOOD = {
|
||||
ACTIVE = true, -- make false to disable vacuum-packed food entirely
|
||||
-- if AUTO_GENERATE is true, the mod scans all items defined as of this mod's initialization
|
||||
-- if an item has an on_use and has the group food_*, it is assumed to be a food and adds a vacuum-packed version
|
||||
-- to ensure a mod's items are scanned, it should be added to terumet's list of dependent mods in mod.conf/depends.txt
|
||||
AUTO_GENERATE = true,
|
||||
-- items that are flagged as food by AUTO_GENERATE you do not want to be made into a vacfood can be added through this list
|
||||
-- if AUTO_GENERATE is false, this list has no effect
|
||||
-- (1 is meaningless and just to provide a value)
|
||||
BLACKLIST = {
|
||||
['mobs:glass_milk']=1,
|
||||
['mobs:bucket_milk']=1,
|
||||
['main:honey_bottle']=1,
|
||||
['mobs:egg']=1,
|
||||
['group:food_butter']=1, -- you can use groups too
|
||||
},
|
||||
-- items that aren't automatically recognized as food can be added through this list
|
||||
-- even if AUTO_GENERATE is false, these items will be made into a vacfood
|
||||
-- (1 is meaningless and just to provide a value)
|
||||
WHITELIST = {
|
||||
['moretrees:acorn_muffin']=1,
|
||||
}
|
||||
-- see interop/farming.lua for foods from "farming" mod
|
||||
-- see interop/extra.lua for foods from "extra" mod
|
||||
},
|
||||
|
||||
MAX_RESULTS = 2, -- Maximum number of result items from recipes (adjust this if any larger recipes are added)
|
||||
}
|
||||
|
||||
terumet.options.vulcan = {
|
||||
--
|
||||
-- CRYSTAL VULCANIZER SETTINGS
|
||||
--
|
||||
-- populated through registration, see interop/terumet_api.lua
|
||||
recipes = {}, -- DO NOT CHANGE
|
||||
-- Maximum HUs vulcanizer can contain
|
||||
MAX_HEAT = 60000,
|
||||
-- Heat cost per second of vulcanizing
|
||||
VULCANIZE_HUPS = 200,
|
||||
-- Time to process one item (in seconds)
|
||||
PROCESS_TIME = 6.0,
|
||||
-- when true, crystalizing obsidian always produces exactly one crystal.
|
||||
-- this prevents easy infinite obsidian loops.
|
||||
LIMIT_OBSIDIAN = true,
|
||||
}
|
||||
|
||||
terumet.options.lavam = {
|
||||
--
|
||||
-- LAVA MELTER SETTINGS
|
||||
--
|
||||
-- Maximum HUs melter can contain
|
||||
MAX_HEAT = 30000,
|
||||
-- Nodes that can be melted to lava
|
||||
-- related number is total required heat to melt
|
||||
VALID_STONES = {
|
||||
['default:stone']=15000,
|
||||
['default:cobble']=20000,
|
||||
['default:desert_stone']=14000,
|
||||
['default:desert_cobble']=18000
|
||||
},
|
||||
-- total time for 1 item required in seconds (best if required heat/MELT_TIME is a whole number)
|
||||
MELT_TIME = 200
|
||||
}
|
||||
|
||||
terumet.options.meseg = {
|
||||
--
|
||||
-- MESE GARDEN SETTINGS
|
||||
--
|
||||
-- Maximum HUs garden can contain
|
||||
MAX_HEAT = 50000,
|
||||
-- HUs required to begin growing
|
||||
START_HEAT = 10000,
|
||||
-- HUs required per second when growing
|
||||
HEAT_HUPS = 350,
|
||||
-- Multiplier applied to efficiency every second not heated or seeded
|
||||
EFFIC_LOSS_RATE = 0.75,
|
||||
-- Maximum efficiency "points" (at this level, progress is 100% of possible rate)
|
||||
-- Efficiency points increase by number of seed crystals each second until max
|
||||
MAX_EFFIC = 2000,
|
||||
-- Progress "points" needed to grow a new shard
|
||||
-- points gained each second = number of seed crystals x efficiency
|
||||
PROGRESS_NEED = 300,
|
||||
-- item id of seed crystal
|
||||
SEED_ITEM = 'default:mese_crystal',
|
||||
-- item id of produced item
|
||||
PRODUCE_ITEM = 'default:mese_crystal_fragment',
|
||||
-- Chance to lose a seed crystal each growth is 1/(SEED_LOSS_CHANCE-seed crystal count)
|
||||
-- so SEED_LOSS_CHANCE = 101 means:
|
||||
-- 1 seed crystal = 1/100 chance (very low)
|
||||
-- 99 seed crystals = 1/2 chance (coin flip)
|
||||
-- You can set to false or nil to disable losing seeds, even if it's overpowered.
|
||||
SEED_LOSS_CHANCE = 101,
|
||||
-- sound to play at Garden node when a seed is lost (nil for none)
|
||||
SEED_LOSS_SOUND = 'terumet_break',
|
||||
-- true if particle effects occur when a seed is lost (default machine PARTICLES option false will also disable)
|
||||
SEED_LOSS_PARTICLES = true
|
||||
}
|
||||
|
||||
terumet.options.repm = {
|
||||
--
|
||||
-- EQUIPMENT REFORMER SETTINGS
|
||||
--
|
||||
MAX_HEAT = 50000,
|
||||
|
||||
-- HUs/sec to melt repair material and repair material units processed per tick
|
||||
MELT_HUPS = 100,
|
||||
MELTING_RATE = 10,
|
||||
-- HUs/sec to repair one item and repair material units applied to repairing per tick
|
||||
REPAIR_HUPS = 30,
|
||||
REPAIR_RATE = 10,
|
||||
-- maximum units of repair material that can be stored
|
||||
RMAT_MAXIMUM = 1000,
|
||||
|
||||
-- items that can be turned into "repair-material" and how much
|
||||
-- populated through registration, see interop/terumet_api.lua
|
||||
repair_mats = {}, -- DO NOT CHANGE
|
||||
|
||||
-- all items that can be repaired and how much "repair-material" is required to remove a full wear bar
|
||||
-- (TODO) mods can add addtional ones through the API terumet.register_repairable_item -- see interop/terumet_api.lua
|
||||
repairable = {}, -- DO NOT CHANGE
|
||||
}
|
||||
|
||||
terumet.options.ore_saw = {
|
||||
--
|
||||
-- ORE SAW SETTINGS
|
||||
--
|
||||
-- Nodes that can be gathered directly via saw (1 is meaningless and just to provide a value)
|
||||
VALID_ORES = {
|
||||
['default:stone_with_diamond']=1,
|
||||
['default:stone_with_mese']=1,
|
||||
['default:stone_with_copper']=1,
|
||||
['default:stone_with_tin']=1,
|
||||
['default:stone_with_iron']=1,
|
||||
['default:stone_with_gold']=1,
|
||||
['default:stone_with_coal']=1,
|
||||
['terumet:ore_raw']=1,
|
||||
['terumet:ore_raw_desert']=1,
|
||||
['asteroid:copperore']=1,
|
||||
['asteroid:diamondore']=1,
|
||||
['asteroid:goldore']=1,
|
||||
['asteroid:ironore']=1,
|
||||
['asteroid:meseore']=1,
|
||||
['moreores:mineral_mithril']=1,
|
||||
['moreores:mineral_silver']=1,
|
||||
['titanium:titanium_in_ground']=1,
|
||||
['quartz:quartz_ore']=1,
|
||||
['nether:titanium_ore']=1,
|
||||
},
|
||||
-- Number of times basic ore saw can be used before breaking
|
||||
BASIC_USES = 40,
|
||||
-- Number of times advanced ore saw can be used before breaking
|
||||
ADVANCED_USES = 200,
|
||||
}
|
||||
|
||||
-- NOTE: Armor and bracers will only be available if the mod "3d_armor" by stujones11 (https://github.com/stujones11/minetest-3d_armor) is active
|
||||
terumet.options.armor = {
|
||||
-- delete or comment out entire BRACERS = {...} block to disable all bracers
|
||||
BRACERS = { -- delete single line or comment out (add -- to start) to disable that type of bracer
|
||||
-- water-breathing bracer
|
||||
aqua={name='Aqua', color='#0010ff', mat='default:papyrus', xinfo='Underwater breathing',
|
||||
def=5, uses=65535/150, rep=100, breathing=1},
|
||||
-- high jump bracer
|
||||
jump={name='Jump', color='#ffac00', mat='terumet:item_cryst_mese', xinfo='Increase jump height',
|
||||
def=5, uses=65535/200, rep=150, jump=0.5},
|
||||
-- movement speed bracer
|
||||
spd={ name='Speed', color='#4eff00', mat='terumet:item_cryst_dia', xinfo='Increase move speed',
|
||||
def=5, uses=65535/150, rep=400, speed=0.8},
|
||||
-- anti-gravity bracer
|
||||
agv={ name='Antigravity', color='#7600ff', mat='terumet:item_entropy', xinfo='Reduce gravity',
|
||||
def=5, uses=65535/100, rep=400, speed=-0.1, gravity=-0.5, jump=-0.1},
|
||||
-- high heal bracer
|
||||
heal={name='Heal', color='#ff0086', mat='terumet:block_dust_bio', xinfo='Heal +10',
|
||||
heal=10, uses=65535/200, rep=600},
|
||||
-- high defense bracer
|
||||
def={ name='Defense', color='#727272', mat='terumet:item_rsuitmat', xinfo='Defense +30',
|
||||
def=30, uses=65535/150, rep=300},
|
||||
-- fire protection bracer
|
||||
-- 3darmor must have the option "Enable fire protection" on in order for this bracer to function or be loaded
|
||||
fire={name='Fireproof', color='#ff5d00', mat='terumet:item_cryst_ob', xinfo='Immunity to fire/lava',
|
||||
uses=65535/100, rep=300, fire=99},
|
||||
},
|
||||
-- Item used to create bracer crystals
|
||||
BRACER_CRYSTAL_ITEM = 'default:steelblock',
|
||||
}
|
||||
BIN
mods/ip_terumet/screenshot.png
Normal file
|
After Width: | Height: | Size: 409 KiB |
BIN
mods/ip_terumet/sounds/terumet_break.0.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_break.1.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_break.2.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_break.3.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_eat_vacfood.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_heatin.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_heatout.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_saw.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_saw_fail.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_dig.0.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_dig.1.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_dig.2.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_dug.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_place.0.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_place.1.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_step.0.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_step.1.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_squish_step.2.ogg
Normal file
BIN
mods/ip_terumet/sounds/terumet_venting.ogg
Normal file
BIN
mods/ip_terumet/textures/terumet_armboots_cgls.png
Normal file
|
After Width: | Height: | Size: 314 B |
BIN
mods/ip_terumet/textures/terumet_armboots_rsuit.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
mods/ip_terumet/textures/terumet_armboots_tcha.png
Normal file
|
After Width: | Height: | Size: 297 B |
BIN
mods/ip_terumet/textures/terumet_armboots_tcop.png
Normal file
|
After Width: | Height: | Size: 293 B |
BIN
mods/ip_terumet/textures/terumet_armboots_tgol.png
Normal file
|
After Width: | Height: | Size: 290 B |
BIN
mods/ip_terumet/textures/terumet_armboots_tste.png
Normal file
|
After Width: | Height: | Size: 304 B |
BIN
mods/ip_terumet/textures/terumet_armboots_ttin.png
Normal file
|
After Width: | Height: | Size: 284 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_agv.png
Normal file
|
After Width: | Height: | Size: 348 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_aqua.png
Normal file
|
After Width: | Height: | Size: 340 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_base.png
Normal file
|
After Width: | Height: | Size: 310 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_def.png
Normal file
|
After Width: | Height: | Size: 741 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_fire.png
Normal file
|
After Width: | Height: | Size: 746 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_heal.png
Normal file
|
After Width: | Height: | Size: 341 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_jump.png
Normal file
|
After Width: | Height: | Size: 345 B |
BIN
mods/ip_terumet/textures/terumet_armbrcr_spd.png
Normal file
|
After Width: | Height: | Size: 341 B |
BIN
mods/ip_terumet/textures/terumet_armchest_cgls.png
Normal file
|
After Width: | Height: | Size: 559 B |
BIN
mods/ip_terumet/textures/terumet_armchest_rsuit.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
mods/ip_terumet/textures/terumet_armchest_tcha.png
Normal file
|
After Width: | Height: | Size: 583 B |
BIN
mods/ip_terumet/textures/terumet_armchest_tcop.png
Normal file
|
After Width: | Height: | Size: 556 B |
BIN
mods/ip_terumet/textures/terumet_armchest_tgol.png
Normal file
|
After Width: | Height: | Size: 529 B |
BIN
mods/ip_terumet/textures/terumet_armchest_tste.png
Normal file
|
After Width: | Height: | Size: 567 B |
BIN
mods/ip_terumet/textures/terumet_armchest_ttin.png
Normal file
|
After Width: | Height: | Size: 543 B |
BIN
mods/ip_terumet/textures/terumet_armhelm_cgls.png
Normal file
|
After Width: | Height: | Size: 399 B |
BIN
mods/ip_terumet/textures/terumet_armhelm_rsuit.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
mods/ip_terumet/textures/terumet_armhelm_tcha.png
Normal file
|
After Width: | Height: | Size: 397 B |
BIN
mods/ip_terumet/textures/terumet_armhelm_tcop.png
Normal file
|
After Width: | Height: | Size: 393 B |
BIN
mods/ip_terumet/textures/terumet_armhelm_tgol.png
Normal file
|
After Width: | Height: | Size: 387 B |
BIN
mods/ip_terumet/textures/terumet_armhelm_tste.png
Normal file
|
After Width: | Height: | Size: 408 B |
BIN
mods/ip_terumet/textures/terumet_armhelm_ttin.png
Normal file
|
After Width: | Height: | Size: 375 B |
BIN
mods/ip_terumet/textures/terumet_armlegs_cgls.png
Normal file
|
After Width: | Height: | Size: 470 B |
BIN
mods/ip_terumet/textures/terumet_armlegs_rsuit.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
mods/ip_terumet/textures/terumet_armlegs_tcha.png
Normal file
|
After Width: | Height: | Size: 473 B |
BIN
mods/ip_terumet/textures/terumet_armlegs_tcop.png
Normal file
|
After Width: | Height: | Size: 433 B |
BIN
mods/ip_terumet/textures/terumet_armlegs_tgol.png
Normal file
|
After Width: | Height: | Size: 424 B |
BIN
mods/ip_terumet/textures/terumet_armlegs_tste.png
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
mods/ip_terumet/textures/terumet_armlegs_ttin.png
Normal file
|
After Width: | Height: | Size: 455 B |
BIN
mods/ip_terumet/textures/terumet_asmelt_front_lit.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
mods/ip_terumet/textures/terumet_asmelt_front_unlit.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/ip_terumet/textures/terumet_blank.png
Normal file
|
After Width: | Height: | Size: 253 B |
BIN
mods/ip_terumet/textures/terumet_block_asphalt.png
Normal file
|
After Width: | Height: | Size: 569 B |
BIN
mods/ip_terumet/textures/terumet_block_ceramic.png
Normal file
|
After Width: | Height: | Size: 936 B |
BIN
mods/ip_terumet/textures/terumet_block_cgls.png
Normal file
|
After Width: | Height: | Size: 965 B |
BIN
mods/ip_terumet/textures/terumet_block_coke.png
Normal file
|
After Width: | Height: | Size: 576 B |
BIN
mods/ip_terumet/textures/terumet_block_con.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
mods/ip_terumet/textures/terumet_block_conmix.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/ip_terumet/textures/terumet_block_dust_bio.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
mods/ip_terumet/textures/terumet_block_entropy.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
mods/ip_terumet/textures/terumet_block_pwood.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
mods/ip_terumet/textures/terumet_block_pwood_sides.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
mods/ip_terumet/textures/terumet_block_raw.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |