mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-15 07:24:52 +09:00
#61 extracting place data from game
Still need to extract remove data in the LUA portion and store it
This commit is contained in:
1 parent
dc0a722e3d
commit
2bcacb2513
5 files changed
+172
-1
No files matched your search
+2
-1
@@ -39,4 +39,5 @@ package-lock.json
|
||||
!sharedPlugins/
|
||||
sharedPlugins/*
|
||||
!sharedPlugins/inventoryImports/
|
||||
!sharedPlugins/UPSdisplay/
|
||||
!sharedPlugins/UPSdisplay/
|
||||
!sharedPlugins/remoteMap/
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
Config for clusterio remote mapping plugin. Will handle writing out new map data, aggregating it and sending it to the master (or something) for
|
||||
display/interaction.
|
||||
*/
|
||||
var modInfo = require("./info.json");
|
||||
module.exports = {
|
||||
// Name of package. For display somewhere I guess.
|
||||
name: modInfo.name,
|
||||
version: modInfo.version,
|
||||
// Binary entrypoint for plugin. Don't let it crash. Stdout is sent to game as server chat (run /c commands from here for interface)
|
||||
// Make sure its cross platform somehow.
|
||||
binary: "node",
|
||||
arguments: ["index.js"],
|
||||
description: modInfo.description,
|
||||
// We'll send everything in this file to your stdin. Beware.
|
||||
scriptOutputFileSubscription: "remoteMap.txt",
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
-- MIT License
|
||||
--
|
||||
-- Copyright (c) 2017 Florian Jung
|
||||
--
|
||||
-- Permission is hereby granted, free of charge, to any person obtaining a
|
||||
-- copy of this factorio lua stub and associated
|
||||
-- documentation files (the "Software"), to deal in the Software without
|
||||
-- restriction, including without limitation the rights to use, copy, modify,
|
||||
-- merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
-- Software, and to permit persons to whom the Software is furnished to do
|
||||
-- so, subject to the following conditions:
|
||||
--
|
||||
-- The above copyright notice and this permission notice shall be included in
|
||||
-- all copies or substantial portions of the Software.
|
||||
--
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
-- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
-- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
-- DEALINGS IN THE SOFTWARE.
|
||||
|
||||
function write_file(data)
|
||||
if must_write_initstuff then
|
||||
must_write_initstuff = false
|
||||
writeout_initial_stuff()
|
||||
end
|
||||
|
||||
game.write_file("remoteMap.txt", data, true)
|
||||
end
|
||||
function complain(text)
|
||||
print(text)
|
||||
game.forces["player"].print(text)
|
||||
end
|
||||
|
||||
local todo_next_tick = {}
|
||||
function on_tick(event)
|
||||
if #todo_next_tick > 0 then
|
||||
print("on_tick executing "..#todo_next_tick.." stored callbacks")
|
||||
for _,func in ipairs(todo_next_tick) do
|
||||
func()
|
||||
end
|
||||
todo_next_tick = {}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function writeout_objects(surface, area)
|
||||
--if my_client_id ~= 1 then return end
|
||||
header = "objects "..area.left_top.x..","..area.left_top.y..";"..area.right_bottom.x..","..area.right_bottom.y..": "
|
||||
line = ''
|
||||
lines={}
|
||||
for idx, ent in pairs(surface.find_entities(area)) do
|
||||
if area.left_top.x <= ent.position.x and ent.position.x < area.right_bottom.x and area.left_top.y <= ent.position.y and ent.position.y < area.right_bottom.y then
|
||||
if ent.prototype.collision_mask ~= nil and ent.prototype.collision_mask['player-layer'] then
|
||||
line=line..","..ent.name.." "..ent.position.x.." "..ent.position.y
|
||||
if idx % 100 == 0 then
|
||||
table.insert(lines,line)
|
||||
line=''
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
table.insert(lines,line)
|
||||
write_file(header..table.concat(lines,"").."\n")
|
||||
|
||||
line=nil
|
||||
end
|
||||
|
||||
function on_some_entity_created(event)
|
||||
local ent = event.entity or event.created_entity or nil
|
||||
if ent == nil then
|
||||
complain("wtf, on_some_entity_created has nil entity")
|
||||
return
|
||||
end
|
||||
|
||||
writeout_objects(ent.surface, {left_top={x=math.floor(ent.position.x), y=math.floor(ent.position.y)}, right_bottom={x=math.floor(ent.position.x)+1, y=math.floor(ent.position.y)+1}})
|
||||
|
||||
complain("on_some_entity_created: "..ent.name.." at "..ent.position.x..","..ent.position.y)
|
||||
end
|
||||
function on_some_entity_deleted(event)
|
||||
local ent = event.entity
|
||||
if ent == nil then
|
||||
complain("wtf, on_some_entity_deleted has nil entity")
|
||||
return
|
||||
end
|
||||
|
||||
-- we can't do this now, because the entity still exists at this point. instead, we schedule the writeout for the next tick
|
||||
|
||||
local surface = ent.surface
|
||||
local area = {left_top={x=math.floor(ent.position.x), y=math.floor(ent.position.y)}, right_bottom={x=math.floor(ent.position.x)+1, y=math.floor(ent.position.y)+1}}
|
||||
|
||||
table.insert(todo_next_tick, function () writeout_objects(surface, area ) end)
|
||||
|
||||
complain("on_some_entity_deleted: "..ent.name.." at "..ent.position.x..","..ent.position.y)
|
||||
end
|
||||
|
||||
script.on_event(defines.events.on_tick, on_tick)
|
||||
|
||||
script.on_event(defines.events.on_biter_base_built, on_some_entity_created) --entity
|
||||
script.on_event(defines.events.on_built_entity, on_some_entity_created) --created_entity
|
||||
script.on_event(defines.events.on_robot_built_entity, on_some_entity_created) --created_entity
|
||||
|
||||
script.on_event(defines.events.on_entity_died, on_some_entity_deleted) --entity
|
||||
script.on_event(defines.events.on_player_mined_entity, on_some_entity_deleted) --entity
|
||||
script.on_event(defines.events.on_robot_mined_entity, on_some_entity_deleted) --entity
|
||||
script.on_event(defines.events.on_resource_depleted, on_some_entity_deleted) --entity
|
||||
@@ -0,0 +1,34 @@
|
||||
const needle = require("needle");
|
||||
const moduleConfig = require("./config");
|
||||
console.log("/silent-command game.print('"+moduleConfig.name+" version "+moduleConfig.version+" enabled')");
|
||||
|
||||
/*setInterval(function(){
|
||||
console.log("/silent-command game.write_file('"+moduleConfig.scriptOutputFileSubscription+"', game.tick, true, 0)");
|
||||
},1000);*/
|
||||
var config = {};
|
||||
process.stdin.setEncoding('utf8');
|
||||
process.stdin.on('readable', () => {
|
||||
var chunk = process.stdin.read();
|
||||
if (chunk !== null && !isNaN(chunk) && !chunk.includes("objects")){
|
||||
console.log(chunk);
|
||||
// objects -29,-35;-28,-34: ,inserter -28.5 -34.5
|
||||
|
||||
let data = chunk.split(",");
|
||||
data.shift();data.shift();data.shift();
|
||||
if(data && data[0] == undefined){
|
||||
// this position is now empty, delete whatever was there from DB
|
||||
}
|
||||
data.forEach(entity => {
|
||||
let name = entity.split(" ")[0];
|
||||
let xPos = entity.split(" ")[1];
|
||||
let yPos = entity.split(" ")[2];
|
||||
});
|
||||
|
||||
} else {
|
||||
// config is the same config as client.js and master.js uses
|
||||
config = JSON.parse(chunk);
|
||||
}
|
||||
});
|
||||
process.stdin.on('end', () => {
|
||||
process.stdout.write('end');
|
||||
});
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
{
|
||||
"name": "remoteMap",
|
||||
"title": "Clusterio remote map",
|
||||
"version": "1.0.0",
|
||||
"date": "18-11-2017",
|
||||
"author": "Danielv123",
|
||||
"dependencies": ["base >= 0.15"],
|
||||
"factorio_version": "0.15",
|
||||
"description": "Clusterio plugin for external mapping and possibly building?"
|
||||
}
|
||||
Reference in new issue
Block a user