Skip to content

Commit

Permalink
Prepare chunks on merge target
Browse files Browse the repository at this point in the history
  • Loading branch information
Danielv123 committed Apr 23, 2024
1 parent 868f3cd commit a443ae5
Show file tree
Hide file tree
Showing 8 changed files with 63 additions and 8 deletions.
6 changes: 6 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,12 @@ module.exports = {
description: "Make this instance act as a lobby server for a gridworld",
initialValue: false,
},
"gridworld.is_grid_square": {
type: "boolean",
title: "Server is a grid square",
description: "Make this instance act as a grid square for a gridworld",
initialValue: false,
},
"gridworld.grid_id": {
type: "number",
title: "Grid ID",
Expand Down
2 changes: 2 additions & 0 deletions module/gridworld.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ local gui_events = require("gui/events")
local set_player_permission_group = require("faction/building_restrictions/set_player_permission_group")
local worldgen = require("worldgen/index")
local load_balancing = require("load_balancing/load_balancing")
local merge_map = require("merge_map/merge_map")

gridworld.events = {}
gridworld.events[clusterio_api.events.on_server_startup] = function()
Expand Down Expand Up @@ -331,5 +332,6 @@ gridworld.map = {
dump_entities = map.dump_entities,
dump_mapview = map.dump_mapview,
}
gridworld.merge_map = merge_map

return gridworld
5 changes: 5 additions & 0 deletions module/merge_map/merge_map.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
local prepare_chunks = require("modules/gridworld/merge_map/prepare_chunks")

return {
prepare_chunks = prepare_chunks,
}
20 changes: 20 additions & 0 deletions module/merge_map/prepare_chunks.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
local function prepare_chunks(left_top, right_bottom)
local chunk_position_left_top = {math.floor(left_top[1] / 32), math.floor(left_top[2] / 32)}
local chunk_position_right_bottom = {math.floor(right_bottom[1] / 32), math.floor(right_bottom[2] / 32)}

for x = chunk_position_left_top[1], chunk_position_right_bottom[1] do
for y = chunk_position_left_top[2], chunk_position_right_bottom[2] do
-- Mark generation as complete
game.surfaces[1].set_chunk_generated_status({x, y}, defines.chunk_generated_status.entities)
end
end

-- Delete all entities in area in case anything was generated
local entities = game.surfaces[1].find_entities({left_top, right_bottom})
for _, entity in pairs(entities) do
entity.destroy()
end

rcon.print("Area prepared")
end
return prepare_chunks
14 changes: 10 additions & 4 deletions src/request_handlers/startMapMergeRequestHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const lib = require("@clusterio/lib");
const assignInstance = require("../worldgen/assignInstance");
const createSave = require("../worldgen/createSave");
const { InstanceInfo } = require("@clusterio/controller");
const mapFilter = require("../util/mapFilter");

module.exports = async function startMapMergeRequestHandler(message) {
// message === {
Expand Down Expand Up @@ -55,18 +56,23 @@ module.exports = async function startMapMergeRequestHandler(message) {
await this.controller.sendTo({ instanceId }, new lib.InstanceStartRequest());

// Get instances with the same grid_id
const instances = this.controller.instances.filter(instance => instance.config.get("gridworld.grid_id") === message.grid_id);
for (let instance of instances) {
const instances = mapFilter(this.controller.instances,
instance => instance.config.get("gridworld.grid_id") === message.grid_id
&& instance.config.get("gridworld.is_grid_square") === true
);
for (let [_, instance] of instances) {
// Generate chunks in target area on merge target
const grid_x_size = instance.config.get("gridworld.grid_x_size");
const grid_y_size = instance.config.get("gridworld.grid_y_size");
const grid_x_position = instance.config.get("gridworld.grid_x_position");
const grid_y_position = instance.config.get("gridworld.grid_y_position");
const leftTop = [grid_x_position * grid_x_size, grid_y_position * grid_y_size];
const rightBottom = [(grid_x_position + 1) * grid_x_size, (grid_y_position + 1) * grid_y_size];
const command = `/c gridworld.merge_map.prepare_chunks({${leftTop[0]}, ${leftTop[1]}}, {${rightBottom[0]}, ${rightBottom[1]})`;

// Send command to the merge target
const command = `/c gridworld.merge_map.prepare_chunks({${leftTop[0]}, ${leftTop[1]}}, {${rightBottom[0]}, ${rightBottom[1]}})`;
const status = await this.controller.sendTo({ instanceId }, new lib.InstanceSendRconRequest(command));
this.logger.info(`Prepare chunks status for ${instance.name}: ${status}`);
this.logger.info(`Prepare chunks status for ${instance.config.get("instance.name")}: ${status}`);
}

for (let instance of instances) {
Expand Down
19 changes: 15 additions & 4 deletions src/request_handlers/updateEdgeTransportEdgesRequestHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,23 @@ const mapFind = require("../util/mapFind");
const getEdges = require("../worldgen/getEdges");
const { edge_target_position_offsets } = require("../worldgen/factionGrid/edge_target_position_offsets");

/**
* Update edge transports edges for a grid square instance
* @param {object} message Message as defined by UpdateEdgeTransportEdges
* @param {object} message.data - The message data
* @param {number} message.data.instance_id - The instance ID of the instance to update edge transports for
*/
module.exports = async function updateEdgeTransportsEdges(message) {
// message.data === {
// instance_id: instance_id,
// }

const instance = this.controller.instances.get(message.data.instance_id);

if (!instance) {
this.logger.error(`Instance ${message.data.instance_id} not found`);
return;
}
if (!instance.config.get("gridworld.is_grid_square")) {
return;
}

const x = instance.config.get("gridworld.grid_x_position");
const y = instance.config.get("gridworld.grid_y_position");
const grid_id = instance.config.get("gridworld.grid_id");
Expand Down
1 change: 1 addition & 0 deletions src/worldgen/createInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module.exports = async function createInstance(plugin, name, x, y, x_size, y_siz
plugin.logger.info("Creating instance", name);
let instanceConfig = new lib.InstanceConfig("controller");
instanceConfig.set("instance.name", name);
instanceConfig.set("gridworld.is_grid_square", true);
instanceConfig.set("gridworld.grid_id", grid_id);
instanceConfig.set("gridworld.grid_x_position", x);
instanceConfig.set("gridworld.grid_y_position", y);
Expand Down
4 changes: 4 additions & 0 deletions src/worldgen/util/worldPositionToInstance.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ function worldPositionToInstance(x, y, grid_id, instances) {
const grid_instances = mapFilter(instances, instance => instance.config.get("gridworld.grid_id") === grid_id);
const lobby_server = mapFind(grid_instances, instance => instance.config.get("gridworld.is_lobby_server"));

if (!lobby_server) {
throw new Error(`No lobby server found for grid_id ${grid_id}`);
}

const grid_x_size = lobby_server.config.get("gridworld.grid_x_size");
const grid_y_size = lobby_server.config.get("gridworld.grid_y_size");

Expand Down

0 comments on commit a443ae5

Please sign in to comment.