commit | author | age
|
ee0765
|
1 |
|
be2f30
|
2 |
local S = technic.getter |
S |
3 |
|
ee0765
|
4 |
minetest.register_craft({ |
S |
5 |
recipe = { |
68b7bc
|
6 |
{"technic:carbon_steel_block", "pipeworks:filter", "technic:carbon_steel_block"}, |
Z |
7 |
{"technic:carbon_steel_block", "technic:motor", "technic:carbon_steel_block"}, |
|
8 |
{"technic:carbon_steel_block", "technic:diamond_drill_head", "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 |
|
|
15 |
local function get_quarry_formspec(size) |
|
16 |
return "size[3,1.5]".. |
|
17 |
"field[1,0.5;2,1;size;Radius;"..size.."]".. |
be2f30
|
18 |
"button[0,1;3,1;toggle;"..S("Enable/Disable").."]" |
ee0765
|
19 |
end |
S |
20 |
|
|
21 |
local function quarry_receive_fields(pos, formname, fields, sender) |
|
22 |
local meta = minetest.get_meta(pos) |
2d8ff4
|
23 |
local size = tonumber(fields.size) or 0 |
ee0765
|
24 |
|
S |
25 |
if fields.toggle then |
|
26 |
if meta:get_int("enabled") == 0 then |
|
27 |
meta:set_int("enabled", 1) |
|
28 |
else |
|
29 |
meta:set_int("enabled", 0) |
|
30 |
end |
|
31 |
end |
|
32 |
|
2d8ff4
|
33 |
-- Smallest size is 2. Largest is 8. |
ee0765
|
34 |
size = math.max(size, 2) |
S |
35 |
size = math.min(size, 8) |
|
36 |
|
|
37 |
if meta:get_int("size") ~= size then |
|
38 |
meta:set_int("size", size) |
|
39 |
meta:set_string("formspec", get_quarry_formspec(size)) |
|
40 |
end |
|
41 |
end |
|
42 |
|
|
43 |
local function get_quarry_center(pos, size) |
|
44 |
local node = minetest.get_node(pos) |
|
45 |
local back_dir = minetest.facedir_to_dir(node.param2) |
|
46 |
local relative_center = vector.multiply(back_dir, size + 1) |
|
47 |
local center = vector.add(pos, relative_center) |
|
48 |
return center |
|
49 |
end |
|
50 |
|
|
51 |
local function gen_next_digpos(center, digpos, size) |
|
52 |
digpos.x = digpos.x + 1 |
|
53 |
if digpos.x > center.x + size then |
|
54 |
digpos.x = center.x - size |
|
55 |
digpos.z = digpos.z + 1 |
|
56 |
end |
|
57 |
if digpos.z > center.z + size then |
|
58 |
digpos.x = center.x - size |
|
59 |
digpos.z = center.z - size |
|
60 |
digpos.y = digpos.y - 1 |
|
61 |
end |
|
62 |
end |
|
63 |
|
|
64 |
local function find_next_digpos(data, area, center, dig_y, size) |
|
65 |
local c_air = minetest.get_content_id("air") |
|
66 |
|
|
67 |
for y = center.y + quarry_dig_above_nodes, dig_y - 1, -1 do |
|
68 |
for z = center.z - size, center.z + size do |
|
69 |
for x = center.x - size, center.x + size do |
|
70 |
if data[area:index(x, y, z)] ~= c_air then |
|
71 |
return vector.new(x, y, z) |
|
72 |
end |
|
73 |
end |
|
74 |
end |
|
75 |
end |
|
76 |
end |
|
77 |
|
|
78 |
local function quarry_dig(pos, center, size) |
|
79 |
local meta = minetest.get_meta(pos) |
|
80 |
local drops = {} |
|
81 |
local dig_y = meta:get_int("dig_y") |
93b0d2
|
82 |
local owner = meta:get_string("owner") |
ee0765
|
83 |
|
S |
84 |
local vm = VoxelManip() |
|
85 |
local p1 = vector.new( |
|
86 |
center.x - size, |
|
87 |
center.y + quarry_dig_above_nodes, |
|
88 |
center.z - size) |
|
89 |
local p2 = vector.new( |
|
90 |
center.x + size, |
|
91 |
dig_y - 1, -- One node lower in case we have finished the current layer |
|
92 |
center.z + size) |
|
93 |
local e1, e2 = vm:read_from_map(p1, p2) |
|
94 |
local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) |
|
95 |
local data = vm:get_data() |
|
96 |
|
|
97 |
local digpos = find_next_digpos(data, area, center, dig_y, size) |
|
98 |
|
|
99 |
if digpos then |
|
100 |
if digpos.y < pos.y - quarry_max_depth then |
|
101 |
meta:set_int("dig_y", digpos.y) |
|
102 |
return drops |
|
103 |
end |
|
104 |
if minetest.is_protected and minetest.is_protected(digpos, owner) then |
|
105 |
meta:set_int("enabled", 0) |
bde49a
|
106 |
return {} |
ee0765
|
107 |
end |
S |
108 |
dig_y = digpos.y |
|
109 |
local node = minetest.get_node(digpos) |
|
110 |
drops = minetest.get_node_drops(node.name, "") |
|
111 |
minetest.dig_node(digpos) |
|
112 |
if minetest.get_node(digpos).name == node.name then |
|
113 |
-- We tried to dig something undigable like a |
|
114 |
-- filled chest. Notice that we check for a node |
|
115 |
-- change, not for air. This is so that we get drops |
|
116 |
-- from things like concrete posts with platforms, |
|
117 |
-- which turn into regular concrete posts when dug. |
|
118 |
drops = {} |
|
119 |
end |
|
120 |
elseif not (dig_y < pos.y - quarry_max_depth) then |
|
121 |
dig_y = dig_y - 16 |
|
122 |
end |
|
123 |
|
|
124 |
meta:set_int("dig_y", dig_y) |
|
125 |
return drops |
|
126 |
end |
|
127 |
|
|
128 |
local function send_items(items, pos, node) |
|
129 |
for _, item in pairs(items) do |
8ef3f2
|
130 |
local tube_item = pipeworks.tube_item(vector.new(pos), item) |
ee0765
|
131 |
tube_item:get_luaentity().start_pos = vector.new(pos) |
S |
132 |
tube_item:setvelocity(vector.new(0, 1, 0)) |
|
133 |
tube_item:setacceleration({x=0, y=0, z=0}) |
|
134 |
end |
|
135 |
end |
|
136 |
|
|
137 |
minetest.register_node("technic:quarry", { |
be2f30
|
138 |
description = S("Quarry"), |
68b7bc
|
139 |
tiles = {"technic_carbon_steel_block.png", "technic_carbon_steel_block.png", |
Z |
140 |
"technic_carbon_steel_block.png", "technic_carbon_steel_block.png", |
|
141 |
"technic_carbon_steel_block.png^default_tool_mesepick.png", "technic_carbon_steel_block.png"}, |
ee0765
|
142 |
paramtype2 = "facedir", |
S |
143 |
groups = {cracky=2, tubedevice=1}, |
|
144 |
tube = { |
|
145 |
connect_sides = {top = 1}, |
|
146 |
}, |
|
147 |
on_construct = function(pos) |
|
148 |
local size = 4 |
|
149 |
local meta = minetest.get_meta(pos) |
be2f30
|
150 |
meta:set_string("infotext", S("Quarry")) |
ee0765
|
151 |
meta:set_string("formspec", get_quarry_formspec(4)) |
S |
152 |
meta:set_int("size", size) |
|
153 |
meta:set_int("dig_y", pos.y) |
|
154 |
end, |
|
155 |
after_place_node = function(pos, placer, itemstack) |
|
156 |
local meta = minetest.get_meta(pos) |
|
157 |
meta:set_string("owner", placer:get_player_name()) |
ae235e
|
158 |
pipeworks.scan_for_tube_objects(pos) |
ee0765
|
159 |
end, |
ae235e
|
160 |
after_dig_node = pipeworks.scan_for_tube_objects, |
ee0765
|
161 |
on_receive_fields = quarry_receive_fields, |
S |
162 |
}) |
|
163 |
|
|
164 |
minetest.register_abm({ |
|
165 |
nodenames = {"technic:quarry"}, |
|
166 |
interval = 1, |
|
167 |
chance = 1, |
|
168 |
action = function(pos, node, active_object_count, active_object_count_wider) |
|
169 |
local meta = minetest.get_meta(pos) |
|
170 |
local size = meta:get_int("size") |
|
171 |
local eu_input = meta:get_int("HV_EU_input") |
|
172 |
local demand = 10000 |
|
173 |
local center = get_quarry_center(pos, size) |
|
174 |
local dig_y = meta:get_int("dig_y") |
be2f30
|
175 |
local machine_name = S("Quarry") |
ee0765
|
176 |
|
S |
177 |
technic.switching_station_timeout_count(pos, "HV") |
|
178 |
|
|
179 |
if meta:get_int("enabled") == 0 then |
be2f30
|
180 |
meta:set_string("infotext", S("%s Disabled"):format(machine_name)) |
ee0765
|
181 |
meta:set_int("HV_EU_demand", 0) |
S |
182 |
return |
|
183 |
end |
|
184 |
|
|
185 |
if eu_input < demand then |
be2f30
|
186 |
meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) |
ee0765
|
187 |
elseif eu_input >= demand then |
be2f30
|
188 |
meta:set_string("infotext", S("%s Active"):format(machine_name)) |
ee0765
|
189 |
|
S |
190 |
local items = quarry_dig(pos, center, size) |
|
191 |
send_items(items, pos, node) |
|
192 |
|
|
193 |
if dig_y < pos.y - quarry_max_depth then |
be2f30
|
194 |
meta:set_string("infotext", S("%s Finished"):format(machine_name)) |
ee0765
|
195 |
end |
S |
196 |
end |
|
197 |
meta:set_int("HV_EU_demand", demand) |
|
198 |
end |
|
199 |
}) |
|
200 |
|
|
201 |
technic.register_machine("HV", "technic:quarry", technic.receiver) |
|
202 |
|