TA4 chest,quarry, and oil explorer reworked

master
Joachim Stolberg 2020-03-31 18:27:15 +02:00
parent c4392723ff
commit 1024f8ccc5
11 changed files with 252 additions and 217 deletions

View File

@ -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)

View File

@ -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

View File

@ -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,

View File

@ -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"..

View File

@ -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 #####
##### 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!

View File

@ -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=

View File

@ -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]

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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)