179 lines
4.5 KiB
Lua
179 lines
4.5 KiB
Lua
|
|
minetest.register_node("jumpdrive:engine", {
|
|
description = "Jumpdrive",
|
|
|
|
tiles = {"jumpdrive.png"},
|
|
|
|
tube = {
|
|
insert_object = function(pos, node, stack, direction)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
return inv:add_item("main", stack)
|
|
end,
|
|
can_insert = function(pos, node, stack, direction)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
stack = stack:peek_item(1)
|
|
|
|
return inv:room_for_item("main", stack)
|
|
end,
|
|
input_inventory = "main",
|
|
connect_sides = {bottom = 1}
|
|
},
|
|
|
|
connects_to = {"group:technic_hv_cable"},
|
|
connect_sides = {"bottom", "top", "left", "right", "front", "back"},
|
|
|
|
light_source = 13,
|
|
groups = {cracky=2,oddly_breakable_by_hand=2,tubedevice=1, tubedevice_receiver=1,technic_machine = 1, technic_hv = 1},
|
|
|
|
sounds = default.node_sound_glass_defaults(),
|
|
|
|
digiline = {
|
|
receptor = {action = function() end},
|
|
effector = {
|
|
action = jumpdrive.digiline_effector
|
|
},
|
|
},
|
|
|
|
after_place_node = function(pos, placer)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("owner", placer:get_player_name() or "")
|
|
end,
|
|
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_int("x", pos.x)
|
|
meta:set_int("y", pos.y)
|
|
meta:set_int("z", pos.z)
|
|
meta:set_int("radius", 5)
|
|
meta:set_int("powerstorage", 0)
|
|
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("main", 8)
|
|
|
|
meta:set_int("HV_EU_input", 0)
|
|
meta:set_int("HV_EU_demand", 0)
|
|
|
|
jumpdrive.update_formspec(meta, pos)
|
|
end,
|
|
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
local name = player:get_player_name()
|
|
|
|
return inv:is_empty("main") and not minetest.is_protected(pos, name)
|
|
end,
|
|
|
|
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")
|
|
local store = meta:get_int("powerstorage")
|
|
|
|
meta:set_string("infotext", "Power: " .. eu_input .. "/" .. demand .. " Store: " .. store)
|
|
|
|
if store < jumpdrive.config.powerstorage then
|
|
-- charge
|
|
meta:set_int("HV_EU_demand", jumpdrive.config.powerrequirement)
|
|
store = store + eu_input
|
|
meta:set_int("powerstorage", math.min(store, jumpdrive.config.powerstorage))
|
|
else
|
|
-- charged
|
|
meta:set_int("HV_EU_demand", 0)
|
|
end
|
|
end,
|
|
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
|
|
local meta = minetest.get_meta(pos);
|
|
|
|
if not sender then
|
|
return
|
|
end
|
|
|
|
if minetest.is_protected(pos, sender:get_player_name()) then
|
|
-- not allowed
|
|
return
|
|
end
|
|
|
|
if fields.read_book then
|
|
jumpdrive.read_from_book(pos)
|
|
jumpdrive.update_formspec(meta, pos)
|
|
return
|
|
end
|
|
|
|
if fields.reset then
|
|
jumpdrive.reset_coordinates(pos)
|
|
jumpdrive.update_formspec(meta, pos)
|
|
return
|
|
end
|
|
|
|
if fields.write_book then
|
|
jumpdrive.write_to_book(pos, sender)
|
|
return
|
|
end
|
|
|
|
local x = tonumber(fields.x);
|
|
local y = tonumber(fields.y);
|
|
local z = tonumber(fields.z);
|
|
local radius = tonumber(fields.radius);
|
|
|
|
if x == nil or y == nil or z == nil or radius == nil or radius < 1 then
|
|
return
|
|
end
|
|
|
|
local max_radius = jumpdrive.config.max_radius
|
|
|
|
if radius > max_radius then
|
|
minetest.chat_send_player(sender:get_player_name(), "Invalid jump: max-radius=" .. max_radius)
|
|
return
|
|
end
|
|
|
|
-- update coords
|
|
meta:set_int("x", jumpdrive.sanitize_coord(x))
|
|
meta:set_int("y", jumpdrive.sanitize_coord(y))
|
|
meta:set_int("z", jumpdrive.sanitize_coord(z))
|
|
meta:set_int("radius", radius)
|
|
jumpdrive.update_formspec(meta, pos)
|
|
|
|
if fields.jump then
|
|
jumpdrive.execute_jump(pos, sender)
|
|
end
|
|
|
|
if fields.show then
|
|
local success, msg = jumpdrive.simulate_jump(pos, sender, true)
|
|
if not success then
|
|
minetest.chat_send_player(sender:get_player_name(), msg)
|
|
return
|
|
end
|
|
minetest.chat_send_player(sender:get_player_name(), "Simulation successful")
|
|
end
|
|
|
|
end,
|
|
|
|
on_punch = function(pos, node, puncher)
|
|
|
|
if minetest.is_protected(pos, puncher:get_player_name()) then
|
|
return
|
|
end
|
|
|
|
local meta = minetest.get_meta(pos);
|
|
local radius = meta:get_int("radius")
|
|
|
|
jumpdrive.show_marker(pos, radius, "green")
|
|
end
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = 'jumpdrive:engine',
|
|
recipe = {
|
|
{'jumpdrive:backbone', 'default:diamondblock', 'jumpdrive:backbone'},
|
|
{'default:diamondblock', 'technic:blue_energy_crystal', 'default:diamondblock'},
|
|
{'jumpdrive:backbone', 'technic:hv_transformer', 'jumpdrive:backbone'}
|
|
}
|
|
})
|
|
|
|
technic.register_machine("HV", "jumpdrive:engine", technic.receiver)
|