Past structures when new area is made

WIP - needs to address Jigsaw blocks that are also pasted.
This commit is contained in:
tastybento 2023-03-04 09:53:16 -08:00
parent 77f182355e
commit c3e5d09283
3 changed files with 28 additions and 45 deletions

View File

@ -31,6 +31,7 @@ import world.bentobox.boxed.generators.chunks.BoxedChunkGenerator;
import world.bentobox.boxed.generators.chunks.BoxedSeedChunkGenerator; import world.bentobox.boxed.generators.chunks.BoxedSeedChunkGenerator;
import world.bentobox.boxed.listeners.AdvancementListener; import world.bentobox.boxed.listeners.AdvancementListener;
import world.bentobox.boxed.listeners.EnderPearlListener; import world.bentobox.boxed.listeners.EnderPearlListener;
import world.bentobox.boxed.listeners.NewAreaListener;
/** /**
* Main Boxed class - provides a survival game inside a box * Main Boxed class - provides a survival game inside a box
@ -121,7 +122,7 @@ public class Boxed extends GameModeAddon {
// Register listeners // Register listeners
this.registerListener(new AdvancementListener(this)); this.registerListener(new AdvancementListener(this));
this.registerListener(new EnderPearlListener(this)); this.registerListener(new EnderPearlListener(this));
//this.registerListener(new NewAreaListener(this)); this.registerListener(new NewAreaListener(this));
// Register placeholders // Register placeholders
PlaceholdersManager phManager = new PlaceholdersManager(this); PlaceholdersManager phManager = new PlaceholdersManager(this);

View File

@ -6,21 +6,26 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Queue; import java.util.Queue;
import java.util.Random;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.NamespacedKey;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.World.Environment; import org.bukkit.World.Environment;
import org.bukkit.block.structure.Mirror;
import org.bukkit.block.structure.StructureRotation;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.structure.Structure;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.events.island.IslandCreatedEvent; import world.bentobox.bentobox.api.events.island.IslandCreatedEvent;
import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.util.Pair; import world.bentobox.bentobox.util.Pair;
import world.bentobox.bentobox.util.Util;
import world.bentobox.boxed.Boxed; import world.bentobox.boxed.Boxed;
/** /**
@ -33,7 +38,7 @@ public class NewAreaListener implements Listener {
private File structureFile; private File structureFile;
private Queue<Item> itemsToBuild = new LinkedList<>(); private Queue<Item> itemsToBuild = new LinkedList<>();
private boolean pasting; private boolean pasting;
private record Item(World w, List<Pair<Integer, Integer>> cs, String cmd) {}; private record Item(World w, List<Pair<Integer, Integer>> cs, Structure structure, Location location) {};
Pair<Integer, Integer> min = new Pair<Integer, Integer>(0,0); Pair<Integer, Integer> min = new Pair<Integer, Integer>(0,0);
Pair<Integer, Integer> max = new Pair<Integer, Integer>(0,0); Pair<Integer, Integer> max = new Pair<Integer, Integer>(0,0);
@ -49,8 +54,8 @@ public class NewAreaListener implements Listener {
if (!structureFile.exists()) { if (!structureFile.exists()) {
addon.saveResource("structures.yml", true); addon.saveResource("structures.yml", true);
} }
// Try to build something every 10 seconds // Try to build something every 5 seconds
Bukkit.getScheduler().runTaskTimer(addon.getPlugin(), () -> BuildItem(), 20, 200); Bukkit.getScheduler().runTaskTimer(addon.getPlugin(), () -> BuildItem(), 20, 100);
} }
private void BuildItem() { private void BuildItem() {
@ -58,7 +63,7 @@ public class NewAreaListener implements Listener {
if (!pasting && !itemsToBuild.isEmpty()) { if (!pasting && !itemsToBuild.isEmpty()) {
// Build item // Build item
Item item = itemsToBuild.poll(); Item item = itemsToBuild.poll();
LoadChunksAsync(item.w, item.cs, 0, item.cmd); LoadChunksAsync(item);
} }
} }
@ -104,12 +109,14 @@ public class NewAreaListener implements Listener {
cs.add(new Pair<>(cx, cz)); cs.add(new Pair<>(cx, cz));
} }
} }
// Make command // Load Structure
String cmd = "execute in " + world.getName() + " run place "+ string + " minecraft:" + structure + " " Structure s = Bukkit.getStructureManager().loadStructure(NamespacedKey.fromString("minecraft:" + structure));
+ x + " " if (s == null) {
+ y + " " BentoBox.getInstance().logError("Could not load " + structure);
+ z + " "; return;
itemsToBuild.add(new Item(world, cs, cmd)); }
Location l = new Location(world, x, y, z);
itemsToBuild.add(new Item(world, cs, s, l));
} else { } else {
addon.logError("Structure file syntax error: " + structure + " " + key); addon.logError("Structure file syntax error: " + structure + " " + key);
} }
@ -117,36 +124,11 @@ public class NewAreaListener implements Listener {
} }
private void LoadChunksAsync(World w, List<Pair<Integer, Integer>> cs, int i, String cmd) { private void LoadChunksAsync(Item item) {
pasting = true; pasting = true;
int total = cs.size(); item.structure().place(item.location(), true, StructureRotation.NONE, Mirror.NONE, -1, 1, new Random());
addon.log("Structure placed at " + item.location);
//addon.log("Loading chunk async " + i);
if (i < total) {
if (i == 0) {
min = new Pair<>(cs.get(0).x, cs.get(0).z);
max = new Pair<>(cs.get(0).x, cs.get(0).z);
}
if (cs.get(i).x < min.x || cs.get(i).z < min.z) {
min = cs.get(i);
}
if (cs.get(i).x > min.x || cs.get(i).z > min.z) {
max = cs.get(i);
}
Util.getChunkAtAsync(w, cs.get(i).x, cs.get(i).z, true).thenAccept(c -> {
LoadChunksAsync(w, cs, i + 1, cmd);
});
} else {
addon.log("Complete");
addon.log("Loaded chunks in " + w.getName() + " min " + (min.x << 4) + " " + (min.z << 4) + " to " +
(max.x << 4) + " " + (max.z << 4));
addon.log("run command " + cmd);
Bukkit.getScheduler().runTaskLater(addon.getPlugin(), () -> {
addon.log("Comand success = " + addon.getServer().dispatchCommand(Bukkit.getConsoleSender(), cmd));
pasting = false; pasting = false;
}, 20L);
}
} }

View File

@ -1,6 +1,6 @@
structures: tructures:
new: new:
village_plains: "normal, 0 ,64, 80" village/plains/houses/plains_masons_house_1: "normal, 0 ,64, 80"
ruined_portal_mountain: "normal, -38, 63, 20" ruined_portal/portal_5: "normal, -38, 66, 20"
pillager_outpost: "normal, 3, 63, -60" shipwreck/rightsideup_backhalf: "normal, 3, 59, -60"