add initial support for tapping technic power cables

This commit is contained in:
FaceDeer 2017-10-12 03:06:24 -06:00
parent a44f517a4e
commit 65f5ac8520
5 changed files with 130 additions and 11 deletions

@ -36,7 +36,8 @@ function DigtronLayout.create(pos, player)
self.all = {}
self.inventories = {}
self.fuelstores = {}
self.battery_holders = {}
self.battery_holders = {} -- technic batteries
self.power_connectors = {} -- technic power cable
self.diggers = {}
self.builders = {}
self.extents = {}
@ -123,6 +124,8 @@ function DigtronLayout.create(pos, player)
table.insert(self.fuelstores, node_image)
elseif group_number == 7 then
table.insert(self.battery_holders, node_image)
elseif group_number == 8 then
table.insert(self.power_connectors, node_image)
end
if is_protected then
@ -320,6 +323,14 @@ function DigtronLayout.write_layout_image(self, player)
local old_meta = minetest.get_meta(oldpos)
local old_def = minetest.registered_nodes[old_node.name]
minetest.remove_node(oldpos)
for _, callback in ipairs(minetest.registered_on_dignodes) do
-- Copy pos and node because callback can modify them
local pos_copy = {x=oldpos.x, y=oldpos.y, z=oldpos.z}
local oldnode_copy = {name=old_node.name, param1=old_node.param1, param2=old_node.param2}
callback(pos_copy, oldnode_copy, player)
end
minetest.log("action", string.format("%s removes Digtron component %s at (%d, %d, %d)", player:get_player_name(), old_node.name, oldpos.x, oldpos.y, oldpos.z))
if old_def.after_dig_node ~= nil then
old_def.after_dig_node(oldpos, old_node, old_meta, player)
@ -329,10 +340,21 @@ function DigtronLayout.write_layout_image(self, player)
-- create the new one
for k, node_image in pairs(self.all) do
minetest.set_node(node_image.pos, node_image.node)
minetest.get_meta(node_image.pos):from_table(node_image.meta)
local new_pos = node_image.pos
local new_node = node_image.node
local old_node = minetest.get_node(new_pos)
minetest.set_node(new_pos, new_node)
minetest.get_meta(new_pos):from_table(node_image.meta)
minetest.log("action", string.format("%s adds Digtron component %s at (%d, %d, %d)", player:get_player_name(), node_image.node.name, node_image.pos.x, node_image.pos.y, node_image.pos.z))
for _, callback in ipairs(minetest.registered_on_placenodes) do
-- Copy pos and node because callback can modify them
local pos_copy = {x=new_pos.x, y=new_pos.y, z=new_pos.z}
local oldnode_copy = {name=old_node.name, param1=old_node.param1, param2=old_node.param2}
local newnode_copy = {name=new_node.name, param1=new_node.param1, param2=new_node.param2}
callback(pos_copy, newnode_copy, player, oldnode_copy)
end
local new_def = minetest.registered_nodes[node_image.node.name]
if new_def.after_place_node ~= nil then
new_def.after_place_node(node_image.pos, player)

@ -39,6 +39,8 @@ dofile( digtron_modpath .. "/nodes/node_axle.lua" ) -- Rotation controller
dofile( digtron_modpath .. "/nodes/node_crate.lua" ) -- Digtron portability support
dofile( digtron_modpath .. "/nodes/recipes.lua" )
dofile( digtron_modpath .. "/nodes/node_power_connector.lua")
dofile( digtron_modpath .. "/upgrades.lua" ) -- various LBMs for upgrading older versions of Digtron.
-- digtron group numbers:

@ -30,7 +30,16 @@ minetest.register_node("digtron:empty_crate", {
-- destroy everything. Note that this includes the empty crate, which will be bundled up with the layout.
for _, node_image in pairs(layout.all) do
minetest.remove_node(node_image.pos)
local old_pos = node_image.pos
local old_node = node_image.node
minetest.remove_node(old_pos)
for _, callback in ipairs(minetest.registered_on_dignodes) do
-- Copy pos and node because callback can modify them
local pos_copy = {x=old_pos.x, y=old_pos.y, z=old_pos.z}
local oldnode_copy = {name=old_node.name, param1=old_node.param1, param2=old_node.param2}
callback(pos_copy, oldnode_copy, clicker)
end
end
-- Create the loaded crate node

@ -0,0 +1,69 @@
-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")
local size = 3/16
local max_dig_cost = math.max(digtron.config.dig_cost_cracky, digtron.config.dig_cost_crumbly, digtron.config.dig_cost_choppy, digtron.config.dig_cost_default)
minetest.register_node("digtron:power_connector", {
description = S("DPC"),
_doc_items_longdesc = digtron.doc.power_connector_longdesc,
_doc_items_usagehelp = digtron.doc.power_connector_usagehelp,
groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 8, technic_machine=1, technic_hv=1},
tiles = {"digtron_plate.png"},
connect_sides = {"bottom", "top", "left", "right", "front", "back"},
drawtype = "nodebox",
sounds = digtron.metal_sounds,
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
-- node_box = {
-- type = "fixed",
-- fixed = {
-- {-0.5, 0.5, -0.5, 0.5, 0, 0.5}, -- NodeBox1
-- {-0.1875, 0, -0.1875, 0.1875, -0.5, 0.1875}, -- NodeBox2
-- {-0.3125, -0.0625, -0.3125, 0.3125, -0.1875, 0.3125}, -- NodeBox3
-- {-0.3125, -0.25, -0.3125, 0.3125, -0.375, 0.3125}, -- NodeBox4
-- }
-- },
connects_to = {"group:technic_hv_cable"},
node_box = {
type = "connected",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, -- NodeBox1
{-0.1875, 0, -0.1875, 0.1875, 0.5, 0.1875}, -- NodeBox2
{-0.3125, 0.0625, -0.3125, 0.3125, 0.1875, 0.3125}, -- NodeBox3
{-0.3125, 0.25, -0.3125, 0.3125, 0.375, 0.3125}, -- NodeBox4
},
connect_front = {-size, -size, -0.5, size, size, size}, -- z-
connect_back = {-size, -size, size, size, size, 0.5 }, -- z+
connect_left = {-0.5, -size, -size, size, size, size}, -- x-
connect_right = {-size, -size, -size, 0.5, size, size}, -- x+
},
technic_run = function(pos, node)
local meta = minetest.get_meta(pos)
local eu_input = meta:get_int("HV_EU_input")
local demand = meta:get_int("HV_EU_demand")
meta:set_string("infotext", S("Digtron Power @1/@2\nRight-click to update", eu_input, demand))
end,
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
local layout = DigtronLayout.create(pos, player)
local max_cost = 0
for _, node_image in pairs(layout.builders) do
max_cost = max_cost + digtron.config.build_cost
end
for _, node_image in pairs(layout.diggers) do
max_cost = max_cost + max_dig_cost
end
local meta = minetest.get_meta(pos)
meta:set_int("HV_EU_demand", max_cost * digtron.config.power_ratio)
end,
})
technic.register_machine("HV", "digtron:power_connector", technic.receiver)

@ -207,10 +207,25 @@ digtron.execute_dig_cycle = function(pos, clicker)
local test_fuel_needed = test_build_fuel_cost + digging_fuel_cost - fuel_burning
local test_fuel_burned = 0
if test_fuel_needed > 0 then
-- check for the available electrical power
test_fuel_burned = digtron.tap_batteries(layout.battery_holders, test_fuel_needed, true)
local power_from_cables = 0
if minetest.get_modpath("technic") then
local power_inputs = {}
for _, power_connector in pairs(layout.power_connectors) do
if power_connector.meta.fields.HV_network and power_connector.meta.fields.HV_EU_input then
power_inputs[power_connector.meta.fields.HV_network] = tonumber(power_connector.meta.fields.HV_EU_input)
end
end
for _, power in pairs(power_inputs) do
power_from_cables = power_from_cables + power
end
power_from_cables = power_from_cables / digtron.config.power_ratio
test_fuel_burned = power_from_cables
if test_fuel_needed - test_fuel_burned > 0 then
-- check for the available electrical power
test_fuel_burned = test_fuel_burned + digtron.tap_batteries(layout.battery_holders, test_fuel_needed, true)
end
end
if (test_fuel_needed < test_fuel_burned) then
exhaust = 0 -- all power needs met by electricity, don't blow smoke
@ -312,11 +327,13 @@ digtron.execute_dig_cycle = function(pos, clicker)
minetest.sound_play("buzzer", {gain=0.5, pos=pos})
status_text = S("Digtron unexpectedly failed to execute one or more build operations, likely due to an inventory error.") .. "\n"
end
local total_fuel_cost = math.max(digging_fuel_cost + building_fuel_cost - power_from_cables, 0)
-- actually burn the fuel needed
fuel_burning = fuel_burning - digging_fuel_cost
fuel_burning = fuel_burning - total_fuel_cost
if digtron.config.particle_effects and exhaust == 1 then
table.insert(particle_systems, burn_smoke(pos, digging_fuel_cost))
table.insert(particle_systems, burn_smoke(pos, total_fuel_cost))
end
if fuel_burning < 0 then
-- we tap into the batteries either way