0375cb1480
Quarry now digs nodes like a player. Additionally, some possible causes for crashes are fixed. E.g. the `inv` in the `after_dig_node` callbacks were not guaranteed to exist. Please note that TA4 batteries that were dug before this change are considered as full.
177 lines
5.1 KiB
Lua
177 lines
5.1 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2019-2020 Joachim Stolberg
|
|
Copyright (C) 2020 Thomas S.
|
|
|
|
GPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
Electricity powered battery for Digtron
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local M = minetest.get_meta
|
|
local S = techage.S
|
|
|
|
-- Consumer Related Data
|
|
local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end
|
|
local power = techage.power
|
|
|
|
local STANDBY_TICKS = 3
|
|
local COUNTDOWN_TICKS = 4
|
|
local CYCLE_TIME = 4
|
|
local INV_SIZE = 4
|
|
local FUEL = "default:coal_lump"
|
|
local FUEL_STACK_MAX = ItemStack(FUEL):get_stack_max()
|
|
local TOTAL_MAX = INV_SIZE * FUEL_STACK_MAX
|
|
|
|
local function count_coal(metadata)
|
|
local total = 0
|
|
for _,stack in pairs(metadata.inventory.fuel) do
|
|
total = total + stack:get_count()
|
|
end
|
|
return total
|
|
end
|
|
|
|
local function formspec(self, pos, nvm)
|
|
local meta = M(pos):to_table()
|
|
local total = 0
|
|
if meta.inventory then
|
|
total = count_coal(meta)
|
|
end
|
|
return "size[5,4]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"box[0,-0.1;4.8,0.5;#c6e8ff]"..
|
|
"label[1,-0.1;"..minetest.colorize("#000000", S("Digtron Battery")).."]"..
|
|
power.formspec_label_bar(0, 0.8, S("Load"), TOTAL_MAX, total, S("Coal Equivalents"))..
|
|
"image_button[2.6,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]"..
|
|
"tooltip[2.6,2;1,1;"..self:get_state_tooltip(nvm).."]"..
|
|
"image[3.75,2;1,1;"..techage.get_power_image(pos, nvm).."]"
|
|
end
|
|
|
|
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
|
return 0
|
|
end
|
|
|
|
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
|
return 0
|
|
end
|
|
|
|
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
|
return 0
|
|
end
|
|
|
|
local function produce_coal(pos, crd, nvm, inv)
|
|
local stack = ItemStack(FUEL)
|
|
if inv:room_for_item("fuel", stack) then
|
|
inv:add_item("fuel", stack)
|
|
crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS)
|
|
else
|
|
crd.State:idle(pos, nvm)
|
|
end
|
|
end
|
|
|
|
local function keep_running(pos, elapsed)
|
|
local nvm = techage.get_nvm(pos)
|
|
local crd = CRD(pos)
|
|
local inv = M(pos):get_inventory()
|
|
produce_coal(pos, crd, nvm, inv)
|
|
|
|
if techage.is_activeformspec(pos) then
|
|
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm))
|
|
end
|
|
end
|
|
|
|
local function on_receive_fields(pos, formname, fields, player)
|
|
if minetest.is_protected(pos, player:get_player_name()) then
|
|
return
|
|
end
|
|
local nvm = techage.get_nvm(pos)
|
|
CRD(pos).State:state_button_event(pos, nvm, fields)
|
|
end
|
|
|
|
|
|
local tiles = {}
|
|
-- '#' will be replaced by the stage number
|
|
-- '{power}' will be replaced by the power PNG
|
|
|
|
tiles = {
|
|
-- up, down, right, left, back, front
|
|
"digtron_plate.png^digtron_core.png",
|
|
"digtron_plate.png^digtron_core.png",
|
|
"digtron_plate.png^digtron_battery.png",
|
|
"digtron_plate.png^digtron_battery.png",
|
|
"digtron_plate.png^digtron_battery.png",
|
|
"digtron_plate.png^digtron_battery.png",
|
|
}
|
|
|
|
local tubing = {
|
|
on_recv_message = function(pos, src, topic, payload)
|
|
return CRD(pos).State:on_receive_message(pos, topic, payload)
|
|
end,
|
|
}
|
|
|
|
local node_name_ta2, node_name_ta3, node_name_ta4 =
|
|
techage.register_consumer("digtron_battery", S("Digtron Battery"), { act = tiles, pas = tiles }, {
|
|
drawtype = "normal",
|
|
paramtype = "light",
|
|
cycle_time = CYCLE_TIME,
|
|
standby_ticks = STANDBY_TICKS,
|
|
formspec = formspec,
|
|
tubing = tubing,
|
|
after_place_node = function(pos, placer, itemstack)
|
|
local inv = M(pos):get_inventory()
|
|
inv:set_size('fuel', INV_SIZE)
|
|
if itemstack then
|
|
local stack_meta = itemstack:get_meta()
|
|
if stack_meta then
|
|
local coal_amount = techage.in_range(stack_meta:get_int("coal"), 0, TOTAL_MAX)
|
|
while coal_amount > 0 do
|
|
local amount = math.min(coal_amount, FUEL_STACK_MAX)
|
|
inv:add_item("fuel", ItemStack(FUEL.." "..amount))
|
|
coal_amount = coal_amount - amount;
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
preserve_metadata = function(pos, oldnode, oldmetadata, drops)
|
|
local metadata = M(pos):to_table()
|
|
if metadata.inventory then
|
|
local total = count_coal(metadata)
|
|
local meta = drops[1]:get_meta()
|
|
meta:set_int("coal", total)
|
|
local text = S("Digtron Battery").." ("..math.floor(total/TOTAL_MAX * 100).." %)"
|
|
meta:set_string("description", text)
|
|
end
|
|
end,
|
|
on_rightclick = function(pos, node, clicker)
|
|
techage.set_activeformspec(pos, clicker)
|
|
local nvm = techage.get_nvm(pos)
|
|
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm))
|
|
end,
|
|
node_timer = keep_running,
|
|
on_receive_fields = on_receive_fields,
|
|
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
|
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
|
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
|
groups = {choppy=2, cracky=2, crumbly=2, digtron=5},
|
|
sounds = default.node_sound_wood_defaults(),
|
|
power_consumption = {0,25,25,25},
|
|
power_sides = techage.networks.AllSides,
|
|
}, {false, false, true, false})
|
|
|
|
minetest.register_craft({
|
|
output = node_name_ta3,
|
|
recipe = {
|
|
{"group:wood", "default:copper_ingot", "group:wood"},
|
|
{"techage:electric_cableS", "default:tin_ingot", "digtron:digtron_core"},
|
|
{"group:wood", "default:copper_ingot", "group:wood"},
|
|
},
|
|
})
|