mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
Merge branch 'master' of https://github.com/veladon/factorioClusterio
This commit is contained in:
commit
fea9fb28ca
4 files changed
+98
-58
No files matched your search
@@ -235,7 +235,7 @@ const db = {};
|
||||
|
||||
(function(){
|
||||
try{
|
||||
let x = fs.statSync(path.resolve(config.databaseDirectory, "/slaves.json"));
|
||||
let x = fs.statSync(path.resolve(config.databaseDirectory, "slaves.json"));
|
||||
console.log(`loading slaves from path.resolve(config.databaseDirectory, "slaves.json")`);
|
||||
slaves = JSON.parse(fs.readFileSync(path.resolve(config.databaseDirectory, "slaves.json")));
|
||||
} catch (e){
|
||||
|
||||
@@ -3,7 +3,11 @@
|
||||
local data = {};
|
||||
|
||||
for _, tech in pairs(game.forces["player"].technologies) do
|
||||
table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level));
|
||||
if tech.enabled == true and tech.prototype.max_level == 4294967295 then
|
||||
table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level) .. ":true");
|
||||
else
|
||||
table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level) .. ":false");
|
||||
end
|
||||
end
|
||||
|
||||
game.write_file("researchSync.txt", table.concat(data, "\n"), false, 0)
|
||||
@@ -1,16 +1,17 @@
|
||||
/silent-command
|
||||
if game.forces['player'].technologies['{tech_name}'] then
|
||||
if game.forces['player'].technologies['{tech_name}'].researched ~= {tech_researched} then
|
||||
game.forces['player'].technologies['{tech_name}'].researched = {tech_researched}
|
||||
end
|
||||
if game.forces['player'].technologies['{tech_name}'].level ~= {tech_level} then
|
||||
game.forces['player'].technologies['{tech_name}'].level = {tech_level}
|
||||
end
|
||||
if 1 == {tech_infinite} then
|
||||
game.forces['player'].technologies['{tech_name}'].level = {tech_level}
|
||||
else
|
||||
game.forces['player'].technologies['{tech_name}'].researched = true
|
||||
end
|
||||
script.raise_event(defines.events.on_research_finished, {research=game.forces['player'].technologies['{tech_name}'], by_script=true})
|
||||
game.play_sound({path="utility/research_completed"})
|
||||
if game.forces['player'].technologies['{tech_name}'].researched == false then
|
||||
game.print("Technology {tech_name} synced at level {tech_level}")
|
||||
else
|
||||
game.print("Technology {tech_name} synced")
|
||||
end
|
||||
if {notify} then
|
||||
if 1 == {tech_infinite} then
|
||||
game.print("Infinite technology {tech_name} level {tech_level} unlocked")
|
||||
else
|
||||
game.print("Technology {tech_name} researched")
|
||||
end
|
||||
game.play_sound({path="utility/research_completed"})
|
||||
end
|
||||
end
|
||||
@@ -1,19 +1,21 @@
|
||||
const fs = require('fs');
|
||||
const fs = require('fs');
|
||||
const needle = require("needle");
|
||||
|
||||
|
||||
class ResearchSync {
|
||||
constructor(slaveConfig, messageInterface, extras = {}){
|
||||
this.config = slaveConfig;
|
||||
constructor(slaveConfig, messageInterface, extras = {}) {
|
||||
this.config = slaveConfig;
|
||||
this.messageInterface = messageInterface;
|
||||
this.functions = this.loadFunctions();
|
||||
|
||||
this.functions = this.loadFunctions();
|
||||
|
||||
this.research = {};
|
||||
|
||||
setInterval(() => {
|
||||
this.pollResearch();
|
||||
setTimeout(this.doSync.bind(this), 2000);
|
||||
}, extras.researchSyncPollInterval || 5000);
|
||||
setInterval(
|
||||
() => {
|
||||
this.pollResearch();
|
||||
setTimeout(this.doSync.bind(this), 5000);
|
||||
},
|
||||
extras.researchSyncPollInterval || 30000
|
||||
);
|
||||
}
|
||||
|
||||
pollResearch() {
|
||||
@@ -23,11 +25,11 @@ class ResearchSync {
|
||||
|
||||
doSync() {
|
||||
needle.get(this.config.masterIP + ':' + this.config.masterPort + '/api/slaves', (err, resp, slaveData) => {
|
||||
if (err){
|
||||
this.messageInterface("Unable to post JSON master/api/slaves, master might be unreachable");
|
||||
return false;
|
||||
}
|
||||
if (resp.statusCode !== 200){
|
||||
if (err) {
|
||||
this.messageInterface("Unable to post JSON master/api/slaves, master might be unreachable");
|
||||
return false;
|
||||
}
|
||||
if (resp.statusCode !== 200) {
|
||||
this.messageInterface("got error when calling slaves", resp.statusCode, resp.body);
|
||||
return;
|
||||
}
|
||||
@@ -38,51 +40,76 @@ class ResearchSync {
|
||||
if (slaveData[instanceKey].unique === this.config.unique.toString()) {
|
||||
return;
|
||||
}
|
||||
if (!slaveData[instanceKey].hasOwnProperty('meta') || !slaveData[instanceKey].meta.hasOwnProperty('research')) {
|
||||
if (!slaveData[instanceKey].hasOwnProperty('meta')
|
||||
|| !slaveData[instanceKey].meta.hasOwnProperty('research')
|
||||
) {
|
||||
return;
|
||||
}
|
||||
let researchList = slaveData[instanceKey].meta.research;
|
||||
if(researchList){
|
||||
if (researchList) {
|
||||
Object.keys(researchList).forEach(researchName => {
|
||||
if (isNaN(researchList[researchName].researched) || isNaN(researchList[researchName].level)) {
|
||||
if (
|
||||
isNaN(researchList[researchName].researched)
|
||||
|| isNaN(researchList[researchName].level)
|
||||
|| isNaN(researchList[researchName].infinite))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (needResearch.hasOwnProperty(researchName)) {
|
||||
if (needResearch[researchName].researched === 0) {
|
||||
needResearch[researchName].researched = parseInt(researchList[researchName].researched);
|
||||
}
|
||||
if (needResearch[researchName].level < parseInt(researchList[researchName].level)) {
|
||||
if (
|
||||
needResearch[researchName].infinite === 1
|
||||
&& needResearch[researchName].level < parseInt(researchList[researchName].level)
|
||||
) {
|
||||
needResearch[researchName].level = parseInt(researchList[researchName].level);
|
||||
} else if (
|
||||
needResearch[researchName].researched === 0
|
||||
&& parseInt(researchList[researchName].researched) === 1
|
||||
) {
|
||||
needResearch[researchName].researched = 1
|
||||
}
|
||||
}
|
||||
else {
|
||||
needResearch[researchName] = {researched: parseInt(researchList[researchName].researched), level: parseInt(researchList[researchName].level)};
|
||||
} else {
|
||||
needResearch[researchName] = {
|
||||
researched: parseInt(researchList[researchName].researched),
|
||||
level : parseInt(researchList[researchName].level),
|
||||
infinite : parseInt(researchList[researchName].infinite)
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
let difference = this.filterResearchDiff(this.research, needResearch);
|
||||
|
||||
let count = Object.keys(difference).length;
|
||||
let counter = 1;
|
||||
Object.keys(difference).forEach((key) => {
|
||||
if (this.research[key]) {
|
||||
let command = this.functions.enableResearch;
|
||||
while(command.includes("{tech_name}")){
|
||||
while (command.includes("{tech_name}")) {
|
||||
command = command.replace("{tech_name}", key);
|
||||
command = command.replace("{tech_researched}", difference[key].researched);
|
||||
command = command.replace("{tech_level}", difference[key].level);
|
||||
command = command.replace("{tech_infinite}", difference[key].infinite);
|
||||
command = command.replace("{notify}", count > 1 || count === counter ? 'false' : 'true');
|
||||
}
|
||||
this.messageInterface(command);
|
||||
console.log('Unlocking '+ key + ': ' + (difference[key].researched === 0 ? 'false' : 'true') + ' and level ' + difference[key].level + ', was '+ (this.research[key].researched === 0 ? 'false' : 'true') + ' at level ' + this.research[key].level);
|
||||
this.messageInterface("Unlocking research: " + key + " at research state = " + (difference[key].researched === 0 ? 'false' : 'true') + ' and level ' + difference[key].level);
|
||||
let log_message = '';
|
||||
if (difference[key].infinite === 1) {
|
||||
log_message = 'Unlocking infinite research ' + key + 'at level ' + this.research[key].level;
|
||||
} else {
|
||||
log_message = 'Unlocking research ' + key;
|
||||
}
|
||||
console.log(log_message);
|
||||
this.messageInterface(log_message);
|
||||
this.research[key] = difference[key];
|
||||
++counter;
|
||||
}
|
||||
});
|
||||
|
||||
needle.post(this.config.masterIP + ':' + this.config.masterPort + '/api/editSlaveMeta', {
|
||||
instanceID: this.config.unique,
|
||||
password: this.config.clientPassword,
|
||||
meta: {research: this.research}
|
||||
password : this.config.clientPassword,
|
||||
meta : {research: this.research}
|
||||
}, {headers: {'x-access-token': this.config.masterAuthToken}}, function (err, resp) {
|
||||
// success?
|
||||
});
|
||||
@@ -93,9 +120,13 @@ class ResearchSync {
|
||||
let diff = {};
|
||||
Object.keys(localResearch).forEach((key) => {
|
||||
if (remoteResearch.hasOwnProperty(key)) {
|
||||
if ((localResearch[key].researched === 0 && localResearch[key].researched !== remoteResearch[key].researched) || localResearch[key].level < remoteResearch[key].level) {
|
||||
if (!isNaN(remoteResearch[key].researched) && !isNaN(remoteResearch[key].level)) {
|
||||
diff[key] = {researched: remoteResearch[key].researched, level: remoteResearch[key].level};
|
||||
if (
|
||||
(localResearch[key].infinite === 0 && localResearch[key].researched === 0 && remoteResearch[key].researched === 1)
|
||||
||
|
||||
(localResearch[key].infinite === 1 && localResearch[key].level < remoteResearch[key].level)
|
||||
) {
|
||||
if (!isNaN(remoteResearch[key].researched) && !isNaN(remoteResearch[key].level) && !isNaN(remoteResearch[key].infinite)) {
|
||||
diff[key] = {researched: remoteResearch[key].researched, level: remoteResearch[key].level, infinite: remoteResearch[key].infinite};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -105,23 +136,27 @@ class ResearchSync {
|
||||
|
||||
loadFunctions() {
|
||||
return {
|
||||
dumpResearch: this.loadFunc("dumpResearch.lua"),
|
||||
enableResearch: this.loadFunc("enableResearch.lua"),
|
||||
dumpResearch : this.loadFunc("dumpResearch.lua"),
|
||||
enableResearch: this.loadFunc("enableResearch.lua"),
|
||||
};
|
||||
}
|
||||
|
||||
loadFunc(path) {
|
||||
return fs.readFileSync("sharedPlugins/researchSync/" + path,'utf-8').replace(/\r?\n|\r/g,' ');
|
||||
return fs.readFileSync("sharedPlugins/researchSync/" + path, 'utf-8').replace(/\r?\n|\r/g, ' ');
|
||||
}
|
||||
scriptOutput(data){
|
||||
let kv = data.split(":");
|
||||
let name = kv[0];
|
||||
let researched = ('true' !== kv[1]
|
||||
|
||||
scriptOutput(data) {
|
||||
let kv = data.split(":");
|
||||
let name = kv[0];
|
||||
let researched = ('true' !== kv[1]
|
||||
? 0
|
||||
: 1);
|
||||
let level = parseInt(kv[2]);
|
||||
let infinite = ('true' !== kv[3]
|
||||
? 0
|
||||
: 1);
|
||||
let level = parseInt(kv[2]);
|
||||
if (!isNaN(level) && !isNaN(researched)) {
|
||||
this.research[name] = {researched: researched, level: level};
|
||||
this.research[name] = {researched: researched, level: level, infinite: infinite};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user