diff --git a/src/main/java/de/lunarakai/minecleaner/MinecleanerArena.java b/src/main/java/de/lunarakai/minecleaner/MinecleanerArena.java index 7beda46..6101635 100644 --- a/src/main/java/de/lunarakai/minecleaner/MinecleanerArena.java +++ b/src/main/java/de/lunarakai/minecleaner/MinecleanerArena.java @@ -503,6 +503,7 @@ public class MinecleanerArena { currentMinecleanerGame.flag(x, y); if (currentMinecleanerGame.gameover) { + arenaStatus = ArenaStatus.COMPLETED; plugin.getManager().handleGameover(player, this, true); } if (cell.isFlagged() == true) { @@ -534,6 +535,7 @@ public class MinecleanerArena { setBlockForCellType(x, y, cell); if (currentMinecleanerGame.gameover) { + arenaStatus = ArenaStatus.COMPLETED; plugin.getManager().handleGameover(player, this, !(cell.isRevealed() && cell.isExploded())); } else { updateIngameInfoTexts(); @@ -723,10 +725,13 @@ public class MinecleanerArena { return currentGameStartTime; } + public Game getCurrentMinecleanerGame() { return currentMinecleanerGame; } + public int getWidthIndex() { return widthIndex; } + private int getRotationYaw() { return switch (orientation) { case EAST -> 90; diff --git a/src/main/java/de/lunarakai/minecleaner/MinecleanerListener.java b/src/main/java/de/lunarakai/minecleaner/MinecleanerListener.java index 46a1ff1..8682976 100644 --- a/src/main/java/de/lunarakai/minecleaner/MinecleanerListener.java +++ b/src/main/java/de/lunarakai/minecleaner/MinecleanerListener.java @@ -38,48 +38,51 @@ public class MinecleanerListener implements Listener { if(arena != null) { e.setCancelled(true); MinecleanerArena arenaClicked = plugin.getArenaList().getArenaAtBlock(block); - if(arenaClicked == arena && arena.getArenaStatus() == ArenaStatus.PLAYING) { - int d0x = arena.getOrientation().getModX(); - int d0z = arena.getOrientation().getModZ(); - int d1x = -d0z; - int d1z = d0x; + boolean hasRightClicked = false; + if(e.getAction() == Action.RIGHT_CLICK_BLOCK) { + hasRightClicked = true; + } + if(!arenaClicked.getCurrentMinecleanerGame().gameover) { + if(arenaClicked == arena && arena.getArenaStatus() == ArenaStatus.PLAYING) { + int d0x = arena.getOrientation().getModX(); + int d0z = arena.getOrientation().getModZ(); + int d1x = -d0z; + int d1z = d0x; - if (e.getBlockFace() == arena.getOrientation()) { + if (e.getBlockFace() == arena.getOrientation()) { - Player player = e.getPlayer(); - RayTraceResult r2 = player.rayTraceBlocks(36.0); + Player player = e.getPlayer(); + RayTraceResult r2 = player.rayTraceBlocks(36.0); - if(r2 != null) { - Vector hitPos = r2.getHitPosition(); - Vector substract = new Vector(0.5, 0.5, 0.5); + if(r2 != null) { + Vector hitPos = r2.getHitPosition(); + Vector substract = new Vector(0.5, 0.5, 0.5); - Location loc = hitPos.subtract(arena.getLocation().toVector()).subtract(substract).toLocation(player.getWorld()); //(0.5, 0.5, 0.5); // substract 0.5, 0.5, 0.5 - double lx = loc.getX(); - double ly = loc.getY(); - double lz = loc.getZ(); - double dy = ly + 1.5; - double dz = -d1x * lx - d1z * lz + 1.5; + Location loc = hitPos.subtract(arena.getLocation().toVector()).subtract(substract).toLocation(player.getWorld()); //(0.5, 0.5, 0.5); // substract 0.5, 0.5, 0.5 + double lx = loc.getX(); + double ly = loc.getY(); + double lz = loc.getZ(); + double dy = ly + 1.5; + double dz = -d1x * lx - d1z * lz + 1.5; - double blockx = (dy / 3.0) * 9.0; - double blockz = (dz / 3.0) * 9.0; + double blockx = (dy / 3.0) * 9.0; + double blockz = (dz / 3.0) * 9.0; - int blockxInt = (int) blockx; - int blockzInt = (int) blockz; - blockx -= blockxInt; - blockz -= blockzInt; + int blockxInt = (int) blockx; + int blockzInt = (int) blockz; + blockx -= blockxInt; + blockz -= blockzInt; - boolean hasRightClicked = false; - if(e.getAction() == Action.RIGHT_CLICK_BLOCK) { - hasRightClicked = true; + if(blockzInt < arena.getArenaWidth() && blockxInt < arenaClicked.getArenaHeight()) { + plugin.getManager().handleFieldClick(e.getPlayer(), blockzInt, blockxInt, hasRightClicked); + } + //player.sendMessage("Arena click! " + blockxInt + " " + blockzInt + " Right Clicked: " + hasRightClicked); } - - if(blockzInt < arena.getArenaWidth() && blockxInt < arenaClicked.getArenaHeight()) { - plugin.getManager().handleFieldClick(e.getPlayer(), blockzInt, blockxInt, hasRightClicked); - } - //player.sendMessage("Arena click! " + blockxInt + " " + blockzInt + " Right Clicked: " + hasRightClicked); - } } + } else if(arenaClicked.hasPlayer() && arenaClicked.getArenaStatus() == ArenaStatus.COMPLETED && !hasRightClicked){ + plugin.getManager().getSchedulerGameOver().cancel(); + plugin.getManager().leaveArena(arenaClicked.getCurrentPlayer(), false); } } else { arena = plugin.getArenaList().getArenaAtBlock(block); diff --git a/src/main/java/de/lunarakai/minecleaner/MinecleanerManager.java b/src/main/java/de/lunarakai/minecleaner/MinecleanerManager.java index f3cb3a5..071e0fd 100644 --- a/src/main/java/de/lunarakai/minecleaner/MinecleanerManager.java +++ b/src/main/java/de/lunarakai/minecleaner/MinecleanerManager.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; -import java.util.Set; import java.util.UUID; import java.util.function.Consumer; import org.bukkit.Bukkit; @@ -13,12 +12,11 @@ import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.Sound; import org.bukkit.World; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitTask; import org.jetbrains.annotations.NotNull; import com.google.common.base.Preconditions; import de.iani.cubesidestats.api.PlayerStatistics; @@ -37,6 +35,7 @@ public class MinecleanerManager { private final MinecleanerPlugin plugin; private final Inventory confirmPlayingInventory; private final HashMap sizes; + public BukkitTask schedulerGameOver; // Statistics private final StatisticKey statisticsWonGamesTotal; @@ -174,12 +173,12 @@ public class MinecleanerManager { ps.increaseScore(sg, 1); } - Bukkit.getScheduler().runTaskLater(plugin, () -> { - if(arena.getCurrentPlayer() == null) { - arena.removePlayer(); - } else { + schedulerGameOver = Bukkit.getScheduler().runTaskLater(plugin, () -> { + if (arena.getCurrentPlayer() == null) { + arena.removePlayer(); + } else { leaveArena(player, false); - } + } }, plugin.getManager().getSettingsValue("resettime", player) * 20L); return; } @@ -235,7 +234,7 @@ public class MinecleanerManager { player.sendMessage(ChatColor.YELLOW + "Glückwunsch, du konntest das " + plugin.getDisplayedPluginName() + "-Feld in " + ChatColor.RED + MinecleanerStringUtil.timeToString(millis, false) + ChatColor.YELLOW + " erfolgreich lösen!"); } - Bukkit.getScheduler().runTaskLater(plugin, () -> { + schedulerGameOver = Bukkit.getScheduler().runTaskLater(plugin, () -> { if(arena.getCurrentPlayer() == null) { arena.removePlayer(); } else { @@ -463,5 +462,7 @@ public class MinecleanerManager { return minecleanerAdditionalDisplaySettingKey; } - public SettingKey getMinecleanerResetTimeSettingKey() {return minecleanerResetTimerSettingKey; } + public SettingKey getMinecleanerResetTimeSettingKey() {return minecleanerResetTimerSettingKey; } + + public BukkitTask getSchedulerGameOver() { return schedulerGameOver; } }