Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,5 @@ public Configuration() {
.put(Color.OFF, true)
.build();

public boolean tpBypassersWithRegen = true;
}
142 changes: 95 additions & 47 deletions src/main/java/com/iridium/iridiumskyblock/managers/IslandManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,26 @@
import com.iridium.iridiumteams.missions.Mission;
import com.iridium.iridiumteams.missions.MissionData;
import com.iridium.iridiumteams.missions.MissionType;
import com.iridium.iridiumteams.support.SpawnSupport;
import com.iridium.iridiumteams.support.StackerSupport;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.sk89q.worldedit.*;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.extent.MaskingExtent;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.world.block.BlockTypes;
import de.tr7zw.changeme.nbtapi.NBT;
import de.tr7zw.changeme.nbtapi.NBTCompound;
import de.tr7zw.changeme.nbtapi.NBTFile;
Expand All @@ -44,6 +61,7 @@
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand Down Expand Up @@ -141,8 +159,8 @@ public void setIslandBiome(@NotNull Island island, @NotNull XBiome biome) {
if (world == null) return;

getIslandChunks(island).thenAccept(chunks -> {
Location pos1 = island.getPosition1(world);
Location pos2 = island.getPosition2(world);
Location pos1 = island.getMaximumPosition1(world);
Location pos2 = island.getMaximumPosition2(world);
biome.setBiome(pos1, pos2).thenRun(() -> {
for (Chunk chunk : chunks) {
chunk.getWorld().refreshChunk(chunk.getX(), chunk.getZ());
Expand Down Expand Up @@ -301,9 +319,11 @@ public CompletableFuture<Void> generateIsland(Island island, Schematics.Schemati
return CompletableFuture.runAsync(() -> {
setHome(island, schematicConfig);
clearEntities(island);
removePlayers(island).join();
deleteIslandBlocks(island).join();
if (IridiumSkyblock.getInstance().getConfiguration().generatorType.isTerrainGenerator())
if (IridiumSkyblock.getInstance().getConfiguration().generatorType.isTerrainGenerator()) {
regenerateTerrain(island).join();
}
IridiumSkyblock.getInstance().getSchematicManager().pasteSchematic(island, schematicConfig).join();
setIslandBiome(island, schematicConfig);
});
Expand Down Expand Up @@ -353,6 +373,55 @@ private void clearEntities(Island island, World world, CompletableFuture<Void> c
completableFuture.complete(null);
}

public CompletableFuture<Void> removePlayers(Island island) {

return CompletableFuture.runAsync(() -> {
List<CompletableFuture<Void>> completableFutures = Arrays.asList(
removePlayers(island, getWorld(World.Environment.NORMAL)),
removePlayers(island, getWorld(World.Environment.NETHER)),
removePlayers(island, getWorld(World.Environment.THE_END))
);
completableFutures.forEach(CompletableFuture::join);
});
}

private CompletableFuture<Void> removePlayers(Island island, World world) {
CompletableFuture<Void> completableFuture = new CompletableFuture<>();
if (world == null) {
completableFuture.complete(null);
} else {
Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> removePlayers(island, world, completableFuture));
}
return completableFuture;
}

private void removePlayers(Island island, World world, CompletableFuture<Void> completableFuture) {

if (world == null) return;

Optional<SpawnSupport<Island>> spawnSupport = IridiumSkyblock.getInstance().getSupportManager().getSpawnSupport().stream().findFirst();

world.getPlayers().forEach(player -> {

if (island.isInIsland(player.getLocation())) {

boolean bypasser = IridiumSkyblock.getInstance().getUserManager().getUser(player).isBypassing();

// If a player is bypassing island restrictions, they're likely an admin.
// We don't want to kick admins from an island if they're watching it.
if (!bypasser || (bypasser && IridiumSkyblock.getInstance().getConfiguration().tpBypassersWithRegen)) { // if not bypassing OR bypassing and should be teleported
if (spawnSupport.isPresent()) {
player.teleport(spawnSupport.get().getSpawn(player));
} else {
player.teleport(Bukkit.getServer().getWorlds().get(0).getSpawnLocation());
}
}
}
});

completableFuture.complete(null);
}

public CompletableFuture<Void> deleteIslandBlocks(Island island) {
return CompletableFuture.runAsync(() -> {
List<CompletableFuture<Void>> completableFutures = Arrays.asList(
Expand All @@ -369,37 +438,25 @@ private CompletableFuture<Void> deleteIslandBlocks(Island island, World world) {
if (world == null) {
completableFuture.complete(null);
} else {
Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> deleteIslandBlocks(island, world, world.getMaxHeight(), completableFuture, 0));
Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () ->
deleteIslandBlocks(island, world, completableFuture, IridiumSkyblock.getInstance().getConfiguration().pasterDelayInTick));
}
return completableFuture;
}

private void deleteIslandBlocks(Island island, World world, int y, CompletableFuture<Void> completableFuture, int delay) {
private void deleteIslandBlocks(Island island, World world, CompletableFuture<Void> completableFuture, int delay) {

if (world == null) return;

Location pos1 = island.getMaximumPosition1(world);
Location pos2 = island.getMaximumPosition2(world);

for (int x = pos1.getBlockX(); x <= pos2.getBlockX(); x++) {
for (int z = pos1.getBlockZ(); z <= pos2.getBlockZ(); z++) {
Block block = world.getBlockAt(x, y, z);
if (block.getType() != Material.AIR) {
if (block.getState() instanceof InventoryHolder) {
((InventoryHolder) block.getState()).getInventory().clear();
}
block.setType(Material.AIR, false);
}
}
}
int minHeight = 0;
if (XReflection.supports(18)) minHeight = world.getMinHeight();
final int finalMinHeight = minHeight;
int maxHeight = world.getMaxHeight();

if (y <= LocationUtils.getMinHeight(world)) {
completableFuture.complete(null);
} else {
if (delay < 1) {
deleteIslandBlocks(island, world, y - 1, completableFuture, delay);
} else {
Bukkit.getScheduler().runTaskLater(IridiumSkyblock.getInstance(), () -> deleteIslandBlocks(island, world, y - 1, completableFuture, delay), delay);
}
}
IridiumSkyblock.getInstance().getSchematicManager().deleteIsland(world, pos1, pos2, finalMinHeight, maxHeight, completableFuture, delay);
}

public CompletableFuture<Void> regenerateTerrain(Island island) {
Expand All @@ -418,37 +475,29 @@ private CompletableFuture<Void> regenerateTerrain(Island island, World world) {
if (world == null) {
completableFuture.complete(null);
} else {
Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> regenerateTerrain(island, world, world.getMaxHeight(), completableFuture, 0));
Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () ->
regenerateTerrain(island, world, completableFuture, IridiumSkyblock.getInstance().getConfiguration().pasterDelayInTick));
}
return completableFuture;
}

public void regenerateTerrain(Island island, World world, int y, CompletableFuture<Void> completableFuture, int delay) {
public void regenerateTerrain(Island island, World world, CompletableFuture<Void> completableFuture, int delay) {

if (world == null) return;

Location pos1 = island.getMaximumPosition1(world);
Location pos2 = island.getMaximumPosition2(world);

World regenWorld = Bukkit.getWorld(getCacheWorldName(world));

for (int x = pos1.getBlockX(); x <= pos2.getBlockX(); x++) {
for (int z = pos1.getBlockZ(); z <= pos2.getBlockZ(); z++) {
Block blockA = regenWorld.getBlockAt(x, y, z);
Block blockB = world.getBlockAt(x, y, z);
blockB.setBlockData(blockA.getBlockData(), false);
}
}
Location pos1 = island.getMaximumPosition1(regenWorld);
Location pos2 = island.getMaximumPosition2(regenWorld);
Location pos3 = island.getMaximumPosition1(world);
Location pos4 = island.getMaximumPosition2(world);

if (y <= LocationUtils.getMinHeight(world)) {
completableFuture.complete(null);
} else {
if (delay < 1) {
regenerateTerrain(island, world, y - 1, completableFuture, delay);
} else {
Bukkit.getScheduler().runTaskLater(IridiumSkyblock.getInstance(), () -> regenerateTerrain(island, world, y - 1, completableFuture, delay), delay);
}
}
int minHeight = 0;
if (XReflection.supports(18)) minHeight = world.getMinHeight();
final int finalMinHeight = minHeight;
int maxHeight = world.getMaxHeight();

IridiumSkyblock.getInstance().getSchematicManager().regenIsland(world, regenWorld, pos1, pos2, pos3, pos4, finalMinHeight, maxHeight, completableFuture, delay);
}

@Override
Expand Down Expand Up @@ -1065,5 +1114,4 @@ public void clearTeamInventory(Island island) {
}
}
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.iridium.iridiumskyblock.managers;

import com.iridium.iridiumcore.multiversion.IridiumInventory;
import com.iridium.iridiumcore.utils.StringUtils;
import com.iridium.iridiumskyblock.IridiumSkyblock;
import com.iridium.iridiumskyblock.configs.Schematics;
Expand All @@ -10,12 +11,33 @@
import com.iridium.iridiumskyblock.schematics.SchematicPaster;
import com.iridium.iridiumskyblock.schematics.WorldEdit;
import com.iridium.iridiumteams.database.TeamBank;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.extent.MaskingExtent;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.function.mask.ExistingBlockMask;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.util.SideEffectSet;
import com.sk89q.worldedit.world.block.BlockTypes;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.scheduler.BukkitRunnable;

import java.io.File;
import java.util.*;
Expand Down Expand Up @@ -175,4 +197,22 @@ public String formatPrice(double value) {
return String.valueOf(value);
}

// IslandManager calls deleteIsland() and regenIsland() for each world.
// This is intentional, as we'll be reworking the regen command to only regenerate a specific dimension.

public CompletableFuture<Void> deleteIsland(World world, Location pos1, Location pos2, int minHeight, int maxHeight, CompletableFuture<Void> completableFuture, int delay) {

Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> {
schematicPaster.deleteIsland(world, pos1, pos2, minHeight, maxHeight, completableFuture, delay);
});
return completableFuture;
}

public CompletableFuture<Void> regenIsland(World world, World regenWorld, Location pos1, Location pos2, Location pos3, Location pos4, int minHeight, int maxHeight, CompletableFuture<Void> completableFuture, int delay) {

Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> {
schematicPaster.regenIsland(world, regenWorld, pos1, pos2, pos3, pos4, minHeight, maxHeight, completableFuture, delay);
});
return completableFuture;
}
}
Loading