Updated research sync to handle infinite science and hopefully stop it from apply same research in a loop annoying everyone

This commit is contained in:
psihius committed 2019-07-14 01:25:48 +02:00
1 parent 1f8ac50950
commit 0afe35b67c
3 files changed
+40 -21

No files matched your search

+5 -1
View File
@@ -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.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,14 +1,13 @@
/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
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
if 1 == {tech_infinite} then
game.print("Technology {tech_name} synced at level {tech_level}")
else
game.print("Technology {tech_name} synced")
+31 -15
View File
@@ -11,9 +11,11 @@ class ResearchSync {
this.research = {};
setInterval(() => {
this.pollResearch();
setTimeout(this.doSync.bind(this), 2000);
}, extras.researchSyncPollInterval || 5000);
this.pollResearch();
setTimeout(this.doSync.bind(this), 5000);
},
extras.researchSyncPollInterval || 30000
);
}
pollResearch() {
@@ -44,19 +46,25 @@ class ResearchSync {
let researchList = slaveData[instanceKey].meta.research;
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)
};
}
});
}
@@ -71,6 +79,7 @@ class ResearchSync {
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);
}
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);
@@ -93,9 +102,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};
}
}
}
@@ -120,8 +133,11 @@ class ResearchSync {
? 0
: 1);
let level = parseInt(kv[2]);
let infinite = ('true' !== kv[3]
? 0
: 1);
if (!isNaN(level) && !isNaN(researched)) {
this.research[name] = {researched: researched, level: level};
this.research[name] = {researched: researched, level: level, infinite: infinite};
}
}
}