9
0
mirror of https://gitlab.com/SamB440/rpgregions-2.git synced 2025-12-27 10:49:08 +00:00

Add schematic support for region regeneration

This commit is contained in:
SamB440
2020-09-26 18:22:19 +01:00
parent 15a0a48c09
commit edf35ae742
5 changed files with 120 additions and 10 deletions

View File

@@ -1,11 +1,14 @@
package net.islandearth.rpgregions.regenerate;
import net.islandearth.rpgregions.regenerate.entity.RegeneratingEntity;
import org.bukkit.Location;
import java.util.List;
public class Regenerate {
private String schematicName;
private Location origin;
private final int regenerateInterval;
private final boolean loadChunks;
private final List<RegeneratingEntity> regeneratingEntities;
@@ -27,4 +30,20 @@ public class Regenerate {
public List<RegeneratingEntity> getRegeneratingEntities() {
return regeneratingEntities;
}
public String getSchematicName() {
return schematicName;
}
public void setSchematicName(String schematicName) {
this.schematicName = schematicName;
}
public Location getOrigin() {
return origin;
}
public void setOrigin(Location origin) {
this.origin = origin;
}
}

View File

@@ -39,8 +39,11 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, LanguagyPluginHook {
@@ -189,6 +192,14 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu
private void registerCommands() {
PaperCommandManager manager = new PaperCommandManager(this);
manager.getCommandCompletions().registerAsyncCompletion("regions", context -> ImmutableList.copyOf(getManagers().getRegionsCache().getConfiguredRegions().keySet()));
manager.getCommandCompletions().registerAsyncCompletion("schematics", context -> {
File schematicFolder = new File("plugins/WorldEdit/schematics/");
List<String> files = new ArrayList<>();
for (File file : schematicFolder.listFiles()) {
files.add(file.getName());
}
return files;
});
manager.getCommandContexts().registerContext(ConfiguredRegion.class, context -> {
String id = context.popFirstArg();
for (ConfiguredRegion region : plugin.getManagers().getRegionsCache().getConfiguredRegions().values()) {

View File

@@ -7,9 +7,11 @@ import co.aikar.commands.annotation.CommandPermission;
import co.aikar.commands.annotation.Default;
import co.aikar.commands.annotation.Subcommand;
import net.islandearth.rpgregions.RPGRegions;
import net.islandearth.rpgregions.api.integrations.IntegrationType;
import net.islandearth.rpgregions.gui.DiscoveryGUI;
import net.islandearth.rpgregions.gui.EditorGUI;
import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion;
import net.islandearth.rpgregions.regenerate.Regenerate;
import net.islandearth.rpgregions.rewards.ItemReward;
import net.islandearth.rpgregions.utils.RegenUtils;
import net.islandearth.rpgregions.utils.StringUtils;
@@ -25,11 +27,14 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@CommandAlias("rpgregions")
public class RPGRegionsCommand extends BaseCommand {
private final RPGRegions plugin;
private List<UUID> regenerateConfirm = new ArrayList<>();
public RPGRegionsCommand(RPGRegions plugin) {
this.plugin = plugin;
@@ -244,15 +249,58 @@ public class RPGRegionsCommand extends BaseCommand {
@Subcommand("regenerate|regen")
@CommandPermission("rpgregions.regenerate")
@CommandCompletion("@regions")
public void onRegenerate(CommandSender sender, ConfiguredRegion configuredRegion) {
sender.sendMessage(ChatColor.GREEN + "Regenerating region...");
long startTime = System.currentTimeMillis();
boolean done = RegenUtils.regenerate(configuredRegion);
if (!done) {
sender.sendMessage(ChatColor.RED + "Unable to regenerate region. Check console for details.");
public void onRegenerate(Player player, ConfiguredRegion configuredRegion) {
IntegrationType integrationType = IntegrationType.valueOf(plugin.getConfig().getString("settings.integration.name").toUpperCase());
if (integrationType != IntegrationType.WORLDGUARD) {
player.sendMessage(ChatColor.RED + "Regeneration only supports WorldGuard integrations.");
return;
}
if (!regenerateConfirm.contains(player.getUniqueId())) {
regenerateConfirm.add(player.getUniqueId());
player.sendMessage(ChatColor.YELLOW + "Run /rpgregions regenerate " + configuredRegion.getId() + " again to confirm. Only use if you know what you are doing!");
player.sendMessage(ChatColor.RED + "" + ChatColor.ITALIC + "" + ChatColor.BOLD + "The regenerate configuration is very dangerous and can delete world sections if used wrongly.");
} else {
regenerateConfirm.remove(player.getUniqueId());
player.sendMessage(ChatColor.GREEN + "Regenerating region...");
long startTime = System.currentTimeMillis();
boolean done = RegenUtils.regenerate(configuredRegion);
if (!done) {
player.sendMessage(ChatColor.RED + "Unable to regenerate region. Check console for details.");
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
player.sendMessage(ChatColor.GREEN + "Done! (" + totalTime + "ms)");
}
}
@Subcommand("setschematic")
@CommandPermission("rpgregions.setschematic")
@CommandCompletion("@regions @schematics @nothing")
public void onAddSchematic(Player player, ConfiguredRegion configuredRegion, String schematicName) {
IntegrationType integrationType = IntegrationType.valueOf(plugin.getConfig().getString("settings.integration.name").toUpperCase());
if (integrationType != IntegrationType.WORLDGUARD) {
player.sendMessage(ChatColor.RED + "Regeneration only supports WorldGuard integrations.");
return;
}
if (configuredRegion != null) {
if (!regenerateConfirm.contains(player.getUniqueId())) {
regenerateConfirm.add(player.getUniqueId());
player.sendMessage(ChatColor.YELLOW + "Run /rpgregions addschematic " + schematicName + " again to confirm. Only use if you know what you are doing!");
player.sendMessage(ChatColor.RED + "MAKE SURE YOU ARE STANDING WHERE YOU CREATED THE SCHEMATIC ORIGINALLY (//copy, //schematic save), OTHERWISE IT WILL NOT PASTE CORRECTLY.");
player.sendMessage(ChatColor.RED + "" + ChatColor.ITALIC + "" + ChatColor.BOLD + "The regenerate configuration is very dangerous and can delete world sections if used wrongly.");
} else {
regenerateConfirm.remove(player.getUniqueId());
Regenerate regenerate = configuredRegion.getRegenerate();
if (regenerate == null) regenerate = new Regenerate(Integer.MAX_VALUE, false, new ArrayList<>());
regenerate.setSchematicName(schematicName);
regenerate.setOrigin(player.getLocation());
configuredRegion.setRegenerate(regenerate);
player.sendMessage(ChatColor.GREEN + "This region has had a regenerate section added, and schematicName set to " + schematicName + " and origin set to " + player.getLocation().toString() + ".");
player.sendMessage(ChatColor.YELLOW + "Run /rpgregions save and " + ChatColor.BOLD + "CONFIGURE BEFORE RELOADING OR RESTARTING THE SERVER.");
player.sendMessage(ChatColor.RED + "" + ChatColor.ITALIC + "" + ChatColor.BOLD + "The regenerate configuration is very dangerous and can delete world sections if used wrongly.");
}
}
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
sender.sendMessage(ChatColor.GREEN + "Done! (" + totalTime + "ms)");
}
}

View File

@@ -90,7 +90,7 @@ public class RPGRegionsManagers {
ConfiguredRegion configuredRegion = new ConfiguredRegion(null, "exampleconfig", "ExampleConfig", rewards, effects,
XSound.AMBIENT_UNDERWATER_EXIT.parseSound(),
XMaterial.WOODEN_AXE);
configuredRegion.setRegenerate(new Regenerate(5000,
configuredRegion.setRegenerate(new Regenerate(50000,
false,
Collections.singletonList(
new RegeneratingEntity(EntityType.SHULKER, Arrays.asList(

View File

@@ -2,8 +2,16 @@ package net.islandearth.rpgregions.utils;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.function.operation.Operation;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
@@ -17,6 +25,9 @@ import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
@@ -39,6 +50,27 @@ public class RegenUtils {
World world = BukkitAdapter.adapt(region.getWorld());
EditSession session = WorldEdit.getInstance().getEditSessionFactory().getEditSession(world, Integer.MAX_VALUE);
try {
if (regenerate.getSchematicName() != null && regenerate.getOrigin() != null) {
BlockVector3 position = BlockVector3.at(regenerate.getOrigin().getX(), regenerate.getOrigin().getY(), regenerate.getOrigin().getZ());
File schematic = new File("plugins/WorldEdit/schematics/" + regenerate.getSchematicName());
ClipboardFormat format = ClipboardFormats.findByFile(schematic);
EditSession editSession = WorldEdit.getInstance().getEditSessionFactory().getEditSession(world, -1);
Clipboard clipboard = format.getReader(new FileInputStream(schematic)).read();
ClipboardHolder clipboardHolder = new ClipboardHolder(clipboard);
Operation operation = clipboardHolder.createPaste(editSession)
.to(position)
.ignoreAirBlocks(false)
.build();
Operations.complete(operation);
editSession.flushSession();
return true;
}
} catch (IOException | WorldEditException e) {
e.printStackTrace();
return false;
}
boolean result = world.regenerate(new CuboidRegion(world, protectedRegion.getMinimumPoint(), protectedRegion.getMaximumPoint()), session);
if (!result) {
plugin.getLogger().severe("Could not regenerate region " + region.getId() + "!");