summaryrefslogtreecommitdiff
path: root/technic
diff options
context:
space:
mode:
Diffstat (limited to 'technic')
-rw-r--r--technic/config.lua1
-rw-r--r--technic/crafts.lua48
-rw-r--r--technic/depends.txt2
-rw-r--r--technic/doc/api.md130
-rw-r--r--technic/init.lua4
-rw-r--r--technic/machines/HV/forcefield.lua81
-rw-r--r--technic/machines/HV/nuclear_reactor.lua190
-rw-r--r--technic/machines/other/frames.lua2
-rw-r--r--technic/machines/register/battery_box.lua81
-rw-r--r--technic/machines/register/cables.lua32
-rw-r--r--technic/machines/switching_station.lua33
-rw-r--r--technic/radiation.lua26
-rw-r--r--technic/tools/vacuum.lua2
13 files changed, 508 insertions, 124 deletions
diff --git a/technic/config.lua b/technic/config.lua
index 29321f9..bb748ec 100644
--- a/technic/config.lua
+++ b/technic/config.lua
@@ -12,6 +12,7 @@ local defaults = {
enable_radiation_protection = "true",
enable_entity_radiation_damage = "true",
enable_longterm_radiation_damage = "true",
+ enable_nuclear_reactor_digiline_selfdestruct = "false",
}
for k, v in pairs(defaults) do
diff --git a/technic/crafts.lua b/technic/crafts.lua
index 9e07978..14bafd3 100644
--- a/technic/crafts.lua
+++ b/technic/crafts.lua
@@ -9,34 +9,38 @@ minetest.clear_craft({
})
-- Accelerator tube
-minetest.clear_craft({
- output = "pipeworks:accelerator_tube_1",
-})
+if pipeworks.enable_accelerator_tube then
+ minetest.clear_craft({
+ output = "pipeworks:accelerator_tube_1",
+ })
+
+ minetest.register_craft({
+ output = 'pipeworks:accelerator_tube_1',
+ recipe = {
+ {'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'},
+ }
+ })
+end
-- Teleport tube
-minetest.clear_craft({
- output = "pipeworks:teleport_tube_1",
-})
+if pipeworks.enable_teleport_tube then
+ minetest.clear_craft({
+ output = "pipeworks:teleport_tube_1",
+ })
+
+ minetest.register_craft({
+ output = 'pipeworks:teleport_tube_1',
+ recipe = {
+ {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
+ {'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'},
+ {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
+ }
+ })
+end
-- tubes crafting recipes
minetest.register_craft({
- output = 'pipeworks:accelerator_tube_1',
- recipe = {
- {'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'},
- }
-})
-
-minetest.register_craft({
- output = 'pipeworks:teleport_tube_1',
- recipe = {
- {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
- {'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'},
- {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
- }
-})
-
-minetest.register_craft({
output = 'technic:diamond_drill_head',
recipe = {
{'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'},
diff --git a/technic/depends.txt b/technic/depends.txt
index 777e94f..5bf9f9f 100644
--- a/technic/depends.txt
+++ b/technic/depends.txt
@@ -2,9 +2,11 @@ default
pipeworks
technic_worldgen
bucket?
+screwdriver?
mesecons?
mesecons_mvps?
digilines?
+digiline_remote?
intllib?
unified_inventory?
vector_extras?
diff --git a/technic/doc/api.md b/technic/doc/api.md
new file mode 100644
index 0000000..2e5b6d3
--- /dev/null
+++ b/technic/doc/api.md
@@ -0,0 +1,130 @@
+This file is fairly incomplete. Help is welcome.
+
+Tiers
+-----
+The tier is a string, currently `"LV"`, `"MV"` and `"HV"` are supported.
+
+Network
+-------
+The network is the cable with the connected machine nodes. Currently the
+switching station handles the network activity.
+
+Helper functions
+----------------
+* `technic.pretty_num(num)`
+ * Converts the number `num` to a human-readable string.
+ * Use this function when showing players power values.
+* `technic.swap_node(pos, nodename)`
+ * Same as `mintest.swap_node` but it only changes the nodename.
+ * It uses `minetest.get_node` before swapping to ensure the new nodename
+ is not the same as the current one.
+* `technic.get_or_load_node(pos)`
+ * If the mapblock is loaded, it returns the node at pos,
+ else it loads the chunk and returns `nil`.
+* `technic.set_RE_wear(itemstack, item_load, max_charge)`
+ * If the `wear_represents` field in the item's nodedef is
+ `"technic_RE_charge"`, this function does nothing.
+* `technic.refill_RE_charge(itemstack)`
+ * This function fully recharges an RE chargeable item.
+ * If `technic.power_tools[itemstack:get_name()]` is `nil` (or `false`), this
+ function does nothing, else that value is the maximum charge.
+ * The itemstack metadata is changed to contain the charge.
+* `technic.is_tier_cable(nodename, tier)`
+ * Tells whether the node `nodename` is the cable of the tier `tier`.
+* `technic.get_cable_tier(nodename)`
+ * Returns the tier of the cable `nodename` or `nil`.
+* `technic.trace_node_ray(pos, dir, range)`
+ * Returns an iteration function (usable in the for loop) to iterate over the
+ node positions along the specified ray.
+ * The returned positions will not include the starting position `pos`.
+* `technic.trace_node_ray_fat(pos, dir, range)`
+ * Like `technic.trace_node_ray` but includes extra positions near the ray.
+ * The node ray functions are used for mining lasers.
+* `technic.config:get(name)`
+ * Some configuration function
+* `technic.tube_inject_item(pos, start_pos, velocity, item)`
+ * Same as `pipeworks.tube_inject_item`
+
+Registration functions
+----------------------
+* `technic.register_power_tool(itemname, max_charge)`
+ * Same as `technic.power_tools[itemname] = max_charge`
+ * This function makes the craftitem `itemname` chargeable.
+* `technic.register_machine(tier, nodename, machine_type)`
+ * Same as `technic.machines[tier][nodename] = machine_type`
+ * Currently this is requisite to make technic recognize your node.
+ * See also `Machine types`
+* `technic.register_tier(tier)`
+ * Same as `technic.machines[tier] = {}`
+ * See also `tiers`
+
+### Specific machines
+* `technic.register_solar_array(data)`
+ * data is a table
+
+Used itemdef fields
+-------------------
+* groups:
+ * `technic_<ltier> = 1` ltier is a tier in small letters; this group makes
+ the node connect to the cable(s) of the right tier.
+ * `technic_machine = 1` Currently used for
+* `connect_sides`
+ * In addition to the default use (see lua_api.txt), this tells where the
+ machine can be connected.
+#
+#
+* `technic_run(pos, node)`
+ * This function is currently used to update the node.
+ Modders have to manually change the information about supply etc. in the
+ node metadata.
+
+Machine types
+-------------
+There are currently following types:
+* `technic.receiver = "RE"` e.g. grinder
+* `technic.producer = "PR"` e.g. solar panel
+* `technic.producer_receiver = "PR_RE"` supply converter
+* `technic.battery = "BA"` e.g. LV batbox
+
+Switching Station
+-----------------
+The switching station is the center of all power distribution on an electric
+network.
+
+The station collects power from sources (PR), distributes it to sinks (RE),
+and uses the excess/shortfall to charge and discharge batteries (BA).
+
+For now, all supply and demand values are expressed in kW.
+
+It works like this:
+ All PR,BA,RE nodes are indexed and tagged with the switching station.
+The tagging is a workaround to allow more stations to be built without allowing
+a cheat with duplicating power.
+ All the RE nodes are queried for their current EU demand. Those which are off
+would require no or a small standby EU demand, while those which are on would
+require more.
+If the total demand is less than the available power they are all updated with
+the demand number.
+If any surplus exists from the PR nodes the batteries will be charged evenly
+with this.
+If the total demand requires draw on the batteries they will be discharged
+evenly.
+
+If the total demand is more than the available power all RE nodes will be shut
+down. We have a brown-out situation.
+
+Hence for now all the power distribution logic resides in this single node.
+
+### Node meta usage
+Nodes connected to the network will have one or more of these parameters as meta
+data:
+ * `<LV|MV|HV>_EU_supply` : Exists for PR and BA node types.
+ This is the EU value supplied by the node. Output
+ * `<LV|MV|HV>_EU_demand` : Exists for RE and BA node types.
+ This is the EU value the node requires to run. Output
+ * `<LV|MV|HV>_EU_input` : Exists for RE and BA node types.
+ This is the actual EU value the network can give the node. Input
+
+The reason the LV|MV|HV type is prepended to meta data is because some machine
+could require several supplies to work.
+This way the supplies are separated per network.
diff --git a/technic/init.lua b/technic/init.lua
index 4464082..0d97319 100644
--- a/technic/init.lua
+++ b/technic/init.lua
@@ -5,7 +5,7 @@
local load_start = os.clock()
technic = rawget(_G, "technic") or {}
-technic.creative_mode = minetest.setting_getbool("creative_mode")
+technic.creative_mode = minetest.settings:get_bool("creative_mode")
local modpath = minetest.get_modpath("technic")
@@ -47,7 +47,7 @@ dofile(modpath.."/tools/init.lua")
-- Aliases for legacy node/item names
dofile(modpath.."/legacy.lua")
-if minetest.setting_getbool("log_mods") then
+if minetest.settings:get_bool("log_mods") then
print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start))
end
diff --git a/technic/machines/HV/forcefield.lua b/technic/machines/HV/forcefield.lua
index 3bb8d03..157dc33 100644
--- a/technic/machines/HV/forcefield.lua
+++ b/technic/machines/HV/forcefield.lua
@@ -17,9 +17,9 @@ local cable_entry = "^technic_cable_connection_overlay.png"
minetest.register_craft({
output = "technic:forcefield_emitter_off",
recipe = {
- {"default:mese", "technic:motor", "default:mese" },
- {"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"},
- {"default:mese", "technic:hv_cable", "default:mese" },
+ {"default:mese", "technic:motor", "default:mese" },
+ {"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"},
+ {"default:mese", "technic:hv_cable", "default:mese" },
}
})
@@ -170,44 +170,68 @@ local digiline_def = {
if channel ~= meta:get_string("channel") then
return
end
- msg = msg:lower()
- if msg == "get" then
+ local msgt = type(msg)
+ if msgt == "string" then
+ local smsg = msg:lower()
+ msg = {}
+ if smsg == "get" then
+ msg.command = "get"
+ elseif smsg == "off" then
+ msg.command = "off"
+ elseif smsg == "on" then
+ msg.command = "on"
+ elseif smsg == "toggle" then
+ msg.command = "toggle"
+ elseif smsg:sub(1, 5) == "range" then
+ msg.command = "range"
+ msg.value = tonumber(smsg:sub(7))
+ elseif smsg:sub(1, 5) == "shape" then
+ msg.command = "shape"
+ msg.value = smsg:sub(7):lower()
+ msg.value = tonumber(msg.value) or msg.value
+ end
+ elseif msgt ~= "table" then
+ return
+ end
+ if msg.command == "get" then
digilines.receptor_send(pos, digilines.rules.default, channel, {
enabled = meta:get_int("enabled"),
range = meta:get_int("range"),
shape = meta:get_int("shape")
})
return
- elseif msg == "off" then
+ elseif msg.command == "off" then
meta:set_int("enabled", 0)
- elseif msg == "on" then
+ elseif msg.command == "on" then
meta:set_int("enabled", 1)
- elseif msg == "toggle" then
+ elseif msg.command == "toggle" then
local onn = meta:get_int("enabled")
onn = 1-onn -- Mirror onn with pivot 0.5, so switch between 1 and 0.
meta:set_int("enabled", onn)
- elseif msg:sub(1, 5) == "range" then
- local range = tonumber(msg:sub(7))
- if not range then
+ elseif msg.command == "range" then
+ if type(msg.value) ~= "number" then
return
end
- range = math.max(range, 5)
- range = math.min(range, 20)
+ msg.value = math.max(msg.value, 5)
+ msg.value = math.min(msg.value, 20)
update_forcefield(pos, meta, false)
- meta:set_int("range", range)
- elseif msg:sub(1, 5) == "shape" then
- local shape = msg:sub(7):lower()
- if shape == "sphere" then
- shape = 0
- elseif shape == "cube" then
- shape = 1
+ meta:set_int("range", msg.value)
+ elseif msg.command == "shape" then
+ local valuet = type(msg.value)
+ if valuet == "string" then
+ if msg.value == "sphere" then
+ msg.value = 0
+ elseif msg.value == "cube" then
+ msg.value = 1
+ end
+ elseif valuet ~= "number" then
+ return
end
- shape = tonumber(shape)
- if not shape then
+ if not msg.value then
return
end
update_forcefield(pos, meta, false)
- meta:set_int("shape", shape)
+ meta:set_int("shape", msg.value)
else
return
end
@@ -219,7 +243,8 @@ local digiline_def = {
local function run(pos, node)
local meta = minetest.get_meta(pos)
local eu_input = meta:get_int("HV_EU_input")
- local enabled = meta:get_int("enabled") ~= 0 and (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0)
+ local enabled = meta:get_int("enabled") ~= 0 and
+ (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0)
local machine_name = S("%s Forcefield Emitter"):format("HV")
local range = meta:get_int("range")
@@ -315,6 +340,10 @@ minetest.register_node("technic:forcefield_emitter_on", {
update_forcefield(pos, meta, false)
technic.swap_node(pos, "technic:forcefield_emitter_off")
end,
+ on_blast = function(pos, intensity)
+ minetest.dig_node(pos)
+ return {"technic:forcefield_emitter_off"}
+ end,
})
minetest.register_node("technic:forcefield", {
@@ -323,7 +352,7 @@ minetest.register_node("technic:forcefield", {
drawtype = "glasslike",
groups = {not_in_creative_inventory=1},
paramtype = "light",
- light_source = 15,
+ light_source = default.LIGHT_MAX,
diggable = false,
drop = '',
tiles = {{
@@ -335,6 +364,8 @@ minetest.register_node("technic:forcefield", {
length = 1.0,
},
}},
+ on_blast = function(pos, intensity)
+ end,
})
diff --git a/technic/machines/HV/nuclear_reactor.lua b/technic/machines/HV/nuclear_reactor.lua
index 7338d28..3377710 100644
--- a/technic/machines/HV/nuclear_reactor.lua
+++ b/technic/machines/HV/nuclear_reactor.lua
@@ -12,6 +12,8 @@ intact the reactor will melt down!
local burn_ticks = 7 * 24 * 60 * 60 -- Seconds
local power_supply = 100000 -- EUs
local fuel_type = "technic:uranium_fuel" -- The reactor burns this
+local digiline_meltdown = technic.config:get_bool("enable_nuclear_reactor_digiline_selfdestruct")
+local digiline_remote_path = minetest.get_modpath("digiline_remote")
local S = technic.getter
@@ -28,12 +30,26 @@ minetest.register_craft({
}
})
-local reactor_formspec =
- "invsize[8,9;]"..
+local function make_reactor_formspec(meta)
+ local f = "size[8,9]"..
"label[0,0;"..S("Nuclear Reactor Rod Compartment").."]"..
"list[current_name;src;2,1;3,2;]"..
"list[current_player;main;0,5;8,4;]"..
- "listring[]"
+ "listring[]"..
+ "button[5.5,1.5;2,1;start;Start]"..
+ "checkbox[5.5,2.5;autostart;automatic Start;"..meta:get_string("autostart").."]"
+ if not digiline_remote_path then
+ return f
+ end
+ local digiline_enabled = meta:get_string("enable_digiline")
+ f = f.."checkbox[0.5,2.8;enable_digiline;Enable Digiline;"..digiline_enabled.."]"
+ if digiline_enabled ~= "true" then
+ return f
+ end
+ return f..
+ "button_exit[4.6,3.69;2,1;save;Save]"..
+ "field[1,4;4,1;remote_channel;Digiline Remote Channel;${remote_channel}]"
+end
local SS_OFF = 0
local SS_DANGER = 1
@@ -196,7 +212,37 @@ end
local function melt_down_reactor(pos)
minetest.log("action", "A reactor melted down at "..minetest.pos_to_string(pos))
- minetest.set_node(pos, {name="technic:corium_source"})
+ minetest.set_node(pos, {name = "technic:corium_source"})
+end
+
+
+local function start_reactor(pos, meta)
+ if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then
+ return false
+ end
+ local inv = meta:get_inventory()
+ if inv:is_empty("src") then
+ return false
+ end
+ local src_list = inv:get_list("src")
+ local correct_fuel_count = 0
+ for _, src_stack in pairs(src_list) do
+ if src_stack and src_stack:get_name() == fuel_type then
+ correct_fuel_count = correct_fuel_count + 1
+ end
+ end
+ -- Check that the reactor is complete and has the correct fuel
+ if correct_fuel_count ~= 6 or reactor_structure_badness(pos) ~= 0 then
+ return false
+ end
+ meta:set_int("burn_time", 1)
+ technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
+ meta:set_int("HV_EU_supply", power_supply)
+ for idx, src_stack in pairs(src_list) do
+ src_stack:take_item()
+ inv:set_stack("src", idx, src_stack)
+ end
+ return true
end
@@ -229,27 +275,13 @@ minetest.register_abm({
local function run(pos, node)
local meta = minetest.get_meta(pos)
local burn_time = meta:get_int("burn_time") or 0
-
if burn_time >= burn_ticks or burn_time == 0 then
- local inv = meta:get_inventory()
- if not inv:is_empty("src") then
- local src_list = inv:get_list("src")
- local correct_fuel_count = 0
- for _, src_stack in pairs(src_list) do
- if src_stack and src_stack:get_name() == fuel_type then
- correct_fuel_count = correct_fuel_count + 1
- end
- end
- -- Check that the reactor is complete and has the correct fuel
- if correct_fuel_count == 6 and
- reactor_structure_badness(pos) == 0 then
- meta:set_int("burn_time", 1)
- technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
- meta:set_int("HV_EU_supply", power_supply)
- for idx, src_stack in pairs(src_list) do
- src_stack:take_item()
- inv:set_stack("src", idx, src_stack)
- end
+ if digiline_remote_path and meta:get_int("HV_EU_supply") == power_supply then
+ digiline_remote.send_to_node(pos, meta:get_string("remote_channel"),
+ "fuel used", 6, true)
+ end
+ if meta:get_string("autostart") == "true" then
+ if start_reactor(pos, meta) then
return
end
end
@@ -268,6 +300,100 @@ local function run(pos, node)
end
end
+local nuclear_reactor_receive_fields = function(pos, formname, fields, sender)
+ local player_name = sender:get_player_name()
+ if minetest.is_protected(pos, player_name) then
+ minetest.chat_send_player(player_name, "You are not allowed to edit this!")
+ minetest.record_protection_violation(pos, player_name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ local update_formspec = false
+ if fields.remote_channel then
+ meta:set_string("remote_channel", fields.remote_channel)
+ end
+ if fields.start then
+ local b = start_reactor(pos, meta)
+ if b then
+ minetest.chat_send_player(player_name, "Start successful")
+ else
+ minetest.chat_send_player(player_name, "Error")
+ end
+ end
+ if fields.autostart then
+ meta:set_string("autostart", fields.autostart)
+ update_formspec = true
+ end
+ if fields.enable_digiline then
+ meta:set_string("enable_digiline", fields.enable_digiline)
+ update_formspec = true
+ end
+ if update_formspec then
+ meta:set_string("formspec", make_reactor_formspec(meta))
+ end
+end
+
+local digiline_remote_def = function(pos, channel, msg)
+ local meta = minetest.get_meta(pos)
+ if meta:get_string("enable_digiline") ~= "true" or
+ channel ~= meta:get_string("remote_channel") then
+ return
+ end
+ -- Convert string messages to tables:
+ local msgt = type(msg)
+ if msgt == "string" then
+ local smsg = msg:lower()
+ msg = {}
+ if smsg == "get" then
+ msg.command = "get"
+ elseif smsg:sub(1, 13) == "self_destruct" then
+ msg.command = "self_destruct"
+ msg.timer = tonumber(smsg:sub(15)) or 0
+ elseif smsg == "start" then
+ msg.command = "start"
+ end
+ elseif msgt ~= "table" then
+ return
+ end
+
+ if msg.command == "get" then
+ local inv = meta:get_inventory()
+ local invtable = {}
+ for i = 1, 6 do
+ local stack = inv:get_stack("src", i)
+ if stack:is_empty() then
+ invtable[i] = 0
+ elseif stack:get_name() == fuel_type then
+ invtable[i] = stack:get_count()
+ else
+ invtable[i] = -stack:get_count()
+ end
+ end
+ digiline_remote.send_to_node(pos, channel, {
+ burn_time = meta:get_int("burn_time"),
+ enabled = meta:get_int("HV_EU_supply") == power_supply,
+ siren = meta:get_int("siren") == 1,
+ structure_accumulated_badness = meta:get_int("structure_accumulated_badness"),
+ rods = invtable
+ }, 6, true)
+ elseif digiline_meltdown and msg.command == "self_destruct" and
+ minetest.get_node(pos).name == "technic:hv_nuclear_reactor_core_active" then
+ if msg.timer ~= 0 and type(msg.timer) == "number" then
+ siren_danger(pos, meta)
+ minetest.after(msg.timer, melt_down_reactor, pos)
+ else
+ melt_down_reactor(pos)
+ end
+ elseif msg.command == "start" then
+ local b = start_reactor(pos, meta)
+ if b then
+ digiline_remote.send_to_node(pos, channel, "Start successful", 6, true)
+ else
+ digiline_remote.send_to_node(pos, channel, "Error", 6, true)
+ end
+ end
+end
+
minetest.register_node("technic:hv_nuclear_reactor_core", {
description = reactor_desc,
tiles = {
@@ -276,19 +402,25 @@ minetest.register_node("technic:hv_nuclear_reactor_core", {
},
drawtype = "mesh",
mesh = "technic_reactor.obj",
- groups = {cracky=1, technic_machine=1, technic_hv=1},
+ groups = {cracky = 1, technic_machine = 1, technic_hv = 1, digiline_remote_receive = 1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
paramtype = "light",
paramtype2 = "facedir",
stack_max = 1,
+ on_receive_fields = nuclear_reactor_receive_fields,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", reactor_desc)
- meta:set_string("formspec", reactor_formspec)
+ meta:set_string("formspec", make_reactor_formspec(meta))
+ if digiline_remote_path then
+ meta:set_string("remote_channel",
+ "nucelear_reactor"..minetest.pos_to_string(pos))
+ end
local inv = meta:get_inventory()
inv:set_size("src", 6)
end,
+ _on_digiline_remote_receive = digiline_remote_def,
can_dig = technic.machine_can_dig,
on_destruct = function(pos) siren_set_state(pos, SS_OFF) end,
allow_metadata_inventory_put = technic.machine_inventory_put,
@@ -304,14 +436,16 @@ minetest.register_node("technic:hv_nuclear_reactor_core_active", {
},
drawtype = "mesh",
mesh = "technic_reactor.obj",
- groups = {cracky=1, technic_machine=1, technic_hv=1,
- radioactive=4, not_in_creative_inventory=1},
+ groups = {cracky = 1, technic_machine = 1, technic_hv = 1, radioactive = 4,
+ not_in_creative_inventory = 1, digiline_remote_receive = 1},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
drop = "technic:hv_nuclear_reactor_core",
light_source = 14,
paramtype = "light",
paramtype2 = "facedir",
+ on_receive_fields = nuclear_reactor_receive_fields,
+ _on_digiline_remote_receive = digiline_remote_def,
can_dig = technic.machine_can_dig,
after_dig_node = melt_down_reactor,
on_destruct = function(pos) siren_set_state(pos, SS_OFF) end,
diff --git a/technic/machines/other/frames.lua b/technic/machines/other/frames.lua
index 2d630a2..5459289 100644
--- a/technic/machines/other/frames.lua
+++ b/technic/machines/other/frames.lua
@@ -3,7 +3,7 @@ local S = technic.getter
frames = {}
-local infinite_stacks = minetest.setting_getbool("creative_mode") and minetest.get_modpath("unified_inventory") == nil
+local infinite_stacks = minetest.settings:get_bool("creative_mode") and minetest.get_modpath("unified_inventory") == nil
local frames_pos = {}
diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua
index c04875b..84e992c 100644
--- a/technic/machines/register/battery_box.lua
+++ b/technic/machines/register/battery_box.lua
@@ -12,12 +12,59 @@ technic.register_power_tool("technic:red_energy_crystal", 50000)
technic.register_power_tool("technic:green_energy_crystal", 150000)
technic.register_power_tool("technic:blue_energy_crystal", 450000)
+-- Battery recipes:
+-- Tin-copper recipe:
minetest.register_craft({
- output = 'technic:battery',
+ output = "technic:battery",
recipe = {
- {'group:wood', 'default:copper_ingot', 'group:wood'},
- {'group:wood', 'moreores:tin_ingot', 'group:wood'},
- {'group:wood', 'default:copper_ingot', 'group:wood'},
+ {"group:wood", "default:copper_ingot", "group:wood"},
+ {"group:wood", "moreores:tin_ingot", "group:wood"},
+ {"group:wood", "default:copper_ingot", "group:wood"},
+ }
+})
+-- Sulfur-lead-water recipes:
+-- With sulfur lumps:
+-- With water:
+minetest.register_craft({
+ output = "technic:battery",
+ recipe = {
+ {"group:wood", "technic:sulfur_lump", "group:wood"},
+ {"technic:lead_ingot", "bucket:bucket_water", "technic:lead_ingot"},
+ {"group:wood", "technic:sulfur_lump", "group:wood"},
+ },
+ replacements = {
+ {"bucket:bucket_water", "bucket:bucket_empty"}
+ }
+})
+-- With oil extract:
+minetest.register_craft({
+ output = "technic:battery",
+ recipe = {
+ {"group:wood", "technic:sulfur_lump", "group:wood"},
+ {"technic:lead_ingot", "homedecor:oil_extract", "technic:lead_ingot"},
+ {"group:wood", "technic:sulfur_lump", "group:wood"},
+ }
+})
+-- With sulfur dust:
+-- With water:
+minetest.register_craft({
+ output = "technic:battery",
+ recipe = {
+ {"group:wood", "technic:sulfur_dust", "group:wood"},
+ {"technic:lead_ingot", "bucket:bucket_water", "technic:lead_ingot"},
+ {"group:wood", "technic:sulfur_dust", "group:wood"},
+ },
+ replacements = {
+ {"bucket:bucket_water", "bucket:bucket_empty"}
+ }
+})
+-- With oil extract:
+minetest.register_craft({
+ output = "technic:battery",
+ recipe = {
+ {"group:wood", "technic:sulfur_dust", "group:wood"},
+ {"technic:lead_ingot", "homedecor:oil_extract", "technic:lead_ingot"},
+ {"group:wood", "technic:sulfur_dust", "group:wood"},
}
})
@@ -35,26 +82,38 @@ minetest.register_tool("technic:battery", {
}
})
+-- x+2 + (z+2)*2
+local dirtab = {
+ [4] = 2,
+ [5] = 3,
+ [7] = 1,
+ [8] = 0
+}
+
local tube = {
insert_object = function(pos, node, stack, direction)
- if direction.y == 0 then
+ print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2)
+ if direction.y == 1
+ or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then
return stack
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
- if direction.y > 0 then
+ if direction.y == 0 then
return inv:add_item("src", stack)
else
return inv:add_item("dst", stack)
end
end,
can_insert = function(pos, node, stack, direction)
- if direction.y == 0 then
+ print(minetest.pos_to_string(direction), dirtab[direction.x+2+(direction.z+2)*2], node.param2)
+ if direction.y == 1
+ or (direction.y == 0 and dirtab[direction.x+2+(direction.z+2)*2] == node.param2) then
return false
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
- if direction.y > 0 then
+ if direction.y == 0 then
if meta:get_int("split_src_stacks") == 1 then
stack = stack:peek_item(1)
end
@@ -66,7 +125,7 @@ local tube = {
return inv:room_for_item("dst", stack)
end
end,
- connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
+ connect_sides = {left=1, right=1, back=1, top=1},
}
local function add_on_off_buttons(meta, ltier, charge_percent)
@@ -219,13 +278,12 @@ function technic.register_battery_box(data)
local top_tex = "technic_"..ltier.."_battery_box_top.png"..tube_entry
local front_tex = "technic_"..ltier.."_battery_box_front.png^technic_power_meter"..i..".png"
local side_tex = "technic_"..ltier.."_battery_box_side.png"..tube_entry
- local bottom_tex = "technic_"..ltier.."_battery_box_bottom.png"..tube_entry
+ local bottom_tex = "technic_"..ltier.."_battery_box_bottom.png"..cable_entry
if ltier == "lv" then
top_tex = "technic_"..ltier.."_battery_box_top.png"
front_tex = "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"
side_tex = "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"
- bottom_tex = "technic_"..ltier.."_battery_box_bottom.png"..cable_entry
end
minetest.register_node("technic:"..ltier.."_battery_box"..i, {
@@ -271,6 +329,7 @@ function technic.register_battery_box(data)
allow_metadata_inventory_take = technic.machine_inventory_take,
allow_metadata_inventory_move = technic.machine_inventory_move,
technic_run = run,
+ on_rotate = screwdriver.rotate_simple,
after_place_node = data.tube and pipeworks.after_place,
after_dig_node = technic.machine_after_dig_node,
on_receive_fields = function(pos, formname, fields, sender)
diff --git a/technic/machines/register/cables.lua b/technic/machines/register/cables.lua
index d65c399..1e8cee9 100644
--- a/technic/machines/register/cables.lua
+++ b/technic/machines/register/cables.lua
@@ -203,12 +203,31 @@ function technic.register_cable(tier, size)
def.on_place = function(itemstack, placer, pointed_thing)
local pointed_thing_diff = vector.subtract(pointed_thing.above, pointed_thing.under)
local num
+ local changed
for k, v in pairs(pointed_thing_diff) do
if v ~= 0 then
+ changed = k
num = xyz[s(tostring(v):sub(-2, -2)..k)]
break
end
end
+ local crtl = placer:get_player_control()
+ if (crtl.aux1 or crtl.sneak) and not (crtl.aux1 and crtl.sneak) then
+ local fine_pointed = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
+ fine_pointed = vector.subtract(fine_pointed, pointed_thing.above)
+ fine_pointed[changed] = nil
+ local ps = {}
+ for p, _ in pairs(fine_pointed) do
+ ps[#ps+1] = p
+ end
+ local bigger = (math.abs(fine_pointed[ps[1]]) > math.abs(fine_pointed[ps[2]]) and ps[1]) or ps[2]
+ if math.abs(fine_pointed[bigger]) < 0.3 then
+ num = num + 3
+ num = (num <= 6 and num) or num - 6
+ else
+ num = xyz[((fine_pointed[bigger] < 0 and "-") or "") .. bigger]
+ end
+ end
minetest.set_node(pointed_thing.above, {name = "technic:"..ltier.."_cable_plate_"..num})
if not (creative and creative.is_enabled_for(placer)) then
itemstack:take_item()
@@ -218,6 +237,19 @@ function technic.register_cable(tier, size)
else
def.groups.not_in_creative_inventory = 1
end
+ def.on_rotate = function(pos, node, user, mode, new_param2)
+ local dir = 0
+ if mode == screwdriver.ROTATE_FACE then -- left-click
+ dir = 1
+ elseif mode == screwdriver.ROTATE_AXIS then -- right-click
+ dir = -1
+ end
+ local num = tonumber(node.name:sub(-1))
+ num = num + dir
+ num = (num >= 1 and num) or num + 6
+ num = (num <= 6 and num) or num - 6
+ minetest.swap_node(pos, {name = "technic:"..ltier.."_cable_plate_"..num})
+ end
minetest.register_node("technic:"..ltier.."_cable_plate_"..i, def)
cable_tier["technic:"..ltier.."_cable_plate_"..i] = tier
end
diff --git a/technic/machines/switching_station.lua b/technic/machines/switching_station.lua
index 9c6f32c..40b40e7 100644
--- a/technic/machines/switching_station.lua
+++ b/technic/machines/switching_station.lua
@@ -1,35 +1,4 @@
--- SWITCHING STATION
--- The switching station is the center of all power distribution on an electric network.
---
--- The station collects power from sources (PR), distributes it to sinks (RE),
--- and uses the excess/shortfall to charge and discharge batteries (BA).
---
--- For now, all supply and demand values are expressed in kW.
---
--- It works like this:
--- All PR,BA,RE nodes are indexed and tagged with the switching station.
--- The tagging is to allow more stations to be built without allowing a cheat
--- with duplicating power.
--- All the RE nodes are queried for their current EU demand. Those which are off
--- would require no or a small standby EU demand, while those which are on would
--- require more.
--- If the total demand is less than the available power they are all updated with the
--- demand number.
--- If any surplus exists from the PR nodes the batteries will be charged evenly with this.
--- If the total demand requires draw on the batteries they will be discharged evenly.
---
--- If the total demand is more than the available power all RE nodes will be shut down.
--- We have a brown-out situation.
---
--- Hence all the power distribution logic resides in this single node.
---
--- Nodes connected to the network will have one or more of these parameters as meta data:
--- <LV|MV|HV>_EU_supply : Exists for PR and BA node types. This is the EU value supplied by the node. Output
--- <LV|MV|HV>_EU_demand : Exists for RE and BA node types. This is the EU value the node requires to run. Output
--- <LV|MV|HV>_EU_input : Exists for RE and BA node types. This is the actual EU value the network can give the node. Input
---
--- The reason the LV|MV|HV type is prepended toe meta data is because some machine could require several supplies to work.
--- This way the supplies are separated per network.
+-- See also technic/doc/api.md
technic.networks = {}
technic.cables = {}
diff --git a/technic/radiation.lua b/technic/radiation.lua
index 6a93483..722b0ac 100644
--- a/technic/radiation.lua
+++ b/technic/radiation.lua
@@ -344,7 +344,7 @@ local function dmg_abm(pos, node)
end
end
-if minetest.setting_getbool("enable_damage") then
+if minetest.settings:get_bool("enable_damage") then
minetest.register_abm({
label = "Radiation damage",
nodenames = {"group:radioactive"},
@@ -384,7 +384,7 @@ for _, state in pairs({"flowing", "source"}) do
minetest.register_node("technic:corium_"..state, {
description = S(state == "source" and "Corium Source" or "Flowing Corium"),
drawtype = (state == "source" and "liquid" or "flowingliquid"),
- [state == "source" and "tiles" or "special_tiles"] = {{
+ tiles = {{
name = "technic_corium_"..state.."_animated.png",
animation = {
type = "vertical_frames",
@@ -393,6 +393,28 @@ for _, state in pairs({"flowing", "source"}) do
length = 3.0,
},
}},
+ special_tiles = {
+ {
+ name = "technic_corium_"..state.."_animated.png",
+ backface_culling = false,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 3.0,
+ },
+ },
+ {
+ name = "technic_corium_"..state.."_animated.png",
+ backface_culling = true,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 3.0,
+ },
+ },
+ },
paramtype = "light",
paramtype2 = (state == "flowing" and "flowingliquid" or nil),
light_source = (state == "source" and 8 or 5),
diff --git a/technic/tools/vacuum.lua b/technic/tools/vacuum.lua
index f5fac9a..037f3bb 100644
--- a/technic/tools/vacuum.lua
+++ b/technic/tools/vacuum.lua
@@ -26,7 +26,7 @@ minetest.register_tool("technic:vacuum", {
end
local pos = user:getpos()
local inv = user:get_inventory()
- for _, object in ipairs(minetest.env:get_objects_inside_radius(pos, vacuum_range)) do
+ for _, object in ipairs(minetest.get_objects_inside_radius(pos, vacuum_range)) do
local luaentity = object:get_luaentity()
if not object:is_player() and luaentity and luaentity.name == "__builtin:item" and luaentity.itemstring ~= "" then
if inv and inv:room_for_item("main", ItemStack(luaentity.itemstring)) then