Improvements on move-, fly-, and turn controllers

This commit is contained in:
Joachim Stolberg 2021-11-16 20:07:52 +01:00
parent 5597836d06
commit 793ef84a8c
9 changed files with 118 additions and 70 deletions

View File

@ -17,6 +17,7 @@ local M = minetest.get_meta
local S = techage.S
local TA4_INV_SIZE = 50
local EX_PIONTS = 10
local MP = minetest.get_modpath(minetest.get_current_modname())
local mConf = dofile(MP.."/basis/conf_inv.lua")
@ -365,7 +366,7 @@ minetest.register_node("techage:chest_ta4", {
techage.remove_node(pos, oldnode, oldmetadata)
hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger)
end,
ta5_formspec = {menu=hyperloop.WRENCH_MENU, ex_points=10},
ta5_formspec = {menu=hyperloop.WRENCH_MENU, ex_points=EX_PIONTS},
ta_after_formspec = hyperloop.after_formspec,
allow_metadata_inventory_put = ta4_allow_metadata_inventory_put,
allow_metadata_inventory_take = ta4_allow_metadata_inventory_take,

View File

@ -224,6 +224,10 @@ local function entity_to_node(pos, obj)
local param2 = self.param2 or 0
local metadata = self.metadata or {}
detach_objects(pos, self)
if self.base_pos then
local nvm = techage.get_nvm(self.base_pos)
nvm.running = nil
end
obj:remove()
local node = minetest.get_node(pos)
@ -281,7 +285,7 @@ local function node_to_entity(start_pos)
self.players = {}
self.entities = {}
-- Prepare for path walk
self.idx = 1
self.path_idx = 1
return obj
end
end
@ -306,9 +310,9 @@ local function move_entity(obj, dest_pos, dir, is_corner)
end
local function moveon_entity(obj, self, pos1)
local pos2 = next_path_pos(pos1, self.lpath, self.idx)
local pos2 = next_path_pos(pos1, self.lpath, self.path_idx)
if pos2 then
self.idx = self.idx + 1
self.path_idx = self.path_idx + 1
local dir = determine_dir(pos1, pos2)
move_entity(obj, pos2, dir, true)
return true
@ -321,15 +325,31 @@ local function handover_to(obj, self, pos1)
if info and info.name == "techage:ta4_movecontroller" then
local meta = M(info.pos)
if self.move2to1 then
self.handover = meta:contains("handoverB") and meta:get_string("handoverB")
else
self.handover = meta:contains("handoverA") and meta:get_string("handoverA")
else
self.handover = meta:contains("handoverB") and meta:get_string("handoverB")
end
local offs = flylib.to_vector(meta:get_string("path"))
if pos1 and offs then
self.dest_pos = vector.add(pos1, offs)
local dir = determine_dir(pos1, info.pos)
move_entity(obj, info.pos, dir)
self.lpath = flylib.to_path(meta:get_string("path"))
if pos1 and self.lpath then
self.path_idx = 2
if self.move2to1 then
self.lpath[1] = vector.multiply(self.lpath[1], - 1)
end
local pos2 = next_path_pos(pos1, self.lpath, 1)
local dir = determine_dir(pos1, pos2)
--print("handover_to", P2S(pos1), P2S(pos2), P2S(dir), P2S(info.pos), meta:get_string("path"))
if not self.handover then
local nvm = techage.get_nvm(info.pos)
nvm.lpos1 = nvm.lpos1 or {}
if self.move2to1 then
nvm.lpos1[self.pos1_idx] = pos2
else
nvm.lpos1[self.pos1_idx] = pos1
end
end
move_entity(obj, pos2, dir)
return true
end
end
@ -355,9 +375,11 @@ minetest.register_entity("techage:move_item", {
metadata = self.metadata,
move2to1 = self.move2to1,
handover = self.handover,
idx = self.idx,
path_idx = self.path_idx,
pos1_idx = self.pos1_idx,
lpath = self.lpath,
start_pos = self.start_pos,
base_pos = self.base_pos,
max_speed = self.max_speed,
dest_pos = self.dest_pos,
dir = self.dir,
@ -373,14 +395,16 @@ minetest.register_entity("techage:move_item", {
self.metadata = tbl.metadata or {}
self.move2to1 = tbl.move2to1 or false
self.handover = tbl.handover
self.idx = tbl.idx or 1
self.path_idx = tbl.path_idx or 1
self.pos1_idx = tbl.pos1_idx or 1
self.lpath = tbl.lpath or {}
self.max_speed = tbl.max_speed or MAX_SPEED
self.dest_pos = tbl.dest_pos or self.object:get_pos()
self.start_pos = tbl.start_pos or self.object:get_pos()
self.base_pos = tbl.base_pos
self.dir = tbl.dir or {x=0, y=0, z=0}
self.object:set_properties({wield_item = self.item})
print("tbl.respawn", tbl.respawn)
--print("tbl.respawn", tbl.respawn)
if tbl.respawn then
entity_to_node(self.start_pos, self.object)
end
@ -405,7 +429,7 @@ minetest.register_entity("techage:move_item", {
self.old_dist = self.old_dist or dist
-- Landing
if self.lpath and self.lpath[self.idx] then
if self.lpath and self.lpath[self.path_idx] then
if dist < 1 or dist > self.old_dist then
local dest_pos = self.dest_pos
stop_obj(obj, self)
@ -415,12 +439,12 @@ minetest.register_entity("techage:move_item", {
return
end
elseif self.handover and dist < 0.2 or dist > self.old_dist then
if not handover_to(obj, self, self.dest_pos) then
local dest_pos = self.dest_pos
stop_obj(obj, self)
local dest_pos = self.dest_pos
stop_obj(obj, self)
if not handover_to(obj, self, dest_pos) then
minetest.after(0.5, entity_to_node, dest_pos, obj)
return
end
return
else
if dist < 0.05 or dist > self.old_dist then
local dest_pos = self.dest_pos
@ -458,7 +482,6 @@ minetest.register_entity("techage:move_item", {
end
end
end,
})
local function is_valid_dest(pos)
@ -500,9 +523,9 @@ local function table_add(tbl, offs)
return tbl2
end
local function move_node(pos, start_pos, lpath, max_speed, height, move2to1, handover)
local function move_node(pos, pos1_idx, start_pos, lpath, max_speed, height, move2to1, handover)
local pos2 = next_path_pos(start_pos, lpath, 1)
print("move_node", P2S(pos), P2S(start_pos), lpath, max_speed, height, move2to1, P2S(pos2))
--print("move_node", P2S(pos), P2S(start_pos), lpath, max_speed, height, move2to1, P2S(pos2))
if pos2 then
local dir = determine_dir(start_pos, pos2)
local obj = node_to_entity(start_pos)
@ -516,19 +539,22 @@ local function move_node(pos, start_pos, lpath, max_speed, height, move2to1, han
end
end
local self = obj:get_luaentity()
self.idx = 2
self.path_idx = 2
self.pos1_idx = pos1_idx
self.lpath = lpath
self.max_speed = max_speed
self.start_pos = start_pos
self.base_pos = pos
self.move2to1 = move2to1
self.handover = handover
print("move_node", P2S(start_pos), P2S(pos2), P2S(dir), P2S(pos))
move_entity(obj, pos2, dir)
end
end
end
local function move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, handover)
print("move_nodes", dump(nvm), dump(lpath), max_speed, height, move2to1, handover)
--print("move_nodes", dump(nvm), dump(lpath), max_speed, height, move2to1, handover)
local owner = meta:get_string("owner")
techage.counting_add(owner, #nvm.lpos1 * #lpath)
@ -540,10 +566,10 @@ local function move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, ha
pos1, pos2 = pos2, pos1
end
print("move_nodes", P2S(pos1), P2S(pos2))
--print("move_nodes", P2S(pos1), P2S(pos2))
if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then
if is_simple_node(pos1) and is_valid_dest(pos2) then
move_node(pos, pos1, lpath, max_speed, height, move2to1, handover)
move_node(pos, idx, pos1, lpath, max_speed, height, move2to1, handover)
else
if not is_simple_node(pos1) then
meta:set_string("status", S("No valid node at the start position"))

View File

@ -25,6 +25,7 @@ local hyperloop = techage.hyperloop
local remote_pos = techage.hyperloop.remote_pos
local CAPACITY = 1000
local EX_PIONTS = 20
local function on_rightclick(pos, node, clicker)
local rmt_pos = remote_pos(pos)
@ -242,7 +243,7 @@ minetest.register_node("techage:ta4_tank", {
techage.remove_node(pos, oldnode, oldmetadata)
end,
on_rightclick = on_rightclick,
ta5_formspec = {menu=hyperloop.WRENCH_MENU, ex_points=20},
ta5_formspec = {menu=hyperloop.WRENCH_MENU, ex_points=EX_PIONTS},
ta_after_formspec = hyperloop.after_formspec,
can_dig = can_dig,
paramtype2 = "facedir",

View File

@ -24,6 +24,7 @@ local mark = dofile(MP .. "/basis/mark_lib.lua")
local MAX_DIST = 200
local MAX_BLOCKS = 16
local EX_PIONTS = 40
local WRENCH_MENU = {
{
@ -65,9 +66,9 @@ minetest.register_node("techage:ta5_flycontroller", {
description = S("TA5 Fly Controller"),
tiles = {
-- up, down, right, left, back, front
"techage_filling_ta4.png^techage_frame_ta4_top.png",
"techage_filling_ta4.png^techage_frame_ta4_top.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_movecontroller.png",
"techage_filling_ta4.png^techage_frame_ta5_top.png",
"techage_filling_ta4.png^techage_frame_ta5_top.png",
"techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_movecontroller.png",
},
after_place_node = function(pos, placer, itemstack)
@ -82,13 +83,18 @@ minetest.register_node("techage:ta5_flycontroller", {
if minetest.is_protected(pos, player:get_player_name()) then
return
end
if techage.get_expoints(player) < EX_PIONTS then
return
end
local meta = M(pos)
local nvm = techage.get_nvm(pos)
if fields.record then
nvm.lpos1 = {}
nvm.lpos2 = {}
nvm.moveBA = false
nvm.running = true
meta:set_string("status", S("Recording..."))
local name = player:get_player_name()
minetest.chat_send_player(name, S("Click on all blocks that shall be moved"))
@ -113,20 +119,26 @@ minetest.register_node("techage:ta5_flycontroller", {
meta:set_string("formspec", formspec(nvm, meta))
local name = player:get_player_name()
mark.stop(name)
nvm.moveBA = false
nvm.running = true
elseif fields.moveAB then
meta:set_string("status", "")
if fly.move_to_other_pos(pos, false) then
nvm.running = true
meta:set_string("formspec", formspec(nvm, meta))
local name = player:get_player_name()
mark.stop(name)
end
meta:set_string("formspec", formspec(nvm, meta))
elseif fields.moveBA then
meta:set_string("status", "")
if fly.move_to_other_pos(pos, true) then
nvm.running = true
meta:set_string("formspec", formspec(nvm, meta))
local name = player:get_player_name()
mark.stop(name)
end
meta:set_string("formspec", formspec(nvm, meta))
end
end,
@ -137,23 +149,34 @@ minetest.register_node("techage:ta5_flycontroller", {
techage.remove_node(pos, oldnode, oldmetadata)
end,
ta4_formspec = WRENCH_MENU,
ta5_formspec = {menu=WRENCH_MENU, ex_points=EX_PIONTS},
paramtype2 = "facedir",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
local INFO = [[Commands: 'a2b', 'b2a']]
local INFO = [[Commands: 'status', 'a2b', 'b2a', 'move']]
techage.register_node({"techage:ta5_flycontroller"}, {
on_recv_message = function(pos, src, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "info" then
return INFO
elseif topic == "status" then
return nvm.running and "running" or "stopped"
elseif topic == "a2b" then
nvm.moveBA = true
nvm.running = true
return fly.move_to_other_pos(pos, false)
elseif topic == "b2a" then
nvm.moveBA = false
nvm.running = true
return fly.move_to_other_pos(pos, true)
elseif topic == "move" then
nvm.moveBA = nvm.moveBA == false
nvm.running = true
return fly.move_to_other_pos(pos, nvm.moveBA == false)
end
return false
end,

View File

@ -25,28 +25,6 @@ local mark = dofile(MP .. "/basis/mark_lib.lua")
local MAX_DIST = 100
local MAX_BLOCKS = 16
-- Determine and store the path in the first and in the last block of the chain
local function store_path(pos)
local lpath = {}
local pos2 = table.copy(pos)
while pos2 do
local meta = M(pos2)
lpath[#lpath + 1] = meta:get_string("distance")
local number = meta:get_string("handoverB")
local info = techage.get_node_info(number)
if info and info.name == "techage:ta4_movecontroller" then
pos2 = info.pos
else
local s = table.concat(lpath, "\n")
M(pos):set_string("path", s) -- first block
M(pos2):set_string("path", s) -- last block
techage.get_nvm(pos2).lpos1 = techage.get_nvm(pos).lpos2
pos2 = nil
end
end
return #lpath
end
local WRENCH_MENU = {
{
type = "dropdown",
@ -81,7 +59,7 @@ local WRENCH_MENU = {
local function formspec(nvm, meta)
local status = meta:get_string("status")
local distance = meta:contains("distance") and meta:get_string("distance") or "0,3,0"
local path = meta:contains("path") and meta:get_string("path") or "0,3,0"
return "size[8,5]" ..
default.gui_bg ..
default.gui_bg_img ..
@ -91,7 +69,7 @@ local function formspec(nvm, meta)
techage.wrench_image(7.4, -0.05) ..
"button[0.1,0.8;3.8,1;record;" .. S("Record") .. "]" ..
"button[4.1,0.8;3.8,1;done;" .. S("Done") .. "]" ..
"field[0.4,2.5;3.8,1;distance;" .. S("Move distance (A to B)") .. ";" .. distance .. "]" ..
"field[0.4,2.5;3.8,1;path;" .. S("Move distance (A to B)") .. ";" .. path .. "]" ..
"button[4.1,2.2;3.8,1;store;" .. S("Store") .. "]" ..
"button_exit[0.1,3.3;3.8,1;moveAB;" .. S("Move A-B") .. "]" ..
"button_exit[4.1,3.3;3.8,1;moveBA;" .. S("Move B-A") .. "]" ..
@ -126,6 +104,8 @@ minetest.register_node("techage:ta4_movecontroller", {
if fields.record then
nvm.lpos1 = {}
nvm.lpos2 = {}
nvm.moveBA = false
nvm.running = true
meta:set_string("status", S("Recording..."))
local name = player:get_player_name()
minetest.chat_send_player(name, S("Click on all blocks that shall be moved"))
@ -141,31 +121,35 @@ minetest.register_node("techage:ta4_movecontroller", {
mark.stop(name)
meta:set_string("formspec", formspec(nvm, meta))
elseif fields.store then
if fly.to_vector(fields.distance, MAX_DIST) then
meta:set_string("distance", fields.distance)
if fly.to_vector(fields.path or "", MAX_DIST) then
meta:set_string("path", fields.path)
meta:set_string("status", S("Stored"))
meta:set_string("path", "")
else
meta:set_string("status", S("Error: Invalid distance !!"))
end
meta:set_string("formspec", formspec(nvm, meta))
local name = player:get_player_name()
mark.stop(name)
nvm.moveBA = false
nvm.running = true
elseif fields.moveAB then
meta:set_string("status", "")
--store_path(pos)
if fly.move_to_other_pos(pos, false) then
nvm.running = true
meta:set_string("formspec", formspec(nvm, meta))
local name = player:get_player_name()
mark.stop(name)
end
meta:set_string("formspec", formspec(nvm, meta))
elseif fields.moveBA then
meta:set_string("status", "")
if fly.move_to_other_pos(pos, true) then
nvm.running = true
meta:set_string("formspec", formspec(nvm, meta))
local name = player:get_player_name()
mark.stop(name)
end
meta:set_string("formspec", formspec(nvm, meta))
end
end,
@ -183,16 +167,27 @@ minetest.register_node("techage:ta4_movecontroller", {
sounds = default.node_sound_wood_defaults(),
})
local INFO = [[Commands: 'a2b', 'b2a']]
local INFO = [[Commands: 'status', 'a2b', 'b2a', 'move']]
techage.register_node({"techage:ta4_movecontroller"}, {
on_recv_message = function(pos, src, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "info" then
return INFO
elseif topic == "status" then
return nvm.running and "running" or "stopped"
elseif topic == "a2b" then
nvm.moveBA = true
nvm.running = true
return fly.move_to_other_pos(pos, false)
elseif topic == "b2a" then
nvm.moveBA = false
nvm.running = true
return fly.move_to_other_pos(pos, true)
elseif topic == "move" then
nvm.moveBA = nvm.moveBA == false
nvm.running = true
return fly.move_to_other_pos(pos, nvm.moveBA == false)
end
return false
end,

View File

@ -99,6 +99,7 @@ minetest.register_node("techage:ta4_turncontroller", {
mark.stop(name)
print("new_posses", #new_posses)
end
meta:set_string("formspec", formspec(nvm, meta))
elseif fields.right then
meta:set_string("status", "")
local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r")
@ -108,6 +109,7 @@ minetest.register_node("techage:ta4_turncontroller", {
mark.stop(name)
print("new_posses", #new_posses)
end
meta:set_string("formspec", formspec(nvm, meta))
end
end,
@ -164,11 +166,11 @@ techage.register_node({"techage:ta4_turncontroller"}, {
end,
})
--minetest.register_craft({
-- output = "techage:ta5_flycontroller",
-- recipe = {
-- {"default:steel_ingot", "dye:blue", "default:steel_ingot"},
-- {"default:mese_crystal_fragment", "techage:ta4_wlanchip", "default:mese_crystal_fragment"},
-- {"group:wood", "basic_materials:gear_steel", "group:wood"},
-- },
--})
minetest.register_craft({
output = "techage:ta4_turncontroller",
recipe = {
{"default:steel_ingot", "dye:blue", "default:steel_ingot"},
{"techage:aluminum", "techage:baborium_ingot", "techage:aluminum"},
{"group:wood", "basic_materials:gear_steel", "group:wood"},
},
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 708 B

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B