Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Base Monitor 1.3
- This script allows you to monitor caches, tanks, barrels and chests
- Monitoring chests requires an open peripheral proxy, the same goes for
- buildcraft tanks.
- You can build one of more computers and set one of them as the main server by
- setting isMain to true. This will let it receive information from other computers.
- For the main server to receive info from other computers you need to attach a
- wireless modem to each computer.
- Peripherals can be attached to any side you like, the script will automatically
- work out where the peripherals are.
- Changes since 1.2
- Changed the way ME systems are processed as it was very slow.
- Added filtering so that certain names of items can be excluded.
- This was again a problem on ME systems with a lot of items in them.
- Changes since 1.1
- Fixed a bug with tanks. Used to check if getInventoryName existed to determine if the
- peripheral is a tank or not. Now using the getType function instead.
- Changed the string.match to string.find
- http://youtu.be/KT-2hKjUpGA
- --]]
- -- Below are values you can change
- local isMain = true;
- --local id = os.computerID();
- local id = "Main Base";
- local VersionInfo = "Base Monitor 1.3";
- local titleTextColor = colors.blue;
- local titleBackColor = colors.white;
- local tankTextColor = colors.black;
- local tankBackColor = colors.lime;
- local chestTextColor = colors.white;
- local chestBackColor = colors.purple;
- local cacheTextColor = colors.white;
- local cacheBackColor = colors.cyan;
- local powerTextColor = colors.black;
- local powerBackColor = colors.orange;
- --[[
- Add or remove values here to exclude items from being displayed.
- It is case insensitive and it will look for matches.
- So an item called "Nether Brick" will not be displayed if any of the following is set
- "Brick","brick","rick","ck"
- This also means that of you set a filter call "iron" then it will remove all items containing iron.
- it will not show Iron Ore, Iron Block, Iron Helmet, etc.
- --]]
- local filterexclude = {"Ore","Brick","Flesh","Ingot","Pipe","Nugget","Brain","Steel","Drac","Thaum","Sapling","Seed","Cable","Helmet","Chestplat","Boots","Pants","Legging","Glass","Conduit","duct","Stone","Cent","Dollar","Lamp","wood","Crys","config","honey","qua","energy","cell","carpent","fruit","obsid","paper","frog","avoc","crim","nut","berry","raw","cooked","mush","broc","door","card","garden","block","clay","cucum","tea","egg","lettuce","disc","sword","table","tomato","mango","durian","corn","cherry","book","apple","sprout","light","sugar","slime","plate","gate","bar","soul","frame","spawner","fluid","eye","armor","snow","leather","bean","bone","shard","log","tree","and","oats","end","ton","iron"};
- local NameLen = 18;
- local mainChannel = 2;
- -- Above are values you can change
- print("Starting "..VersionInfo);
- local peripherals = peripheral.getNames();
- local mon;
- local wmod;
- local x,y;
- local CurColumn = 0;
- local MaxColumn;
- local ColumnWidth;
- local CurLine = 2;
- local ContentData = {};
- function padString (sText, iLen)
- local iTextLen = string.len(sText);
- -- Too short, pad
- if (iTextLen < iLen) then
- local iDiff = iLen - iTextLen;
- return(sText..string.rep(" ",iDiff));
- end
- -- Too long, trim
- if (iTextLen > iLen) then
- return(string.sub(sText,1,iLen));
- end
- -- Exact length
- return(sText);
- end
- function prepmonitor(objectmon)
- mon = peripheral.wrap(objectmon);
- if (mon.isColor() == false) then
- titleTextColor = colors.black;
- titleBackColor = colors.white;
- tankTextColor = colors.black;
- tankBackColor = colors.white;
- chestTextColor = colors.black;
- chestBackColor = colors.white;
- cacheTextColor = colors.black;
- cacheBackColor = colors.white;
- powerTextColor = colors.black;
- powerBackColor = colors.white;
- end
- end
- function updateTable(strSource,strName,strAmount,strMax,strLegend)
- for l,filter in pairs(filterexclude) do
- if (string.find(string.lower(strName),string.lower(filter)) ~= nil) then
- return;
- end
- end
- if (ContentData[strSource] == nil) then
- ContentData[strSource] = {};
- end
- ContentData[strSource]["displayname"] = strName;
- if (ContentData[strSource]["count"] == nil) then
- ContentData[strSource]["count"] = strAmount;
- else
- ContentData[strSource]["count"] = ContentData[strSource]["count"] + strAmount;
- end
- ContentData[strSource]["max"] = strMax;
- ContentData[strSource]["legend"] = strLegend;
- end
- function printmon(strName,strAmount,strMax,strLegend)
- local textColor;
- local backColor;
- if (strLegend == "#") then
- textColor = chestTextColor;
- backColor = chestBackColor;
- strLegend = "";
- end
- if (strLegend == "+") then
- textColor = tankTextColor;
- backColor = tankBackColor;
- strLegend = "";
- end
- if (strLegend == "*") then
- textColor = powerTextColor;
- backColor = powerBackColor;
- strLegend = "";
- end
- if (strLegend == "$") then
- textColor = cacheTextColor;
- backColor = cacheBackColor;
- strLegend = "";
- end
- local line = string.format("%s %3i%s",padString(strName,NameLen+1),strAmount,padString(strLegend,1));
- if (strAmount >= 1000000) then
- line = string.format("%s %3iM%s",padString(strName,NameLen),math.floor(strAmount/1000000),padString(strLegend,1));
- elseif (strAmount >= 1000) then
- line = string.format("%s %3iK%s",padString(strName,NameLen),math.floor(strAmount/1000),padString(strLegend,1));
- end
- local ColPadding = 0;
- if (CurColumn > 0) then
- ColPadding = 1;
- end
- local CurX = math.floor((CurColumn*ColumnWidth))+math.floor(CurColumn*ColPadding)+1;
- if (CurColumn == 0) then
- -- print("CurX:"..CurX);
- end
- mon.setCursorPos(CurX,CurLine);
- local percent = strAmount / strMax * 100;
- mon.setBackgroundColor(backColor);
- if (strMax == 0) then
- percent = 0;
- end
- local barlength = math.floor(percent / 100 * (string.len(line)-1));
- --if (CurColumn == 0) then
- barlength = barlength + 1;
- --end
- if (string.len(line) > barlength) then
- local msg = string.sub(line,1,barlength);
- mon.setTextColor(textColor);
- mon.write(msg);
- --[[if (percent == 0) then
- mon.setBackgroundColor();
- else
- mon.setBackgroundColor(colors.black);
- end--]]
- mon.setBackgroundColor(colors.black);
- mon.setTextColor(backColor);
- mon.write(string.sub(line,barlength+1,-2))
- else
- local spaces = barlength - string.len(line);
- mon.write(line);
- mon.write(string.rep(" ",spaces));
- end
- mon.setTextColor(colors.white);
- CurColumn = CurColumn + 1;
- if (CurColumn > MaxColumn) then
- CurColumn = 0;
- CurLine = CurLine + 1;
- end
- return true;
- end
- -- Find a monitor
- function findMonitor()
- for i,name in pairs(peripherals) do
- for j,method in pairs(peripheral.getMethods(name)) do
- if (method == 'getCursorPos') then
- prepmonitor(name);
- end
- end
- end
- end
- -- Find a wireless modem
- function findWirelessModem()
- local foundWireless = false;
- for i,name in pairs(peripherals) do
- for j,method in pairs(peripheral.getMethods(name)) do
- if (method == 'isWireless') then
- wmod = peripheral.wrap(name);
- if (wmod.isWireless()) then
- wmod.closeAll();
- foundWireless = true;
- break;
- else
- wmod = {};
- end
- end
- end
- if (foundWireless) then
- break;
- end
- end
- end
- function collectLocalInfo()
- ContentData = {};
- for i,name in pairs(peripherals) do
- local isTank = false;
- local isCache = false;
- local isChest = false;
- local isCell = false;
- local isMESystem = false;
- local displayNames = {};
- for j,method in pairs(peripheral.getMethods(name)) do
- if (method == 'getTankInfo') then
- isTank = true;
- if ( (string.find(peripheral.getType(name),"tank") == -1) and (string.find(peripheral.getType(name),"drum") == -1)) then
- isTank = false;
- isCell = false;
- isChest = false;
- isMESystem = true;
- end
- break;
- end
- if (method == 'getStoredItems') then
- isCache = true;
- isChest = false;
- break;
- end
- if (method == 'getMaxEnergyStored') then
- isCell = true;
- isChest = false;
- if (string.match(peripheral.call(name,"getInventoryName"),"cache") == "cache") then
- isCell = false;
- isChest = false;
- isCache = true;
- end
- if (string.match(peripheral.call(name,"getInventoryName"),"Chest") == "Chest") then
- isCell = false;
- isChest = false;
- isMESystem = true;
- end
- break;
- end
- if ((method == 'getStackInSlot') and (not isCache)) then
- isChest = true;
- if (string.match(peripheral.call(name,"getInventoryName"),"Drive") == "Drive") then
- isChest = false;
- isMESystem = true;
- end
- end
- end
- if (isTank) then
- print("Processing Tank");
- local p = peripheral.wrap(name);
- local iteminfo = p.getTankInfo();
- local maxItems = iteminfo[1].capacity;
- maxItems = math.floor(maxItems/1000);
- local displayname = "Empty";
- local amount = 0;
- if (iteminfo[1].contents) then
- displayname = iteminfo[1].contents.rawName;
- amount = iteminfo[1].contents.amount;
- amount = math.floor(amount/1000);
- end
- updateTable(id.."-"..name,displayname,amount,maxItems,"+");
- end
- if (isCache) then
- print("Processing Cache");
- local p = peripheral.wrap(name);
- local iteminfo = p.getStoredItems();
- if (iteminfo) then
- local maxItems = p.getMaxStoredItems();
- local displayname = iteminfo.display_name;
- updateTable(id.."-"..name,displayname,iteminfo.qty,maxItems,"$");
- end
- end
- if (isCell) then
- print("Processing Cell");
- local p = peripheral.wrap(name);
- local energy = p.getEnergyStored();
- local maxEnergy = p.getMaxEnergyStored();
- local percent = (energy/maxEnergy*100);
- updateTable(id.."-"..name,"Power Cell",energy,maxEnergy,"*");
- end
- if (isChest) then
- print("Processing Chest");
- local p = peripheral.wrap(name);
- local chestSize = p.getInventorySize();
- local items = {};
- for j=1,chestSize,1 do
- local iteminfo = p.getStackInSlot(j);
- if (iteminfo) then
- displayname = iteminfo.display_name;
- if (displayname) then
- if (not items[displayname]) then
- items[displayname] = iteminfo.qty;
- else
- items[displayname] = items[displayname] + iteminfo.qty;
- end
- end
- end
- end
- local k = 0;
- for key,val in pairs(items) do
- k = k + 1;
- updateTable(id.."-"..name.."_"..k,key,val,0,"#");
- end
- end
- if (isMESystem) then
- print("Processing ME System");
- local p = peripheral.wrap(name);
- local itemarray = p.getAvailableItems();
- for j=1,table.getn(itemarray),1 do
- if (itemarray[j].size > 0) then
- local fingerprint = itemarray[j].fingerprint;
- if ( (displayNames[fingerprint.id] == nil) or (displayNames[fingerprint.id] == fingerprint.id)) then
- local ItemDetail = p.getItemDetail(fingerprint);
- if (ItemDetail ~= nil) then
- displayNames[fingerprint.id] = ItemDetail.basic().display_name;
- else
- displayNames[fingerprint.id] = fingerprint.id;
- end
- end
- updateTable(id.."-"..name.."_"..fingerprint.id,displayNames[fingerprint.id],itemarray[j].size,0,"#");
- end
- end
- end
- print("Done");
- end
- end
- function updateMonitor()
- x,y = mon.getSize();
- ColumnWidth = NameLen + 7;
- MaxColumn = math.floor(x / (ColumnWidth))-1;
- mon.setBackgroundColor(colors.black);
- mon.clear();
- CurColumn = 0;
- CurLine = 1;
- mon.setCursorPos(1,1);
- mon.setTextColor(colors.white);
- mon.setTextScale(0.5);
- mon.write(VersionInfo);
- local sorted = {};
- for n in pairs(ContentData) do
- table.insert(sorted, n);
- end
- table.sort(sorted);
- local name = "";
- for i,source in ipairs(sorted) do
- local curname = string.sub(source,1,string.find(source,"-")-1);
- if (name ~= curname) then
- name = curname;
- CurColumn = 0;
- mon.setTextColor(titleTextColor);
- mon.setBackgroundColor(titleBackColor);
- mon.setCursorPos(1,CurLine+1);
- mon.write(padString("Contents for "..name,x-1));
- CurLine = CurLine + 2;
- end
- displayname = ContentData[source]["displayname"];
- count = ContentData[source]["count"];
- max = ContentData[source]["max"];
- legend = ContentData[source]["legend"];
- printmon(displayname,count,max,legend);
- end
- end
- -- This is the main section of the script
- findMonitor();
- findWirelessModem();
- if (isMain == true) then
- if (type(wmod.isWireless) == "function") then
- wmod.open(mainChannel);
- else
- print("You don't have a wireless modem, and this is set as the main computer");
- end
- end
- ContentData = {};
- local timerUpdate = os.startTimer(60);
- local updateCount = 0;
- local wirelessEventCount = 0;
- -- Perform Initial Collection and Update the Monitor
- collectLocalInfo();
- updateMonitor();
- while true do
- local event, param1, param2, param3, param4, param5 = os.pullEvent();
- print("Received event:"..event);
- if (event == "timer") then
- if (param1 == timerUpdate) then
- updateCount = updateCount + 1;
- if (updateCount >= 3) then
- updateCount = 0;
- ContentData = {};
- end
- collectLocalInfo();
- if (wmod) then
- if (isMain == false) then
- wmod.transmit(mainChannel,1,ContentData);
- end
- end
- if (updateCount == 2) then
- updateMonitor();
- end
- wirelessEventCount = 0;
- timerUpdate = os.startTimer(5);
- end
- end
- if (event == "modem_message") then
- if (isMain == true) then
- wirelessEventCount = wirelessEventCount + 1;
- for source,data in pairs(param4) do
- if (ContentData[source] == nil) then
- ContentData[source] = {};
- end
- ContentData[source]["displayname"] = param4[source]["displayname"];
- ContentData[source]["count"] = param4[source]["count"];
- ContentData[source]["max"] = param4[source]["max"];
- ContentData[source]["legend"] = param4[source]["legend"];
- end
- if (wirelessEventCount >= 10) then
- timerUpdate = os.startTimer(1);
- end
- end
- end
- if (event == "monitor_touch") or (event == "monitor_resize") then
- print("Updating the Monitor");
- updateMonitor();
- end
- if (event == "peripheral") or (event == "peripheral_detach") then
- print("Updating the peripheral list");
- peripherals = peripheral.getNames();
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement