From 1024f8ccc5b195d47dcbbd2716d528863cb76a53 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Tue, 31 Mar 2020 18:27:15 +0200 Subject: [PATCH] TA4 chest,quarry, and oil explorer reworked --- basic_machines/chest.lua | 11 +- basic_machines/pusher.lua | 10 ++ basic_machines/quarry.lua | 236 ++++++++++++++++++-------------------- doc/manual_DE.lua | 12 +- locale/techage.de.tr | 13 ++- locale/template.txt | 8 +- manuals/manual_ta3_DE.md | 10 +- manuals/manual_ta4_DE.md | 2 + oil/drillbox.lua | 20 ++-- oil/explore.lua | 137 +++++++++++++--------- oil/pumpjack.lua | 10 +- 11 files changed, 252 insertions(+), 217 deletions(-) diff --git a/basic_machines/chest.lua b/basic_machines/chest.lua index 4c0e867..2829e15 100644 --- a/basic_machines/chest.lua +++ b/basic_machines/chest.lua @@ -199,10 +199,17 @@ minetest.register_node("techage:chest_ta4", { }) techage.register_node({"techage:chest_ta2", "techage:chest_ta3", "techage:chest_ta4"}, { - on_pull_item = function(pos, in_dir, num) + on_pull_item = function(pos, in_dir, num, item_name) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - return techage.get_items(inv, "main", num) + if item_name and inv:get_size("main") == 50 then -- TA4 chest? + local taken = inv:remove_item("main", {name = item_name, count = num}) + if taken:get_count() > 0 then + return taken + end + else + return techage.get_items(inv, "main", num) + end end, on_push_item = function(pos, in_dir, stack) local meta = minetest.get_meta(pos) diff --git a/basic_machines/pusher.lua b/basic_machines/pusher.lua index 01fd569..0ffedb3 100644 --- a/basic_machines/pusher.lua +++ b/basic_machines/pusher.lua @@ -56,6 +56,11 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) return 0 end + local nvm = techage.get_nvm(pos) + if CRD(pos).State:get_state(nvm) ~= techage.STOPPED then + return 0 + end + local inv = M(pos):get_inventory() local list = inv:get_list(listname) if list[index]:get_count() == 0 then @@ -71,6 +76,11 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return 0 end + local nvm = techage.get_nvm(pos) + if CRD(pos).State:get_state(nvm) ~= techage.STOPPED then + return 0 + end + local inv = M(pos):get_inventory() inv:set_stack(listname, index, nil) return 0 diff --git a/basic_machines/quarry.lua b/basic_machines/quarry.lua index 428c1cc..ec65d76 100644 --- a/basic_machines/quarry.lua +++ b/basic_machines/quarry.lua @@ -37,12 +37,8 @@ local Level2Idx = {[2]=1, [1]=2, [0]=3, [-1]=4, [-2]=5, [-3]=6, local function formspec(self, pos, nvm) local tooltip = S("Start level = 0\nmeans the same Y-level\nas the quarry is placed") - local level = "-" - local index = "-" - if nvm.quarry_pos then - level = nvm.quarry_pos.y - pos.y - index = nvm.idx - end + local level = nvm.level or "-" + local index = nvm.index or "-" local depth_list = "1,2,3,5,10,15,20,25,40,60,80" if CRD(pos).stage == 3 then depth_list = "1,2,3,5,10,15,20,25,40" @@ -53,24 +49,24 @@ local function formspec(self, pos, nvm) nvm.start_level = nvm.start_level or -1 return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3.5,-0.1;"..minetest.colorize( "#000000", S("Quarry")).."]".. - techage.question_mark_help(8, tooltip).. - "dropdown[0,0.8;1.5;level;2,1,0,-1,-2,-3,-5,-10,-15,-20;"..Level2Idx[nvm.start_level].."]".. - "label[1.6,0.9;"..S("Start level").."]".. - "dropdown[0,1.8;1.5;depth;"..depth_list..";"..Depth2Idx[nvm.quarry_depth].."]".. - "label[1.6,1.9;"..S("Digging depth").."]".. - "label[0,2.9;"..S("level").."="..level..", "..S("pos=")..index.."/25]".. - "list[context;main;5,0.8;3,3;]".. - "image[4,0.8;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image_button[4,2.8;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[4,2.8;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[current_player;main;0,4.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "box[0,-0.1;7.8,0.5;#c6e8ff]".. + "label[3.5,-0.1;"..minetest.colorize( "#000000", S("Quarry")).."]".. + techage.question_mark_help(8, tooltip).. + "dropdown[0,0.8;1.5;level;2,1,0,-1,-2,-3,-5,-10,-15,-20;"..Level2Idx[nvm.start_level].."]".. + "label[1.6,0.9;"..S("Start level").."]".. + "dropdown[0,1.8;1.5;depth;"..depth_list..";"..Depth2Idx[nvm.quarry_depth].."]".. + "label[1.6,1.9;"..S("Digging depth").."]".. + "label[0,2.9;"..S("level").."="..level..", "..S("pos=")..index.."/25]".. + "list[context;main;5,0.8;3,3;]".. + "image[4,0.8;1,1;"..techage.get_power_image(pos, nvm).."]".. + "image_button[4,2.8;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[4,2.8;1,1;"..self:get_state_tooltip(nvm).."]".. + "list[current_player;main;0,4.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" end local function play_sound(pos) @@ -96,14 +92,13 @@ local function stop_sound(pos) end local function on_node_state_change(pos, old_state, new_state) + local mem = techage.get_mem(pos) + local owner = M(pos):get_string("owner") + mem.co = nil + techage.unmark_position(owner) if new_state == techage.RUNNING then play_sound(pos) - elseif new_state == techage.STOP then - local nvm = techage.get_nvm(pos) - nvm.quarry_pos = nil - stop_sound(pos) else - local nvm = techage.get_nvm(pos) stop_sound(pos) end end @@ -128,13 +123,20 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return stack:get_count() end -local QuarrySchedule = {3,0,0,3,3,3,3,2,2,2,2,1,1,1,1,0,3,0,0,3,3,2,2,1,0} +local QuarryPath = { + 3,3,3,3,2, + 1,1,1,1,2, + 3,3,3,3,2, + 1,1,1,1,2, + 3,3,3,3,2, +} -local function get_next_pos(pos, facedir, dir) - facedir = (facedir + dir) % 4 +local function get_next_pos(pos, facedir, idx) + facedir = (facedir + QuarryPath[idx]) % 4 return vector.add(pos, core.facedir_to_dir(facedir)) end +-- pos is the quarry pos, y_pos the current dug level local function get_corner_positions(pos, facedir, y_pos) local start_pos = get_pos(pos, facedir, "L") local pos1 = get_pos(start_pos, facedir, "F", 2) @@ -145,57 +147,90 @@ local function get_corner_positions(pos, facedir, y_pos) return pos1, pos2 end -local function check_protection(pos, nvm, facedir, owner) - local pos1, pos2 = get_corner_positions(pos, facedir, nvm.start_y) - while true do - if minetest.is_protected(pos1, owner) then - return false - end - if minetest.is_protected(pos2, owner) then - return false - end - if pos1.y < nvm.stop_y then - break - end - pos1.y = pos1.y - 5 - pos2.y = pos2.y - 5 - end - return true +local function is_air_level(pos1, pos2) + return #minetest.find_nodes_in_area(pos1, pos2, {"air"}) == 25 end -local function skip_air_levels(pos, nvm, facedir, owner) - local pos1, pos2 - pos1, pos2 = get_corner_positions(pos, facedir, nvm.start_y) - while pos1.y >= nvm.stop_y do - local lPos = minetest.find_nodes_in_area(pos1, pos2, {"air"}) - if #lPos ~= 25 then break end - pos1.y = pos1.y - 1 - pos2.y = pos2.y - 1 - end - -- quarry block position with start y-level - nvm.quarry_pos = {x = pos.x, y = pos2.y, z = pos.z} +local function mark_area(pos1, pos2, owner) pos1.y = pos1.y + 0.2 techage.mark_cube(owner, pos1, pos2, "quarry", "#FF0000", 20) + pos1.y = pos1.y - 0.2 end -local function can_start(pos, nvm, state) +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", {name = item_name}) then + inv:add_item("main", {name = item_name}) + return true + end + return false +end + +local function quarry_task(pos, crd, nvm) + nvm.start_level = nvm.start_level or 0 + nvm.quarry_depth = nvm.quarry_depth or 1 + local y_first = pos.y + nvm.start_level + local y_last = y_first - nvm.quarry_depth + 1 local facedir = minetest.get_node(pos).param2 local owner = M(pos):get_string("owner") - nvm.start_level = nvm.start_level or 0 - nvm.quarry_depth = nvm.quarry_depth or 1 - nvm.start_y = pos.y + nvm.start_level - nvm.stop_y = nvm.start_y - nvm.quarry_depth + 1 - nvm.idx = nvm.idx or 1 + nvm.level = 1 + for y_curr = y_first, y_last, -1 do + local pos1, pos2 = get_corner_positions(pos, facedir, y_curr) + local qpos = {x = pos1.x, y = pos1.y, z = pos1.z} + + if minetest.is_area_protected(pos1, pos2, owner, 5) then + crd.State:fault(pos, nvm, S("area is protected")) + return + end + + if not is_air_level(pos1, pos2) then + mark_area(pos1, pos2, owner) + coroutine.yield() + + nvm.index = 1 + for i = 1, 25 do + local item_name = peek_node(qpos) + if item_name then + if add_to_inv(pos, item_name) then + minetest.remove_node(qpos) + crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS, 1) + else + crd.State:blocked(pos, nvm, S("inventory full")) + end + coroutine.yield() + end + qpos = get_next_pos(qpos, facedir, i) + nvm.index = nvm.index + 1 + end + techage.unmark_position(owner) + end + nvm.level = nvm.level + 1 + end + crd.State:stop(pos, nvm, S("finished")) +end - if state == techage.STOPPED then - nvm.idx = 1 +local function keep_running(pos, elapsed) + local mem = techage.get_mem(pos) + if not mem.co then + mem.co = coroutine.create(quarry_task) end - if not check_protection(pos, nvm, facedir, owner) then - return S("Quarry area is protected") + + local nvm = techage.get_nvm(pos) + local crd = CRD(pos) + coroutine.resume(mem.co, pos, crd, nvm) + + if techage.is_activeformspec(pos) then + M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) end - skip_air_levels(pos, nvm, facedir, owner) - return true end local function on_rightclick(pos, node, clicker) @@ -204,58 +239,6 @@ local function on_rightclick(pos, node, clicker) M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) end -local function quarry_next_node(pos, crd, nvm, inv) - if nvm.quarry_pos then - local facedir = minetest.get_node(pos).param2 - if nvm.idx <= #QuarrySchedule then - nvm.quarry_pos = get_next_pos(nvm.quarry_pos, facedir, QuarrySchedule[nvm.idx]) - nvm.idx = nvm.idx + 1 - elseif nvm.quarry_pos.y > nvm.stop_y then - local owner = M(pos):get_string("owner") - local pos1, pos2 - pos1, pos2 = get_corner_positions(pos, facedir, nvm.quarry_pos.y - 1) - -- quarry block position with new y-level - nvm.quarry_pos = {x = pos.x, y = pos2.y, z = pos.z} - nvm.idx = 1 - pos1.y = pos1.y + 0.2 - techage.mark_cube(owner, pos1, pos2, "quarry", "#FF0000", 20) - else - nvm.idx = 1 - nvm.quarry_pos = nil - crd.State:stop(pos, nvm) - return - end - - local node = techage.get_node_lvm(nvm.quarry_pos) - local ndef = minetest.registered_nodes[node.name] - if techage.can_node_dig(node, ndef) then - local drop_name = techage.dropped_node(node, ndef) - if drop_name then - local inv = M(pos):get_inventory() - if inv:room_for_item("main", {name = drop_name}) then - minetest.remove_node(nvm.quarry_pos) - inv:add_item("main", {name = drop_name}) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS, 1) - else - crd.State:blocked(pos, nvm) - end - end - end - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - if inv then - quarry_next_node(pos, crd, nvm, inv) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) - end -end - local function can_dig(pos, player) if minetest.is_protected(pos, player:get_player_name()) then return false @@ -269,11 +252,12 @@ local function on_receive_fields(pos, formname, fields, player) return end local nvm = techage.get_nvm(pos) + local mem = techage.get_mem(pos) if fields.depth then if tonumber(fields.depth) ~= nvm.quarry_depth then nvm.quarry_depth = tonumber(fields.depth) - nvm.quarry_pos = nil + mem.co = nil CRD(pos).State:stop(pos, nvm) end end @@ -281,7 +265,7 @@ local function on_receive_fields(pos, formname, fields, player) if fields.level then if tonumber(fields.level) ~= nvm.start_level then nvm.start_level = tonumber(fields.level) - nvm.quarry_pos = nil + mem.co = nil CRD(pos).State:stop(pos, nvm) end end @@ -360,13 +344,11 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = standby_ticks = STANDBY_TICKS, formspec = formspec, tubing = tubing, - can_start = can_start, on_state_change = on_node_state_change, after_place_node = function(pos, placer) local inv = M(pos):get_inventory() local nvm = techage.get_nvm(pos) inv:set_size('main', 9) - nvm.quarry_pos = nil M(pos):set_string("owner", placer:get_player_name()) end, can_dig = can_dig, diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index 7722c16..e87bc9d 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -684,14 +684,14 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in Tiefen bis zu -50 Meter eingesetzt werden.\n".. + "Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in allen Tiefen eingesetzt werden.\n".. "Über die Chat-Ausgabe wird dir angezeigt\\, in welcher Tiefe nach Öl gesucht wurde und wie viel Öl (oil) gefunden wurde.\n".. - "Du kannst bis zu 4 mal auf den Block klicken\\, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 2000 bis zu 20000 Items.\n".. + "Du kannst mehrfach auf den Block klicken\\, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 4000 bis zu 20000 Items.\n".. "\n".. "Falls die Suche erfolglos war\\, musst du den Block ca. 16 m weiter setzen.\n".. "Der Ölexplorer sucht immer innerhalb des ganzen Map-Blocks und darunter nach Öl\\, in dem er gesetzt wurde. Eine erneute Suche im gleichen Map-Block (16x16 Feld) macht daher keinen Sinn.\n".. "\n".. - "Falls Öl gefunden wurde\\, wird die Stelle für den Bohrturm angezeigt. Die Mitte des angezeigten Bereiches am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen.\n".. + "Falls Öl gefunden wurde\\, wird die Stelle für den Bohrturm angezeigt. Du musst den Bohrturm innerhalb des angezeigten Bereiches errichten\\, die Stelle am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen.\n".. "\n".. "Gib die Suche nach Öl nicht zu schnell auf. Es kann wenn du Pech hast\\, sehr lange dauern\\, bis du eine Ölquelle gefunden hast.\n".. "Es macht auch keinen Sinn\\, einen Bereich den ein anderer Spieler bereits abgesucht hat\\, nochmals abzusuchen. Die Chance\\, irgendwo Öl zu finden\\, ist für alle Spieler gleich.\n".. @@ -700,7 +700,7 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "Die Ölbohrkiste muss genau an die Stelle gesetzt werden\\, die vom Ölexplorer angezeigt wurde.\n".. + "Die Ölbohrkiste muss an die Stelle gesetzt werden\\, die vom Ölexplorer angezeigt wurde. An anderen Stellen nach Öl zu bohren ist zwecklos.\n".. "Wird auf den Button der Ölbohrkiste geklickt\\, wird über der Kiste ein Bohrturm errichtet. Dies dauert einige Sekunden.\n".. "Die Ölbohrkiste hat 4 Seiten\\, bei IN muss das Bohrgestänge über Schieber angeliefert und bei OUT muss das Bohrmaterial abtransportiert werden. Über eine der anderen zwei Seiten muss die Ölbohrkiste mit Strom versorgt werden.\n".. "\n".. @@ -720,7 +720,7 @@ techage.manual_DE.aText = { "\n", "Der Öltank ist die große Ausführung des TA3 Tanks (siehe Flüssigkeiten -> TA3 Tank).\n".. "\n".. - "Der große Tank kann 4000 Einheiten Öl aufnehmen.\n".. + "Der große Tank kann 4000 Einheiten Öl\\, aber auch jede andere Art von Flüssigkeit aufnehmen.\n".. "\n".. "\n".. "\n", @@ -1329,6 +1329,8 @@ techage.manual_DE.aText = { "\n", "Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten\\, sondern verfügt über 8 Speicher\\, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2\\, TA3 oder TA4) gefüllt bzw. geleert werden.\n".. "\n".. + "Die Kiste kann nur von den Spielern genutzt werden\\, die an diesem Ort auch bauen können\\, also Protection Rechte besitzen. Es spielt dabei keine Rolle\\, wer die Kiste setzt. \n".. + "\n".. "Der Kiste besitzt ein zusätzliches Kommandos für den Lua Controller:\n".. "\n".. " - 'count' dient zur Anfrage\\, wie viele Items in der Kiste sind.\nBeispiel 1: '$read_data(CHEST\\, \"count\")' --> Summe der Items über alle 8 Speicher\nBeispiel 2: '$read_data(CHEST\\, \"count\"\\, 2)' --> Anzahl der Items in Speicher 2 (zweiter von links)\n".. diff --git a/locale/techage.de.tr b/locale/techage.de.tr index 3ddc9a1..6f48581 100644 --- a/locale/techage.de.tr +++ b/locale/techage.de.tr @@ -101,6 +101,7 @@ Nacelle is missing=Die Gondel fehlt Needle Powder=Nadel Pulver Network Data=Netzwerkdaten No network or active generator available!=Kein Stromnetz oder aktiver Generator verfügbar +No oil found=Kein Öl gefunden No plan available=Kein Plan verfügar No wind at this altitude!=Kein Wind auf dieser Höhe Node number to send the events to=Knotennummer zum Senden der Events @@ -129,7 +130,6 @@ Pumpjack=Ölpumpe Punch the block to make the area visible.=Schlage auf den Bock um den Bereich anzuzeigen. Pusher=Schieber Quarry=Steinbrecher -Quarry area is protected=Bereich ist geschützt Recipe=Rezept Red Mud=Rotschlamm Red Mud Barrel=Rotschlamm Fass @@ -344,7 +344,6 @@ Water Barrel=Wasserfass Water Boiler=Wasserboiler Water Pump=Wasserpumpe [Bucket] Lava can only be placed below sea level!=Lava kann nur unterhalb der Meerehöhe platziert werden! -[TA Oil] No oil exploration possible at this depth! = [TA Oil] Keine Ölsuche in dieser Tiefe möglich! [TA4 Wind Turbine]=[TA4 Windkraftanlage] [TA] Area is protected!=[TA] Bereich ist geschützt [TA] Derrick is being built!=[TA] Bohrturm wird errichtet @@ -360,14 +359,17 @@ Water Pump=Wasserpumpe accept=akzeptieren added=hinzugefügt wird added or removed=hinzugefügt oder entfernt wird -block can't be dug=Block kann nicht abgebaut werden +area is protected=Bereich ist geschützt commands like: help=Kommandos wie: help connected with=verbunden mit depth=Tiefe did you check the plan?=hast du den Plan geprüft? empty=leer +finished=fertig full=voll inlet/pipe error=Einlass/Röhrenfehler +inventory full=Inventar ist voll +item output blocked=Ausgang blockiert level=Ebene light=Licht loaded=geladen @@ -390,4 +392,7 @@ stopped=gestoppt storage empty?=Speicher leer? water temperature=Wassertemperatur wrong storage diameter=Falscher Wärmespeicher-Durchmesser -##### not used anymore ##### \ No newline at end of file +##### not used anymore ##### +block can't be dug=Block kann nicht abgebaut werden +Quarry area is protected=Bereich ist geschützt +[TA Oil] No oil exploration possible at this depth! = [TA Oil] Keine Ölsuche in dieser Tiefe möglich! \ No newline at end of file diff --git a/locale/template.txt b/locale/template.txt index aa28d13..acebf32 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -99,6 +99,7 @@ Nacelle is missing= Needle Powder= Network Data= No network or active generator available!= +No oil found= No plan available= No wind at this altitude!= Node number to send the events to= @@ -127,7 +128,6 @@ Pumpjack= Punch the block to make the area visible.= Pusher= Quarry= -Quarry area is protected= Recipe= Red Mud= Red Mud Barrel= @@ -342,7 +342,6 @@ Water Barrel= Water Boiler= Water Pump= [Bucket] Lava can only be placed below sea level!= -[TA Oil] No oil exploration possible at this depth! = [TA4 Wind Turbine]= [TA] Area is protected!= [TA] Derrick is being built!= @@ -358,14 +357,17 @@ Water Pump= accept= added= added or removed= -block can't be dug= +area is protected= commands like: help= connected with= depth= did you check the plan?= empty= +finished= full= inlet/pipe error= +inventory full= +item output blocked= level= light= loaded= diff --git a/manuals/manual_ta3_DE.md b/manuals/manual_ta3_DE.md index 5206955..dbf0467 100644 --- a/manuals/manual_ta3_DE.md +++ b/manuals/manual_ta3_DE.md @@ -294,14 +294,14 @@ Dazu dienen dir TA3 Ölexplorer, TA3 Ölbohrkiste und TA3 Ölpumpe. ### TA3 Ölexplorer / Oil Explorer -Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in Tiefen bis zu -50 Meter eingesetzt werden. +Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in allen Tiefen eingesetzt werden. Über die Chat-Ausgabe wird dir angezeigt, in welcher Tiefe nach Öl gesucht wurde und wie viel Öl (oil) gefunden wurde. -Du kannst bis zu 4 mal auf den Block klicken, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 2000 bis zu 20000 Items. +Du kannst mehrfach auf den Block klicken, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 4000 bis zu 20000 Items. Falls die Suche erfolglos war, musst du den Block ca. 16 m weiter setzen. Der Ölexplorer sucht immer innerhalb des ganzen Map-Blocks und darunter nach Öl, in dem er gesetzt wurde. Eine erneute Suche im gleichen Map-Block (16x16 Feld) macht daher keinen Sinn. -Falls Öl gefunden wurde, wird die Stelle für den Bohrturm angezeigt. Die Mitte des angezeigten Bereiches am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen. +Falls Öl gefunden wurde, wird die Stelle für den Bohrturm angezeigt. Du musst den Bohrturm innerhalb des angezeigten Bereiches errichten, die Stelle am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen. Gib die Suche nach Öl nicht zu schnell auf. Es kann wenn du Pech hast, sehr lange dauern, bis du eine Ölquelle gefunden hast. Es macht auch keinen Sinn, einen Bereich den ein anderer Spieler bereits abgesucht hat, nochmals abzusuchen. Die Chance, irgendwo Öl zu finden, ist für alle Spieler gleich. @@ -313,7 +313,7 @@ Der Ölexplorer kann immer wieder zur Suche nach Öl eingesetzt werden. ### TA3 Ölbohrkiste / Oil Drill Box -Die Ölbohrkiste muss genau an die Stelle gesetzt werden, die vom Ölexplorer angezeigt wurde. +Die Ölbohrkiste muss an die Stelle gesetzt werden, die vom Ölexplorer angezeigt wurde. An anderen Stellen nach Öl zu bohren ist zwecklos. Wird auf den Button der Ölbohrkiste geklickt, wird über der Kiste ein Bohrturm errichtet. Dies dauert einige Sekunden. Die Ölbohrkiste hat 4 Seiten, bei IN muss das Bohrgestänge über Schieber angeliefert und bei OUT muss das Bohrmaterial abtransportiert werden. Über eine der anderen zwei Seiten muss die Ölbohrkiste mit Strom versorgt werden. @@ -342,7 +342,7 @@ Das Bohrgestänge wird für die Bohrung benötigt. Es werden so viele Bohrgestä Der Öltank ist die große Ausführung des TA3 Tanks (siehe Flüssigkeiten -> TA3 Tank). -Der große Tank kann 4000 Einheiten Öl aufnehmen. +Der große Tank kann 4000 Einheiten Öl, aber auch jede andere Art von Flüssigkeit aufnehmen. [oiltank|image] diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 3adea05..aa5e602 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -510,6 +510,8 @@ Die Funktion entspricht der von TA3. Die Kiste kann aber mehr Inhalt aufnehmen. Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten, sondern verfügt über 8 Speicher, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2, TA3 oder TA4) gefüllt bzw. geleert werden. +Die Kiste kann nur von den Spielern genutzt werden, die an diesem Ort auch bauen können, also Protection Rechte besitzen. Es spielt dabei keine Rolle, wer die Kiste setzt. + Der Kiste besitzt ein zusätzliches Kommandos für den Lua Controller: - `count` dient zur Anfrage, wie viele Items in der Kiste sind. diff --git a/oil/drillbox.lua b/oil/drillbox.lua index 8b68041..d74042a 100644 --- a/oil/drillbox.lua +++ b/oil/drillbox.lua @@ -21,7 +21,7 @@ local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm local STANDBY_TICKS = 1 local COUNTDOWN_TICKS = 6 -local CYCLE_TIME = 2 ---------------------------------------- TODO 16 +local CYCLE_TIME = 16 local formspec0 = "size[5,4]".. default.gui_bg.. @@ -56,7 +56,7 @@ local function formspec(self, pos, nvm) if not nvm.assemble_build then return formspec0 end - local depth = M(pos):get_int("depth") + local depth = M(pos):get_int("depth") - 7 -- oil bubble local curr_depth = pos.y - (nvm.drill_pos or pos).y return "size[8,8]".. default.gui_bg.. @@ -139,9 +139,6 @@ local function drilling(pos, crd, nvm, inv) elseif node.name == "techage:oilstorage" then -- old oil bubble node? nvm.drill_pos.y = nvm.drill_pos.y-1 crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif node.name == "techage:oil_source" then - M(pos):set_string("oil_found", "true") - crd.State:stop(pos, nvm) elseif minetest.is_protected(nvm.drill_pos, owner) then crd.State:fault(pos, nvm, S("Drill area is protected")) elseif node.name == "techage:oil_drillbit2" then @@ -238,11 +235,14 @@ local tubing = { end end, on_push_item = function(pos, in_dir, stack) - local meta = minetest.get_meta(pos) - if meta:get_int("push_dir") == in_dir or in_dir == 5 then - local inv = M(pos):get_inventory() - CRD(pos).State:start_if_standby(pos) - return techage.put_items(inv, "src", stack) + local nvm = techage.get_nvm(pos) + if not nvm.assemble_locked then + local meta = minetest.get_meta(pos) + if meta:get_int("push_dir") == in_dir or in_dir == 5 then + local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) + return techage.put_items(inv, "src", stack) + end end end, on_unpull_item = function(pos, in_dir, stack) diff --git a/oil/explore.lua b/oil/explore.lua index c293b92..439c79c 100644 --- a/oil/explore.lua +++ b/oil/explore.lua @@ -17,14 +17,14 @@ local M = minetest.get_meta local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local S = techage.S -local PROBABILITY = 20 -local OIL_MIN = 2000 +local PROBABILITY = 100 +local OIL_MIN = 4096 local OIL_MAX = 20000 local DEPTH_MIN = 16 -local DEPTH_MAX = 30*16 +local DEPTH_MAX = 25*16 local DEPTH_STEP = 16 -local YPOS_MAX = -6*16 -local RADIUS = 8 +local YPOS_MAX = -6*16 -- oil can found below this level +local OIL_BUBBLE_SIZE = 4096 local seed = tonumber(minetest.settings:get("techage_oil_exploration_seed")) or 1234 -- confidental! @@ -58,29 +58,59 @@ local function center(coord) return (math.floor(coord/16) * 16) + 8 end +local function basis(coord) + return (math.floor(coord/16) * 16) +end + +-- determine the mapblock coordinates +local function mapblock_coordinates(pos) + local pos1 = {x = basis(pos.x), y = basis(pos.y), z = basis(pos.z)} + local pos2 = {x = pos1.x + 15, y = pos1.y + 15, z = pos1.z + 15} + return pos1, pos2 +end + local function calc_depth(pos, explore_pos) return pos.y - explore_pos.y + 1 end -local function gen_oil_slice(ypos, from, to, data, id) - for x = from, to do - for z = from, to do - local idx = (x + (ypos * 16) + (z * 16 * 16)) + 1 - data[idx] = id +-- posC is the center position of the oil bubble +-- idx is the vmdata index +-- function returns the real position {x,y,z} +local function calc_vmdata_pos(posC, idx) + local rest, xoffs, yoffs, zoffs + + rest = idx - 1 + xoffs = rest % 16 + rest = math.floor(rest / 16) + zoffs = rest % 16 + rest = math.floor(rest / 16) + yoffs = rest % 16 + return {x = basis(posC.x) + xoffs, y = basis(posC.y) + yoffs, z = basis(posC.z) + zoffs} +end + +local function calc_vmdata_index(xoffs, yoffs, zoffs) + return (xoffs + (yoffs * 16) + (zoffs * 16 * 16)) + 1 +end + +-- from/to are x/z-offsets (0..15) for one layer of oil within one mapblock +local function gen_oil_slice(yoffs, from, to, vmdata, id) + for xoffs = from, to do + for zoffs = from, to do + vmdata[calc_vmdata_index(xoffs, yoffs, zoffs)] = id end end end -local function gen_oil_bubble(data) +local function gen_oil_bubble(vmdata) local id = minetest.get_content_id("techage:oil_source") - gen_oil_slice(1, 3, 12, data, id) - gen_oil_slice(2, 2, 13, data, id) + gen_oil_slice(1, 3, 12, vmdata, id) + gen_oil_slice(2, 2, 13, vmdata, id) for offs = 3, 12 do - gen_oil_slice(offs, 1, 14, data, id) + gen_oil_slice(offs, 1, 14, vmdata, id) end - gen_oil_slice(13, 2, 13, data, id) - gen_oil_slice(14, 3, 12, data, id) + gen_oil_slice(13, 2, 13, vmdata, id) + gen_oil_slice(14, 3, 12, vmdata, id) end local function useable_stone_block(data) @@ -91,14 +121,12 @@ local function useable_stone_block(data) if not ValidGroundNodes[itemname] then local ndef = minetest.registered_nodes[itemname] if InvalidGroundNodes[itemname] or not ndef or ndef.is_ground_content == false then - print("useable_stone_block false", itemname) return false end end valid[id] = true end end - print("useable_stone_block true") return true end @@ -111,9 +139,16 @@ local function get_next_explore_pos(pos) local d = calc_depth(pos, {y = ypos}) if d + DEPTH_STEP < DEPTH_MAX then ypos = ypos - DEPTH_STEP - meta:set_int("exploration_ypos", ypos) + local posC = {x = center(pos.x), y = center(ypos), z = center(pos.z)} + local node = techage.get_node_lvm(posC) + if node.name ~= "ignore" then + meta:set_int("exploration_ypos", ypos) + else + -- load world and pause for one step + minetest.emerge_area(posC, posC) + end + end - print(minetest.pos_to_string({x = center(pos.x), y = center(ypos), z = center(pos.z)})) return {x = center(pos.x), y = center(ypos), z = center(pos.z)} end @@ -123,7 +158,8 @@ end local function set_oil_amount(pos, amount) minetest.set_node(pos, {name = "techage:oilstorage"}) - return M(pos):set_int("oil_amount", amount) + M(pos):set_int("oil_amount", amount) + M(pos):set_int("initial_oil_amount", amount) end local function status(pos, player_name, explore_pos, amount) @@ -134,20 +170,17 @@ end local function marker(player_name, pos) local posC = {x = center(pos.x), y = pos.y, z = center(pos.z)} - local pos1 = {x = posC.x - 1, y = posC.y - 1, z = posC.z - 1} - local pos2 = {x = posC.x + 1, y = posC.y + 3, z = posC.z + 1} + local pos1 = {x = posC.x - 2, y = posC.y - 2, z = posC.z - 2} + local pos2 = {x = posC.x + 2, y = posC.y + 5, z = posC.z + 2} techage.switch_region(player_name, pos1, pos2) end -- check if oil can be placed and if so, do it and return true local function generate_oil_bubble(posC, amount) - local pos1 = {x = posC.x - RADIUS, y = posC.y - RADIUS, z = posC.z - RADIUS} - local pos2 = {x = posC.x + RADIUS - 1, y = posC.y + RADIUS - 1, z = posC.z + RADIUS - 1} + local pos1, pos2 = mapblock_coordinates(posC) local vm = minetest.get_voxel_manip(pos1, pos2) local data = vm:get_data() - print("#data", #data) - if useable_stone_block(data) then gen_oil_bubble(data) vm:set_data(data) @@ -159,26 +192,6 @@ local function generate_oil_bubble(posC, amount) return false end --- replace oil by air -local function generate_air_bubble(posC) - local pos1 = {x = posC.x - RADIUS, y = posC.y - RADIUS, z = posC.z - RADIUS} - local pos2 = {x = posC.x + RADIUS - 1, y = posC.y + RADIUS - 1, z = posC.z + RADIUS - 1} - local vm = minetest.get_voxel_manip(pos1, pos2) - local data = vm:get_data() - local air = minetest.get_content_id("air") - local oil = minetest.get_content_id("techage:oil_source") - - for i = 1, #data do - if date[i] == oil then - data[i] = air - end - end - - vm:set_data(data) - vm:write_to_map() - vm:update_map() -end - local function explore_area(pos, node, player_name) if M(pos):get_int("oil_amount") == 0 then -- nothing found so far? local posC, amount @@ -193,7 +206,6 @@ local function explore_area(pos, node, player_name) for i = 1,4 do posC = get_next_explore_pos(pos) amount = oil_amount(posC) - print("explore", P2S(posC), amount) if amount > 0 then break end @@ -300,19 +312,32 @@ function techage.explore.get_oil_info(pos) depth = calc_depth(pos, posC) posC.y = posC.y - DEPTH_STEP end + posC.y = posC.y + DEPTH_STEP return {depth = depth, amount = amount, storage_pos = posC} end function techage.explore.get_oil_amount(posC) - return M(posC):get_int("oil_amount") + local meta = M(posC) + if meta:get_int("initial_oil_amount") == 0 then + meta:set_int("initial_oil_amount", meta:get_int("oil_amount")) + end + return meta:get_int("oil_amount"), meta:get_int("initial_oil_amount") end function techage.explore.dec_oil_amount(posC) - local meta = M(posC) - local amount = meta:get_int("oil_amount") - meta:set_int("oil_amount", amount-1) - return amount-1 + local oil_amount, oil_initial = techage.explore.get_oil_amount(posC) + oil_amount = oil_amount - 1 + M(posC):set_int("oil_amount", oil_amount) + + local idx = math.floor(oil_amount * OIL_BUBBLE_SIZE / oil_initial) + idx = idx + 256 -- last level is stone, so add one level + if idx <= (OIL_BUBBLE_SIZE - 256) then -- first level is stone, too + local pos = calc_vmdata_pos(posC, idx) + local node = techage.get_node_lvm(pos) + print(idx, P2S(pos), node.name) + if node.name == "techage:oil_source" then + minetest.remove_node(pos) + end + end + return oil_amount end - --- generate_air_bubble(posC) -techage.explore.generate_air_bubble = generate_air_bubble \ No newline at end of file diff --git a/oil/pumpjack.lua b/oil/pumpjack.lua index f709b3c..2fa5d22 100644 --- a/oil/pumpjack.lua +++ b/oil/pumpjack.lua @@ -31,11 +31,10 @@ local CYCLE_TIME = 8 local function has_oil(pos, meta) local storage_pos = meta:get_string("storage_pos") if storage_pos ~= "" then - local amount = techage.explore.get_oil_amount(P(storage_pos)) + local amount, initial_amount = techage.explore.get_oil_amount(P(storage_pos)) if amount > 0 then return true end - techage.explore.generate_air_bubble(P(storage_pos)) end end @@ -58,11 +57,12 @@ local function formspec(self, pos, nvm) default.gui_slots.. "box[0,-0.1;4.8,0.5;#c6e8ff]".. "label[1.5,-0.1;"..minetest.colorize( "#000000", S("Pumpjack")).."]".. - "image[0.5,1.4;1,1;techage_liquid2_inv.png^[colorize:#000000^techage_liquid1_inv.png]".. + "image[0.5,1.5;1,1;techage_liquid2_inv.png^[colorize:#000000^techage_liquid1_inv.png]".. "image[4,0.8;1,1;"..techage.get_power_image(pos, nvm).."]".. "tooltip[4,0.8;1,1;"..S("needs power").."]".. - "label[0,2.5;"..S("Oil amount")..": "..amount.."]".. - "image_button[2.5,2.2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]" + "label[0,0.8;"..S("Oil amount")..": "..amount.."]".. + "image_button[2,2.2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. + "tooltip[2,2.2;1,1;"..self:get_state_tooltip(nvm).."]" end local function play_sound(pos)