SHOW:
|
|
- or go back to the newest paste.
1 | --[[ | |
2 | - | display_tanks v1.0 for OpenCCSensors 0.1.4c |
2 | + | display_tanks_v2 v2.0 for OpenPeripheral 0.4.1 |
3 | - | Copyright (C) 2013 DEXTER |
3 | + | Copyright (C) 2014 DEXTER |
4 | ||
5 | This program is free software: you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation, either version 3 of the License, or | |
8 | (at your option) any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | --]] | |
18 | ||
19 | - | -- Position of your modem |
19 | + | |
20 | - | modem_position = "left" |
20 | + | |
21 | ||
22 | - | -- Position of your monitor |
22 | + | |
23 | - | monitor_position = "top" |
23 | + | |
24 | modem_channel = 3 | |
25 | ||
26 | -- Whether to show or not the percentage in numberic form above the graphs | |
27 | -- Note: This will only work if there is enough horizontal space to write the numbers | |
28 | -- So if the graphs width is less than 4 characters you won't see the numbers | |
29 | -- even if you set this to true | |
30 | show_percentage = true | |
31 | ||
32 | -- The colors you want to see your liquids in | |
33 | -- You can add more liquids, or change the colors here | |
34 | tank_colors={ | |
35 | {name="Lava", color=colors.red}, | |
36 | {name="Water", color=colors.blue}, | |
37 | {name="Biofuel", color=colors.orange}, | |
38 | {name="item.mobessenceitem", color=colors.green}, | |
39 | {name="Creosote Oil", color=colors.brown}, | |
40 | {name="Fuel", color=colors.yellow}, | |
41 | {name="Oil", color=colors.gray}, | |
42 | {name="Biomass", color=colors.green}, | |
43 | {name="Sludge", color=colors.blue}, | |
44 | {name="Sewage", color=colors.brown}, | |
45 | {name="Liquid DNA", color=colors.pink}, | |
46 | {name="Honey", color=colors.yellow}, | |
47 | {name="Fruit Juice", color=colors.lime}, | |
48 | {name="Milk", color=colors.white}, | |
49 | {name="Seed Oil", color=colors.yellow}, | |
50 | {name="Ethanol", color=colors.orange}, | |
51 | {name="Pink Slime", color=colors.pink}, | |
52 | {name="Molten Iron", color=colors.red}, | |
53 | {name="Molten Gold", color=colors.yellow}, | |
54 | {name="Molten Ardite", color=colors.brown}, | |
55 | {name="Molten Copper", color=colors.orange}, | |
56 | {name="Molten Bronze", color=colors.brown}, | |
57 | {name="Molten Aluminum Brass", color=colors.yellow}, | |
58 | {name="Molten Manyullyn", color=colors.purple}, | |
59 | {name="Molten Alumite", color=colors.pink}, | |
60 | {name="Molten Aluminum", color=colors.pink}, | |
61 | {name="Molten Obsidian", color=colors.purple}, | |
62 | {name="Molten Cobalt", color=colors.blue}, | |
63 | {name="Molten Steel", color=colors.lightGray}, | |
64 | {name="Molten Glass", color=colors.lightBlue}, | |
65 | {name="Seared Stone", color=colors.gray}, | |
66 | {name="Liquified Emerald", color=colors.lime}, | |
67 | {name="Blood", color=colors.red}, | |
68 | {name="Molten Nickel", color=colors.yellow}, | |
69 | {name="Molten Lead", color=colors.purple}, | |
70 | {name="Molten Silver", color=colors.cyan}, | |
71 | {name="fluid.platinum.molten", color=colors.cyan}, | |
72 | {name="Molten Invar", color=colors.lightGray}, | |
73 | - | modem = peripheral.wrap(modem_position) |
73 | + | {name="Molten Electrum", color=colors.yellow}, |
74 | - | monitor = peripheral.wrap(monitor_position) |
74 | + | {name="Resonant Ender", color=colors.green}, |
75 | {name="Liquid Blueslime", color=colors.lightBlue}, | |
76 | - | monitor.setTextScale(monitor_scale) |
76 | + | {name="Pig Iron", color=colors.pink}, |
77 | {name="Liquid XP", color=colors.lime}, | |
78 | {name="Destabilized Redstone", color=colors.red}, | |
79 | {name="Energized Glowstone", color=colors.yellow}, | |
80 | {name="Blazing Pyrotheum", color=colors.orange}, | |
81 | {name="Gelid Cryotheum", color=colors.cyan}, | |
82 | {name="coal", color=colors.gray}, | |
83 | } | |
84 | ||
85 | ||
86 | ----------------------------------------- | |
87 | -- DO NOT MODIFY ANYTHING FROM HERE ON -- | |
88 | ----------------------------------------- | |
89 | ||
90 | modem = peripheral.find("modem") | |
91 | - | if (v.name == data.Name) or |
91 | + | if not modem then |
92 | - | (v.name == data.RawName) then |
92 | + | error("Please attach one wireless modem") |
93 | end | |
94 | ||
95 | modem.open(modem_channel) | |
96 | ||
97 | unique_tank_hash = {} | |
98 | ||
99 | function tableLength(T) | |
100 | local count = 0 | |
101 | for _ in pairs(T) do | |
102 | count = count + 1 | |
103 | end | |
104 | return count | |
105 | end | |
106 | ||
107 | function getColor(data) | |
108 | for _, v in pairs(tank_colors) do | |
109 | if (v.name == data.name) or | |
110 | (v.name == data.rawName) then | |
111 | return v.color | |
112 | end | |
113 | end | |
114 | return colors.white | |
115 | end | |
116 | ||
117 | function drawGraph() | |
118 | local graph_width=0 | |
119 | local tanks_num = tableLength(unique_tank_hash) | |
120 | local percentage_line = 0 | |
121 | ||
122 | if tanks_num == 0 then | |
123 | - | percent = v.Amount / v.Capacity |
123 | + | |
124 | end | |
125 | ||
126 | while graph_width <= 0 do | |
127 | graph_width = math.floor((width-tanks_num+1) / tanks_num) | |
128 | tanks_num = tanks_num - 1 | |
129 | end | |
130 | tanks_num = tanks_num + 1 | |
131 | ||
132 | if (show_percentage) and | |
133 | (graph_width > 4) then | |
134 | percentage_line = 1 | |
135 | end | |
136 | ||
137 | local count=0 | |
138 | for k, v in pairs(unique_tank_hash) do | |
139 | local x = (count * graph_width) + 1 + count | |
140 | local x_end = x + graph_width -1 | |
141 | if v.amount == nil then | |
142 | v.amount = 0 | |
143 | end | |
144 | if v.capacity == nil then | |
145 | v.capacity = 1 | |
146 | end | |
147 | percent = v.amount / v.capacity | |
148 | percentage = (height-percentage_line) * percent | |
149 | ||
150 | y = (height-percentage_line) - math.floor(percentage + 0.5) + percentage_line | |
151 | ||
152 | if percentage_line == 1 then | |
153 | local round_percent = math.floor((percent*100) + 0.5) | |
154 | local text = round_percent.."%" | |
155 | local x_pos = x + math.floor((graph_width-string.len(text))/2) | |
156 | monitor.setCursorPos(x_pos,1) | |
157 | monitor.setBackgroundColor(colors.black) | |
158 | monitor.setTextColor(colors.white) | |
159 | ||
160 | monitor.write(text) | |
161 | end | |
162 | ||
163 | for i=1+percentage_line,height do | |
164 | for j=x,x_end do | |
165 | local c = colors.black | |
166 | if i > y then | |
167 | c = getColor(v) | |
168 | end | |
169 | monitor.setBackgroundColor(c) | |
170 | monitor.setCursorPos(j, i) | |
171 | monitor.write(" ") | |
172 | end | |
173 | end | |
174 | ||
175 | count = count + 1 | |
176 | if count >= tanks_num then | |
177 | return | |
178 | end | |
179 | end | |
180 | end | |
181 | ||
182 | function removeTanks(temp_tank_hash, sensor_id) | |
183 | local deletables = {} | |
184 | local temp_tank_hash_empty = false | |
185 | if not next(temp_tank_hash) then | |
186 | temp_tank_hash_empty = true | |
187 | end | |
188 | ||
189 | for k, v in pairs(unique_tank_hash) do | |
190 | local other_hash = textutils.unserialize(k) | |
191 | if other_hash[1] == sensor_id then | |
192 | if temp_tank_hash_empty then | |
193 | deletables[k] = k | |
194 | - | sensor_id = unser_message.id |
194 | + | |
195 | - | sensor_data = unser_message.data |
195 | + | |
196 | for i, j in pairs(temp_tank_hash) do | |
197 | if k == i then | |
198 | found = true | |
199 | - | for i, v in ipairs(sensor_data) do |
199 | + | |
200 | - | tanks=v.Tanks |
200 | + | |
201 | - | position=v.Position |
201 | + | |
202 | if not found then | |
203 | - | for j, value in ipairs(tanks) do |
203 | + | |
204 | - | tank = value |
204 | + | |
205 | - | local hash={sensor_id, position, j} |
205 | + | |
206 | - | unique_tank_hash[textutils.serialize(hash)] = tank |
206 | + | |
207 | - | temp_tank_hash[textutils.serialize(hash)] = tank |
207 | + | |
208 | for k, v in pairs(deletables) do | |
209 | unique_tank_hash[k] = nil | |
210 | end | |
211 | - | removeTanks(temp_tank_hash, sensor_id) |
211 | + | |
212 | ||
213 | - | monitor.setBackgroundColor(colors.black) |
213 | + | |
214 | - | monitor.clear() |
214 | + | |
215 | - | width, height = monitor.getSize() |
215 | + | |
216 | - | drawGraph() |
216 | + | |
217 | ||
218 | tank_id = unser_message.id | |
219 | tank_data = unser_message.tanks | |
220 | ||
221 | local temp_tank_hash = {} | |
222 | ||
223 | for i, v in ipairs(tank_data) do | |
224 | tank=v.data | |
225 | tank_position=v.position | |
226 | ||
227 | local hash={tank_id, tank_position, i} | |
228 | unique_tank_hash[textutils.serialize(hash)] = tank | |
229 | temp_tank_hash[textutils.serialize(hash)] = tank | |
230 | end | |
231 | ||
232 | removeTanks(temp_tank_hash, tank_id) | |
233 | ||
234 | monitor = peripheral.find("monitor") | |
235 | if monitor then | |
236 | monitor.setTextScale(monitor_scale) | |
237 | monitor.setBackgroundColor(colors.black) | |
238 | monitor.clear() | |
239 | width, height = monitor.getSize() | |
240 | drawGraph() | |
241 | end | |
242 | end |