diff --git a/basic_machines/chest.lua b/basic_machines/chest.lua index 310f476..be26878 100644 --- a/basic_machines/chest.lua +++ b/basic_machines/chest.lua @@ -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, diff --git a/basis/fly_lib.lua b/basis/fly_lib.lua index 9eeb126..13dc527 100644 --- a/basis/fly_lib.lua +++ b/basis/fly_lib.lua @@ -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")) diff --git a/liquids/tank.lua b/liquids/tank.lua index 58996fb..c81b635 100644 --- a/liquids/tank.lua +++ b/liquids/tank.lua @@ -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", diff --git a/move_controller/flycontroller.lua b/move_controller/flycontroller.lua index c902ed9..5f0bab5 100644 --- a/move_controller/flycontroller.lua +++ b/move_controller/flycontroller.lua @@ -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, diff --git a/move_controller/movecontroller.lua b/move_controller/movecontroller.lua index 0d88762..abccdb2 100644 --- a/move_controller/movecontroller.lua +++ b/move_controller/movecontroller.lua @@ -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, diff --git a/move_controller/turncontroller.lua b/move_controller/turncontroller.lua index 28a9010..781d630 100644 --- a/move_controller/turncontroller.lua +++ b/move_controller/turncontroller.lua @@ -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"}, + }, +}) diff --git a/textures/techage_appl_turn.png b/textures/techage_appl_turn.png index 4a2998d..fbc8b33 100644 Binary files a/textures/techage_appl_turn.png and b/textures/techage_appl_turn.png differ diff --git a/textures/techage_frame_ta5.png b/textures/techage_frame_ta5.png new file mode 100644 index 0000000..6609d1f Binary files /dev/null and b/textures/techage_frame_ta5.png differ diff --git a/textures/techage_frame_ta5_top.png b/textures/techage_frame_ta5_top.png new file mode 100644 index 0000000..85b4276 Binary files /dev/null and b/textures/techage_frame_ta5_top.png differ