Skip to content

Commit

Permalink
Fixed issues with tracking of dirty chunks after transferring leaders…
Browse files Browse the repository at this point in the history
…hip of islands (#1369)
  • Loading branch information
OmerBenGera committed Sep 23, 2022
1 parent 42161a6 commit c305316
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 18 deletions.
Expand Up @@ -66,7 +66,6 @@
import com.bgsoftware.superiorskyblock.mission.MissionData;
import com.bgsoftware.superiorskyblock.module.BuiltinModules;
import com.bgsoftware.superiorskyblock.module.upgrades.type.UpgradeTypeCropGrowth;
import com.bgsoftware.superiorskyblock.module.upgrades.type.UpgradeTypeEntityLimits;
import com.bgsoftware.superiorskyblock.module.upgrades.type.UpgradeTypeIslandEffects;
import com.bgsoftware.superiorskyblock.world.WorldBlocks;
import com.bgsoftware.superiorskyblock.world.chunk.ChunkLoadReason;
Expand Down Expand Up @@ -3506,12 +3505,12 @@ public Map<Mission<?>, Integer> getCompletedMissionsWithAmounts() {

@Override
public int hashCode() {
return owner.hashCode();
return this.uuid.hashCode();
}

@Override
public boolean equals(Object obj) {
return obj instanceof Island && owner.equals(((Island) obj).getOwner());
return obj instanceof Island && this.uuid.equals(((Island) obj).getUniqueId());
}

@Override
Expand Down
Expand Up @@ -3,9 +3,9 @@
import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin;
import com.bgsoftware.superiorskyblock.api.island.Island;
import com.bgsoftware.superiorskyblock.core.ChunkPosition;
import com.bgsoftware.superiorskyblock.core.Text;
import com.bgsoftware.superiorskyblock.core.database.bridge.IslandsDatabaseBridge;
import com.bgsoftware.superiorskyblock.core.database.serialization.IslandsSerializer;
import com.bgsoftware.superiorskyblock.core.Text;
import com.bgsoftware.superiorskyblock.core.debug.PluginDebugger;
import com.bgsoftware.superiorskyblock.island.GridManagerImpl;
import com.google.gson.Gson;
Expand All @@ -21,14 +21,16 @@
import org.bukkit.block.Block;

import javax.annotation.Nullable;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

public class ChunksTracker {

private static final Map<Island, Set<ChunkPosition>> dirtyChunks = new ConcurrentHashMap<>();
private static final Map<UUID, Set<ChunkPosition>> dirtyChunks = new ConcurrentHashMap<>();
private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();
private static final Gson gson = new GsonBuilder().create();

Expand Down Expand Up @@ -65,19 +67,17 @@ public static void markDirty(Island island, Chunk chunk, boolean save) {
}

public static boolean isMarkedDirty(Island island, World world, int x, int z) {
return dirtyChunks.containsKey(island) && dirtyChunks.get(island).contains(ChunkPosition.of(world, x, z));
Set<ChunkPosition> islandDirtyChunks = dirtyChunks.get(island.getUniqueId());
return islandDirtyChunks != null && islandDirtyChunks.contains(ChunkPosition.of(world, x, z));
}

public static void removeIsland(Island island) {
if (dirtyChunks.containsKey(island)) {
dirtyChunks.get(island).clear();
dirtyChunks.remove(island);
}
dirtyChunks.remove(island.getUniqueId());
}

public static String serialize(Island island) {
Set<ChunkPosition> dirtyChunks = ChunksTracker.dirtyChunks.getOrDefault(island, new HashSet<>());
return IslandsSerializer.serializeDirtyChunks(dirtyChunks);
Set<ChunkPosition> islandDirtyChunks = dirtyChunks.getOrDefault(island.getUniqueId(), Collections.emptySet());
return IslandsSerializer.serializeDirtyChunks(islandDirtyChunks);
}

public static void deserialize(GridManagerImpl grid, Island island, @Nullable String serialized) {
Expand Down Expand Up @@ -157,20 +157,20 @@ public static void markEmpty(Island island, ChunkPosition chunkPosition, boolean
if (island == null)
island = getIsland(plugin.getGrid(), chunkPosition);

Set<ChunkPosition> dirtyChunks = ChunksTracker.dirtyChunks.get(island);
Set<ChunkPosition> islandDirtyChunks = dirtyChunks.get(island.getUniqueId());

if (dirtyChunks != null && dirtyChunks.remove(chunkPosition) && save)
IslandsDatabaseBridge.saveDirtyChunks(island, dirtyChunks);
if (islandDirtyChunks != null && islandDirtyChunks.remove(chunkPosition) && save)
IslandsDatabaseBridge.saveDirtyChunks(island, islandDirtyChunks);
}

public static void markDirty(Island island, ChunkPosition chunkPosition, boolean save) {
if (island == null)
island = getIsland(plugin.getGrid(), chunkPosition);

Set<ChunkPosition> dirtyChunks = ChunksTracker.dirtyChunks.computeIfAbsent(island, s -> new HashSet<>());
Set<ChunkPosition> islandDirtyChunks = dirtyChunks.computeIfAbsent(island.getUniqueId(), s -> new HashSet<>());

if (dirtyChunks.add(chunkPosition) && save && !island.isSpawn())
IslandsDatabaseBridge.saveDirtyChunks(island, dirtyChunks);
if (islandDirtyChunks.add(chunkPosition) && save && !island.isSpawn())
IslandsDatabaseBridge.saveDirtyChunks(island, islandDirtyChunks);
}

}

0 comments on commit c305316

Please sign in to comment.