diff --git a/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java new file mode 100644 index 0000000..581bf92 --- /dev/null +++ b/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java @@ -0,0 +1,79 @@ +package de.fanta.challenges.challenges; + +import de.fanta.challenges.Challenges; +import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.utils.ChatUtil; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerMoveEvent; + +import java.util.*; + +public class DeathrunChallengeEvent implements Listener { + + private final Challenges plugin = Challenges.getPlugin(); + + private final HashMap oldValues = new HashMap<>(); + private final List deadPlayer = new ArrayList<>(); + + @EventHandler + public void onMove(PlayerMoveEvent e) { + Player p = e.getPlayer(); + if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun") && plugin.getTimer().isRunning() && !plugin.getVanish().isVanish(p)) { + if (!deadPlayer.contains(p)) { + int distance = calculateDistances(p); + plugin.getScoreManager().updateScore(p, distance); + //player.sendBlockChange(new Location(player.getWorld(), playerloc.getX(), playerloc.getBlockY() - 1, playerloc.getBlockZ()), Bukkit.createBlockData(Material.BLUE_ICE)); TODO müll2.0 + } + } + } + + @EventHandler + public void onDamage(EntityDamageEvent e) { + if (e.getEntity() instanceof Player p) { + if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun") && plugin.getTimer().isRunning()) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + ChatUtil.sendDebugMessage(p, (float) (p.getHealth() / 100f)); + p.setWalkSpeed((float) (p.getHealth() / 100f)); + }, 1L); + } + } + } + + @EventHandler + public void onDeath(PlayerDeathEvent e) { + Player p = e.getEntity(); + if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun") && plugin.getTimer().isRunning()) { + deadPlayer.add(p); + plugin.getSBManager().removeScoreboard(p); + } + if (plugin.getSBManager().countScoreboardPlayers() == 0) { + plugin.getTimer().stopTimer(); + ChatUtil.sendBrodcastMessage("Das Event wurde beendet, da alle Spieler gestorben sind!"); + } + } + + @EventHandler + public void onTimerChange(TimerChangedEvent e) { + if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun") && !e.isRunning()) { + //plugin.getScoreManager().getScores().values(). TODO müll + } + } + + public int calculateDistances(Player p) { + int spawnDistance = (int) p.getLocation().toVector().subtract(p.getWorld().getSpawnLocation().toVector()).length(); + if (oldValues.get(p) != null) { + int oldValue = oldValues.get(p); + oldValues.put(p, spawnDistance); + return spawnDistance - oldValue; + } else { + oldValues.put(p, spawnDistance); + } + return 0; + } + +} diff --git a/src/main/java/de/fanta/challenges/challenges/IceRunnerChallenge.java b/src/main/java/de/fanta/challenges/challenges/IceRunnerChallenge.java new file mode 100644 index 0000000..e8b9a74 --- /dev/null +++ b/src/main/java/de/fanta/challenges/challenges/IceRunnerChallenge.java @@ -0,0 +1,58 @@ +package de.fanta.challenges.challenges; + +import de.fanta.challenges.Challenges; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; + +import java.util.HashMap; + +public class IceRunnerChallenge implements Listener { + + public final Challenges plugin = Challenges.getPlugin(); + + private final HashMap iceRunnerEnable = new HashMap<>(); + + @EventHandler + public void onMove(PlayerMoveEvent e) { + Player p = e.getPlayer(); + if (plugin.getConfig().getBoolean("icerunner") && plugin.getTimer().isRunning() && !plugin.getVanish().isVanish(p)) { + if (iceRunnerEnable.get(p) != null) { + if (iceRunnerEnable.get(p)) { + Location playerloc = p.getLocation(); + World world = playerloc.getWorld(); + for (int x = playerloc.getBlockX() - 2; x <= playerloc.getBlockX() + 2; x++) { + for (int z = playerloc.getBlockZ() - 2; z <= playerloc.getBlockZ() + 2; z++) { + world.getBlockAt(x, playerloc.getBlockY() - 1, z).setType(Material.BLUE_ICE); + } + } + } + } else { + iceRunnerEnable.put(p, true); + } + } + } + + @EventHandler + public void onSneak(PlayerToggleSneakEvent e) { + Player p = e.getPlayer(); + if (e.isSneaking()) { + if (iceRunnerEnable.get(p) != null) { + if (plugin.getConfig().getBoolean("icerunner") && plugin.getTimer().isRunning() && !plugin.getVanish().isVanish(p)) { + if (iceRunnerEnable.get(p)) { + iceRunnerEnable.put(p, false); + } else { + iceRunnerEnable.put(p, true); + } + } + } else { + iceRunnerEnable.put(p, true); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/de/fanta/challenges/challenges/XPChallenge.java b/src/main/java/de/fanta/challenges/challenges/XPChallenge.java index 872dc75..e8df498 100644 --- a/src/main/java/de/fanta/challenges/challenges/XPChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/XPChallenge.java @@ -18,8 +18,8 @@ if (plugin.getTimer().isRunning() && e.getPlayer().getGameMode() == GameMode.SURVIVAL && !plugin.getVanish().isVanish(p)) { if (plugin.getConfig().getBoolean("xpdeath")) { p.setHealth(0); + ChatUtil.sendBrodcastMessage(e.getPlayer().getName() + " hat XP eingesammelt!"); } - ChatUtil.sendBrodcastMessage(e.getPlayer().getName() + " hat XP eingesammelt!"); } } } diff --git a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java index 462441c..7608a75 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java @@ -22,9 +22,10 @@ private static final int NULL_EVENT_INDEX = 0; private static final int BINGO_EVENT_INDEX = 10; - private static final int BINGO_ITEMS_INDEX = 19; - private static final int BUILD_EVENT_INDEX = 12; private static final int XP_EVENT_INDEX = 11; + private static final int BUILD_EVENT_INDEX = 12; + private static final int DEATHRUN_EVENT_INDEX = 13; + private static final int BINGO_ITEMS_INDEX = 19; private static final int CLOSE_IDEX = 26; public static void createEventGUI(Player p) { @@ -50,6 +51,11 @@ } else { EVENT_GUI.setItem(XP_EVENT_INDEX, GUIUtils.createGuiItem(Material.ENCHANTING_TABLE, ChatColor.RED + "XP Event", ChatColor.GREEN + "Sammle so viel XP wie Möglich", ChatColor.RED + "Verzaubern zieht Level ab")); } + if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun")) { + EVENT_GUI.setItem(DEATHRUN_EVENT_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_BOOTS, ChatColor.GREEN + "Deathrun Event", true, ChatColor.GREEN + "Laufe so weit wie möglich ohne zu sterben")); + } else { + EVENT_GUI.setItem(DEATHRUN_EVENT_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_BOOTS, ChatColor.RED + "Deathrun Event", ChatColor.GREEN + "Laufe so weit wie möglich ohne zu sterben")); + } EVENT_GUI.setItem(CLOSE_IDEX, GUIUtils.createGuiItem(Material.BARRIER, ChatColor.RED + "Menü verlassen!")); for (int i = 0; i < INVENTORY_SIZE; i++) { if (EVENT_GUI.getItem(i) == null || EVENT_GUI.getItem(i).getType() == Material.AIR) { @@ -66,23 +72,28 @@ if (e.getInventory() == EVENT_GUI) { if (plugin.getConfig().getBoolean("event.enabled")) { switch (slot) { - case NULL_EVENT_INDEX: + case NULL_EVENT_INDEX -> { plugin.getScoreManager().saveScores(p); plugin.getScoreManager().resetScores(); GUIUtils.setConfig("event.type", "nix"); GUIUtils.sendTitleToAll("Event", "Event beendet", ChatColor.RED); - break; - case BUILD_EVENT_INDEX: + } + case BUILD_EVENT_INDEX -> { GUIUtils.setConfig("event.type", "build"); GUIUtils.sendTitleToAll("Event", "Baue die meisten Blöcke ab!", ChatColor.GREEN); - break; - case XP_EVENT_INDEX: + } + case XP_EVENT_INDEX -> { GUIUtils.setConfig("event.type", "xp"); GUIUtils.sendTitleToAll("Event", "Sammle so viel XP wie möglich ein!", ChatColor.GREEN); - break; - case BINGO_EVENT_INDEX: + } + case BINGO_EVENT_INDEX -> { GUIUtils.setConfig("event.type", "bingo"); GUIUtils.sendTitleToAll("Event", "Sammle Vorgegebene Items! (/bingo)", ChatColor.GREEN); + } + case DEATHRUN_EVENT_INDEX -> { + GUIUtils.setConfig("event.type", "deathrun"); + GUIUtils.sendTitleToAll("Event", "Laufe so weit wie möglich ohne zu sterben!", ChatColor.GREEN); + } } createEventGUI(p); diff --git a/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java b/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java index f1c4923..1dd4f1f 100644 --- a/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java +++ b/src/main/java/de/fanta/challenges/guis/settingsgui/SettingsGui.java @@ -46,6 +46,8 @@ private static final int DMG_ON_SNEAK_ADD_INDEX = 34; private static final int DMG_ON_SNEAK_REMOVE_INDEX = 52; + private static final int ICE_RUNNER_INDEX = 32; + public static void createSettingsGUI(Player p) { if (plugin.getConfig().getBoolean("craftingtable")) { SETTINGS_GUI.setItem(CRAFTING_TABLE_INDEX, GUIUtils.createGuiItem(Material.CRAFTING_TABLE, ChatColor.GREEN + "Werkbank aktiviert", true)); @@ -130,6 +132,10 @@ SETTINGS_GUI.setItem(TIED_TOGETHER_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_BOOTS, ChatColor.RED + "Zusammengebunden deaktiviert")); SETTINGS_GUI.setItem(RANGE_ON_TIED_TOGETHER_ADD_INDEX, GUIUtils.EMPTY_ICON); SETTINGS_GUI.setItem(RANGE_ON_TIED_TOGETHER_REMOVE_INDEX, GUIUtils.EMPTY_ICON); + } if (plugin.getConfig().getBoolean("icerunner")) { + SETTINGS_GUI.setItem(ICE_RUNNER_INDEX, GUIUtils.createGuiItem(Material.BLUE_ICE, ChatColor.GREEN + "Ice-Runner aktiviert", true)); + } else { + SETTINGS_GUI.setItem(ICE_RUNNER_INDEX, GUIUtils.createGuiItem(Material.BLUE_ICE, ChatColor.RED + "Ice-Runner deaktiviert")); } SETTINGS_GUI.setItem(SHUFFLE_RANDOM_DROP_INDEX, GUIUtils.createGuiItem(Material.CHORUS_FLOWER, ChatColor.GREEN + "Zufällige Drops neu mischen")); SETTINGS_GUI.setItem(CLOSE_GUI_INDEX, GUIUtils.createGuiItem(Material.BARRIER, ChatColor.RED + "Menü verlassen!")); @@ -307,6 +313,15 @@ GUIUtils.setConfig("playerrange", plugin.getConfig().getDouble("playerrange") - 1); } break; + case ICE_RUNNER_INDEX: + if (plugin.getConfig().getBoolean("icerunner")) { + GUIUtils.setConfig("icerunner", false); + GUIUtils.sendTitleToAll("Challenge", "Ice-Runner deaktiviert", ChatColor.RED); + } else { + GUIUtils.setConfig("icerunner", true); + GUIUtils.sendTitleToAll("Challenge", "Ice-Runner aktiviert", ChatColor.GREEN); + } + break; default: break; } diff --git a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java index 9b39ea3..77439ef 100644 --- a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java +++ b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java @@ -1,21 +1,7 @@ package de.fanta.challenges.listeners; import de.fanta.challenges.Challenges; -import de.fanta.challenges.challenges.BingoChallengeEvent; -import de.fanta.challenges.challenges.ChallengeGoals; -import de.fanta.challenges.challenges.ClearInventoryByDamageChallenge; -import de.fanta.challenges.challenges.CraftingTableChallenge; -import de.fanta.challenges.challenges.FloorIsLavaChallenge; -import de.fanta.challenges.challenges.NoFallDamageChallenge; -import de.fanta.challenges.challenges.NoJumpChallenge; -import de.fanta.challenges.challenges.NoSneakChallenge; -import de.fanta.challenges.challenges.NoSprintChallenge; -import de.fanta.challenges.challenges.NoTradingChallenge; -import de.fanta.challenges.challenges.RandomDropsChallenge; -import de.fanta.challenges.challenges.RandomEffectChallenge; -import de.fanta.challenges.challenges.ShareDamageChallenge; -import de.fanta.challenges.challenges.TiedTogetherChallenge; -import de.fanta.challenges.challenges.XPChallenge; +import de.fanta.challenges.challenges.*; import de.fanta.challenges.guis.ResetGui; import de.fanta.challenges.guis.TimerGui; import de.fanta.challenges.guis.eventgui.EventGui; @@ -66,5 +52,7 @@ pM.registerEvents(new TiedTogetherChallenge(), plugin); pM.registerEvents(new NoSneakChallenge(), plugin); pM.registerEvents(new BingoChallengeEvent(), plugin); + pM.registerEvents(new DeathrunChallengeEvent(), plugin); + pM.registerEvents(new IceRunnerChallenge(), plugin); } } diff --git a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java index a7673e8..56f13c8 100644 --- a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java +++ b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java @@ -162,16 +162,4 @@ } } } - - @EventHandler - public void onDamage(EntityDamageEvent e) { - if (e.getEntity() instanceof Player p) { - if (plugin.getConfig().getBoolean("deathrun")) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - ChatUtil.sendDebugMessage(p, (float) (p.getHealth() / 100f)); - p.setWalkSpeed((float) (p.getHealth() / 100f)); - }, 1L); - } - } - } } diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java index 77cfe06..8124273 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java @@ -61,6 +61,10 @@ } } + public int countScoreboardPlayers() { + return team.getEntries().size(); + } + public void updateTabHP() { if (plugin.getConfig().getBoolean("tabhp")) { if (this.tabHP == null) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 51fc368..26a82f3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -19,6 +19,7 @@ lavafloor: false tiedtogether: false playerrange: 30 +icerunner: false #Mögliche werte: 1-6 backpack_size: 3 mlg: