From a7fcde60b80c9ccccb4a9f79cabeb00acd4cdd82 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Tue, 6 Jun 2017 10:45:44 +0200 Subject: [PATCH] Reporting for multiple players --- sharedPlugins/inventoryImports/index.js | 54 +++++++++++++-- .../inventoryImports/lua commands.lua | 65 ++++++++++++------- 2 files changed, 90 insertions(+), 29 deletions(-) diff --git a/sharedPlugins/inventoryImports/index.js b/sharedPlugins/inventoryImports/index.js index eb61903a..85898ccc 100644 --- a/sharedPlugins/inventoryImports/index.js +++ b/sharedPlugins/inventoryImports/index.js @@ -1,12 +1,10 @@ const needle = require("needle"); const isJson = require("./isJson.js"); const pluginConfig = require("./config.js"); +const objectOps = require("../../lib/objectOps.js"); -console.log("/silent-command game.print('UPSdisplay enabled')\n"); +console.log("/silent-command game.print('InventoryImports enabled')\n"); -setInterval(function(){ - console.log("/silent-command game.write_file('UPSdisplay.txt', game.tick, true, 0)\n"); -},1000); var config = {}; process.stdin.setEncoding('utf8'); let historicalTicks = []; @@ -18,7 +16,51 @@ process.stdin.on('readable', () => { // in JSON than JS objects. let inventory = ""; eval("inventory = " + chunk); + /* Example output: + {'1':{ + inventory: { + 'raw-wood': 4 + }, + requestSlots:{ + 'underground-belt': 50, + 'fast-transport-belt': 50, + 'express-underground-belt': 50 + }}} + */ console.log(inventory); + // we want to seperate players, parse their inventory and compare to request slots + // then ask master for the difference + // we must then prepare it all and inject it into players inventories with lua before + // the next inventory report arrives to avoid duplicating orders + if(inventory && typeof inventory != "string"){ + let players = Object.keys(inventory); + for(let i = 0; i < players.length; i++) { + let pinv = inventory[players[i]]; + // create a copy of player.requestSlots + let toRequest = objectOps.deepclone(pinv.requestSlots); + // subtract items already in inventory + Object.keys(pinv.inventory).forEach(function(key){ + let itemCount = pinv.inventory[key]; + if(toRequest[key]){ + toRequest[key] -= itemCount; + } + let request = { + name:key, + count:toRequest[key], + } + // request the difference from master + needle.post(config.masterIP + ":" + config.masterPort + '/api/remove', request, function (err, response, body) { + if (response && response.body && typeof response.body == "object") { + // confirmed orders, already removed from master inventory + //response.body.name: response.body.count + + } + }); + }); + + } + } + } else if(isJson(chunk) && JSON.parse(chunk).factorioPort){ config = JSON.parse(chunk); } @@ -32,7 +74,9 @@ setInterval(function(){ // TODO: Make it work for players other than myself, don't error when inventory does not exist, check logistic request slots // console.log("/silent-command "+'local a=game.players["Danielv123"].get_inventory(defines.inventory.player_main).get_contents()local b=game.players["Danielv123"].get_quickbar().get_contents()local c={}local d="{inventory:{"for e,f in pairs(a)do d=d.."['+"'"+'"..e.."'+"'"+']:"..f..","end;for e,f in pairs(b)do d=d.."['+"'"+'"..e.."'+"'"+']:"..f..","end;d=d.."},requestSlots:{"for e,f in pairs(c)do d=d.."['+"'"+'"..e.."'+"'"+']:"..f..","end;d=d.."}}"game.write_file("'+pluginConfig.scriptOutputFileSubscription+'",d)'); // console.log("Running inventory LUA") - console.log("/silent-command "+'local a=game.players["Danielv123"].get_inventory(defines.inventory.player_main).get_contents()local b=game.players["Danielv123"].get_quickbar().get_contents()local c={}for d=1,game.players["Danielv123"].force.character_logistic_slot_count do c[d]=game.players["Danielv123"].character.get_request_slot(d)end;local e="{inventory:{"for f,g in pairs(a)do e=e.."['+"'"+'"..f.."'+"'"+']:"..g..","end;for f,g in pairs(b)do e=e.."['+"'"+'"..f.."'+"'"+']:"..g..","end;e=e.."},requestSlots:{"for f,g in pairs(c)do e=e.."['+"'"+'"..g["name"].."'+"'"+']:"..g["count"]..", "end;e=e.."}}"game.write_file("'+pluginConfig.scriptOutputFileSubscription+'",e)') + //console.log("/silent-command "+'local a=game.players["Danielv123"].get_inventory(defines.inventory.player_main).get_contents()local b=game.players["Danielv123"].get_quickbar().get_contents()local c={}for d=1,game.players["Danielv123"].force.character_logistic_slot_count do c[d]=game.players["Danielv123"].character.get_request_slot(d)end;local e="{inventory:{"for f,g in pairs(a)do e=e.."['+"'"+'"..f.."'+"'"+']:"..g..","end;for f,g in pairs(b)do e=e.."['+"'"+'"..f.."'+"'"+']:"..g..","end;e=e.."},requestSlots:{"for f,g in pairs(c)do e=e.."['+"'"+'"..g["name"].."'+"'"+']:"..g["count"]..", "end;e=e.."}}"game.write_file("'+pluginConfig.scriptOutputFileSubscription+'",e)') + // console.log("/silent-command "+'local a="{"for b,c in pairs(game.players)do local d=game.players[b].get_inventory(defines.inventory.player_main).get_contents()local e=game.players[b].get_quickbar().get_contents()local f={}for g=1,game.players[b].force.character_logistic_slot_count do f[g]=game.players[b].character.get_request_slot(g)end;a=a..b..":{inventory:{"for h,i in pairs(d)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;for h,i in pairs(e)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;a=a.."},requestSlots:{"for h,i in pairs(f)do a=a.."['+"'"+'"..i["name"].."'+"'"+']:"..i["count"]..", "end;a=a.."}},"end;a=a.."}"game.write_file("'+pluginConfig.scriptOutputFileSubscription+'",a)') + console.log("/silent-command "+'local a="{"for b,c in pairs(game.players)do if c.connected then local d=game.players[b].get_inventory(defines.inventory.player_main).get_contents()local e=game.players[b].get_quickbar().get_contents()local f={}for g=1,game.players[b].force.character_logistic_slot_count do f[g]=game.players[b].character.get_request_slot(g)end;a=a..b..":{inventory:{"for h,i in pairs(d)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;for h,i in pairs(e)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;a=a.."},requestSlots:{"for h,i in pairs(f)do a=a.."['+"'"+'"..i["name"].."'+"'"+']:"..i["count"]..", "end;a=a.."}},"end end;a=a.."}"game.write_file("'+pluginConfig.scriptOutputFileSubscription+'",a)') /* needle.post(config.masterIP+':'+config.masterPort+'/api/editSlaveMeta', {slaveID: config.unique, password: config.clientPassword, meta: {UPS:UPS}}, function(err, resp) { // success? diff --git a/sharedPlugins/inventoryImports/lua commands.lua b/sharedPlugins/inventoryImports/lua commands.lua index 4af884fd..30de641c 100644 --- a/sharedPlugins/inventoryImports/lua commands.lua +++ b/sharedPlugins/inventoryImports/lua commands.lua @@ -22,37 +22,51 @@ for k,v in pairs(requests) do end game.print(o) +-- sum up our inventory and request slots /c - -local o = "" - +local o = "{" for a,b in pairs(game.players) do -local inventory = game.players["Danielv123"].get_inventory(defines.inventory.player_main).get_contents() -local quickbar = game.players["Danielv123"].get_quickbar().get_contents() ---[[ Get contents of requester slots into a table ]] -local requests = {} -for i = 1, game.players["Danielv123"].force.character_logistic_slot_count do - requests[i] = game.players["Danielv123"].character.get_request_slot(i) -end + if b.connected then + local inventory = game.players[a].get_inventory(defines.inventory.player_main).get_contents() + local quickbar = game.players[a].get_quickbar().get_contents() + --[[ Get contents of requester slots into a table ]] + local requests = {} + for i = 1, game.players[a].force.character_logistic_slot_count do + requests[i] = game.players[a].character.get_request_slot(i) + end -o = o.."{inventory:{" ---[[ generate JS table (not JSON) ]] -for k,v in pairs(inventory) do - o = o.."['"..k.."']:"..v.."," -end -for k,v in pairs(quickbar) do - o = o.."['"..k.."']:"..v.."," -end + o = o..a..":{inventory:{" + --[[ generate JS table (not JSON) ]] + for k,v in pairs(inventory) do + o = o.."['"..k.."']:"..v.."," + end + for k,v in pairs(quickbar) do + o = o.."['"..k.."']:"..v.."," + end -o = o.."},requestSlots:{" -for k,v in pairs(requests) do - o = o.."['"..v["name"].."']:"..v["count"]..", " -end -o = o.."}}" + o = o.."},requestSlots:{" + for k,v in pairs(requests) do + o = o.."['"..v["name"].."']:"..v["count"]..", " + end + o = o.."}}," + end end +o = o.."}" game.print(o) game.write_file("test.txt", o) +-- insert items in players inventory and export leftovers +/c +local name = "Danielv123" +local itemName = "iron-ore" +local itemCount = 100 +if game.players[name] do + local items = {name=itemName, count=itemCount} + if game.players[name].can_insert(items) do + local insertedItems = game.players[name].insert(items) + local restItems = itemCount - insertedItems + end +end --[[ @@ -66,6 +80,9 @@ enclose in '' ]] -- minified strings - +-- offline playes +local a="{"for b,c in pairs(game.players)do if c.connected then local d=game.players[b].get_inventory(defines.inventory.player_main).get_contents()local e=game.players[b].get_quickbar().get_contents()local f={}for g=1,game.players[b].force.character_logistic_slot_count do f[g]=game.players[b].character.get_request_slot(g)end;a=a..b..":{inventory:{"for h,i in pairs(d)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;for h,i in pairs(e)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;a=a.."},requestSlots:{"for h,i in pairs(f)do a=a.."['+"'"+'"..i["name"].."'+"'"+']:"..i["count"]..", "end;a=a.."}},"end end;a=a.."}"game.print(a) +-- multiple players +local a="{"for b,c in pairs(game.players)do local d=game.players[b].get_inventory(defines.inventory.player_main).get_contents()local e=game.players[b].get_quickbar().get_contents()local f={}for g=1,game.players[b].force.character_logistic_slot_count do f[g]=game.players[b].character.get_request_slot(g)end;a=a..b..":{inventory:{"for h,i in pairs(d)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;for h,i in pairs(e)do a=a.."['+"'"+'"..h.."'+"'"+']:"..i..","end;a=a.."},requestSlots:{"for h,i in pairs(f)do a=a.."['+"'"+'"..i["name"].."'+"'"+']:"..i["count"]..", "end;a=a.."}},"end;a=a.."}"game.print(a) local a=game.players["Danielv123"].get_inventory(defines.inventory.player_main).get_contents()local b=game.players["Danielv123"].get_quickbar().get_contents()local c={}for d=1,game.players["Danielv123"].force.character_logistic_slot_count do c[d]=game.players["Danielv123"].character.get_request_slot(d)end;local e="{inventory:{"for f,g in pairs(a)do e=e.."['+"'"+'"..f.."'+"'"+']:"..g..","end;for f,g in pairs(b)do e=e.."['+"'"+'"..f.."'+"'"+']:"..g..","end;e=e.."},requestSlots:{"for f,g in pairs(c)do e=e.."['+"'"+'"..g["name"].."'+"'"+']:"..g["count"]..", "end;e=e.."}}"game.print(e) local inventory = game.players["Danielv123"].get_inventory(defines.inventory.player_main).get_contents()local quickbar = game.players["Danielv123"].get_quickbar().get_contents()local requests = {}for i = 1, game.player.force.character_logistic_slot_count do requests[i] = game.players["Danielv123"].character.get_request_slot(i) end local o = "{inventory:{" for k,v in pairs(inventory) do o = o.."['+"'"+'"..k.."'+"'"+']:"..v.."," end for k,v in pairs(quickbar) do o = o.."['+"'"+'"..k.."'+"'"+']:"..v.."," end o = o.."},requestSlots:{" for k,v in pairs(requests) do o = o.."['+"'"+'"..v["name"].."'+"'"+']:"..v["count"]..", " end o = o.."}}" game.write_file("test.txt", o) \ No newline at end of file