commit | author | age
|
ee0765
|
1 |
|
be2f30
|
2 |
local S = technic.getter |
S |
3 |
|
ee0765
|
4 |
minetest.register_craft({ |
S |
5 |
recipe = { |
5e4a87
|
6 |
{"technic:carbon_plate", "pipeworks:filter", "technic:composite_plate"}, |
68ea0a
|
7 |
{"technic:motor", "technic:machine_casing", "technic:diamond_drill_head"}, |
Z |
8 |
{"technic:carbon_steel_block", "technic:hv_cable0", "technic:carbon_steel_block"}}, |
ee0765
|
9 |
output = "technic:quarry", |
S |
10 |
}) |
|
11 |
|
|
12 |
local quarry_dig_above_nodes = 3 -- How far above the quarry we will dig nodes |
|
13 |
local quarry_max_depth = 100 |
|
14 |
|
b74c2d
|
15 |
local function set_quarry_formspec(meta) |
Z |
16 |
local formspec = "size[3,1.5]".. |
|
17 |
"field[1,0.5;2,1;size;Radius;"..meta:get_int("size").."]" |
|
18 |
if meta:get_int("enabled") == 0 then |
7c4b70
|
19 |
formspec = formspec.."button[0,1;3,1;enable;"..S("%s Disabled"):format(S("%s Quarry"):format("HV")).."]" |
b74c2d
|
20 |
else |
7c4b70
|
21 |
formspec = formspec.."button[0,1;3,1;disable;"..S("%s Enabled"):format(S("%s Quarry"):format("HV")).."]" |
b74c2d
|
22 |
end |
Z |
23 |
meta:set_string("formspec", formspec) |
ee0765
|
24 |
end |
S |
25 |
|
|
26 |
local function quarry_receive_fields(pos, formname, fields, sender) |
|
27 |
local meta = minetest.get_meta(pos) |
b74c2d
|
28 |
if fields.size then |
Z |
29 |
local size = tonumber(fields.size) or 0 |
|
30 |
size = math.max(size, 2) |
|
31 |
size = math.min(size, 8) |
ee0765
|
32 |
meta:set_int("size", size) |
S |
33 |
end |
b74c2d
|
34 |
if fields.enable then meta:set_int("enabled", 1) end |
Z |
35 |
if fields.disable then meta:set_int("enabled", 0) end |
|
36 |
set_quarry_formspec(meta) |
ee0765
|
37 |
end |
S |
38 |
|
|
39 |
local function get_quarry_center(pos, size) |
|
40 |
local node = minetest.get_node(pos) |
|
41 |
local back_dir = minetest.facedir_to_dir(node.param2) |
|
42 |
local relative_center = vector.multiply(back_dir, size + 1) |
|
43 |
local center = vector.add(pos, relative_center) |
|
44 |
return center |
|
45 |
end |
|
46 |
|
|
47 |
local function gen_next_digpos(center, digpos, size) |
|
48 |
digpos.x = digpos.x + 1 |
|
49 |
if digpos.x > center.x + size then |
|
50 |
digpos.x = center.x - size |
|
51 |
digpos.z = digpos.z + 1 |
|
52 |
end |
|
53 |
if digpos.z > center.z + size then |
|
54 |
digpos.x = center.x - size |
|
55 |
digpos.z = center.z - size |
|
56 |
digpos.y = digpos.y - 1 |
|
57 |
end |
|
58 |
end |
|
59 |
|
|
60 |
local function find_next_digpos(data, area, center, dig_y, size) |
|
61 |
local c_air = minetest.get_content_id("air") |
|
62 |
|
|
63 |
for y = center.y + quarry_dig_above_nodes, dig_y - 1, -1 do |
|
64 |
for z = center.z - size, center.z + size do |
|
65 |
for x = center.x - size, center.x + size do |
|
66 |
if data[area:index(x, y, z)] ~= c_air then |
|
67 |
return vector.new(x, y, z) |
|
68 |
end |
|
69 |
end |
|
70 |
end |
|
71 |
end |
|
72 |
end |
|
73 |
|
|
74 |
local function quarry_dig(pos, center, size) |
|
75 |
local meta = minetest.get_meta(pos) |
|
76 |
local drops = {} |
|
77 |
local dig_y = meta:get_int("dig_y") |
93b0d2
|
78 |
local owner = meta:get_string("owner") |
ee0765
|
79 |
|
S |
80 |
local vm = VoxelManip() |
|
81 |
local p1 = vector.new( |
|
82 |
center.x - size, |
|
83 |
center.y + quarry_dig_above_nodes, |
|
84 |
center.z - size) |
|
85 |
local p2 = vector.new( |
|
86 |
center.x + size, |
|
87 |
dig_y - 1, -- One node lower in case we have finished the current layer |
|
88 |
center.z + size) |
|
89 |
local e1, e2 = vm:read_from_map(p1, p2) |
|
90 |
local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) |
|
91 |
local data = vm:get_data() |
|
92 |
|
|
93 |
local digpos = find_next_digpos(data, area, center, dig_y, size) |
|
94 |
|
|
95 |
if digpos then |
|
96 |
if digpos.y < pos.y - quarry_max_depth then |
|
97 |
meta:set_int("dig_y", digpos.y) |
|
98 |
return drops |
|
99 |
end |
|
100 |
if minetest.is_protected and minetest.is_protected(digpos, owner) then |
|
101 |
meta:set_int("enabled", 0) |
b74c2d
|
102 |
set_quarry_formspec(meta) |
bde49a
|
103 |
return {} |
ee0765
|
104 |
end |
S |
105 |
dig_y = digpos.y |
|
106 |
local node = minetest.get_node(digpos) |
4d20e4
|
107 |
local node_def = minetest.registered_nodes[node.name] or { diggable = false } |
Z |
108 |
if node_def.diggable and ((not node_def.can_dig) or node_def.can_dig(digpos, nil)) then |
|
109 |
minetest.remove_node(digpos) |
|
110 |
drops = minetest.get_node_drops(node.name, "") |
ee0765
|
111 |
end |
S |
112 |
elseif not (dig_y < pos.y - quarry_max_depth) then |
|
113 |
dig_y = dig_y - 16 |
|
114 |
end |
|
115 |
|
|
116 |
meta:set_int("dig_y", dig_y) |
|
117 |
return drops |
|
118 |
end |
|
119 |
|
|
120 |
local function send_items(items, pos, node) |
|
121 |
for _, item in pairs(items) do |
049129
|
122 |
technic.tube_inject_item(pos, pos, vector.new(0, 1, 0), item) |
ee0765
|
123 |
end |
S |
124 |
end |
|
125 |
|
563a4c
|
126 |
local run = function(pos, node) |
N |
127 |
local meta = minetest.get_meta(pos) |
|
128 |
local size = meta:get_int("size") |
|
129 |
local eu_input = meta:get_int("HV_EU_input") |
|
130 |
local demand = 10000 |
|
131 |
local center = get_quarry_center(pos, size) |
|
132 |
local dig_y = meta:get_int("dig_y") |
|
133 |
local machine_name = S("%s Quarry"):format("HV") |
|
134 |
|
|
135 |
if meta:get_int("enabled") == 0 then |
|
136 |
meta:set_string("infotext", S("%s Disabled"):format(machine_name)) |
|
137 |
meta:set_int("HV_EU_demand", 0) |
|
138 |
return |
|
139 |
end |
|
140 |
|
|
141 |
if eu_input < demand then |
|
142 |
meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) |
|
143 |
elseif eu_input >= demand then |
|
144 |
meta:set_string("infotext", S("%s Active"):format(machine_name)) |
|
145 |
|
|
146 |
local items = quarry_dig(pos, center, size) |
|
147 |
send_items(items, pos, node) |
|
148 |
|
|
149 |
if dig_y < pos.y - quarry_max_depth then |
|
150 |
meta:set_string("infotext", S("%s Finished"):format(machine_name)) |
|
151 |
end |
|
152 |
end |
|
153 |
meta:set_int("HV_EU_demand", demand) |
|
154 |
end |
|
155 |
|
ee0765
|
156 |
minetest.register_node("technic:quarry", { |
7c4b70
|
157 |
description = S("%s Quarry"):format("HV"), |
68b7bc
|
158 |
tiles = {"technic_carbon_steel_block.png", "technic_carbon_steel_block.png", |
Z |
159 |
"technic_carbon_steel_block.png", "technic_carbon_steel_block.png", |
|
160 |
"technic_carbon_steel_block.png^default_tool_mesepick.png", "technic_carbon_steel_block.png"}, |
ee0765
|
161 |
paramtype2 = "facedir", |
563a4c
|
162 |
groups = {cracky=2, tubedevice=1, technic_machine = 1}, |
ee0765
|
163 |
tube = { |
S |
164 |
connect_sides = {top = 1}, |
|
165 |
}, |
|
166 |
on_construct = function(pos) |
|
167 |
local meta = minetest.get_meta(pos) |
7c4b70
|
168 |
meta:set_string("infotext", S("%s Quarry"):format("HV")) |
b74c2d
|
169 |
meta:set_int("size", 4) |
Z |
170 |
set_quarry_formspec(meta) |
ee0765
|
171 |
meta:set_int("dig_y", pos.y) |
S |
172 |
end, |
|
173 |
after_place_node = function(pos, placer, itemstack) |
|
174 |
local meta = minetest.get_meta(pos) |
|
175 |
meta:set_string("owner", placer:get_player_name()) |
ae235e
|
176 |
pipeworks.scan_for_tube_objects(pos) |
ee0765
|
177 |
end, |
ae235e
|
178 |
after_dig_node = pipeworks.scan_for_tube_objects, |
ee0765
|
179 |
on_receive_fields = quarry_receive_fields, |
563a4c
|
180 |
technic_run = run, |
ee0765
|
181 |
}) |
S |
182 |
|
|
183 |
technic.register_machine("HV", "technic:quarry", technic.receiver) |
|
184 |
|