diff --git a/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java b/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java new file mode 100644 index 0000000..ac5c821 --- /dev/null +++ b/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java @@ -0,0 +1,105 @@ +package de.fanta.challenges.challenges; + +import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent; +import de.fanta.challenges.Challenges; +import de.fanta.challenges.events.TimerChangedEvent; +import io.papermc.paper.event.entity.EntityMoveEvent; +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.EnderDragon; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.util.BoundingBox; + +import java.util.ArrayList; + +public class MobRemoveWorldChallenge implements Listener { + + Challenges plugin = Challenges.getPlugin(); + + ArrayList dragonList = new ArrayList<>(); + + private int taskId = -1; + + @EventHandler + public void onMobMove(EntityMoveEvent e) { + if (plugin.getConfig().getBoolean("mobremoveworld") && plugin.getTimer().isRunning()) { + if (!e.getTo().equals(e.getFrom())) { + if (e.getEntity().getType() != EntityType.ENDER_DRAGON) { + BoundingBox box = e.getEntity().getBoundingBox(); + removeWorld(e.getEntity().getLocation().getWorld(), box, true); + } + } + } + } + + @EventHandler + public void onTImerChange(TimerChangedEvent e) { + if (plugin.getConfig().getBoolean("mobremoveworld")) { + if (plugin.getTimer().isRunning()) { + startUpdateTask(); + } else { + stopUpdateTask(); + } + } + } + + @EventHandler + public void addEntity(EntityAddToWorldEvent e) { + if (e.getEntity() instanceof EnderDragon enderDragon) { + dragonList.add(enderDragon); + } + } + + private void removeWorld(World world, BoundingBox box, boolean replaceBedrock) { + if (!plugin.getConfig().getBoolean("mobremoveworld")) { + return; + } + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + Location loc = new Location(world, box.getCenterX(), box.getCenterY(), box.getCenterZ()); + double boundingwithX = box.getWidthX() / 2; + double boundingwithZ = box.getWidthZ() / 2; + int worldMinHeight = world.getMinHeight(); + int worldMaxHeight = world.getMaxHeight(); + for (double x = loc.getX() - boundingwithX; x <= loc.getX() + boundingwithX; x++) { + for (double z = loc.getZ() - boundingwithZ; z <= loc.getZ() + boundingwithZ; z++) { + for (int y = worldMinHeight; y < worldMaxHeight; y++) { + Block block = world.getBlockAt((int) Math.round(x), y, (int) Math.round(z)); + if (replaceBedrock) { + if (block.getType() != Material.AIR) { + block.setType(Material.AIR, false); + } + } else { + if (block.getType() != Material.AIR && block.getType() != Material.BEDROCK) { + block.setType(Material.AIR, false); + } + } + + } + } + } + }, 20 * 2L); + } + + public void startUpdateTask() { + taskId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L); + } + + public void stopUpdateTask() { + plugin.getServer().getScheduler().cancelTask(taskId); + } + + private void tick() { + for (EnderDragon enderDragon : dragonList) { + if (!enderDragon.isDead() && enderDragon.isValid()) { + Location loc = enderDragon.getLocation(); + BoundingBox box = enderDragon.getBoundingBox(); + removeWorld(loc.getWorld(), box, false); + } + } + } +} diff --git a/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java b/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java index 89099f4..d41c60e 100644 --- a/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java +++ b/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java @@ -53,7 +53,10 @@ GlobalApi.portOnlinePlayerToLocation(p.getName(), "adventure"); } } - plugin.delteTexturePack(); + if (plugin.getServerType() == ServerType.ADVENTURE) { + plugin.delteTexturePack(); + } + plugin.getConfig().set("World_Reset", true); for (String key : plugin.getConfig().getConfigurationSection("Saved_Locations").getKeys(false)) { plugin.getConfig().set("Saved_Locations." + key, null); diff --git a/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java b/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java index 4e80f13..03b586b 100644 --- a/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java +++ b/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java @@ -46,6 +46,7 @@ private static final int RANDOM_DROPS_INDEX = 37; private static final int DAMAGE_ON_SNEAK_INDEX = 38; private static final int TIED_TOGETHER_INDEX = 39; + private static final int MOB_REMOVE_WORLD_INDEX = 40; public ChallengesGui(Player player) { super(player, Bukkit.createInventory(player, WINDOW_SIZE, plugin.getGUIPREFIX() + " >> Challenges")); @@ -256,6 +257,15 @@ GUIUtils.sendTitleToAll("Challenge", "Zusammengebunden aktiviert", ChatUtil.GREEN); } } + case MOB_REMOVE_WORLD_INDEX -> { + if (plugin.getConfig().getBoolean("mobremoveworld")) { + GUIUtils.setConfig("mobremoveworld", false); + GUIUtils.sendTitleToAll("Challenge", "Mobs entfernen Welt deaktiviert", ChatUtil.RED); + } else { + GUIUtils.setConfig("mobremoveworld", true); + GUIUtils.sendTitleToAll("Challenge", "Mobs entfernen Welt aktiviert", ChatUtil.GREEN); + } + } default -> { } } @@ -422,6 +432,13 @@ item = GUIUtils.createGuiItem(Material.DIAMOND_BOOTS, ChatUtil.RED + "Zusammengebunden deaktiviert"); } } + case MOB_REMOVE_WORLD_INDEX -> { + if (plugin.getConfig().getBoolean("mobremoveworld")) { + item = GUIUtils.createGuiItem(Material.BLACK_CONCRETE, ChatUtil.GREEN + "Mobs entfernen Welt aktiviert", true, ChatUtil.GREEN + "Monster und Tiere löschen hinter sich die Welt."); + } else { + item = GUIUtils.createGuiItem(Material.BLACK_CONCRETE, ChatUtil.RED + "Mobs entfernen Welt deaktiviert", ChatUtil.GREEN + "Monster und Tiere löschen hinter sich die Welt."); + } + } default -> item = GUIUtils.EMPTY_ICON; } this.getInventory().setItem(i, item); diff --git a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java index e83b514..6452cc7 100644 --- a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java +++ b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java @@ -14,6 +14,7 @@ import de.fanta.challenges.challenges.CraftingTableChallenge; import de.fanta.challenges.challenges.FloorIsLavaChallenge; import de.fanta.challenges.challenges.IceRunnerChallenge; +import de.fanta.challenges.challenges.MobRemoveWorldChallenge; import de.fanta.challenges.challenges.NoFallDamageChallenge; import de.fanta.challenges.challenges.NoJumpChallenge; import de.fanta.challenges.challenges.NoSneakChallenge; @@ -93,6 +94,7 @@ pM.registerEvents(new OreBattle(), plugin); pM.registerEvents(new ForceItemChallengeEvent(), plugin); pM.registerEvents(new AllAdvancementsChallenge(), plugin); + pM.registerEvents(new MobRemoveWorldChallenge(), plugin); if (plugin.getProtocolVersion() >= 759) { pM.registerEvents(new WorldBorderLevelChallenge(), plugin); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index da3af1c..eeb98a7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -22,6 +22,7 @@ playerrange: 30 icerunner: false bedrockwall: false +mobremoveworld: false alladvancements: false worldborderlevel: false worldborderlevelnether: false