built on 13/09/2020 13:24:06

This commit is contained in:
Joachim Stolberg 2020-09-13 13:24:06 +02:00
parent 323d160ccf
commit 553cedb06b
48 changed files with 775 additions and 268 deletions

View File

@ -116,4 +116,5 @@ History
2020-06-14 v1.06 API changed and chat command added 2020-06-14 v1.06 API changed and chat command added
2020-06-27 v1.07 Route storage and cart command bugfixes 2020-06-27 v1.07 Route storage and cart command bugfixes
2020-07-24 V1.08 Adapted to new techage ICTA style 2020-07-24 V1.08 Adapted to new techage ICTA style
2020-08-14 V1.09 Hopper support for digtron, protector:chest and default:furnace added

View File

@ -1,3 +1,4 @@
default default
carts carts
screwdriver
doc? doc?

View File

@ -13,7 +13,7 @@
minecart = {} minecart = {}
-- Version for compatibility checks, see readme.md/history -- Version for compatibility checks, see readme.md/history
minecart.version = 1.08 minecart.version = 1.09
minecart.hopper_enabled = minetest.settings:get_bool("minecart_hopper_enabled") ~= false minecart.hopper_enabled = minetest.settings:get_bool("minecart_hopper_enabled") ~= false
@ -31,6 +31,7 @@ dofile(MP.."/protection.lua")
if minecart.hopper_enabled then if minecart.hopper_enabled then
dofile(MP.."/hopper.lua") dofile(MP.."/hopper.lua")
dofile(MP.."/mods_support.lua")
end end
dofile(MP.."/doc.lua") dofile(MP.."/doc.lua")
minetest.log("info", "[MOD] Minecart loaded") minetest.log("info", "[MOD] Minecart loaded")

View File

@ -147,6 +147,8 @@ function minecart.take_items(pos, param2, num)
if def and inv and def.take_listname and (not def.allow_take or def.allow_take(npos, nil, owner)) then if def and inv and def.take_listname and (not def.allow_take or def.allow_take(npos, nil, owner)) then
return minecart.inv_take_items(inv, def.take_listname, num) return minecart.inv_take_items(inv, def.take_listname, num)
elseif def and def.take_item then
return def.take_item(npos, num, owner)
else else
local ndef = minetest.registered_nodes[node.name] local ndef = minetest.registered_nodes[node.name]
if ndef and ndef.minecart_hopper_takeitem then if ndef and ndef.minecart_hopper_takeitem then
@ -166,6 +168,8 @@ function minecart.put_items(pos, param2, stack)
if leftover:get_count() > 0 then if leftover:get_count() > 0 then
return leftover return leftover
end end
elseif def and def.put_item then
return def.put_item(npos, stack, owner)
elseif is_air_like(node.name) or check_cart_for_loading(npos) then elseif is_air_like(node.name) or check_cart_for_loading(npos) then
minetest.add_item(npos, stack) minetest.add_item(npos, stack)
else else
@ -191,8 +195,10 @@ function minecart.untake_items(pos, param2, stack)
local def = RegisteredInventories[node.name] local def = RegisteredInventories[node.name]
local inv = minetest.get_inventory({type="node", pos=npos}) local inv = minetest.get_inventory({type="node", pos=npos})
if def then if def and inv and def.put_listname then
return inv and inv:add_item(def.put_listname, stack) return inv:add_item(def.put_listname, stack)
elseif def and def.untake_item then
return def.untake_item(npos, stack)
else else
local ndef = minetest.registered_nodes[node.name] local ndef = minetest.registered_nodes[node.name]
if ndef and ndef.minecart_hopper_untakeitem then if ndef and ndef.minecart_hopper_untakeitem then
@ -230,6 +236,9 @@ function minecart.register_inventory(node_names, def)
put_listname = def.put and def.put.listname, put_listname = def.put and def.put.listname,
allow_take = def.take and def.take.allow_inventory_take, allow_take = def.take and def.take.allow_inventory_take,
take_listname = def.take and def.take.listname, take_listname = def.take and def.take.listname,
put_item = def.put and def.put.put_item,
take_item = def.take and def.take.take_item,
untake_item = def.take and def.take.untake_item,
} }
end end
end end
@ -272,32 +281,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return false return false
end) end)
minecart.register_inventory({"default:chest", "default:chest_open"}, {
put = {
listname = "main",
},
take = {
listname = "main",
},
})
minecart.register_inventory({"default:chest_locked", "default:chest_locked_open"}, {
put = {
allow_inventory_put = function(pos, stack, player_name)
local owner = M(pos):get_string("owner")
return owner == player_name
end,
listname = "main",
},
take = {
allow_inventory_take = function(pos, stack, player_name)
local owner = M(pos):get_string("owner")
return owner == player_name
end,
listname = "main",
},
})
minecart.register_inventory({"minecart:hopper"}, { minecart.register_inventory({"minecart:hopper"}, {
put = { put = {
allow_inventory_put = function(pos, stack, player_name) allow_inventory_put = function(pos, stack, player_name)

131
minecart/mods_support.lua Normal file
View File

@ -0,0 +1,131 @@
--[[
Minecart
========
Copyright (C) 2019-2020 Joachim Stolberg
MIT
See license.txt for more information
Wrapper functions to get hopper support for other mods
]]--
-- for lazy programmers
local M = minetest.get_meta
local CacheForFuelNodeNames = {}
local function is_fuel(stack)
local name = stack:get_name()
if CacheForFuelNodeNames[name] then
return true
end
if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then
CacheForFuelNodeNames[name] = true
end
return CacheForFuelNodeNames[name]
end
------------------------------------------------------------------------------
-- default
------------------------------------------------------------------------------
minecart.register_inventory({"default:chest", "default:chest_open"}, {
put = {
listname = "main",
},
take = {
listname = "main",
},
})
minecart.register_inventory({"default:chest_locked", "default:chest_locked_open"}, {
put = {
allow_inventory_put = function(pos, stack, player_name)
local owner = M(pos):get_string("owner")
return owner == player_name
end,
listname = "main",
},
take = {
allow_inventory_take = function(pos, stack, player_name)
local owner = M(pos):get_string("owner")
return owner == player_name
end,
listname = "main",
},
})
minecart.register_inventory({"default:furnace", "default:furnace_active"}, {
put = {
-- distinguish between fuel and other items
put_item = function(pos, stack, player_name)
local inv = minetest.get_inventory({type="node", pos=pos})
local listname = is_fuel(stack) and "fuel" or "src"
local leftover = inv:add_item(listname, stack)
minetest.get_node_timer(pos):start(1.0)
if leftover:get_count() > 0 then
return leftover
end
end,
},
take = {
-- fuel can't be taken
listname = "dst",
},
})
------------------------------------------------------------------------------
-- digtron
------------------------------------------------------------------------------
minecart.register_inventory({"digtron:inventory"}, {
put = {
listname = "main",
},
take = {
listname = "main",
},
})
minecart.register_inventory({"digtron:fuelstore"}, {
put = {
listname = "fuel",
},
take = {
listname = "fuel",
},
})
minecart.register_inventory({"digtron:combined_storage"}, {
put = {
-- distinguish between fuel and other items
put_item = function(pos, stack, player_name)
local inv = minetest.get_inventory({type="node", pos=pos})
local listname = is_fuel(stack) and "fuel" or "main"
local leftover = inv:add_item(listname, stack)
if leftover:get_count() > 0 then
return leftover
end
end,
},
take = {
-- fuel can't be taken
listname = "main",
},
})
------------------------------------------------------------------------------
-- protector
------------------------------------------------------------------------------
minecart.register_inventory({"protector:chest"}, {
put = {
listname = "main",
},
take = {
listname = "main",
},
})

View File

@ -32,18 +32,11 @@ function signs_bot.register_flower(name)
end end
minetest.after(1, function() minetest.after(1, function()
for name,_ in pairs(minetest.registered_decorations) do for _,def in pairs(minetest.registered_decorations) do
if type(name) == "string" then local name = def.decoration
if name and type(name) == "string" then
local mod = string.split(name, ":")[1] local mod = string.split(name, ":")[1]
if mod == "flowers" then if mod == "flowers" or mod == "bakedclay" then -- Bakedclay also registers flowers as decoration.
signs_bot.register_flower(name)
end
end
end
for name,ndef in pairs(minetest.registered_nodes) do
if type(name) == "string" then
local mod = string.split(name, ":")[1]
if mod == "flowers" then
signs_bot.register_flower(name) signs_bot.register_flower(name)
end end
end end

View File

@ -147,12 +147,13 @@ end
register_command("repeat", 1, register_command("repeat", 1,
function(base_pos, mem, cnt) function(base_pos, mem, cnt)
mem.Stack[#mem.Stack + 1] = cnt mem.Stack[#mem.Stack + 1] = tonumber(cnt)
mem.Stack[#mem.Stack + 1] = mem.pc + 1 mem.Stack[#mem.Stack + 1] = mem.pc + 1
return api.DONE return api.DONE
end, end,
function(cnt) function(cnt)
return cnt and cnt > 0 and cnt < 1000 cnt = tonumber(cnt) or 0
return cnt > 0 and cnt < 1000
end end
) )

View File

@ -9,7 +9,8 @@ if minetest.get_modpath("techage") then
local Cable = techage.ElectricCable local Cable = techage.ElectricCable
local power = techage.power local power = techage.power
signs_bot.register_inventory({"techage:chest_ta2", "techage:chest_ta3", "techage:chest_ta4"}, { signs_bot.register_inventory({"techage:chest_ta2", "techage:chest_ta3", "techage:chest_ta4",
"techage:ta3_silo", "techage:ta4_silo"}, {
allow_inventory_put = function(pos, stack, player_name) allow_inventory_put = function(pos, stack, player_name)
return not minetest.is_protected(pos, player_name) return not minetest.is_protected(pos, player_name)
end, end,
@ -61,7 +62,7 @@ if minetest.get_modpath("techage") then
and minetest.registered_nodes[node.name].on_ignite then and minetest.registered_nodes[node.name].on_ignite then
minetest.registered_nodes[node.name].on_ignite(pos) minetest.registered_nodes[node.name].on_ignite(pos)
end end
return true return signs_bot.DONE
end, end,
}) })

View File

@ -77,6 +77,21 @@ Available worlds will be converted to 'lsqlite3', but there is no way back, so:
### History ### History
**2020-09-13 V0.23**
- Pull request #26: Digtron Battery: Fix duplication bug (from Thomas-S)
- Improve ta4 sensor box
- Firebox: Add check for free space when placing the node
- Lua controller: Add 'get_gametime' function
- Pull request #27: Liquid Tanks: Add protection support (from Thomas-S)
- Fix pump issue (silo source items can disappear)
- Pull request #28: Quarry: Improve digging behaviour (from Thomas-S)
- Pull request #28: Battery: Store battery load as metadata (from Thomas-S)
- Pull request #29: Distributor: Keep item metadata (from Thomas-S)
**2020-08-08 V0.22**
- Pull request #25: Growlight: Improve flower registration (from Thomas-S)
- Add tube support for digtron chests and protector:chest
**2020-08-08 V0.21** **2020-08-08 V0.21**
- Pull request #18: Add a simple Digtron battery (from Thomas-S) - Pull request #18: Add a simple Digtron battery (from Thomas-S)
- Pull request #23: Lua Controller: Fix $item_description() documentation and translation (from Thomas-S) - Pull request #23: Lua Controller: Fix $item_description() documentation and translation (from Thomas-S)

View File

@ -233,6 +233,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState
on_rightclick = tNode.on_rightclick, on_rightclick = tNode.on_rightclick,
after_place_node = after_place_node, after_place_node = after_place_node,
after_dig_node = after_dig_node, after_dig_node = after_dig_node,
preserve_metadata = tNode.preserve_metadata,
tubelib2_on_update2 = tubelib2_on_update2, tubelib2_on_update2 = tubelib2_on_update2,
allow_metadata_inventory_put = tNode.allow_metadata_inventory_put, allow_metadata_inventory_put = tNode.allow_metadata_inventory_put,
allow_metadata_inventory_move = tNode.allow_metadata_inventory_move, allow_metadata_inventory_move = tNode.allow_metadata_inventory_move,

View File

@ -215,7 +215,7 @@ local function tubelib2_on_update2(pos, outdir, tlib2, node)
end end
end end
local function push_item(pos, filter, item_name, num_items, nvm) local function push_item(pos, filter, itemstack, num_items, nvm)
local idx = 1 local idx = 1
local num_pushed = 0 local num_pushed = 0
local num_ports = #filter local num_ports = #filter
@ -226,7 +226,7 @@ local function push_item(pos, filter, item_name, num_items, nvm)
num_of_trials = num_of_trials + 1 num_of_trials = num_of_trials + 1
local push_dir = filter[randidx[idx]] local push_dir = filter[randidx[idx]]
local num_to_push = math.min(amount, num_items - num_pushed) local num_to_push = math.min(amount, num_items - num_pushed)
if techage.push_items(pos, push_dir, ItemStack(item_name.." "..num_to_push)) then if techage.push_items(pos, push_dir, itemstack:peek_item(num_to_push)) then
num_pushed = num_pushed + num_to_push num_pushed = num_pushed + num_to_push
nvm.port_counter[push_dir] = (nvm.port_counter[push_dir] or 0) + num_to_push nvm.port_counter[push_dir] = (nvm.port_counter[push_dir] or 0) + num_to_push
end end
@ -255,18 +255,19 @@ local function distributing(pos, inv, crd, nvm)
local item_name = stack:get_name() local item_name = stack:get_name()
local num_items = stack:get_count() local num_items = stack:get_count()
local num_to_push = math.min((nvm.num_items or crd.num_items) - sum_num_pushed, num_items) local num_to_push = math.min((nvm.num_items or crd.num_items) - sum_num_pushed, num_items)
local stack_to_push = stack:peek_item(num_to_push)
num_pushed = 0 num_pushed = 0
if item_filter[item_name] then if item_filter[item_name] then
-- Push items based on filter -- Push items based on filter
num_pushed = push_item(pos, item_filter[item_name], item_name, num_to_push, nvm) num_pushed = push_item(pos, item_filter[item_name], stack_to_push, num_to_push, nvm)
elseif blocking_mode and #open_ports > 0 then elseif blocking_mode and #open_ports > 0 then
-- Push items based on open ports -- Push items based on open ports
num_pushed = push_item(pos, open_ports, item_name, num_to_push, nvm) num_pushed = push_item(pos, open_ports, stack_to_push, num_to_push, nvm)
end end
if not blocking_mode and num_pushed == 0 and #open_ports > 0 then if not blocking_mode and num_pushed == 0 and #open_ports > 0 then
-- Push items based on open ports -- Push items based on open ports
num_pushed = push_item(pos, open_ports, item_name, num_to_push, nvm) num_pushed = push_item(pos, open_ports, stack_to_push, num_to_push, nvm)
end end
sum_num_pushed = sum_num_pushed + num_pushed sum_num_pushed = sum_num_pushed + num_pushed

View File

@ -1,16 +1,14 @@
--[[ --[[
Tube Library TechAge
============ =======
Copyright (C) 2017 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
legacy_nodes.lua:
Tubelib support for chests and furnace Tube support for default chests and furnace
]]-- ]]--

View File

@ -0,0 +1,117 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
Tube support for digtron and protector chests
]]--
-- for lazy programmers
local M = minetest.get_meta
local CacheForFuelNodeNames = {}
local function is_fuel(stack)
local name = stack:get_name()
if CacheForFuelNodeNames[name] then
return true
end
if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then
CacheForFuelNodeNames[name] = true
end
return CacheForFuelNodeNames[name]
end
------------------------------------------------------------------------------
-- digtron
------------------------------------------------------------------------------
techage.register_node({"digtron:inventory"}, {
on_pull_item = function(pos, in_dir, num)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.get_items(pos, inv, "main", num)
end,
on_push_item = function(pos, in_dir, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "main", stack)
end,
on_unpull_item = function(pos, in_dir, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "main", stack)
end,
})
techage.register_node({"digtron:fuelstore"}, {
on_pull_item = function(pos, in_dir, num)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.get_items(pos, inv, "fuel", num)
end,
on_push_item = function(pos, in_dir, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "fuel", stack)
end,
on_unpull_item = function(pos, in_dir, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "fuel", stack)
end,
})
techage.register_node({"digtron:combined_storage"}, {
on_pull_item = function(pos, in_dir, num)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.get_items(pos, inv, "main", num)
end,
on_push_item = function(pos, side, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
minetest.get_node_timer(pos):start(1.0)
if is_fuel(stack) then
return techage.put_items(inv, "fuel", stack)
else
return techage.put_items(inv, "main", stack)
end
end,
on_unpull_item = function(pos, side, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "main", stack)
end,
})
------------------------------------------------------------------------------
-- protector
------------------------------------------------------------------------------
techage.register_node({"protector:chest"}, {
on_pull_item = function(pos, in_dir, num)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.get_items(pos, inv, "main", num)
end,
on_push_item = function(pos, in_dir, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "main", stack)
end,
on_unpull_item = function(pos, in_dir, stack)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return techage.put_items(inv, "main", stack)
end,
})

View File

@ -157,23 +157,6 @@ local function mark_area(pos1, pos2, owner)
pos1.y = pos1.y - 0.2 pos1.y = pos1.y - 0.2
end end
local function peek_node(qpos)
local node = techage.get_node_lvm(qpos)
local ndef = minetest.registered_nodes[node.name]
if techage.can_node_dig(node, ndef) then
return techage.dropped_node(node, ndef)
end
end
local function add_to_inv(pos, item_name)
local inv = M(pos):get_inventory()
if inv:room_for_item("main", item_name) then
inv:add_item("main", item_name)
return true
end
return false
end
local function quarry_task(pos, crd, nvm) local function quarry_task(pos, crd, nvm)
nvm.start_level = nvm.start_level or 0 nvm.start_level = nvm.start_level or 0
nvm.quarry_depth = nvm.quarry_depth or 1 nvm.quarry_depth = nvm.quarry_depth or 1
@ -182,6 +165,30 @@ local function quarry_task(pos, crd, nvm)
local y_last = y_first - nvm.quarry_depth + 1 local y_last = y_first - nvm.quarry_depth + 1
local facedir = minetest.get_node(pos).param2 local facedir = minetest.get_node(pos).param2
local owner = M(pos):get_string("owner") local owner = M(pos):get_string("owner")
local fake_player = techage.Fake_player:new()
fake_player.get_pos = function (...)
return pos
end
fake_player.get_inventory = function(...)
return M(pos):get_inventory()
end
local add_to_inv = function(itemstacks)
local at_least_one_added = false
local inv = M(pos):get_inventory()
if #itemstacks == 0 then
return true
end
for _,stack in ipairs(itemstacks) do
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
at_least_one_added = true
elseif at_least_one_added then
minetest.add_item({x=pos.x,y=pos.y+1,z=pos.z}, stack)
end
end
return at_least_one_added
end
local pos1, pos2 = get_corner_positions(pos, facedir, nvm.hole_diameter) local pos1, pos2 = get_corner_positions(pos, facedir, nvm.hole_diameter)
nvm.level = 1 nvm.level = 1
@ -203,14 +210,13 @@ local function quarry_task(pos, crd, nvm)
for zoffs = 1, nvm.hole_diameter do for zoffs = 1, nvm.hole_diameter do
for xoffs = 1, nvm.hole_diameter do for xoffs = 1, nvm.hole_diameter do
local qpos = get_quarry_pos(pos1, xoffs, zoffs) local qpos = get_quarry_pos(pos1, xoffs, zoffs)
local item_name = peek_node(qpos) local dig_state = techage.dig_like_player(qpos, fake_player, add_to_inv)
if item_name then
if add_to_inv(pos, item_name) then if dig_state == techage.dig_states.INV_FULL then
minetest.remove_node(qpos) crd.State:blocked(pos, nvm, S("inventory full"))
crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) coroutine.yield()
else elseif dig_state == techage.dig_states.DUG then
crd.State:blocked(pos, nvm, S("inventory full")) crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS)
end
coroutine.yield() coroutine.yield()
end end
end end
@ -229,7 +235,10 @@ local function keep_running(pos, elapsed)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local crd = CRD(pos) local crd = CRD(pos)
coroutine.resume(mem.co, pos, crd, nvm) local _, err = coroutine.resume(mem.co, pos, crd, nvm)
if err then
minetest.log("error", "[TA4 Quarry Coroutine Error]" .. err)
end
if techage.is_activeformspec(pos) then if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) M(pos):set_string("formspec", formspec(crd.State, pos, nvm))

View File

@ -81,7 +81,7 @@ local function check_space(pos, param2, AssemblyPlan, player_name)
local node = techage.get_node_lvm(pos1) local node = techage.get_node_lvm(pos1)
local ndef = minetest.registered_nodes[node.name] local ndef = minetest.registered_nodes[node.name]
if not ndef or ndef.walkable and node.name ~= node_name then if not ndef or not ndef.buildable_to and node.name ~= node_name then
minetest.chat_send_player(player_name, S("[TA] Not enough space!")) minetest.chat_send_player(player_name, S("[TA] Not enough space!"))
return false return false
end end

View File

@ -0,0 +1,118 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
Copyright (C) 2020 Thomas S.
GPL v3
See LICENSE.txt for more information
Fake Player
]]--
-- Map method names to their return values
local methods = {
get_pos = { x = 0, y = 0, z = 0 },
set_pos = nil,
moveto = nil,
punch = nil,
right_click = nil,
get_hp = 20,
set_hp = nil,
get_inventory = nil,
get_wield_list = "",
get_wield_index = 0,
get_wielded_item = ItemStack(),
set_wielded_item = true,
set_armor_groups = nil,
get_armor_groups = {},
set_animation = nil,
get_animation = {},
set_animation_frame_speed = nil,
set_attach = nil,
get_attach = nil,
set_detach = nil,
get_bone_position = {},
set_properties = nil,
get_properties = {},
is_player = false,
get_nametag_attributes = {},
set_nametag_attributes = nil,
get_player_name = "",
get_player_velocity = nil,
add_player_velocity = nil,
get_look_dir = vector.new(0, 0, 1),
get_look_vertical = 0,
get_look_horizontal = 0,
set_look_vertical = nil,
set_look_horizontal = nil,
get_look_pitch = 0,
get_look_yaw = 0,
set_look_pitch = nil,
set_look_yaw = nil,
get_breath = 10,
set_breath = nil,
set_fov = nil,
get_fov = 0,
set_attribute = nil,
get_attribute = nil,
get_meta = nil,
set_inventory_formspec = nil,
get_inventory_formspec = "",
set_formspec_prepend = nil,
get_formspec_prepend = "",
get_player_control = {},
get_player_control_bits = 0,
set_physics_override = nil,
get_physics_override = {},
hud_add = 0,
hud_remove = nil,
hud_change = nil,
hud_get = {},
hud_set_flags = nil,
hud_get_flags = {},
hud_set_hotbar_itemcount = nil,
hud_get_hotbar_itemcount = 8,
hud_set_hotbar_image = nil,
hud_get_hotbar_image = "",
hud_set_hotbar_selected_image = nil,
hud_get_hotbar_selected_image = "",
set_sky = nil,
get_sky = {},
get_sky_color = {},
set_sun = nil,
get_sun = {},
set_moon = nil,
get_moon = {},
set_stars = nil,
get_stars = {},
set_clouds = nil,
get_clouds = {},
override_day_night_ratio = nil,
get_day_night_ratio = nil,
set_local_animation = nil,
get_local_animation = {},
set_eye_offset = nil,
get_eye_offset = {},
send_mapblock = nil,
}
techage.Fake_player = {}
techage.Fake_player.__index = techage.Fake_player
function techage.Fake_player:new()
local fake_player = {}
setmetatable(fake_player, techage.Fake_player)
return fake_player
end
for method_name, return_value in pairs(methods) do
techage.Fake_player[method_name] = function(self, ...)
return return_value
end
end

View File

@ -118,3 +118,34 @@ function techage.firebox.has_fuel(pos)
local items = inv:get_stack("fuel", 1) local items = inv:get_stack("fuel", 1)
return items:get_count() > 0 return items:get_count() > 0
end end
function techage.firebox.is_free_position(pos, player_name)
local pos2 = techage.get_pos(pos, 'F')
if minetest.is_protected(pos2, player_name) then
minetest.chat_send_player(player_name, S("[TA] Area is protected!"))
return false
end
local node = techage.get_node_lvm(pos2)
local ndef = minetest.registered_nodes[node.name]
if not ndef or not ndef.buildable_to then
minetest.chat_send_player(player_name, S("[TA] Not enough space!"))
return false
end
return true
end
function techage.firebox.set_firehole(pos, on)
local param2 = techage.get_node_lvm(pos).param2
local pos2 = techage.get_pos(pos, 'F')
if on == true then
minetest.swap_node(pos2, {name="techage:coalfirehole_on", param2 = param2})
elseif on == false then
minetest.swap_node(pos2, {name="techage:coalfirehole", param2 = param2})
else
local node = techage.get_node_lvm(pos2)
if node.name == "techage:coalfirehole" or node.name == "techage:coalfirehole_on" then
minetest.swap_node(pos2, {name="air"})
end
end
end

View File

@ -140,7 +140,44 @@ function techage.can_node_dig(node, ndef)
-- add it to the white list -- add it to the white list
RegisteredNodesToBeDug[node.name] = true RegisteredNodesToBeDug[node.name] = true
return true return true
end end
techage.dig_states = {
NOT_DIGGABLE = 1,
INV_FULL = 2,
DUG = 3
}
-- Digs a node like a player would by utilizing a fake player object.
-- add_to_inv(itemstacks) is a method that should try to add the dropped stacks to an appropriate inventory.
-- The node will only be dug, if add_to_inv(itemstacks) returns true.
function techage.dig_like_player(pos, fake_player, add_to_inv)
local node = techage.get_node_lvm(pos)
local ndef = minetest.registered_nodes[node.name]
if not ndef or ndef.diggable == false or (ndef.can_dig and not ndef.can_dig(pos, fake_player)) then
return techage.dig_states.NOT_DIGGABLE
end
local drop_as_strings = minetest.get_node_drops(node)
local drop_as_stacks = {}
for _,itemstring in ipairs(drop_as_strings) do
drop_as_stacks[#drop_as_stacks+1] = ItemStack(itemstring)
end
local meta = M(pos)
if ndef.preserve_metadata then
ndef.preserve_metadata(pos, node, meta, drop_as_stacks)
end
if add_to_inv(drop_as_stacks) then
local oldmeta = meta:to_table()
minetest.remove_node(pos)
if ndef.after_dig_node then
ndef.after_dig_node(pos, node, oldmeta, fake_player)
end
return techage.dig_states.DUG
end
return techage.dig_states.INV_FULL
end
local function handle_drop(drop) local function handle_drop(drop)
-- To keep it simple, return only the item with the lowest rarity -- To keep it simple, return only the item with the lowest rarity

View File

@ -203,6 +203,10 @@ local function empty_on_punch(pos, nvm, full_container, item_count)
end end
function techage.liquid.on_punch(pos, node, puncher, pointed_thing) function techage.liquid.on_punch(pos, node, puncher, pointed_thing)
if minetest.is_protected(pos, puncher:get_player_name()) then
return
end
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local mem = techage.get_mem(pos) local mem = techage.get_mem(pos)
mem.blocking_time = mem.blocking_time or 0 mem.blocking_time = mem.blocking_time or 0

View File

@ -90,7 +90,7 @@ minetest.register_node("techage:tubeS", {
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {choppy=2, cracky=3, stone=1}, groups = {choppy=2, cracky=3},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
@ -130,7 +130,7 @@ minetest.register_node("techage:tubeA", {
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {choppy=2, cracky=3, stone=1, not_in_creative_inventory=1}, groups = {choppy=2, cracky=3, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
drop = "techage:tubeS", drop = "techage:tubeS",
}) })

View File

@ -57,7 +57,7 @@ minetest.register_node("techage:ta4_tubeS", {
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {choppy=2, cracky=3, stone=1}, groups = {choppy=2, cracky=3},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
@ -97,7 +97,7 @@ minetest.register_node("techage:ta4_tubeA", {
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {choppy=2, cracky=3, stone=1, not_in_creative_inventory=1}, groups = {choppy=2, cracky=3, not_in_creative_inventory=1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
drop = "techage:ta4_tubeS", drop = "techage:ta4_tubeS",
}) })

View File

@ -22,18 +22,6 @@ local firebox = techage.firebox
local CYCLE_TIME = 2 local CYCLE_TIME = 2
local BURN_CYCLE_FACTOR = 0.5 local BURN_CYCLE_FACTOR = 0.5
local function firehole(pos, on)
local param2 = techage.get_node_lvm(pos).param2
local pos2 = techage.get_pos(pos, 'F')
if on == true then
minetest.swap_node(pos2, {name="techage:coalfirehole_on", param2 = param2})
elseif on == false then
minetest.swap_node(pos2, {name="techage:coalfirehole", param2 = param2})
else
minetest.swap_node(pos2, {name="air"})
end
end
local function node_timer(pos, elapsed) local function node_timer(pos, elapsed)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local power = techage.transfer( local power = techage.transfer(
@ -52,7 +40,7 @@ local function node_timer(pos, elapsed)
nvm.burn_cycles_total = nvm.burn_cycles nvm.burn_cycles_total = nvm.burn_cycles
else else
nvm.running = false nvm.running = false
firehole(pos, false) firebox.set_firehole(pos, false)
M(pos):set_string("formspec", firebox.formspec(nvm)) M(pos):set_string("formspec", firebox.formspec(nvm))
return false return false
end end
@ -67,7 +55,7 @@ local function start_firebox(pos, nvm)
if not nvm.running then if not nvm.running then
nvm.running = true nvm.running = true
node_timer(pos, 0) node_timer(pos, 0)
firehole(pos, true) firebox.set_firehole(pos, true)
minetest.get_node_timer(pos):start(CYCLE_TIME) minetest.get_node_timer(pos):start(CYCLE_TIME)
end end
end end
@ -96,20 +84,25 @@ minetest.register_node("techage:coalfirebox", {
allow_metadata_inventory_take = firebox.allow_metadata_inventory_take, allow_metadata_inventory_take = firebox.allow_metadata_inventory_take,
on_rightclick = firebox.on_rightclick, on_rightclick = firebox.on_rightclick,
on_construct = function(pos) after_place_node = function(pos, placer)
techage.add_node(pos, "techage:coalfirebox") if firebox.is_free_position(pos, placer:get_player_name()) then
local nvm = techage.get_nvm(pos) techage.add_node(pos, "techage:coalfirebox")
nvm.running = false local nvm = techage.get_nvm(pos)
nvm.burn_cycles = 0 nvm.running = false
local meta = M(pos) nvm.burn_cycles = 0
meta:set_string("formspec", firebox.formspec(nvm)) local meta = M(pos)
local inv = meta:get_inventory() meta:set_string("formspec", firebox.formspec(nvm))
inv:set_size('fuel', 1) local inv = meta:get_inventory()
firehole(pos, false) inv:set_size('fuel', 1)
firebox.set_firehole(pos, false)
else
minetest.remove_node(pos)
return true
end
end, end,
on_destruct = function(pos) on_destruct = function(pos)
firehole(pos, nil) firebox.set_firehole(pos, nil)
end, end,
on_metadata_inventory_put = function(pos, listname, index, stack, player) on_metadata_inventory_put = function(pos, listname, index, stack, player)

View File

@ -25,18 +25,6 @@ local liquid = techage.liquid
local CYCLE_TIME = 2 local CYCLE_TIME = 2
local BURN_CYCLE_FACTOR = 0.5 local BURN_CYCLE_FACTOR = 0.5
local function firehole(pos, on)
local param2 = techage.get_node_lvm(pos).param2
local pos2 = techage.get_pos(pos, 'F')
if on == true then
minetest.swap_node(pos2, {name="techage:coalfirehole_on", param2 = param2})
elseif on == false then
minetest.swap_node(pos2, {name="techage:coalfirehole", param2 = param2})
else
minetest.swap_node(pos2, {name="air"})
end
end
local function node_timer(pos, elapsed) local function node_timer(pos, elapsed)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local power = techage.transfer( local power = techage.transfer(
@ -55,7 +43,7 @@ local function node_timer(pos, elapsed)
nvm.burn_cycles_total = nvm.burn_cycles nvm.burn_cycles_total = nvm.burn_cycles
else else
nvm.running = false nvm.running = false
firehole(pos, false) firebox.set_firehole(pos, false)
M(pos):set_string("formspec", fuel.formspec(nvm)) M(pos):set_string("formspec", fuel.formspec(nvm))
return false return false
end end
@ -70,7 +58,7 @@ local function start_firebox(pos, nvm)
if not nvm.running and fuel.has_fuel(nvm) then if not nvm.running and fuel.has_fuel(nvm) then
nvm.running = true nvm.running = true
node_timer(pos, 0) node_timer(pos, 0)
firehole(pos, true) firebox.set_firehole(pos, true)
minetest.get_node_timer(pos):start(CYCLE_TIME) minetest.get_node_timer(pos):start(CYCLE_TIME)
end end
end end
@ -98,21 +86,26 @@ minetest.register_node("techage:oilfirebox", {
on_rightclick = fuel.on_rightclick, on_rightclick = fuel.on_rightclick,
on_receive_fields = fuel.on_receive_fields, on_receive_fields = fuel.on_receive_fields,
on_construct = function(pos) after_place_node = function(pos, placer)
techage.add_node(pos, "techage:oilfirebox") if firebox.is_free_position(pos, placer:get_player_name()) then
local nvm = techage.get_nvm(pos) techage.add_node(pos, "techage:oilfirebox")
nvm.running = false local nvm = techage.get_nvm(pos)
nvm.burn_cycles = 0 nvm.running = false
nvm.liquid = {} nvm.burn_cycles = 0
nvm.liquid.amount = 0 nvm.liquid = {}
local meta = M(pos) nvm.liquid.amount = 0
meta:set_string("formspec", fuel.formspec(nvm)) local meta = M(pos)
local inv = meta:get_inventory() meta:set_string("formspec", fuel.formspec(nvm))
firehole(pos, false) local inv = meta:get_inventory()
firebox.set_firehole(pos, false)
else
minetest.remove_node(pos)
return true
end
end, end,
on_destruct = function(pos) on_destruct = function(pos)
firehole(pos, nil) firebox.set_firehole(pos, nil)
end, end,
on_punch = function(pos, node, puncher, pointed_thing) on_punch = function(pos, node, puncher, pointed_thing)

View File

@ -140,27 +140,21 @@ techage.register_consumer("digtron_battery", S("Digtron Battery"), { act = tiles
end end
end end
end, end,
after_dig_node = function(pos, oldnode, oldmetadata, digger) preserve_metadata = function(pos, oldnode, oldmetadata, drops)
local node = ItemStack(oldnode.name) local metadata = M(pos):to_table()
if oldmetadata.inventory then if metadata.inventory then
local total = count_coal(oldmetadata) local total = count_coal(metadata)
local meta = node:get_meta() local meta = drops[1]:get_meta()
meta:set_int("coal", total) meta:set_int("coal", total)
local text = S("Digtron Battery").." ("..math.floor(total/TOTAL_MAX * 100).." %)" local text = S("Digtron Battery").." ("..math.floor(total/TOTAL_MAX * 100).." %)"
meta:set_string("description", text) meta:set_string("description", text)
end end
local inv = minetest.get_inventory({type="player", name=digger:get_player_name()})
local left_over = inv:add_item("main", node)
if left_over:get_count() > 0 then
minetest.add_item(pos, node)
end
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
techage.set_activeformspec(pos, clicker) techage.set_activeformspec(pos, clicker)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm))
end, end,
drop = "",
node_timer = keep_running, node_timer = keep_running,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_put = allow_metadata_inventory_put,

View File

@ -1340,7 +1340,16 @@ techage.manual_DE.aText = {
"\n".. "\n"..
"\n".. "\n"..
"\n", "\n",
"Die TA4 Sensor Kiste dient zum Aufbau von Automatischen Lagern oder Verkaufsautomaten. Sie hat erweitere Kommandos zur Fernsteuerung.\n".. "Die TA4 Sensor Kiste dient zum Aufbau von Automatischen Lagern oder Verkaufsautomaten in Verbindung mit dem Lua Controller.\n"..
"Wird etwas in die Kiste gelegt\\, oder entnommen\\, oder eine der Tasten \"F1\"/\"F2\" gedrückt\\, so wird ein Event-Signal an den Lua Controller gesendet.\n"..
"Die Sensor Kiste unterstützt folgende Kommandos:\n"..
"\n"..
" - Über 'state = $read_data(<num>\\, \"state\")' kann der Status der Kiste abgefragt werden. Mögliche Antworten sind: \"empty\"\\, \"loaded\"\\, \"full\"\n"..
" - Über 'name\\, action = $read_data(<num>\\, \"action\")' kann die letzte Spieleraktion abgefragt werden. 'name' ist der Spielername\\, Als 'action' wird zurückgeliefert: \"put\"\\, \"take\"\\, \"f1\"\\, \"f2\".\n"..
" - Über 'stacks = $read_data(<num>\\, \"stacks\")' kann der Inhalt der Kiste ausgelesen werden. Siehe dazu: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest\n"..
" - Über '$send_cmnd(<num>\\, \"text\"\\, \"press both buttons andnput something into the chest\")' kann der Text im Menü der Sensor Kiste gesetzt werden.\n"..
"\n"..
"Über die Checkbox \"Erlaube öffentlichen Zugriff\" kann eingestellt werden\\, ob die Kiste von jedem genutzt werden darf\\, oder nur von Spielern die hier Zugriffsrechte haben.\n"..
"\n".. "\n"..
"\n".. "\n"..
"\n", "\n",

View File

@ -1331,7 +1331,16 @@ techage.manual_EN.aText = {
"\n".. "\n"..
"\n".. "\n"..
"\n", "\n",
"The TA4 sensor box is used to set up automatic warehouses or vending machines. It has additional commands for remote control.\n".. "The TA4 sensor box is used to set up automatic warehouses or vending machines in conjunction with the Lua controller.\n"..
"If something is put into the box or removed\\, or one of the \"F1\" / \"F2\" keys is pressed\\, an event signal is sent to the Lua controller.\n"..
"The sensor box supports the following commands:\n"..
"\n"..
" - The status of the box can be queried via 'state = $read_data(<num>\\, \"state\")'. Possible answers are: \"empty\"\\, \"loaded\"\\, \"full\"\n"..
" - The last player action can be queried via 'name\\, action = $read_data(<num>\\, \"action\")'. 'name' is the player name. One of the following is returned as 'action': \"put\"\\, \"take\"\\, \"f1\"\\, \"f2\".\n"..
" - The contents of the box can be read out via 'stacks = $read_data(<num>\\, \"stacks\")'. See: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest\n"..
" - Via '$send_cmnd(<num>\\, \"text\"\\, \"press both buttons andnput something into the chest\")' the text can be set in the menu of the sensor box.\n"..
"\n"..
"The checkbox \"Allow public chest access\" can be used to set whether the box can be used by everyone or only by players who have access/protection rights here.\n"..
"\n".. "\n"..
"\n".. "\n"..
"\n", "\n",
@ -1417,8 +1426,8 @@ techage.manual_EN.aText = {
"\n".. "\n"..
"The TA4 pusher has two additional commands for the Lua controller:\n".. "The TA4 pusher has two additional commands for the Lua controller:\n"..
"\n".. "\n"..
" - 'config' is used to configure the pusher\\, analogous to manual configuration via the menu.\nExample: '$ send_cmnd(1234\\, \"config\"\\, \"default: dirt\")'\n".. " - 'config' is used to configure the pusher\\, analogous to manual configuration via the menu.\nExample: '$send_cmnd(1234\\, \"config\"\\, \"default: dirt\")'\n"..
" - 'pull' is used to send an order to the pusher:\nExample: '$ send_cmnd(1234\\, \"pull\"\\, \"default: dirt 8\")'\nValues from 1 to 12 are permitted as numbers. Then the pusher goes back to 'stopped' mode and sends an\" off \"command back to the transmitter of the\" pull \"command.\n".. " - 'pull' is used to send an order to the pusher:\nExample: '$send_cmnd(1234\\, \"pull\"\\, \"default: dirt 8\")'\nValues from 1 to 12 are permitted as numbers. Then the pusher goes back to 'stopped' mode and sends an\" off \"command back to the transmitter of the\" pull \"command.\n"..
"\n".. "\n"..
"\n".. "\n"..
"\n", "\n",
@ -1449,7 +1458,7 @@ techage.manual_EN.aText = {
"\n".. "\n"..
"The chest has an additional command for the Lua controller:\n".. "The chest has an additional command for the Lua controller:\n"..
"\n".. "\n"..
" - 'count' is used to request how many items are in the chest.\nExample 1: '$ read_data(CHEST\\, \"count\")' -> Sum of items across all 8 stores\nExample 2: '$ read_data(CHEST\\, \"count\"\\, 2)' -> number of items in store 2 (second from left)\n".. " - 'count' is used to request how many items are in the chest.\nExample 1: '$read_data(CHEST\\, \"count\")' -> Sum of items across all 8 stores\nExample 2: '$read_data(CHEST\\, \"count\"\\, 2)' -> number of items in store 2 (second from left)\n"..
"\n".. "\n"..
"\n".. "\n"..
"\n", "\n",

View File

@ -15,7 +15,6 @@
-- for lazy programmers -- for lazy programmers
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local logic = techage.logic
local BATTERY_CAPACITY = 10000000 local BATTERY_CAPACITY = 10000000
local function calc_percent(content) local function calc_percent(content)
@ -36,73 +35,69 @@ local function on_timer(pos, elapsed)
return true return true
end end
local function register_battery(ext, percent, nici) minetest.register_alias("techage:ta4_battery75", "techage:ta4_battery")
minetest.register_node("techage:ta4_battery"..ext, { minetest.register_alias("techage:ta4_battery50", "techage:ta4_battery")
description = S("Battery").." "..ext, minetest.register_alias("techage:ta4_battery25", "techage:ta4_battery")
inventory_image = 'techage_battery_inventory.png',
wield_image = 'techage_battery_inventory.png',
tiles = {
-- up, down, right, left, back, front
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png^techage_battery_green.png",
},
drawtype = "nodebox", minetest.register_node("techage:ta4_battery", {
node_box = { description = S("Battery"),
type = "fixed", inventory_image = 'techage_battery_inventory.png',
fixed = { wield_image = 'techage_battery_inventory.png',
{ -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, tiles = {
}, -- up, down, right, left, back, front
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png",
"techage_smartline.png^techage_battery_green.png",
},
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{ -6/32, -6/32, 14/32, 6/32, 6/32, 16/32},
}, },
},
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos) after_place_node = function(pos, placer, itemstack)
meta:set_int("content", BATTERY_CAPACITY * percent) local content = BATTERY_CAPACITY
local node = minetest.get_node(pos) if itemstack then
node.name = "techage:ta4_battery" local stack_meta = itemstack:get_meta()
minetest.swap_node(pos, node) if stack_meta then
on_timer(pos, 1) -- This ensures that dug batteries of the old system are considered full.
minetest.get_node_timer(pos):start(30) local string_content = stack_meta:get_string("content")
end, if string_content ~= "" then
-- Batteries dug in the new system are handled correctly.
on_timer = on_timer, content = techage.in_range(stack_meta:get_int("content"), 0, BATTERY_CAPACITY)
end
after_dig_node = function(pos, oldnode, oldmetadata, digger)
local percent = calc_percent(tonumber(oldmetadata.fields.content))
local stack
if percent > 95 then
stack = ItemStack("techage:ta4_battery")
elseif percent > 75 then
stack = ItemStack("techage:ta4_battery75")
elseif percent > 50 then
stack = ItemStack("techage:ta4_battery50")
elseif percent > 25 then
stack = ItemStack("techage:ta4_battery25")
else
return
end end
local inv = minetest.get_inventory({type="player", name=digger:get_player_name()}) end
inv:add_item("main", stack) M(pos):set_int("content", content)
end, on_timer(pos, 1)
minetest.get_node_timer(pos):start(30)
end,
paramtype = "light", on_timer = on_timer,
sunlight_propagates = true,
paramtype2 = "facedir",
groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=nici},
drop = "",
is_ground_content = false,
sounds = default.node_sound_stone_defaults(),
})
end
register_battery("", 1.0, 0) preserve_metadata = function(pos, oldnode, oldmetadata, drops)
register_battery("75", 0.75, 1) local content = M(pos):get_int("content")
register_battery("50", 0.5, 1)
register_battery("25", 0.25, 1) local meta = drops[1]:get_meta()
meta:set_int("content", content)
local percent = calc_percent(content)
local text = S("Digtron Battery").." ("..percent.." %)"
meta:set_string("description", text)
end,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
groups = {choppy=1, cracky=1, crumbly=1},
is_ground_content = false,
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("techage:ta4_battery_empty", { minetest.register_node("techage:ta4_battery_empty", {
description = S("Battery"), description = S("Battery"),
@ -159,8 +154,7 @@ else
}) })
end end
techage.register_node({"techage:ta4_battery", "techage:ta4_battery25", techage.register_node({"techage:ta4_battery"},
"techage:ta4_battery50", "techage:ta4_battery75"},
{ {
on_node_load = function(pos) on_node_load = function(pos)
minetest.get_node_timer(pos):start(30) minetest.get_node_timer(pos):start(30)

View File

@ -13,7 +13,7 @@
techage = {} techage = {}
-- Version for compatibility checks, see readme.md/history -- Version for compatibility checks, see readme.md/history
techage.version = 0.21 techage.version = 0.23
if minetest.global_exists("tubelib") then if minetest.global_exists("tubelib") then
minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!") minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!")
@ -66,6 +66,7 @@ end
-- Basis features -- Basis features
local MP = minetest.get_modpath("techage") local MP = minetest.get_modpath("techage")
dofile(MP.."/basis/lib.lua") -- helper functions dofile(MP.."/basis/lib.lua") -- helper functions
dofile(MP.."/basis/fake_player.lua") -- dummy player object
dofile(MP.."/basis/node_store.lua") dofile(MP.."/basis/node_store.lua")
dofile(MP.."/basis/gravel_lib.lua") -- ore probability dofile(MP.."/basis/gravel_lib.lua") -- ore probability
dofile(MP.."/basis/node_states.lua") -- state model dofile(MP.."/basis/node_states.lua") -- state model
@ -144,6 +145,7 @@ dofile(MP.."/basic_machines/consumer.lua") -- consumer base model
dofile(MP.."/basic_machines/source.lua") dofile(MP.."/basic_machines/source.lua")
dofile(MP.."/basic_machines/pusher.lua") dofile(MP.."/basic_machines/pusher.lua")
dofile(MP.."/basic_machines/legacy_nodes.lua") dofile(MP.."/basic_machines/legacy_nodes.lua")
dofile(MP.."/basic_machines/mods_support.lua")
dofile(MP.."/basic_machines/grinder.lua") dofile(MP.."/basic_machines/grinder.lua")
dofile(MP.."/basic_machines/distributor.lua") dofile(MP.."/basic_machines/distributor.lua")
dofile(MP.."/basic_machines/gravelsieve.lua") dofile(MP.."/basic_machines/gravelsieve.lua")

View File

@ -17,6 +17,7 @@ local S = techage.S
minetest.register_craftitem("techage:hydrogen", { minetest.register_craftitem("techage:hydrogen", {
description = S("TA4 Hydrogen"), description = S("TA4 Hydrogen"),
inventory_image = "techage_hydrogen_inv.png", inventory_image = "techage_hydrogen_inv.png",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:cylinder_small_hydrogen", { minetest.register_craftitem("techage:cylinder_small_hydrogen", {

View File

@ -17,6 +17,7 @@ local S = techage.S
minetest.register_craftitem("techage:lye", { minetest.register_craftitem("techage:lye", {
description = S("Lye"), description = S("Lye"),
inventory_image = "techage_liquid2_inv.png^[colorize:#7fd44c:120^techage_liquid1_inv.png", inventory_image = "techage_liquid2_inv.png^[colorize:#7fd44c:120^techage_liquid1_inv.png",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:barrel_lye", { minetest.register_craftitem("techage:barrel_lye", {

View File

@ -58,7 +58,7 @@ minetest.register_node("techage:oil_source", {
liquid_range = 10, liquid_range = 10,
liquid_renewable = false, liquid_renewable = false,
post_effect_color = {a = 200, r = 1, g = 1, b = 1}, post_effect_color = {a = 200, r = 1, g = 1, b = 1},
groups = {liquid = 5}, groups = {liquid = 5, ta_liquid = 1},
}) })
minetest.register_node("techage:oil_flowing", { minetest.register_node("techage:oil_flowing", {

View File

@ -18,26 +18,31 @@ local S = techage.S
minetest.register_craftitem("techage:bitumen", { minetest.register_craftitem("techage:bitumen", {
description = S("TA3 Bitumen"), description = S("TA3 Bitumen"),
inventory_image = "techage_liquid2_inv.png^[colorize:#000000", inventory_image = "techage_liquid2_inv.png^[colorize:#000000",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:fueloil", { minetest.register_craftitem("techage:fueloil", {
description = S("TA3 Fuel Oil"), description = S("TA3 Fuel Oil"),
inventory_image = "techage_liquid2_inv.png^[colorize:#7E5D0A:180^techage_liquid1_inv.png", inventory_image = "techage_liquid2_inv.png^[colorize:#7E5D0A:180^techage_liquid1_inv.png",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:naphtha", { minetest.register_craftitem("techage:naphtha", {
description = S("TA3 Naphtha"), description = S("TA3 Naphtha"),
inventory_image = "techage_liquid2_inv.png^[colorize:#AAA820:180^techage_liquid1_inv.png", inventory_image = "techage_liquid2_inv.png^[colorize:#AAA820:180^techage_liquid1_inv.png",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:gasoline", { minetest.register_craftitem("techage:gasoline", {
description = S("TA3 Gasoline"), description = S("TA3 Gasoline"),
inventory_image = "techage_liquid2_inv.png^[colorize:#EEFC52:180^techage_liquid1_inv.png", inventory_image = "techage_liquid2_inv.png^[colorize:#EEFC52:180^techage_liquid1_inv.png",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:gas", { minetest.register_craftitem("techage:gas", {
description = S("TA3 Propane"), description = S("TA3 Propane"),
inventory_image = "techage_gas_inv.png", inventory_image = "techage_gas_inv.png",
groups = {ta_liquid = 1},
}) })
minetest.register_craftitem("techage:ta3_cylinder_small_gas", { minetest.register_craftitem("techage:ta3_cylinder_small_gas", {

View File

@ -138,10 +138,11 @@ function techage.register_plant(name)
end end
minetest.after(1, function() minetest.after(1, function()
for name,_ in pairs(minetest.registered_decorations) do for _,def in pairs(minetest.registered_decorations) do
if type(name) == "string" then local name = def.decoration
if name and type(name) == "string" then
local mod = string.split(name, ":")[1] local mod = string.split(name, ":")[1]
if mod == "flowers" then if mod == "flowers" or mod == "bakedclay" then -- Bakedclay also registers flowers as decoration.
techage.register_flower(name) techage.register_flower(name)
end end
end end
@ -149,12 +150,8 @@ minetest.after(1, function()
for name,ndef in pairs(minetest.registered_nodes) do for name,ndef in pairs(minetest.registered_nodes) do
if type(name) == "string" then if type(name) == "string" then
local mod = string.split(name, ":")[1] local mod = string.split(name, ":")[1]
if mod == "farming" then if mod == "farming" and ndef.on_timer then -- probably a plant that still needs to grow
if ndef.on_timer then -- probably a plant that still needs to grow techage.register_plant(name)
techage.register_plant(name)
end
elseif mod == "flowers" then
techage.register_flower(name)
end end
end end
end end

View File

@ -162,6 +162,17 @@ function liquid.take(pos, outdir, name, amount, player_name)
return taken, item_name return taken, item_name
end end
function liquid.untake(pos, outdir, name, amount, player_name)
for _,item in ipairs(get_network_table(pos, outdir, "tank")) do
local liquid = LQD(item.pos)
if liquid and liquid.untake then
amount = liquid.untake(item.pos, item.indir, name, amount)
if not amount or amount == 0 then break end
end
end
return amount or 0
end
-- --
-- Server local functions -- Server local functions
-- --

View File

@ -70,7 +70,7 @@ local function pumping(pos, nvm, state, capa)
if taken > 0 then if taken > 0 then
local leftover = liquid.put(pos, outdir, name, taken, starter) local leftover = liquid.put(pos, outdir, name, taken, starter)
if leftover and leftover == taken then if leftover and leftover == taken then
liquid.put(pos, Flip[outdir], name, leftover) liquid.untake(pos, Flip[outdir], name, leftover)
state:blocked(pos, nvm) state:blocked(pos, nvm)
return return
end end

View File

@ -26,9 +26,10 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then if minetest.is_protected(pos, player:get_player_name()) then
return 0 return 0
end end
-- check if it is powder -- check if it is powder or techage liquid item (migration function)
local ndef = minetest.registered_craftitems[stack:get_name()] or {} local ndef = minetest.registered_craftitems[stack:get_name()] or
if ndef.groups and ndef.groups.powder == 1 then minetest.registered_items[stack:get_name()] or {}
if ndef.groups and (ndef.groups.powder == 1 or ndef.groups.ta_liquid == 1) then
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
nvm.item_name = nil nvm.item_name = nil
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
@ -125,6 +126,15 @@ local tLiquid = {
end end
return 0 return 0
end, end,
untake = function(pos, indir, name, amount)
local inv = M(pos):get_inventory()
local stack = ItemStack(name.." "..amount)
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
return 0
end
return amount
end,
} }
local tNetworks = { local tNetworks = {

View File

@ -67,6 +67,15 @@ local function put_liquid(pos, indir, name, amount)
return amount return amount
end end
local function untake_liquid(pos, indir, name, amount)
local leftover = liquid.srv_put(pos, indir, name, amount)
if techage.is_activeformspec(pos) then
local nvm = techage.get_nvm(pos)
M(pos):set_string("formspec", liquid.formspec(pos, nvm))
end
return leftover
end
local networks_def = { local networks_def = {
pipe2 = { pipe2 = {
sides = techage.networks.AllSides, -- Pipe connection sides sides = techage.networks.AllSides, -- Pipe connection sides
@ -110,6 +119,7 @@ minetest.register_node("techage:ta3_tank", {
peek = liquid.srv_peek, peek = liquid.srv_peek,
put = put_liquid, put = put_liquid,
take = take_liquid, take = take_liquid,
untake = untake_liquid,
}, },
networks = networks_def, networks = networks_def,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
@ -168,6 +178,7 @@ minetest.register_node("techage:oiltank", {
peek = liquid.srv_peek, peek = liquid.srv_peek,
put = put_liquid, put = put_liquid,
take = take_liquid, take = take_liquid,
untake = untake_liquid,
}, },
networks = networks_def, networks = networks_def,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
@ -216,6 +227,7 @@ minetest.register_node("techage:ta4_tank", {
peek = liquid.srv_peek, peek = liquid.srv_peek,
put = put_liquid, put = put_liquid,
take = take_liquid, take = take_liquid,
untake = untake_liquid,
}, },
networks = networks_def, networks = networks_def,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,

View File

@ -1,10 +1,10 @@
# textdomain: techage # textdomain: techage
ku is needed!)= ku wird benötigt!)
#### TA3 Terminal ####@n@nSend commands to your machines@nand output text messages from your@nmachines to the Terminal.@n@nCommand syntax:@n cmd <num> <cmnd>@n@nexample: cmd 181 on@n<num> is the number of the node to which the command is sent@n'on' is the command to turn machines/nodes on@nFurther commands can be retrieved by clicking on@nmachines/nodes with the Techage Info Tool.@n@nLocal commands:@n- clear @= clear screen@n- help @= this message@n- pub @= switch to public use@n- priv @= switch to private use@nTo program a user button with a command:@n set <button-num> <button-text> <command>@ne.g. 'set 1 ON cmd 123 on'@n= #### TA3 Terminal ####@n@nSend commands to your machines@nand output text messages from your@nmachines to the Terminal.@n@nCommand syntax:@n cmd <num> <cmnd>@n@nexample: cmd 181 on@n<num> is the number of the node to which the command is sent@n'on' is the command to turn machines/nodes on@nFurther commands can be retrieved by clicking on@nmachines/nodes with the Techage Info Tool.@n@nLocal commands:@n- clear @= clear screen@n- help @= this message@n- pub @= switch to public use@n- priv @= switch to private use@nTo program a user button with a command:@n set <button-num> <button-text> <command>@ne.g. 'set 1 ON cmd 123 on'@n=
Accu Box=Akkublock Accu Box=Akkublock
Active:=Aktiv: Active:=Aktiv:
All nodes:=Alle Blöcke: All nodes:=Alle Blöcke:
Allow public chest access=Erlaube öffentlichen Zugriff
Allow to dig/place Techage power lines nearby power poles=Erlaubt TODO Allow to dig/place Techage power lines nearby power poles=Erlaubt TODO
Aluminum=Aluminium Aluminum=Aluminium
Area already loaded or max. number of Forceload Blocks reached!=Bereich bereits geladen oder maximale Anzahl von Forceload Blöcken erreicht! Area already loaded or max. number of Forceload Blocks reached!=Bereich bereits geladen oder maximale Anzahl von Forceload Blöcken erreicht!
@ -429,6 +429,7 @@ inlet/pipe error=Einlass/Röhrenfehler
inventory full=Inventar ist voll inventory full=Inventar ist voll
item output blocked=Ausgang blockiert item output blocked=Ausgang blockiert
keep assignment=Zuordnung beibehalten keep assignment=Zuordnung beibehalten
ku is needed=ku wird benötigt
light=Licht light=Licht
loaded=geladen loaded=geladen
needs power=benötigt Strom needs power=benötigt Strom
@ -453,3 +454,4 @@ water temperature=Wassertemperatur
wrong catalyst=falscher Katalysator wrong catalyst=falscher Katalysator
wrong storage diameter=Falscher Wärmespeicher-Durchmesser wrong storage diameter=Falscher Wärmespeicher-Durchmesser
##### not used anymore ##### ##### not used anymore #####

View File

@ -1,8 +1,8 @@
ku is needed!)=
#### TA3 Terminal ####@n@nSend commands to your machines@nand output text messages from your@nmachines to the Terminal.@n@nCommand syntax:@n cmd <num> <cmnd>@n@nexample: cmd 181 on@n<num> is the number of the node to which the command is sent@n'on' is the command to turn machines/nodes on@nFurther commands can be retrieved by clicking on@nmachines/nodes with the Techage Info Tool.@n@nLocal commands:@n- clear @= clear screen@n- help @= this message@n- pub @= switch to public use@n- priv @= switch to private use@nTo program a user button with a command:@n set <button-num> <button-text> <command>@ne.g. 'set 1 ON cmd 123 on'@n= #### TA3 Terminal ####@n@nSend commands to your machines@nand output text messages from your@nmachines to the Terminal.@n@nCommand syntax:@n cmd <num> <cmnd>@n@nexample: cmd 181 on@n<num> is the number of the node to which the command is sent@n'on' is the command to turn machines/nodes on@nFurther commands can be retrieved by clicking on@nmachines/nodes with the Techage Info Tool.@n@nLocal commands:@n- clear @= clear screen@n- help @= this message@n- pub @= switch to public use@n- priv @= switch to private use@nTo program a user button with a command:@n set <button-num> <button-text> <command>@ne.g. 'set 1 ON cmd 123 on'@n=
Accu Box= Accu Box=
Active:= Active:=
All nodes:= All nodes:=
Allow public chest access=
Allow to dig/place Techage power lines nearby power poles= Allow to dig/place Techage power lines nearby power poles=
Aluminum= Aluminum=
Area already loaded or max. number of Forceload Blocks reached!= Area already loaded or max. number of Forceload Blocks reached!=
@ -427,6 +427,7 @@ inlet/pipe error=
inventory full= inventory full=
item output blocked= item output blocked=
keep assignment= keep assignment=
ku is needed=
light= light=
loaded= loaded=
needs power= needs power=

View File

@ -120,10 +120,18 @@ techage.lua_ctlr.register_function("get_ms_time", {
cmnd = function(self) cmnd = function(self)
return math.floor(minetest.get_us_time() / 1000) return math.floor(minetest.get_us_time() / 1000)
end, end,
help = "$get_ms_time()\n".. help = " ms = $get_ms_time()\n"..
" returns time with millisecond precision." " returns time with millisecond precision."
}) })
techage.lua_ctlr.register_function("get_gametime", {
cmnd = function(self)
return minetest.get_gametime()
end,
help = " t = $get_gametime()\n"..
" returns the time, in seconds, since the world was created."
})
techage.lua_ctlr.register_function("position", { techage.lua_ctlr.register_function("position", {
cmnd = function(self, number) cmnd = function(self, number)
local info = techage.get_node_info(number) local info = techage.get_node_info(number)
@ -132,7 +140,7 @@ techage.lua_ctlr.register_function("position", {
end end
return "(-,-,-)" return "(-,-,-)"
end, end,
help = "$position(number)\n".. help = " pos = $position(number)\n"..
" returns the position '(x,y,z)' of the device\n with given number." " returns the position '(x,y,z)' of the device\n with given number."
}) })
@ -144,7 +152,7 @@ techage.lua_ctlr.register_action("battery", {
local val = (BATTERY_CAPA - math.min(batmeta:get_int("content") or 0, BATTERY_CAPA)) local val = (BATTERY_CAPA - math.min(batmeta:get_int("content") or 0, BATTERY_CAPA))
return 100 - math.floor((val * 100.0 / BATTERY_CAPA)) return 100 - math.floor((val * 100.0 / BATTERY_CAPA))
end, end,
help = " $battery()\n".. help = " lvl = $battery()\n"..
" Get charge level of battery connected to Controller.\n".. " Get charge level of battery connected to Controller.\n"..
" Function returns percent number (0-100) where 100 means full.\n".. " Function returns percent number (0-100) where 100 means full.\n"..
" example: battery_percent = $battery()" " example: battery_percent = $battery()"

View File

@ -63,7 +63,7 @@ local function get_stacks(pos)
end end
local function allow_metadata_inventory_put(pos, listname, index, stack, player) local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then if M(pos):get_string("public") ~= "true" and minetest.is_protected(pos, player:get_player_name()) then
return 0 return 0
end end
store_action(pos, player, "put") store_action(pos, player, "put")
@ -72,7 +72,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
end end
local function allow_metadata_inventory_take(pos, listname, index, stack, player) local function allow_metadata_inventory_take(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then if M(pos):get_string("public") ~= "true" and minetest.is_protected(pos, player:get_player_name()) then
return 0 return 0
end end
store_action(pos, player, "take") store_action(pos, player, "take")
@ -93,12 +93,13 @@ local function after_dig_node(pos, oldnode, oldmetadata, digger)
end end
local function formspec1() local function formspec1()
return "size[6,4]".. return "size[5.5,4]"..
default.gui_bg.. default.gui_bg..
default.gui_bg_img.. default.gui_bg_img..
default.gui_slots.. default.gui_slots..
"field[0.5,1;5,1;number;TA4 Lua Controller number:;]" .. "field[0.5,1;5,1;number;TA4 Lua Controller number:;]" ..
"button_exit[1.5,2.5;2,1;exit;Save]" "checkbox[0.5,1.8;public;"..S("Allow public chest access")..";false]"..
"button_exit[1.7,2.8;2,1;exit;Save]"
end end
local function formspec2(pos) local function formspec2(pos)
@ -147,7 +148,15 @@ minetest.register_node("techage:ta4_sensor_chest", {
on_receive_fields = function(pos, formname, fields, player) on_receive_fields = function(pos, formname, fields, player)
local meta = M(pos) local meta = M(pos)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
if fields.number and fields.number ~= "" then
if meta:get_string("public") ~= "true" and minetest.is_protected(pos, player:get_player_name()) then
return 0
end
if fields.public then
meta:set_string("public", fields.public)
end
if fields.quit == "true" and fields.number and fields.number ~= "" then
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
if techage.check_numbers(fields.number, owner) then if techage.check_numbers(fields.number, owner) then
meta:set_string("number", fields.number) meta:set_string("number", fields.number)

View File

@ -386,7 +386,17 @@ Der Server dient zur zentralen Speicherung von Daten von mehreren Lua Controller
### TA4 Sensor Kiste/Chest ### TA4 Sensor Kiste/Chest
Die TA4 Sensor Kiste dient zum Aufbau von Automatischen Lagern oder Verkaufsautomaten. Sie hat erweitere Kommandos zur Fernsteuerung. Die TA4 Sensor Kiste dient zum Aufbau von Automatischen Lagern oder Verkaufsautomaten in Verbindung mit dem Lua Controller.
Wird etwas in die Kiste gelegt, oder entnommen, oder eine der Tasten "F1"/"F2" gedrückt, so wird ein Event-Signal an den Lua Controller gesendet.
Die Sensor Kiste unterstützt folgende Kommandos:
- Über `state = $read_data(<num>, "state")` kann der Status der Kiste abgefragt werden. Mögliche Antworten sind: "empty", "loaded", "full"
- Über `name, action = $read_data(<num>, "action")` kann die letzte Spieleraktion abgefragt werden. `name` ist der Spielername, Als `action` wird zurückgeliefert: "put", "take", "f1", "f2".
- Über `stacks = $read_data(<num>, "stacks")` kann der Inhalt der Kiste ausgelesen werden. Siehe dazu: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest
- Über `$send_cmnd(<num>, "text", "press both buttons and\nput something into the chest")` kann der Text im Menü der Sensor Kiste gesetzt werden.
Über die Checkbox "Erlaube öffentlichen Zugriff" kann eingestellt werden, ob die Kiste von jedem genutzt werden darf, oder nur von Spielern die hier Zugriffsrechte haben.
[ta4_sensor_chest|image] [ta4_sensor_chest|image]
@ -602,4 +612,4 @@ Beim Weitergeben wird in der Zielmaschine pro Item nur eine Position im Inventar
Die Verarbeitungsleistung beträgt bis zu 8 Items alle 3 Sekunden. Die Verarbeitungsleistung beträgt bis zu 8 Items alle 3 Sekunden.
[ta4_injector|image] [ta4_injector|image]

View File

@ -388,7 +388,16 @@ The server is used for the central storage of data from several Lua controllers.
### TA4 Sensor Box / Chest ### TA4 Sensor Box / Chest
The TA4 sensor box is used to set up automatic warehouses or vending machines. It has additional commands for remote control. The TA4 sensor box is used to set up automatic warehouses or vending machines in conjunction with the Lua controller.
If something is put into the box or removed, or one of the "F1" / "F2" keys is pressed, an event signal is sent to the Lua controller.
The sensor box supports the following commands:
- The status of the box can be queried via `state = $read_data(<num>, "state")`. Possible answers are: "empty", "loaded", "full"
- The last player action can be queried via `name, action = $read_data(<num>, "action")`. `name` is the player name. One of the following is returned as `action`: "put", "take", "f1", "f2".
- The contents of the box can be read out via `stacks = $read_data(<num>, "stacks")`. See: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest
- Via `$send_cmnd(<num>, "text", "press both buttons and\nput something into the chest")` the text can be set in the menu of the sensor box.
The checkbox "Allow public chest access" can be used to set whether the box can be used by everyone or only by players who have access/protection rights here.
[ta4_sensor_chest|image] [ta4_sensor_chest|image]
@ -513,9 +522,9 @@ The processing power is 12 items every 2 s, if TA4 tubes are used on both sides.
The TA4 pusher has two additional commands for the Lua controller: The TA4 pusher has two additional commands for the Lua controller:
- `config` is used to configure the pusher, analogous to manual configuration via the menu. - `config` is used to configure the pusher, analogous to manual configuration via the menu.
Example: `$ send_cmnd(1234, "config", "default: dirt")` Example: `$send_cmnd(1234, "config", "default: dirt")`
- `pull` is used to send an order to the pusher: - `pull` is used to send an order to the pusher:
Example: `$ send_cmnd(1234, "pull", "default: dirt 8")` Example: `$send_cmnd(1234, "pull", "default: dirt 8")`
Values from 1 to 12 are permitted as numbers. Then the pusher goes back to `stopped` mode and sends an" off "command back to the transmitter of the" pull "command. Values from 1 to 12 are permitted as numbers. Then the pusher goes back to `stopped` mode and sends an" off "command back to the transmitter of the" pull "command.
[ta4_pusher|image] [ta4_pusher|image]
@ -552,8 +561,8 @@ The chest can only be used by players who can build at this location, i.e. who h
The chest has an additional command for the Lua controller: The chest has an additional command for the Lua controller:
- `count` is used to request how many items are in the chest. - `count` is used to request how many items are in the chest.
Example 1: `$ read_data(CHEST, "count")` -> Sum of items across all 8 stores Example 1: `$read_data(CHEST, "count")` -> Sum of items across all 8 stores
Example 2: `$ read_data(CHEST, "count", 2)` -> number of items in store 2 (second from left) Example 2: `$read_data(CHEST, "count", 2)` -> number of items in store 2 (second from left)
[ta4_8x2000_chest|image] [ta4_8x2000_chest|image]

View File

@ -330,7 +330,8 @@ In addition to Lua standard function the Lua Controller provides the following f
E.g.: `$print("Hello "..name)` E.g.: `$print("Hello "..name)`
- `$loopcycle(seconds)` - This function allows to change the call frequency of the controller loop() function, witch is per default one second. For more info, see "Cyclic Task" - `$loopcycle(seconds)` - This function allows to change the call frequency of the controller loop() function, witch is per default one second. For more info, see "Cyclic Task"
- `$events(bool)` - Enable/disable event handling. For more info, see "Events" - `$events(bool)` - Enable/disable event handling. For more info, see "Events"
- `$get_ms_time()` - Returns time with millisecond precision - `$get_ms_time()` - Returns the time with millisecond precision
- `get_gametime()` - Returns the time, in seconds, since the world was created
- `$time_as_str()` - Read the time of day (ingame) as text string in 24h format, like "18:45" - `$time_as_str()` - Read the time of day (ingame) as text string in 24h format, like "18:45"
- `$time_as_num()` - Read the time of day (ingame) as integer number in 24h format, like 1845 - `$time_as_num()` - Read the time of day (ingame) as integer number in 24h format, like 1845
- `$get_input(num)` - Read an input value provided by an external block with the given number _num_. The block has to be configured with the number of the controller to be able to send status messages (on/off commands) to the controller. _num_ is the number of the remote block, like "1234". - `$get_input(num)` - Read an input value provided by an external block with the given number _num_. The block has to be configured with the number of the controller to be able to send status messages (on/off commands) to the controller. _num_ is the number of the remote block, like "1234".

View File

@ -193,7 +193,7 @@ local function get_state(netw)
if #(netw.gen1 or {}) + #(netw.gen2 or {}) == 0 then if #(netw.gen1 or {}) + #(netw.gen2 or {}) == 0 then
state = S("No power grid or running generator!") state = S("No power grid or running generator!")
elseif needed > (netw.available1 or 0) then elseif needed > (netw.available1 or 0) then
state = S("Probably too many consumers (")..needed..S(" ku is needed!)") state = S("Probably too many consumers (")..needed.." "..S("ku is needed").."!)"
elseif (netw.num_nodes or 0) < techage.networks.MAX_NUM_NODES then elseif (netw.num_nodes or 0) < techage.networks.MAX_NUM_NODES then
state = S("Number of power grid blocks")..": "..(netw.num_nodes or 0)..", "..S("Max. needed power")..": "..needed.. " ku" state = S("Number of power grid blocks")..": "..(netw.num_nodes or 0)..", "..S("Max. needed power")..": "..needed.. " ku"
else else

View File

@ -120,19 +120,15 @@ local function get_capa(itemstack)
return 0 return 0
end end
local function set_capa(pos, oldnode, digger, capa) local function set_capa(pos, oldnode, oldmetadata, drops)
local node = ItemStack(oldnode.name) local nvm = techage.get_nvm(pos)
local meta = node:get_meta() local capa = nvm.capa
local meta = drops[1]:get_meta()
capa = techage.power.percent(PWR_CAPA, capa) capa = techage.power.percent(PWR_CAPA, capa)
capa = (math.floor((capa or 0) / 5)) * 5 capa = (math.floor((capa or 0) / 5)) * 5
meta:set_int("capa", capa) meta:set_int("capa", capa)
local text = S("TA3 Accu Box").." ("..capa.." %)" local text = S("TA3 Accu Box").." ("..capa.." %)"
meta:set_string("description", text) meta:set_string("description", text)
local inv = minetest.get_inventory({type="player", name=digger:get_player_name()})
local left_over = inv:add_item("main", node)
if left_over:get_count() > 0 then
minetest.add_item(pos, node)
end
end end
local function after_place_node(pos, placer, itemstack) local function after_place_node(pos, placer, itemstack)
@ -149,9 +145,7 @@ local function after_place_node(pos, placer, itemstack)
end end
local function after_dig_node(pos, oldnode, oldmetadata, digger) local function after_dig_node(pos, oldnode, oldmetadata, digger)
local nvm = techage.get_nvm(pos)
Cable:after_dig_node(pos) Cable:after_dig_node(pos)
set_capa(pos, oldnode, digger, nvm.capa)
techage.del_mem(pos) techage.del_mem(pos)
end end
@ -188,13 +182,12 @@ minetest.register_node("techage:ta3_akku", {
after_dig_node = after_dig_node, after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2, tubelib2_on_update2 = tubelib2_on_update2,
networks = net_def, networks = net_def,
drop = "", -- don't remove, item will be added via 'set_capa'
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2}, groups = {cracky=2, crumbly=2, choppy=2},
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
is_ground_content = false, is_ground_content = false,
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
preserve_metadata = set_capa,
}) })
Cable:add_secondary_node_names({"techage:ta3_akku"}) Cable:add_secondary_node_names({"techage:ta3_akku"})

View File

@ -281,8 +281,8 @@ minetest.register_node("towercrane:mast_ctrl_off", {
-- switch the crane ON -- switch the crane ON
on_rightclick = function (pos, node, clicker) on_rightclick = function (pos, node, clicker)
if is_my_crane(pos, clicker) and not is_operator(clicker) then if is_my_crane(pos, clicker) and not is_operator(clicker) then
start_crane(pos, clicker)
if set_operator_privs(clicker, pos) then if set_operator_privs(clicker, pos) then
start_crane(pos, clicker)
local pos1, pos2 = calc_construction_area(pos) local pos1, pos2 = calc_construction_area(pos)
-- control player every second -- control player every second
minetest.after(1, control_player, pos, pos1, pos2, clicker:get_player_name()) minetest.after(1, control_player, pos, pos1, pos2, clicker:get_player_name())