5 Commits

Author SHA1 Message Date
140701c99e Add technic_on_disable callback (#592)
This adds a new callback to trigger when the machine is no longer powered by the technic power grid. Also allows mods to override the infotext if needed.
2021-09-10 20:42:27 +02:00
1c219487d3 Add support for craftguide mod recipe registration (#584) 2021-04-14 16:20:20 +02:00
43acec2900 Add Rubber Goo as replacement for the grinder (#578)
Fixes the circular dependency in issue #474 by adding a new item that can be used to craft Rubber.
2021-02-09 19:03:55 +01:00
0f7810e538 Public/private mode for self-contained injector (#567)
Fixes #537.
2021-02-06 12:41:09 +01:00
11e43ffe13 nuclear_reactor: Add error messages on start failure (#574) 2021-01-06 18:12:51 +01:00
11 changed files with 116 additions and 45 deletions

View File

@ -28,6 +28,8 @@ read_globals = {
"protector", "isprotect", "protector", "isprotect",
"homedecor_expect_infinite_stacks", "homedecor_expect_infinite_stacks",
"craftguide", "i3"
} }
files["concrete/init.lua"].ignore = { "steel_ingot" } files["concrete/init.lua"].ignore = { "steel_ingot" }

View File

@ -174,7 +174,6 @@ minetest.register_craft({
}, },
}) })
minetest.register_craft({ minetest.register_craft({
output = "default:dirt 2", output = "default:dirt 2",
type = "shapeless", type = "shapeless",
@ -186,3 +185,25 @@ minetest.register_craft({
"group:sand", "group:sand",
}, },
}) })
minetest.register_craft({
output = "technic:rubber_goo",
type = "shapeless",
recipe = {
"technic:raw_latex",
"default:coal_lump",
"default:coal_lump",
"default:coal_lump",
"default:coal_lump",
"default:coal_lump",
"default:coal_lump",
"default:coal_lump",
"default:coal_lump",
},
})
minetest.register_craft({
output = "technic:rubber",
type = "cooking",
recipe = "technic:rubber_goo",
})

View File

@ -1,14 +0,0 @@
default
pipeworks
technic_worldgen
basic_materials
bucket?
screwdriver?
mesecons?
mesecons_mvps?
digilines?
digiline_remote?
intllib?
unified_inventory?
vector_extras?
dye?

View File

@ -136,10 +136,15 @@ Additional definition fields:
* Specifies how the tool wear level is handled. Available modes: * Specifies how the tool wear level is handled. Available modes:
* `"mechanical_wear"`: represents physical damage * `"mechanical_wear"`: represents physical damage
* `"technic_RE_charge"`: represents electrical charge * `"technic_RE_charge"`: represents electrical charge
* `<itemdef>.technic_run(pos, node)` * `<itemdef>.technic_run = function(pos, node) ...`
* This function is currently used to update the node. * This callback is used to update the node.
Modders have to manually change the information about supply etc. in the Modders have to manually change the information about supply etc. in the
node metadata. node metadata.
* `<itemdef>.technic_disabled_machine_name = "string"`
* Specifies the machine's node name to use when it's not connected connected to a network
* `<itemdef>.technic_on_disable = function(pos, node) ...`
* This callback is run when the machine is no longer connected to a technic-powered network.
## Node Metadata fields ## Node Metadata fields
Nodes connected to the network will have one or more of these parameters as meta Nodes connected to the network will have one or more of these parameters as meta

View File

@ -134,6 +134,11 @@ minetest.register_node("technic:machine_casing", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
minetest.register_craftitem("technic:rubber_goo", {
description = S("Rubber Goo"),
inventory_image = "technic_rubber_goo.png",
})
for p = 0, 35 do for p = 0, 35 do
local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil
local psuffix = p == 7 and "" or p local psuffix = p == 7 and "" or p

View File

@ -217,24 +217,33 @@ end
local function start_reactor(pos, meta) local function start_reactor(pos, meta)
local correct_fuel_count = 6
local msg_fuel_missing = "Error: You need to insert " .. correct_fuel_count .. " pieces of Uranium Fuel."
if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then
return false return msg_fuel_missing
end end
local inv = meta:get_inventory() local inv = meta:get_inventory()
if inv:is_empty("src") then if inv:is_empty("src") then
return false return msg_fuel_missing
end end
local src_list = inv:get_list("src") local src_list = inv:get_list("src")
local correct_fuel_count = 0 local fuel_count = 0
for _, src_stack in pairs(src_list) do for _, src_stack in pairs(src_list) do
if src_stack and src_stack:get_name() == fuel_type then if src_stack and src_stack:get_name() == fuel_type then
correct_fuel_count = correct_fuel_count + 1 fuel_count = fuel_count + 1
end end
end end
-- Check that the reactor is complete and has the correct fuel -- Check that the has the correct fuel
if correct_fuel_count ~= 6 or reactor_structure_badness(pos) ~= 0 then if fuel_count ~= correct_fuel_count then
return false return msg_fuel_missing
end end
-- Check that the reactor is complete
if reactor_structure_badness(pos) ~= 0 then
return "Error: The power plant seems to be built incorrectly."
end
meta:set_int("burn_time", 1) meta:set_int("burn_time", 1)
technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active") technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
meta:set_int("HV_EU_supply", power_supply) meta:set_int("HV_EU_supply", power_supply)
@ -242,7 +251,8 @@ local function start_reactor(pos, meta)
src_stack:take_item() src_stack:take_item()
inv:set_stack("src", idx, src_stack) inv:set_stack("src", idx, src_stack)
end end
return true
return nil
end end
@ -281,7 +291,7 @@ local function run(pos, node)
"fuel used", 6, true) "fuel used", 6, true)
end end
if meta:get_string("autostart") == "true" then if meta:get_string("autostart") == "true" then
if start_reactor(pos, meta) then if not start_reactor(pos, meta) then
return return
end end
end end
@ -313,11 +323,11 @@ local nuclear_reactor_receive_fields = function(pos, formname, fields, sender)
meta:set_string("remote_channel", fields.remote_channel) meta:set_string("remote_channel", fields.remote_channel)
end end
if fields.start then if fields.start then
local b = start_reactor(pos, meta) local start_error_msg = start_reactor(pos, meta)
if b then if not start_error_msg then
minetest.chat_send_player(player_name, "Start successful") minetest.chat_send_player(player_name, "Start successful")
else else
minetest.chat_send_player(player_name, "Error") minetest.chat_send_player(player_name, start_error_msg)
end end
end end
if fields.autostart then if fields.autostart then
@ -385,11 +395,11 @@ local digiline_remote_def = function(pos, channel, msg)
melt_down_reactor(pos) melt_down_reactor(pos)
end end
elseif msg.command == "start" then elseif msg.command == "start" then
local b = start_reactor(pos, meta) local start_error_msg = start_reactor(pos, meta)
if b then if not start_error_msg then
digiline_remote.send_to_node(pos, channel, "Start successful", 6, true) digiline_remote.send_to_node(pos, channel, "Start successful", 6, true)
else else
digiline_remote.send_to_node(pos, channel, "Error", 6, true) digiline_remote.send_to_node(pos, channel, start_error_msg, 6, true)
end end
end end
end end

View File

@ -61,6 +61,9 @@ local function set_injector_formspec(meta)
(is_stack and (is_stack and
"button[0,1;2,1;mode_item;"..S("Stackwise").."]" or "button[0,1;2,1;mode_item;"..S("Stackwise").."]" or
"button[0,1;2,1;mode_stack;"..S("Itemwise").."]").. "button[0,1;2,1;mode_stack;"..S("Itemwise").."]")..
(meta:get_int("public") == 1 and
"button[2,1;2,1;mode_private;"..S("Public").."]" or
"button[2,1;2,1;mode_public;"..S("Private").."]")..
"list[current_name;main;0,2;8,2;]".. "list[current_name;main;0,2;8,2;]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"..
"listring[]".. "listring[]"..
@ -123,6 +126,9 @@ minetest.register_node("technic:injector", {
if fields.mode_item then meta:set_string("mode", "single items") end if fields.mode_item then meta:set_string("mode", "single items") end
if fields.mode_stack then meta:set_string("mode", "whole stacks") end if fields.mode_stack then meta:set_string("mode", "whole stacks") end
if fields.mode_private then meta:set_int("public", 0) end
if fields.mode_public then meta:set_int("public", 1) end
if fields["fs_helpers_cycling:0:splitstacks"] if fields["fs_helpers_cycling:0:splitstacks"]
or fields["fs_helpers_cycling:1:splitstacks"] then or fields["fs_helpers_cycling:1:splitstacks"] then
if not pipeworks.may_configure(pos, sender) then return end if not pipeworks.may_configure(pos, sender) then return end

View File

@ -1,4 +1,6 @@
local have_ui = minetest.get_modpath("unified_inventory") local have_ui = minetest.get_modpath("unified_inventory")
local have_cg = minetest.get_modpath("craftguide")
local have_i3 = minetest.get_modpath("i3")
technic.recipes = { cooking = { input_size = 1, output_size = 1 } } technic.recipes = { cooking = { input_size = 1, output_size = 1 } }
function technic.register_recipe_type(typename, origdata) function technic.register_recipe_type(typename, origdata)
@ -6,13 +8,25 @@ function technic.register_recipe_type(typename, origdata)
for k, v in pairs(origdata) do data[k] = v end for k, v in pairs(origdata) do data[k] = v end
data.input_size = data.input_size or 1 data.input_size = data.input_size or 1
data.output_size = data.output_size or 1 data.output_size = data.output_size or 1
if have_ui and unified_inventory.register_craft_type and data.output_size == 1 then if data.output_size == 1 then
if have_ui and unified_inventory.register_craft_type then
unified_inventory.register_craft_type(typename, { unified_inventory.register_craft_type(typename, {
description = data.description, description = data.description,
width = data.input_size, width = data.input_size,
height = 1, height = 1,
}) })
end end
if have_cg and craftguide.register_craft_type then
craftguide.register_craft_type(typename, {
description = data.description,
})
end
if have_i3 then
i3.register_craft_type(typename, {
description = data.description,
})
end
end
data.recipes = {} data.recipes = {}
technic.recipes[typename] = data technic.recipes[typename] = data
end end
@ -59,6 +73,27 @@ local function register_recipe(typename, data)
width = 0, width = 0,
}) })
end end
if (have_cg or have_i3) and technic.recipes[typename].output_size == 1 then
local result = data.output
if (type(result)=="table") then
result = result[1]
end
local items = table.concat(data.input, ", ")
if have_cg and craftguide.register_craft then
craftguide.register_craft({
type = typename,
result = result,
items = {items},
})
end
if have_i3 then
i3.register_craft({
type = typename,
result = result,
items = {items},
})
end
end
end end
function technic.register_recipe(typename, data) function technic.register_recipe(typename, data)

View File

@ -465,16 +465,17 @@ minetest.register_abm({
for tier, machines in pairs(technic.machines) do for tier, machines in pairs(technic.machines) do
if machines[node.name] and switching_station_timeout_count(pos, tier) then if machines[node.name] and switching_station_timeout_count(pos, tier) then
local nodedef = minetest.registered_nodes[node.name] local nodedef = minetest.registered_nodes[node.name]
if nodedef and nodedef.technic_disabled_machine_name then
node.name = nodedef.technic_disabled_machine_name
minetest.swap_node(pos, node)
elseif nodedef and nodedef.technic_on_disable then
nodedef.technic_on_disable(pos, node)
end
if nodedef then if nodedef then
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description)) meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description))
end end
if nodedef and nodedef.technic_disabled_machine_name then
node.name = nodedef.technic_disabled_machine_name
minetest.swap_node(pos, node)
end
if nodedef and nodedef.technic_on_disable then
nodedef.technic_on_disable(pos, node)
end
end end
end end
end, end,

View File

@ -1,3 +1,3 @@
name = technic name = technic
depends = default, pipeworks, technic_worldgen, basic_materials depends = default, pipeworks, technic_worldgen, basic_materials
optional_depends = bucket, screwdriver, mesecons, mesecons_mvps, digilines, digiline_remote, intllib, unified_inventory, vector_extras, dye optional_depends = bucket, screwdriver, mesecons, mesecons_mvps, digilines, digiline_remote, intllib, unified_inventory, vector_extras, dye, craftguide,i3

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B