Skip to content

Commit

Permalink
Fix saving region block exceptions. Clear rebuild queue after region …
Browse files Browse the repository at this point in the history
…is deleted.
  • Loading branch information
Aquerr committed Nov 13, 2022
1 parent 0d2f2dc commit 66220fb
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 13 deletions.
2 changes: 2 additions & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx4G
3 changes: 1 addition & 2 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
rootProject.name = "WorldRebuilder"

rootProject.name = "WorldRebuilder"
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ public void onPluginLoad(final LoadedGameEvent event)
{
this.worldRebuilderScheduler = new WorldRebuilderScheduler(Sponge.server().scheduler());
registerListeners();
this.regionManager.reloadRegions();
}

@Listener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import io.github.aquerr.worldrebuilder.scheduling.WorldRebuilderTask;
import io.github.aquerr.worldrebuilder.storage.StorageManager;

import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Singleton
Expand All @@ -28,7 +30,7 @@ public Collection<Region> getRegions()
return this.regions.values();
}

public void loadRegions()
public void reloadRegions()
{
final List<Region> regions = this.storageManager.getRegions();
for(final Region region : regions)
Expand All @@ -39,19 +41,20 @@ public void loadRegions()

public void addRegion(final Region region)
{
CompletableFuture.runAsync(() -> this.storageManager.addRegion(region));
WorldRebuilderScheduler.getInstance().queueStorageTask(() -> this.storageManager.addRegion(region));
this.regions.put(region.getName(), region);
}

public void updateRegion(final Region region)
{
CompletableFuture.runAsync(() -> this.storageManager.updateRegion(region));
WorldRebuilderScheduler.getInstance().queueStorageTask(() -> this.storageManager.updateRegion(region));
this.regions.put(region.getName(), region);
}

public void deleteRegion(final String name)
{
CompletableFuture.runAsync(() -> this.storageManager.deleteRegion(name));
WorldRebuilderScheduler.getInstance().queueStorageTask(() -> this.storageManager.deleteRegion(name));
WorldRebuilderScheduler.getInstance().removeTasksForRegion(name);
this.regions.remove(name);
}

Expand All @@ -73,6 +76,5 @@ public void forceRebuildRegion(final Region region)

public void init() {
this.storageManager.init();
loadRegions();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.github.aquerr.worldrebuilder.scheduling;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import io.github.aquerr.worldrebuilder.WorldRebuilder;
import org.spongepowered.api.block.BlockSnapshot;
import org.spongepowered.api.entity.Entity;
Expand All @@ -10,15 +9,19 @@
import org.spongepowered.api.scheduler.Scheduler;
import org.spongepowered.api.scheduler.Task;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class WorldRebuilderScheduler
{
private static final ExecutorService SINGLE_THREADED_EXECUTOR_SERVICE = Executors.newSingleThreadExecutor();
private static WorldRebuilderScheduler INSTANCE;

// RegionName => [ScheduledRebuildTasks]
Expand All @@ -38,6 +41,11 @@ public WorldRebuilderScheduler(final Scheduler scheduler)
INSTANCE = this;
}

public void queueStorageTask(Runnable runnable)
{
SINGLE_THREADED_EXECUTOR_SERVICE.submit(runnable);
}

public void scheduleRebuildBlocksTask(final String regionName, final UUID worldUUID, List<BlockSnapshot> blocks, final int delayInSeconds)
{
RebuildBlocksTask rebuildBlocksTask = new RebuildBlocksTask(regionName, worldUUID, blocks);
Expand Down Expand Up @@ -122,4 +130,15 @@ public void removeTaskForRegion(String regionName, WorldRebuilderTask worldRebui
this.rebuildTasks.remove(regionName);
}
}

public void removeTasksForRegion(String regionName)
{
regionName = regionName.toLowerCase();
List<WorldRebuilderTask> tasks = this.rebuildTasks.getOrDefault(regionName, Collections.emptyList());
for (WorldRebuilderTask task : tasks)
{
task.cancel();
}
this.rebuildTasks.remove(regionName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ public BlockSnapshot deserialize(Type type, ConfigurationNode node) throws Seria
exception.printStackTrace();
}

final String blockTypeId = dataContainer.get(DataQuery.of("BlockType"))
final String blockTypeId = dataContainer.get(DataQuery.of("BlockState").then("BlockState"))
.map(String::valueOf)
.orElse("");

if ("".equals(blockTypeId))
{
throw new SerializationException(format("BlockType id is empty. Data Container: %s", dataContainer));
throw new SerializationException(format("BlockState id is empty. Data Container: %s", dataContainer));
}
// final Optional<BlockType> blockType = Sponge.game().findRegistry(RegistryType.of()).get();
// if (!blockType.isPresent())
Expand Down Expand Up @@ -82,7 +82,7 @@ public void serialize(Type type, @Nullable BlockSnapshot obj, ConfigurationNode
.build()
.load();

node.set(node);
value.set(node);
}
catch (Exception exception)
{
Expand Down

0 comments on commit 66220fb

Please sign in to comment.