diff --git a/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java index fc35c46..b535229 100644 --- a/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/DeathrunChallengeEvent.java @@ -5,35 +5,84 @@ import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; import de.fanta.challenges.utils.ChatUtil; import org.bukkit.Bukkit; +import org.bukkit.GameRule; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerMoveEvent; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; public class DeathrunChallengeEvent implements Listener { private final Challenges plugin = Challenges.getPlugin(); - private final HashMap oldValues = new HashMap<>(); private final List deadPlayer = new ArrayList<>(); + public static Location spawnLocation; + private final Map> currentBarrier = new HashMap<>(); + @EventHandler public void onMove(PlayerMoveEvent e) { Player p = e.getPlayer(); + World world = p.getWorld(); 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 + int distance = (int) p.getLocation().toVector().subtract(p.getWorld().getSpawnLocation().toVector()).length(); + plugin.getScoreManager().setScore(p, distance); + + Location playerLoc = p.getLocation(); + double posRelatedToCenter = playerLoc.getZ() - spawnLocation.getZ(); + double distanceToCenter = Math.abs(posRelatedToCenter); + + List barrierLocations = currentBarrier.computeIfAbsent(p.getUniqueId(), uuid -> new ArrayList<>()); + + int BARRIER_POS = 15; + int BARRIER_SIZE = 6; + if (distanceToCenter >= BARRIER_POS) { //Outside border + p.damage(0.5); + } else if (distanceToCenter >= BARRIER_POS - 4) { //Inside border + //Send barrier + double barrierZ = spawnLocation.getZ() + BARRIER_POS * (posRelatedToCenter > 0 ? 1 : -1); + Location loc = new Location(p.getWorld(), playerLoc.getX() - BARRIER_SIZE / 2d, playerLoc.getY() - BARRIER_SIZE / 2d, barrierZ); + + resetBarrier(p, world, barrierLocations); + for (int y = 0; y < BARRIER_SIZE; y++) { + for (int x = 0; x < BARRIER_SIZE; x++) { + Location blockLoc = loc.clone().add(x, y, 0); + if (!world.getBlockAt(blockLoc).isSolid()) { + barrierLocations.add(blockLoc); + p.sendBlockChange(blockLoc, Bukkit.createBlockData(Material.BLUE_STAINED_GLASS)); + } + } + } + } else if (!barrierLocations.isEmpty()) { //Away from border + resetBarrier(p, world, barrierLocations); + } } } } + private void resetBarrier(Player p, World world, List locations) { + for (Location location : locations) { + p.sendBlockChange(location, world.getBlockAt(location).getBlockData()); + } + locations.clear(); + } + @EventHandler public void onDamage(EntityDamageEvent e) { if (e.getEntity() instanceof Player p) { @@ -71,20 +120,72 @@ } else { ChatUtil.sendBrodcastMessage(ChatUtil.BLUE + maxEntry.getKey() + ChatUtil.GREEN + " ist " + maxEntry.getValue() + " Blöcke gelaufen und hat damit gewonnen!", ChatUtil.BLUE); } + } else { + World world = Bukkit.getWorld("world"); + world.setGameRule(GameRule.MAX_ENTITY_CRAMMING, Bukkit.getServer().getMaxPlayers()); + for (Player pp : Bukkit.getOnlinePlayers()) { + Location spawn = world.getSpawnLocation(); + spawn.setYaw(-90f); + pp.teleport(spawn); + } } } } - 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); + @EventHandler + public void onBarrierBreak(BlockBreakEvent e) { + if (Objects.equals(plugin.getConfig().getString("event.type"), "deathrun")) { + Block block = e.getBlock(); + Location loc = block.getLocation(); + int x = loc.getBlockX(); + int z = loc.getBlockZ(); + int spawnX = spawnLocation.getBlockX(); + int spawnZ = spawnLocation.getBlockZ(); + + int distanceX = spawnX - x; + + if (distanceX > -15 && (Math.abs(distanceX) >= 15 || Math.abs(spawnZ - z) >= 15)) { + ChatUtil.sendWarningMessage(e.getPlayer(), "Keiner hat vor eine Mauer abzubauen!"); + e.setCancelled(true); + } } - return 0; } + + public static void load() { + World world = Bukkit.getWorld("world"); + spawnLocation = world.getSpawnLocation(); + + int height = world.getMaxHeight() - world.getMinHeight(); + int width = 30; + + Location loc = spawnLocation.clone().subtract(15, 0, 15); + loc.setY(world.getMinHeight()); + for (int y = 0; y < height; y++) { + for (int z = 0; z < width; z++) { + Block block = loc.clone().add(0, y, z).getBlock(); + if (!block.isSolid()) { + block.setType(Material.BLUE_STAINED_GLASS); + } + } + } + mexico(15, world); + mexico(-15, world); + + } + + private static void mexico(int startPos, World world) { + int height = world.getMaxHeight() - world.getMinHeight(); + int width = 30; + Location loc = spawnLocation.clone().add(-15, 0, startPos); + loc.setY(world.getMinHeight()); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + Block block = loc.clone().add(x, y, 0).getBlock(); + if (!block.isSolid()) { + block.setType(Material.BLUE_STAINED_GLASS); + } + } + } + } } 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 56027a7..4203498 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java @@ -1,10 +1,12 @@ package de.fanta.challenges.guis.eventgui; import de.fanta.challenges.Challenges; +import de.fanta.challenges.challenges.DeathrunChallengeEvent; import de.fanta.challenges.utils.guiutils.GUIUtils; import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -72,27 +74,29 @@ 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); - break; - case DEATHRUN_EVENT_INDEX: + } + case DEATHRUN_EVENT_INDEX -> { GUIUtils.setConfig("event.type", "deathrun"); GUIUtils.sendTitleToAll("Event", "Laufe so weit wie möglich ohne zu sterben!", ChatColor.GREEN); + DeathrunChallengeEvent.load(); + } } createEventGUI(p); diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java index 8124273..9883123 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreBoardManager.java @@ -121,4 +121,11 @@ score.setScore(score.getScore() + difference); } } + + void setEventScore(Player player, int newScore) { + if (this.event != null) { + Score score = event.getScore(player.getName()); + score.setScore(newScore); + } + } } diff --git a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java index 66a2e8b..d1f7137 100644 --- a/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java +++ b/src/main/java/de/fanta/challenges/scoreboard/ScoreManager.java @@ -32,6 +32,11 @@ this.plugin.getSBManager().updateEventScore(player, difference); } + public void setScore(Player player, int score) { + scores.put(player.getName(), score); + this.plugin.getSBManager().setEventScore(player, score); + } + public int getScore(Player player) { return scores.getOrDefault(player.getName(), 0); }