diff --git a/src/main/java/de/fanta/challenges/Timer.java b/src/main/java/de/fanta/challenges/Timer.java index 3b88ef8..7089cd7 100644 --- a/src/main/java/de/fanta/challenges/Timer.java +++ b/src/main/java/de/fanta/challenges/Timer.java @@ -43,12 +43,6 @@ idleActionBarTaskId = -1; } actionBarTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> { - int random = this.random.nextInt(Config.getInt("mlg.maxtime")); - MLGChallenge.timeSinceMLG++; - if (random == 0 || MLGChallenge.timeSinceMLG >= Config.getInt("mlg.maxtime")) { - MLGChallenge.triggerMLG(); - } - if (mode == TimerMode.DOWN) { if (time <= 0) { if (Config.getBoolean("event.enabled")) { diff --git a/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java b/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java index c8fb6ab..ec0ecff 100644 --- a/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java @@ -1,6 +1,7 @@ package de.fanta.challenges.challenges; import de.fanta.challenges.Challenges; +import de.fanta.challenges.events.TimerChangedEvent; import de.fanta.challenges.gravestones.GravestoneUtils; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; @@ -13,20 +14,127 @@ import org.bukkit.WorldCreator; import org.bukkit.WorldType; import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerGameModeChangeEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; +import org.spigotmc.event.entity.EntityMountEvent; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Random; +import java.util.UUID; -public class MLGChallenge { +public class MLGChallenge implements Listener { private static final Challenges plugin = Challenges.getPlugin(); private static final Random random = new Random(); - private static boolean mlgActive; + private static boolean MLGinProgress; + private static boolean running; + private static int taskID = -1; + private static final HashMap mlgPlayerMap = new HashMap<>(); + private static int timeSinceMLG; // seconds+ + private static Location mlgLocation; + private static final ArrayList mlgBlocks = new ArrayList<>(); - public static int timeSinceMLG; // seconds + @EventHandler + public void onTimerChange(TimerChangedEvent e) { + if (Config.getBoolean("mlg.enabled")) { + if (e.isRunning()) { + mlgBlocks.add(Material.WATER_BUCKET); + mlgBlocks.add(Material.SLIME_BLOCK); + mlgBlocks.add(Material.OAK_BOAT); + mlgBlocks.add(Material.SCAFFOLDING); + mlgBlocks.add(Material.SWEET_BERRIES); + mlgBlocks.add(Material.POWDER_SNOW_BUCKET); + mlgBlocks.add(Material.COBWEB); + mlgBlocks.add(Material.TWISTING_VINES); + setRunning(true); + startTask(); + } else { + setRunning(false); + stopTask(); + } + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { + if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { + if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId())) { + mlgResult(e.getPlayer(), true); + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> e.getPlayer().spigot().respawn(), 1L); + } + } + } + + @EventHandler + public void onTeleport(PlayerTeleportEvent e) { + if (isMLGinProgress() && e.getFrom().getWorld().getName().equals("mlg_challenge")) { + if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId())) { + mlgResult(e.getPlayer(), true); + } + } + } + + @EventHandler + public void onGameModeChange(PlayerGameModeChangeEvent e) { + if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { + if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId())) { + mlgResult(e.getPlayer(), true); + } + } + } + + @EventHandler + public void onDisconnect(PlayerQuitEvent e) { + if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { + if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId())) { + mlgResult(e.getPlayer(), true); + } + } + } + + @EventHandler + public void onBucketEmpty(PlayerBucketEmptyEvent e) { + if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId()) && !e.getPlayer().isDead()) { + mlgResult(e.getPlayer(), false); + } + }, 40L); + } + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent e) { + if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId()) && !e.getPlayer().isDead()) { + mlgResult(e.getPlayer(), false); + } + }, 40L); + } + } + + @EventHandler + public void onEntityMount(EntityMountEvent e) { + if (isMLGinProgress() && e.getMount().getWorld().getName().equals("mlg_challenge")) { + if (e.getEntity() instanceof Player player) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (mlgPlayerMap.containsKey(player.getUniqueId()) && !player.isDead()) { + mlgResult(player, false); + } + }, 40L); + } + } + } public static void checkMLGWorld() { World mlgWorld = Bukkit.getWorld("mlg_challenge"); @@ -42,68 +150,135 @@ } public static boolean triggerMLG() { - if (Config.getBoolean("mlg.enabled") && !mlgActive && Bukkit.getOnlinePlayers().size() >= 1) { - mlgActive = true; - ChatUtil.sendBrodcastMessage("Zeit für einen MLG! Viel Glück!"); + if (isRunning() && !MLGinProgress && !plugin.getVanish().getPlayerListWithoutVanishPlayers().isEmpty()) { timeSinceMLG = 0; - for (Player p : Bukkit.getOnlinePlayers()) { - if (p.getGameMode() == GameMode.SURVIVAL && !p.isDead() && !plugin.getVanish().isVanish(p)) { + mlgPlayerMap.clear(); + for (Player p : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + if (p.getGameMode() == GameMode.SURVIVAL && !p.isDead()) { + MLGInfo mlgInfo = new MLGInfo(p.getInventory().getContents(), p.getLocation()); + mlgPlayerMap.put(p.getUniqueId(), mlgInfo); + ChatUtil.sendNormalMessage(p, "Zeit für einen MLG! Viel Glück!"); + p.getInventory().clear(); tpMLG(p); } } + if (!mlgPlayerMap.isEmpty()) { + setMLGinProgress(true); + } + return true; } return false; } - public static void tpMLG(Player p) { + private static void tpMLG(Player p) { p.closeInventory(); - Inventory inv = Bukkit.createInventory(p, InventoryType.PLAYER, p.getName()); - inv.setContents(p.getInventory().getContents()); - p.getInventory().clear(); - p.getInventory().setItemInMainHand(new ItemStack(Material.WATER_BUCKET)); - int rndY = random.nextInt(40); - int rndX = random.nextInt(500); - int rndZ = random.nextInt(500); - Location oldloc = p.getLocation(); + if (Config.getBoolean("mlg.randommlgblock")) { + Material mlgItem = mlgBlocks.get(random.nextInt(mlgBlocks.size())); + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.getInventory().setItemInMainHand(new ItemStack(mlgItem)), 1L); + } else { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.getInventory().setItemInMainHand(new ItemStack(Material.WATER_BUCKET)), 1L); + } - Location newloc = new Location(Bukkit.getWorld("mlg_challenge"), p.getLocation().getBlockX() + rndX, (oldloc.getWorld().getMinHeight() + 100 + rndY), p.getLocation().getBlockZ() + rndZ); + if (mlgLocation == null) { + mlgLocation = new Location(Bukkit.getWorld("mlg_challenge"), 0, 0, 0); + } + + mlgLocation.add(100, 0, 0); + Location newloc = mlgLocation.clone(); + newloc.add(0.5, 0, 0.5); + newloc.setY(100 + random.nextInt(40)); p.teleport(newloc); - mlgResult(p, oldloc, inv); } - public static void mlgResult(final Player p, final Location loc, final Inventory inv) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - mlgActive = false; - if (!p.isDead() && p.getWorld() == Bukkit.getWorld("mlg_challenge")) { - ChatUtil.sendNormalMessage(p, ChatUtil.GREEN + "Du hast den " + ChatUtil.BLUE + "MLG " + ChatUtil.GREEN + "erfolgreich absolviert! " + ChatUtil.ORANGE + "Weitere folgen..."); - p.setInvulnerable(true); - mlgBack(p, loc, inv); - } else if (Bukkit.getWorlds().get(0).getGameRuleValue(GameRule.KEEP_INVENTORY)) { - p.getInventory().setContents(inv.getContents()); + private static void mlgResult(Player p, boolean dead) { + MLGInfo mlgInfo = mlgPlayerMap.get(p.getUniqueId()); + mlgPlayerMap.remove(p.getUniqueId()); + Location loc = mlgInfo.getLocation(); + ItemStack[] content = mlgInfo.getContent(); + if (!dead) { + p.setInvulnerable(true); + mlgBack(p, loc, content); + ChatUtil.sendNormalMessage(p, ChatUtil.GREEN + "Du hast den " + ChatUtil.BLUE + "MLG " + ChatUtil.GREEN + "erfolgreich absolviert! " + ChatUtil.ORANGE + "Weitere folgen..."); + } else { + p.getInventory().clear(); + if (Bukkit.getWorlds().get(0).getGameRuleValue(GameRule.KEEP_INVENTORY)) { + p.getInventory().setContents(content); + } else if (Config.getBoolean("gravestone")) { + String inventoryString = GravestoneUtils.createInventoryString(content); + GravestoneUtils.spawnAtBlock(loc.getBlock(), p, GravestoneUtils.compressString(inventoryString)); } else { - if (!Config.getBoolean("gravestone")) { - for (ItemStack stack : inv.getContents()) { - if (stack != null) { - loc.getWorld().dropItemNaturally(loc, stack); - } + for (ItemStack stack : content) { + if (stack != null) { + loc.getWorld().dropItemNaturally(loc, stack); } - } else { - String inventoryString = GravestoneUtils.createInventoryString(inv.getContents()); - GravestoneUtils.spawnAtBlock(loc.getBlock(), p, GravestoneUtils.compressString(inventoryString)); } - } - }, 140L); + } + + if (mlgPlayerMap.isEmpty()) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> setMLGinProgress(false), 60L); + } } - public static void mlgBack(final Player p, Location loc, Inventory inv) { + private static void mlgBack(final Player p, Location loc, ItemStack[] content) { p.teleport(loc); - p.getInventory().setContents(inv.getContents()); + p.getInventory().setContents(content); Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.setInvulnerable(false), 60L); } - public static void setMlgActive(boolean mlgActive) { - MLGChallenge.mlgActive = mlgActive; + private static void tick() { + if (!mlgPlayerMap.isEmpty()) { + return; + } + int randomInt = random.nextInt(Config.getInt("mlg.maxtime")); + timeSinceMLG++; + if (randomInt == 0 || timeSinceMLG >= Config.getInt("mlg.maxtime")) { + triggerMLG(); + } } -} + + public static boolean isRunning() { + return running; + } + + private static void setRunning(boolean running) { + MLGChallenge.running = running; + } + + private static boolean isMLGinProgress() { + return MLGinProgress; + } + + public static void setMLGinProgress(boolean MLGinProgress) { + MLGChallenge.MLGinProgress = MLGinProgress; + } + + public static void startTask() { + if (!plugin.getServer().getScheduler().isCurrentlyRunning(taskID) && plugin.getTimer().isRunning()) { + taskID = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, MLGChallenge::tick, 20L, 20L); + } + } + + public static void stopTask() { + plugin.getServer().getScheduler().cancelTask(taskID); + } + + static class MLGInfo { + private final ItemStack[] content; + private final Location location; + + MLGInfo(ItemStack[] content, Location location) { + this.content = content; + this.location = location; + } + + public Location getLocation() { + return location; + } + + public ItemStack[] getContent() { + return content; + } + } +} \ No newline at end of file diff --git a/src/main/java/de/fanta/challenges/commands/ReviveCommand.java b/src/main/java/de/fanta/challenges/commands/ReviveCommand.java index f8b4e5f..4e11fb8 100644 --- a/src/main/java/de/fanta/challenges/commands/ReviveCommand.java +++ b/src/main/java/de/fanta/challenges/commands/ReviveCommand.java @@ -31,7 +31,7 @@ String next = args.next(); if (next.equalsIgnoreCase("all")) { - MLGChallenge.setMlgActive(false); + MLGChallenge.setMLGinProgress(false); for (Player p : Bukkit.getOnlinePlayers()) { p.setHealth(p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); p.setGameMode(GameMode.SURVIVAL); diff --git a/src/main/java/de/fanta/challenges/guis/challengesettingsguis/MLGSettingsGui.java b/src/main/java/de/fanta/challenges/guis/challengesettingsguis/MLGSettingsGui.java index c0b5dd7..72ec2ef 100644 --- a/src/main/java/de/fanta/challenges/guis/challengesettingsguis/MLGSettingsGui.java +++ b/src/main/java/de/fanta/challenges/guis/challengesettingsguis/MLGSettingsGui.java @@ -17,7 +17,7 @@ public class MLGSettingsGui extends AbstractWindow { private static final Challenges plugin = Challenges.getPlugin(); - + private static final int RANDOM_BLOCK_INDEX = 1; private static final int ADD_TIME_INDEX = 2; private static final int TIME_INDEX = 5; private static final int REMOVE_TIME_INDEX = 8; @@ -42,6 +42,16 @@ int slot = event.getSlot(); int time = Config.getInt("mlg.maxtime"); switch (slot) { + case RANDOM_BLOCK_INDEX -> { + if (Config.getBoolean("mlg.randommlgblock")) { + Config.setValue("mlg.randommlgblock", false); + ChatUtil.sendTitleToAll("MLG Challenge", "Wassereimer MLG", ChatUtil.GREEN); + } else { + Config.setValue("mlg.randommlgblock", true); + ChatUtil.sendTitleToAll("MLG Challenge", "Zufälliger MLG Block", ChatUtil.GREEN); + } + rebuildInventory(); + } case ADD_TIME_INDEX -> { if (event.isShiftClick()) { time = time + 10; @@ -74,6 +84,13 @@ ItemStack item; int time = Config.getInt("mlg.maxtime"); switch (i) { + case RANDOM_BLOCK_INDEX -> { + if (Config.getBoolean("mlg.randommlgblock")) { + item = GUIUtils.createGuiItem(Material.SLIME_BLOCK, ChatUtil.GREEN + "Zufälliger MLG Block", true, ChatUtil.GREEN + "Du bekommst ein Zufälligen Block."); + } else { + item = GUIUtils.createGuiItem(Material.WATER_BUCKET, ChatUtil.GREEN + "Wasser MLG", true, ChatUtil.GREEN + "Du bekommst einen Wassereimer."); + } + } case ADD_TIME_INDEX -> item = CustomHeads.RAINBOW_ARROW_UP.getHead(ChatUtil.GREEN + "Zeit hinzufügen", ChatUtil.GREEN + "Klick = +100 Sekunden", ChatUtil.GREEN + "Shift + Klick = +10 Sekunden"); case REMOVE_TIME_INDEX -> 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 c03f06e..be44fa8 100644 --- a/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java +++ b/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java @@ -3,6 +3,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.challenges.AllAdvancementsChallenge; import de.fanta.challenges.challenges.AllItemsChallenge; +import de.fanta.challenges.challenges.MLGChallenge; import de.fanta.challenges.challenges.WorldBorderLevelChallenge; import de.fanta.challenges.guis.challengesettingsguis.BedrockWallSettingsGui; import de.fanta.challenges.guis.challengesettingsguis.LevelBorderSettingsGui; @@ -136,10 +137,12 @@ if (event.isLeftClick()) { if (Config.getBoolean("mlg.enabled")) { Config.setValue("mlg.enabled", false); + MLGChallenge.stopTask(); ChatUtil.sendTitleToAll("Challenge", "MLG deaktiviert", ChatUtil.RED); } else { - ChatUtil.sendTitleToAll("Challenge", "MLG aktiviert", ChatUtil.GREEN); Config.setValue("mlg.enabled", true); + MLGChallenge.startTask(); + ChatUtil.sendTitleToAll("Challenge", "MLG aktiviert", ChatUtil.GREEN); } } else if (event.isRightClick()) { new MLGSettingsGui(player).open(); diff --git a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java index 8fb0af6..23e70d1 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.MLGChallenge; import de.fanta.challenges.challenges.MobRemoveWorldChallenge; import de.fanta.challenges.challenges.NoFallDamageChallenge; import de.fanta.challenges.challenges.NoJumpChallenge; @@ -91,6 +92,7 @@ pM.registerEvents(new AllAdvancementsChallenge(), plugin); pM.registerEvents(new MobRemoveWorldChallenge(), plugin); pM.registerEvents(new BridgeRaceChallengeEvent(), plugin); + pM.registerEvents(new MLGChallenge(), 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 0968c7f..7906a00 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -40,6 +40,7 @@ mlg: enabled: false maxtime: 380 + randommlgblock: false timertime: 0 firsttimerstart: false showtimer: true