Compare commits

...

36 commits

Author SHA1 Message Date
a89930a73a a little bit of refactoring 2025-01-21 17:22:27 +01:00
8c105bba58 eclipse specific gitignore additions 2024-11-06 01:57:19 +01:00
017a02a0c0 fixed compilation error + apparently more usage of translatable components 2024-11-06 01:52:58 +01:00
854fdd1c1d sound fix when in group 2024-05-31 19:03:46 +02:00
9f65250771 fixed stats command 2024-05-27 15:39:29 +02:00
31b18a98c9 sound 2024-05-25 22:26:55 +02:00
63674eb9ef forgot something, whoops 2024-05-25 21:59:01 +02:00
a308cc9546 only creator of group can start game (no spam from other members) 2024-05-25 21:55:13 +02:00
d5536db37f more switching to translatable stuff 2024-05-25 18:54:15 +02:00
e17b7fcc1e accept/deny invites by clicking 2024-05-25 17:53:08 +02:00
7e171194ce more stuff (tm) 2024-05-25 17:16:34 +02:00
e4e973449b stuff (tm) 2024-05-24 22:22:32 +02:00
37ebd2a743 fixed small bugs 2024-05-17 00:44:16 +02:00
558f113f9d help me 2024-05-16 21:48:18 +02:00
12c58e86a2 Merge branch “duo_mode” 2024-05-16 18:42:05 +02:00
5df021e3dd a little bit less spaghetti and statistics should work for groups now 2024-05-16 15:17:35 +02:00
50f51126bb field resets when group creator is too far away, still spaghetti 2024-05-16 12:52:48 +02:00
70605461ef duo mode works but spaghetti (+ 2 small known bugs) 2024-05-16 12:28:45 +02:00
45ad276699 i'm very eepy, but it compiles and works normally if you don't interact with the group system uwu 2024-05-16 00:29:56 +02:00
b57e9ff410 start duo 2024-05-15 21:48:43 +02:00
b7e97212ac translatable DeleteCommand 2024-05-15 19:12:31 +02:00
583f8a1257 translatable StatsCommand 2024-05-15 18:55:12 +02:00
2bc7a3979e Merge branch “1.20.6” 2024-05-15 13:51:58 +02:00
f09c9772b2 whoops 2024-05-13 22:16:50 +02:00
75768ea587 nullpointer + settingsinv 2024-05-13 22:13:44 +02:00
b1193d4687 1.20.6 2024-05-09 22:26:37 +02:00
0f349c3ea0 1.2.0-dev 2024-05-09 22:02:48 +02:00
d0c27ae733 1.2.0-dev 2024-05-05 01:28:26 +02:00
94d796e09b started work on translatable Strings (CreateCommand) 2024-05-05 01:23:10 +02:00
e2c84ec436 readme 2024-05-04 23:27:33 +02:00
b773d0e490 this should fix #4 or i will cry 2024-05-03 22:55:49 +02:00
36e96a50e8 pls fix issues #3, #4, #5 and #6 or i might become a goose farmer /s 2024-05-03 22:45:25 +02:00
4e283a77b1 players can manually activate manual reset 2024-05-03 19:38:53 +02:00
d4a6b64ae5 manual reset on left click 2024-05-02 20:00:19 +02:00
482fc1e22d 1.20.6 + resettime for fields is now customizable 2024-05-02 15:25:27 +02:00
4ab4a1bec4 dependencies & stuff 2024-04-14 20:59:46 +02:00
35 changed files with 1905 additions and 317 deletions

6
.gitignore vendored
View file

@ -114,3 +114,9 @@ buildNumber.properties
# Common working directory # Common working directory
run/ run/
# eclipse
/.classpath
/.project
/.settings
/target

6
README.md Normal file
View file

@ -0,0 +1,6 @@
# Minecleaner
Minecleaner is a Minecraft Implementation of the classic game "Minesweeper". Made using [Paper](https://papermc.io/).
## Important
Before opening an issue on the [GitHub Repo](https://github.com/LunarAkai/Minecleaner) of this Project, please check the issues page on my personal git server [here](https://git.lunarakai.de/LunarAkai/NewMinecleaner/issues) to see if this Bug / Issue is already on my list.

View file

@ -6,7 +6,7 @@
<groupId>de.lunarakai</groupId> <groupId>de.lunarakai</groupId>
<artifactId>Minecleaner</artifactId> <artifactId>Minecleaner</artifactId>
<version>1.1.4</version> <version>1.2.0-dev</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Minecleaner</name> <name>Minecleaner</name>
@ -86,7 +86,7 @@
<dependency> <dependency>
<groupId>io.papermc.paper</groupId> <groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId> <artifactId>paper-api</artifactId>
<version>1.20.4-R0.1-SNAPSHOT</version> <version>1.21.3-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>

View file

@ -2,10 +2,14 @@ package de.lunarakai.minecleaner;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
import de.lunarakai.minecleaner.utils.MinecleanerUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@ -97,6 +101,13 @@ public class ArenaList {
save(); save();
} }
/**
* checks for any other arena that might be at the same location as the new MinecleanerArena
*
* @param newArena the new Arena that is set to be created
* @return true if another MinecleanerArena (or at least one Block of another arena) is at the same location as newArena otherwise false
* @see MinecleanerArena
*/
public boolean collidesWithArena(MinecleanerArena newArena) { public boolean collidesWithArena(MinecleanerArena newArena) {
for(Location location : newArena.getBlocks()) { for(Location location : newArena.getBlocks()) {
if(arenaBlocks.get(location) != null) { if(arenaBlocks.get(location) != null) {
@ -106,16 +117,74 @@ public class ArenaList {
return false; return false;
} }
public void setArenaForPlayer(Player player, MinecleanerArena arena) { public void setArenaForPlayers(Player[] players, MinecleanerArena arena) {
if(arena != null) { if(arena != null) {
playersInArena.put(player.getUniqueId(), arena); for(int i = 0; i < players.length; i++) {
playersInArena.put(players[i].getUniqueId(), arena);
}
} else { } else {
playersInArena.remove(player.getUniqueId()); for(int i = 0; i < players.length; i++) {
playersInArena.remove(players[i].getUniqueId());
}
} }
} }
public MinecleanerArena getPlayerArena(Player player) { public MinecleanerArena getPlayerArena(Player player) {
return playersInArena.get(player.getUniqueId()); if(playersInArena.get(player.getUniqueId()) == null) {
return null;
}
int arraySize = MinecleanerUtils.isPlayerInGroup(plugin, player) ? plugin.getGroupManager().getGroupSize(player) : 1;
Player[] players = new Player[arraySize];
if(plugin.getGroupManager().getGroup(player) != null) {
int i = 0;
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
players[i] = iteratorPlayer;
i++;
}
} else {
Arrays.fill(players, player);
}
return getPlayerArena(players);
}
public MinecleanerArena getPlayerArena(Player[] players) {
return playersInArena.get(players[0].getUniqueId());
// if(plugin.getGroupManager().getGroup(players[0]) != null) {
// if(players.length == 1) {
// return null;
// }
// MinecleanerArena[] arenas = new MinecleanerArena[players.length];
// for(int i = 0; i < players.length; i++) {
// if(playersInArena.get(players[i].getUniqueId()) != null) {
// if(playersInArena.get(Bukkit.getPlayer(plugin.getGroupManager().getGroup(players[0]).getOwner()).getUniqueId()) != null) {
// arenas[i] = playersInArena.get(players[i].getUniqueId());
// continue;
// }
// arenas[i] = null;
// } else {
// arenas = null;
// }
// }
// if(playersInArena.get(players[0].getUniqueId()) == null) {
// return null;
// }
//
// if(arenas != null && arenas[0] != null) {
// MinecleanerArena[] finalArenas = arenas;
// boolean match = Arrays.stream(arenas).allMatch(s -> s.equals(finalArenas[0]));
// if(match) {
// return arenas[0];
// } else {
// return null;
// }
// }
// return null;
//
// } else {
// return playersInArena.get(players[0].getUniqueId());
// }
} }
public MinecleanerArena getArenaAtBlock(Block block) { public MinecleanerArena getArenaAtBlock(Block block) {
@ -127,21 +196,30 @@ public class ArenaList {
} }
public void removeArena(MinecleanerArena arena) { public void removeArena(MinecleanerArena arena) {
if(arena.hasPlayer()) { if(arena.hasPlayers()) {
plugin.getManager().leaveArena(arena.getCurrentPlayer(), true); plugin.getManager().leaveArena(arena.getCurrentPlayers(), true, true);
} }
for(UUID id : arena.getBlockDisplays()) { removeArenaBlockDisplayIDs(arena);
if(id != null) { removeArenaBlocks(arena);
arenaBlockDisplays.remove(id);
}
}
for(Location block : arena.getBlocks()) {
arenaBlocks.remove(block);
}
arena.removeBlockDisplays(); arena.removeBlockDisplays();
arenas.remove(arena.getName()); arenas.remove(arena.getName());
save(); save();
} }
private void removeArenaBlocks(MinecleanerArena arena) {
for(Location block : arena.getBlocks()) {
arenaBlocks.remove(block);
}
}
private void removeArenaBlockDisplayIDs(MinecleanerArena arena) {
for(UUID id : arena.getBlockDisplays()) {
if(id != null) {
arenaBlockDisplays.remove(id);
}
}
}
} }

View file

@ -1,8 +1,35 @@
package de.lunarakai.minecleaner; package de.lunarakai.minecleaner;
/**
* Possible Status of a MinecleanerArena
* <li>{@link #INACTIVE}</li>
* <li>{@link #CONFIRM_PLAYING}</li>
* <li>{@link #PLAYING}</li>
* <li>{@link #COMPLETED}</li>
*
* @see MinecleanerArena
*
*/
public enum ArenaStatus { public enum ArenaStatus {
/**
* default state
*/
INACTIVE, INACTIVE,
/**
* Active when the player (or group leader) has interacted with an {@link #INACTIVE} arena and
* sees the confirmPlayingInventory to decide if they start a Game or not
* @see MinecleanerManager#getConfirmPlayingInventory()
*/
CONFIRM_PLAYING, CONFIRM_PLAYING,
/**
* Active when a Player (or Group) has confirmed to start a Minecleaner Game (and while playing)
*/
PLAYING, PLAYING,
/**
* Active when a Player (or Group) has either won or lost a Mineclenaer Game and the Arena the scheduled for a reset -> {@link #INACTIVE}
*/
COMPLETED COMPLETED
} }

View file

@ -10,11 +10,10 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ChatMessageType; import org.bukkit.Bukkit;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
@ -44,7 +43,7 @@ public class MinecleanerArena {
private TextDisplay textDisplay; private TextDisplay textDisplay;
private boolean hasMadeFirstClick = false; private boolean hasMadeFirstClick = false;
private int flagsPlaced = 0; private int flagsPlaced = 0;
private Player currentPlayer; private Player[] currentPlayers;
private long currentGameStartTime; private long currentGameStartTime;
private long ingameTime; private long ingameTime;
private Game currentMinecleanerGame; private Game currentMinecleanerGame;
@ -236,13 +235,13 @@ public class MinecleanerArena {
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
if(arenaStatus == ArenaStatus.PLAYING && currentPlayer != null) { if(arenaStatus == ArenaStatus.PLAYING && currentPlayers != null) {
if(!currentMinecleanerGame.gameover) { if(!currentMinecleanerGame.gameover) {
ingameTime++; ingameTime++;
} }
if(plugin.isStatisticsEnabled()) { if(plugin.isStatisticsEnabled()) {
if(plugin.getManager().getSettingsValue("additionaldisplay", currentPlayer) != 0 if(plugin.getManager().getSettingsValue("additionaldisplay", currentPlayers[0]) != 0
|| plugin.getManager().getSettingsValue("timer", currentPlayer) != 0) { || plugin.getManager().getSettingsValue("timer", currentPlayers[0]) != 0) {
updateIngameInfoTexts(); updateIngameInfoTexts();
} }
} }
@ -255,21 +254,24 @@ public class MinecleanerArena {
} }
public void addJoiningPlayer(Player player) { public void addJoiningPlayers(Player[] players) {
Preconditions.checkNotNull(player); Preconditions.checkNotNull(players);
Preconditions.checkState(arenaStatus == ArenaStatus.INACTIVE); Preconditions.checkState(arenaStatus == ArenaStatus.INACTIVE);
this.arenaStatus = ArenaStatus.CONFIRM_PLAYING; this.arenaStatus = ArenaStatus.CONFIRM_PLAYING;
this.currentPlayer = player; this.currentPlayers = players;
} }
public void removePlayer() { public void removePlayers() {
int sizeWidth = BoardSize.boardSizesWidth[widthIndex]; int sizeWidth = BoardSize.boardSizesWidth[widthIndex];
int sizeHeight = BoardSize.boardSizesHeight[widthIndex]; int sizeHeight = BoardSize.boardSizesHeight[widthIndex];
this.arenaStatus = ArenaStatus.INACTIVE; this.arenaStatus = ArenaStatus.INACTIVE;
this.currentPlayer = null; this.currentPlayers = null;
this.currentMinecleanerGame = null; this.currentMinecleanerGame = null;
// load chunk of block -1 and x+1
// loadBlockChunk();
for (int x = 0; x < sizeWidth; x++) { for (int x = 0; x < sizeWidth; x++) {
for (int y = 0; y < sizeHeight; y++) { for (int y = 0; y < sizeHeight; y++) {
setDiplayBlock(x, y, MinecleanerHeads.MINESWEEPER_TILE_UNKNOWN, true); setDiplayBlock(x, y, MinecleanerHeads.MINESWEEPER_TILE_UNKNOWN, true);
@ -279,6 +281,63 @@ public class MinecleanerArena {
removeTextDisplay(); removeTextDisplay();
} }
// private void loadBlockChunk() {
//
// BlockFace orientation = getOrientation();
// Location loc1 = this.getLocation();
// Location loc2 = this.getLocation();
// double x;
// double z;
//
// switch (orientation) {
// case NORTH:
// // Block -1:
// // x: +1
// x = loc1.x() + 3.0;
// loc1 = new Location(loc1.getWorld(), x, loc1.y(), loc1.z());
// // Block width+1:
// // x: -1;
// x = loc2.x() - (double) getArenaWidth()/4 - 1;
// loc2 = new Location(loc2.getWorld(), x, loc2.y(), loc2.z());
// break;
// case EAST:
// // Block -1:
// // z: +1
// z = loc1.z() + 3.0;
// loc1 = new Location(loc2.getWorld(), loc2.x(), loc2.y(), z);
// // Block width+1:
// // z: -1;
// z = loc2.z() - (double) getArenaWidth()/4 - 1;
// loc2 = new Location(loc2.getWorld(), loc2.x(), loc2.y(), z);
// break;
// case SOUTH:
// // Block -1:
// // x: -1
// x = loc1.x() - 3.0;
// loc1 = new Location(loc1.getWorld(), x, loc1.y(), loc1.z());
// // Block width+1:
// // x: +1;
// x = loc2.x() + (double) getArenaWidth()/4 + 1;
// loc2 = new Location(loc2.getWorld(), x, loc2.y(), loc2.z());
// break;
// case WEST:
// // Block -1:
// // z: -1
// z = loc1.z() - 3.0 ;
// loc1 = new Location(loc2.getWorld(), loc2.x(), loc2.y(), z);
// // Block width+1:
// // z: +1;
// z = loc2.z() + (double) getArenaWidth()/4 - 1;
// loc2 = new Location(loc2.getWorld(), loc2.x(), loc2.y(), z);
// break;
// }
//
// plugin.getLogger().log(Level.WARNING, "Loc1: " + loc1);
// plugin.getLogger().log(Level.WARNING, "Loc2: " + loc2);
// loc1.getWorld().getChunkAt(loc1).load();
// loc2.getWorld().getChunkAt(loc2).load();
// }
public void showStartHeads() { public void showStartHeads() {
int width = BoardSize.boardSizesWidth[widthIndex]; int width = BoardSize.boardSizesWidth[widthIndex];
int height = BoardSize.boardSizesHeight[widthIndex]; int height = BoardSize.boardSizesHeight[widthIndex];
@ -323,8 +382,8 @@ public class MinecleanerArena {
} }
private void showTextDisplay() { private void showTextDisplay() {
Player player = this.getCurrentPlayer(); Player[] players = this.getCurrentPlayers();
World world = player.getWorld(); World world = players[0].getWorld();
double textCenterX = centerLocation.getX(); double textCenterX = centerLocation.getX();
double textCenterY = centerLocation.getY() + ((double) BoardSize.boardSizesHeight[widthIndex] / 3 - 2.75 - widthIndex); double textCenterY = centerLocation.getY() + ((double) BoardSize.boardSizesHeight[widthIndex] / 3 - 2.75 - widthIndex);
@ -358,7 +417,7 @@ public class MinecleanerArena {
} }
} }
Location textDisplayLocation = new Location(player.getWorld(), textCenterX, textCenterY, textCenterZ); Location textDisplayLocation = new Location(players[0].getWorld(), textCenterX, textCenterY, textCenterZ);
textDisplay = world.spawn(textDisplayLocation.add(-1, 2 + widthIndex, -0.25), TextDisplay.class, textdisplay -> { textDisplay = world.spawn(textDisplayLocation.add(-1, 2 + widthIndex, -0.25), TextDisplay.class, textdisplay -> {
Transformation transformation = textdisplay.getTransformation(); Transformation transformation = textdisplay.getTransformation();
@ -386,12 +445,14 @@ public class MinecleanerArena {
public void updateIngameInfoTexts() { public void updateIngameInfoTexts() {
String timer = ""; String timer = "";
if(plugin.isStatisticsEnabled()) { if(plugin.isStatisticsEnabled()) {
if(plugin.getManager().getSettingsValue("timer", currentPlayer) != 0) { if(plugin.getManager().getSettingsValue("timer", currentPlayers[0]) != 0) {
timer = ChatColor.GOLD + " Zeit: " + MinecleanerStringUtil.timeToString((ingameTime/20)*1000, true) + " "; timer = ChatColor.GOLD + " Zeit: " + MinecleanerStringUtil.timeToString((ingameTime/20)*1000, true) + " ";
} }
if(plugin.getManager().getSettingsValue("additionaldisplay", currentPlayer) != 0 && plugin.isStatisticsEnabled()) { if(plugin.getManager().getSettingsValue("additionaldisplay", currentPlayers[0]) != 0 && plugin.isStatisticsEnabled()) {
String componentActionBar = ChatColor.GREEN + "Flaggen gesetzt: " + flagsPlaced + ChatColor.RED + " Minen insgesamt: " + BoardSize.mineCounter[widthIndex]; String componentActionBar = ChatColor.GREEN + "Flaggen gesetzt: " + flagsPlaced + ChatColor.RED + " Minen insgesamt: " + BoardSize.mineCounter[widthIndex];
currentPlayer.sendActionBar(Component.text(componentActionBar + " " + timer)); for(int i = 0; i < currentPlayers.length; i++) {
currentPlayers[i].sendActionBar(Component.text(componentActionBar + " " + timer));
}
} }
} }
@ -436,11 +497,15 @@ public class MinecleanerArena {
if (currentMinecleanerGame != null && !currentMinecleanerGame.gameover) { if (currentMinecleanerGame != null && !currentMinecleanerGame.gameover) {
Cell cell = currentMinecleanerGame.getCell(x, y); Cell cell = currentMinecleanerGame.getCell(x, y);
if (!cell.isRevealed()) { if (!cell.isRevealed()) {
Player player = this.currentPlayer; Player[] players = this.currentPlayers;
currentMinecleanerGame.flag(x, y); currentMinecleanerGame.flag(x, y);
if (currentMinecleanerGame.gameover) { if (currentMinecleanerGame.gameover) {
plugin.getManager().handleGameover(player, this, true); Bukkit.getScheduler().runTaskLater(plugin, () -> {
arenaStatus = ArenaStatus.COMPLETED;
}, 5L);
plugin.getManager().handleGameover(players, this, true);
} }
if (cell.isFlagged() == true) { if (cell.isFlagged() == true) {
flagsPlaced = flagsPlaced + 1; flagsPlaced = flagsPlaced + 1;
@ -460,7 +525,7 @@ public class MinecleanerArena {
if (currentMinecleanerGame != null && !currentMinecleanerGame.gameover) { if (currentMinecleanerGame != null && !currentMinecleanerGame.gameover) {
Cell cell = currentMinecleanerGame.getCell(x, y); Cell cell = currentMinecleanerGame.getCell(x, y);
if (!cell.isFlagged()) { if (!cell.isFlagged()) {
Player player = this.currentPlayer; Player[] players = this.currentPlayers;
if (!hasMadeFirstClick) { if (!hasMadeFirstClick) {
currentMinecleanerGame.firstClick(x, y); currentMinecleanerGame.firstClick(x, y);
@ -471,7 +536,10 @@ public class MinecleanerArena {
setBlockForCellType(x, y, cell); setBlockForCellType(x, y, cell);
if (currentMinecleanerGame.gameover) { if (currentMinecleanerGame.gameover) {
plugin.getManager().handleGameover(player, this, !(cell.isRevealed() && cell.isExploded())); Bukkit.getScheduler().runTaskLater(plugin, () -> {
arenaStatus = ArenaStatus.COMPLETED;
}, 5L);
plugin.getManager().handleGameover(players, this, !(cell.isRevealed() && cell.isExploded()));
} else { } else {
updateIngameInfoTexts(); updateIngameInfoTexts();
} }
@ -626,12 +694,12 @@ public class MinecleanerArena {
return name; return name;
} }
public boolean hasPlayer() { public boolean hasPlayers() {
return currentPlayer != null; return currentPlayers != null;
} }
public Player getCurrentPlayer() { public Player[] getCurrentPlayers() {
return currentPlayer; return currentPlayers;
} }
public Location getLocation() { public Location getLocation() {
@ -660,10 +728,16 @@ public class MinecleanerArena {
return currentGameStartTime; return currentGameStartTime;
} }
public Game getCurrentMinecleanerGame() { return currentMinecleanerGame; }
public int getWidthIndex() { public int getWidthIndex() {
return widthIndex; return widthIndex;
} }
public void setArenaStaus(ArenaStatus status) {
this.arenaStatus = status;
}
private int getRotationYaw() { private int getRotationYaw() {
return switch (orientation) { return switch (orientation) {
case EAST -> 90; case EAST -> 90;
@ -672,4 +746,5 @@ public class MinecleanerArena {
default -> 0; default -> 0;
}; };
} }
} }

View file

@ -0,0 +1,155 @@
package de.lunarakai.minecleaner;
import de.lunarakai.minecleaner.utils.ChatUtils;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class MinecleanerGroupManager {
public class MinecleanerGroup {
public UUID owner;
public HashSet<UUID> players;
public Set<UUID> invitedPlayers;
public MinecleanerGroup(UUID owner){
this.owner = owner;
this.players = new HashSet<>();
this.invitedPlayers = new HashSet<>();
players.add(owner);
}
public UUID getOwner() {
return owner;
}
public Set<UUID> getInvitedPlayers() {
return invitedPlayers;
}
public HashSet<UUID> getPlayers() {
return players;
}
public void addPlayerToGroup(Player player) {
UUID playerUUID = player.getUniqueId();
if(!isPlayerInvited(playerUUID)) {
return;
}
invitedPlayers.remove(playerUUID);
players.add(playerUUID);
}
public void removePlayerFromGroup(Player player) {
UUID playerUUID = player.getUniqueId();
if(getOwner() == playerUUID) {
for(Iterator<UUID> iterator = getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
if(getOwner() == iterator.next()) {
continue;
}
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, "group.creator.removed");
}
deleteGroup(getGroup(Bukkit.getPlayer(owner)));
}
players.remove(playerUUID);
if(players.size() < 2) {
ChatUtils.sendSimpleInfoMessage(Bukkit.getPlayer(owner), "group.dismantled.alone");
deleteGroup(getGroup(Bukkit.getPlayer(owner)));
}
}
public boolean isPlayerInvited(UUID playerUUID) {
return invitedPlayers.contains(playerUUID);
}
public boolean isInGroup(UUID playerUUID) {
return players.contains(playerUUID) || owner.equals(playerUUID);
}
public boolean invitePlayerToGroup(Player player) {
UUID playerUUID = player.getUniqueId();
if(isPlayerInvited(playerUUID) || isInGroup(playerUUID))
return false;
invitedPlayers.add(player.getUniqueId());
return true;
}
public void removePlayerFromInvitedList(Player player) {
UUID playerUUID = player.getUniqueId();
if(!isPlayerInvited(playerUUID)) {
return;
}
invitedPlayers.remove(playerUUID);
}
}
private final Set<MinecleanerGroup> groups;
public MinecleanerGroupManager() {
this.groups = new HashSet<>();
}
public void createGroup(Player player) {
if (getGroup(player) != null) {
return;
}
groups.add(new MinecleanerGroup(player.getUniqueId()));
}
public MinecleanerGroup getGroup(Player player){
UUID playerUUID = player.getUniqueId();
for (MinecleanerGroup group : groups) {
if (group.isInGroup(playerUUID)) {
return group;
}
}
return null;
}
/**
* loops through all MinecleanerGroups to check if the player is invited to any group
*
* @param player Minecraft Player
* @return the MinecleanerGroup the Player is invited to or null
*/
public MinecleanerGroup getInvitedGroup(Player player){
UUID playerUUID = player.getUniqueId();
for (MinecleanerGroup group : groups) {
if (group.isPlayerInvited(playerUUID)) {
return group;
}
}
return null;
}
public void deleteGroup(MinecleanerGroup minecleanerGroup) {
groups.remove(minecleanerGroup);
}
/**
* removes all MinecleanerGroups
*/
public void deleteAllGroups() {
groups.clear();
}
/**
* Returns the size of the MinecleanerGroup the player is in
*
* @param player the Minecraft Player
* @return the size of the group the player is in
*/
public int getGroupSize(Player player) {
return getGroup(player).getPlayers().size();
}
}

View file

@ -1,6 +1,11 @@
package de.lunarakai.minecleaner; package de.lunarakai.minecleaner;
import de.lunarakai.minecleaner.utils.ChatUtils;
import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.UUID;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -20,7 +25,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.util.RayTraceResult; import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import net.md_5.bungee.api.ChatColor;
public class MinecleanerListener implements Listener { public class MinecleanerListener implements Listener {
private final MinecleanerPlugin plugin; private final MinecleanerPlugin plugin;
@ -38,7 +42,18 @@ public class MinecleanerListener implements Listener {
if(arena != null) { if(arena != null) {
e.setCancelled(true); e.setCancelled(true);
MinecleanerArena arenaClicked = plugin.getArenaList().getArenaAtBlock(block); MinecleanerArena arenaClicked = plugin.getArenaList().getArenaAtBlock(block);
if(arenaClicked == arena && arena.getArenaStatus() == ArenaStatus.PLAYING) {
if(arenaClicked != arena) {
return;
}
boolean hasRightClicked = false;
if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
hasRightClicked = true;
}
if(arena.getCurrentMinecleanerGame() != null && !arena.getCurrentMinecleanerGame().gameover && (arena.getArenaStatus() == ArenaStatus.PLAYING || arena.getArenaStatus() == ArenaStatus.COMPLETED)) {
if(arena.getArenaStatus() == ArenaStatus.PLAYING) {
int d0x = arena.getOrientation().getModX(); int d0x = arena.getOrientation().getModX();
int d0z = arena.getOrientation().getModZ(); int d0z = arena.getOrientation().getModZ();
int d1x = -d0z; int d1x = -d0z;
@ -68,28 +83,48 @@ public class MinecleanerListener implements Listener {
blockx -= blockxInt; blockx -= blockxInt;
blockz -= blockzInt; blockz -= blockzInt;
boolean hasRightClicked = false; if(blockzInt < arena.getArenaWidth() && blockxInt < arena.getArenaHeight()) {
if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
hasRightClicked = true;
}
if(blockzInt < arena.getArenaWidth() && blockxInt < arenaClicked.getArenaHeight()) {
plugin.getManager().handleFieldClick(e.getPlayer(), blockzInt, blockxInt, hasRightClicked); plugin.getManager().handleFieldClick(e.getPlayer(), blockzInt, blockxInt, hasRightClicked);
} }
//player.sendMessage("Arena click! " + blockxInt + " " + blockzInt + " Right Clicked: " + hasRightClicked); //player.sendMessage("Arena click! " + blockxInt + " " + blockzInt + " Right Clicked: " + hasRightClicked);
} }
} }
} }
} else if(arena.hasPlayers() && arena.getArenaStatus() == ArenaStatus.COMPLETED && !hasRightClicked && (plugin.getManager().getSettingsValue("allowmanualreset", e.getPlayer()) == 1)) {
plugin.getManager().getSchedulerGameOver().cancel();
plugin.getLogger().log(Level.INFO, "canceled reset for arena " + arena.getName() + " loc: " + arena.getLocation());
plugin.getManager().leaveArena(arenaClicked.getCurrentPlayers(), false, true);
}
} else { } else {
arena = plugin.getArenaList().getArenaAtBlock(block); arena = plugin.getArenaList().getArenaAtBlock(block);
if(arena != null) { if(arena != null) {
e.setCancelled(true); e.setCancelled(true);
if(e.getHand() == EquipmentSlot.HAND) { if(e.getHand() == EquipmentSlot.HAND) {
if(arena.getArenaStatus() == ArenaStatus.INACTIVE) { if(arena.getArenaStatus() == ArenaStatus.INACTIVE) {
plugin.getManager().joinArena(e.getPlayer(), arena); int arraySize = 1;
if(plugin.getGroupManager().getGroup(e.getPlayer()) != null) {
arraySize = plugin.getGroupManager().getGroup(e.getPlayer()).getPlayers().size();
}
if(plugin.getGroupManager().getGroup(e.getPlayer()) != null && plugin.getGroupManager().getGroup(e.getPlayer()).getOwner() != e.getPlayer().getUniqueId()) {
ChatUtils.sendSimpleWarningMessage(e.getPlayer(), "group.game.nopermission");
return;
}
Player[] players = new Player[arraySize];
if(plugin.getGroupManager().getGroup(e.getPlayer()) != null) {
int i = 0;
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(e.getPlayer()).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
players[i] = iteratorPlayer;
i++;
}
} else { } else {
e.getPlayer().sendMessage(ChatColor.YELLOW + "Hier spielt schon jemand anderes"); Arrays.fill(players, e.getPlayer());
}
plugin.getManager().joinArena(players, arena);
} else {
ChatUtils.sendSimpleInfoMessage(e.getPlayer(), "Hier spielt schon jemand anderes");
} }
} }
} }
@ -115,49 +150,22 @@ public class MinecleanerListener implements Listener {
int slot = e.getRawSlot(); int slot = e.getRawSlot();
boolean hasConfirmed = slot == 1 ? true : false; boolean hasConfirmed = slot == 1 ? true : false;
if(hasConfirmed) { if(hasConfirmed) {
plugin.getManager().startGame(player); Player[] players;
if(plugin.getGroupManager().getGroup(player) != null) {
players = new Player[plugin.getGroupManager().getGroupSize(player)];
players[0] = player;
} else {
players = new Player[1];
players[0] = player;
}
plugin.getManager().startGame(players);
//player.closeInventory(); //player.closeInventory();
} }
player.closeInventory(); player.closeInventory();
} }
} }
} }
if(e.getInventory().equals(plugin.getManager().getSettingsInventory())) {
e.setCancelled(true);
int slot = e.getRawSlot();
switch (slot) {
case 12: {
if(plugin.getManager().getSettingsValue("additionaldisplay", player) == 0) {
plugin.getManager().updateSettingsValue("additionaldisplay", 1, player);
player.closeInventory();
player.openInventory(plugin.getManager().showSettingsInventory(player));
} else {
plugin.getManager().updateSettingsValue("additionaldisplay", 0, player);
player.closeInventory();
player.openInventory(plugin.getManager().showSettingsInventory(player));
}
break;
}
case 14: {
if(plugin.getManager().getSettingsValue("timer", player) == 0) {
plugin.getManager().updateSettingsValue("timer", 1, player);
player.closeInventory();
player.openInventory(plugin.getManager().showSettingsInventory(player));
} else {
plugin.getManager().updateSettingsValue("timer", 0, player);
if(arena != null) {
arena.updateIngameInfoTexts();
}
player.closeInventory();
player.openInventory(plugin.getManager().showSettingsInventory(player));
}
break;
}
default: {
break;
}
}
}
} }
} }
@ -167,7 +175,18 @@ public class MinecleanerListener implements Listener {
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player); MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player);
if(arena != null) { if(arena != null) {
if(arena.getArenaStatus() == ArenaStatus.CONFIRM_PLAYING && e.getInventory().equals(plugin.getManager().getConfirmPlayingInventory())) { if(arena.getArenaStatus() == ArenaStatus.CONFIRM_PLAYING && e.getInventory().equals(plugin.getManager().getConfirmPlayingInventory())) {
plugin.getManager().leaveArena(player, false); int arraySize = plugin.getGroupManager().getGroup(player) != null ? plugin.getGroupManager().getGroupSize(player) : 1;
Player[] players = new Player[arraySize];
if(plugin.getGroupManager().getGroup(player) != null) {
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
Arrays.fill(players, iteratorPlayer);
}
} else {
Arrays.fill(players, player);
}
plugin.getManager().leaveArena(players, false, true);
} }
} }
} }
@ -178,19 +197,104 @@ public class MinecleanerListener implements Listener {
final Player player = e.getPlayer(); final Player player = e.getPlayer();
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player); MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player);
if(arena != null) { if(arena != null) {
if(arena.isTooFarAway(player)) { if(plugin.getGroupManager().getGroup(player) == null) {
player.sendMessage(ChatColor.YELLOW + "Du hast dich zu weit von der Arena entfernt. Das Spiel wurde abgebrochen."); if((arena.isTooFarAway(player))) {
plugin.getManager().leaveArena(player, false); ChatUtils.sendSimpleInfoMessage(player, "arena.common.toofaraway");
Player[] players = new Player[] {
player
};
plugin.getManager().leaveArena(players, false, true);
}
} else {
Player ownerPlayer = Bukkit.getPlayer(plugin.getGroupManager().getGroup(player).getOwner());
if(ownerPlayer.equals(player)) {
if(arena.isTooFarAway(ownerPlayer)) {
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
if(iteratorPlayer == ownerPlayer) {
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, "arena.common.toofaraway");
continue;
}
assert iteratorPlayer != null;
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, "arena.common.groupleadertoofaraway");
}
Player[] players = new Player[] {
ownerPlayer
};
plugin.getManager().leaveArena(players, false, true);
}
}
} }
} }
} }
@EventHandler @EventHandler
public void onPlayerQuit(PlayerQuitEvent e) { public void onPlayerQuit(PlayerQuitEvent e) {
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(e.getPlayer()); Player player = e.getPlayer();
MinecleanerGroupManager groupManager = plugin.getGroupManager();
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player);
if(arena != null) { if(arena != null) {
plugin.getManager().leaveArena(e.getPlayer(), false); if(groupManager.getGroup(player) != null) {
MinecleanerGroupManager.MinecleanerGroup group = groupManager.getGroup(player);
Player ownerPlayer = Bukkit.getPlayer(group.getOwner());
if(player == ownerPlayer) {
Player[] players = iterateOverGroupMembersOnCreatorPlayerQuit(player, groupManager, group);
plugin.getManager().leaveArena(players, false, true);
} else {
iterateOverGroupMembersOnPlayerQuit(player, group);
} }
} else {
Player[] players = new Player[] {
e.getPlayer()
};
plugin.getManager().leaveArena(players, false, true);
}
} else {
if(groupManager.getGroup(player) != null) {
MinecleanerGroupManager.MinecleanerGroup group = groupManager.getGroup(player);
Player ownerPlayer = Bukkit.getPlayer(group.getOwner());
if(player == ownerPlayer) {
iterateOverGroupMembersOnCreatorPlayerQuit(player, groupManager, group);
} else {
iterateOverGroupMembersOnPlayerQuit(player, group);
}
} else {
return;
}
}
}
private void iterateOverGroupMembersOnPlayerQuit(Player player, MinecleanerGroupManager.MinecleanerGroup group) {
Player[] players = new Player[group.players.size()];
int i = 0;
for(Iterator<UUID> iterator = group.getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
if(iteratorPlayer == player) {
i++;
continue;
}
players[i] = iteratorPlayer;
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, player.getName() + " hat den Server verlassen und wurde aus der Gruppe entfernt.");
}
group.removePlayerFromGroup(player);
}
private Player[] iterateOverGroupMembersOnCreatorPlayerQuit(Player player, MinecleanerGroupManager groupManager, MinecleanerGroupManager.MinecleanerGroup group) {
Player[] players = new Player[group.players.size()];
int i = 0;
for(Iterator<UUID> iterator = group.getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
if(iteratorPlayer == player) {
i++;
continue;
}
players[i] = iteratorPlayer;
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, "Die " + plugin.getDisplayedPluginName() + "gruppe in der du dich befindest wurde aufgelöst. Die Person, welche die Gruppe erstellt hat, hat den Server verlassen");
}
groupManager.deleteGroup(group);
return players;
} }
@EventHandler @EventHandler

View file

@ -1,23 +1,29 @@
package de.lunarakai.minecleaner; package de.lunarakai.minecleaner;
import de.iani.cubesidestats.api.SettingKey; import de.iani.cubesidestats.api.SettingKey;
import de.lunarakai.minecleaner.utils.ChatUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import de.iani.cubesidestats.api.PlayerStatistics; import de.iani.cubesidestats.api.PlayerStatistics;
@ -30,12 +36,13 @@ import de.iani.cubesideutils.bukkit.items.ItemStacks;
import de.iani.playerUUIDCache.CachedPlayer; import de.iani.playerUUIDCache.CachedPlayer;
import de.lunarakai.minecleaner.game.BoardSize; import de.lunarakai.minecleaner.game.BoardSize;
import de.lunarakai.minecleaner.utils.MinecleanerStringUtil; import de.lunarakai.minecleaner.utils.MinecleanerStringUtil;
import net.md_5.bungee.api.ChatColor;
// Todo: translatable components verwenden
public class MinecleanerManager { public class MinecleanerManager {
private final MinecleanerPlugin plugin; private final MinecleanerPlugin plugin;
private final Inventory confirmPlayingInventory; private final Inventory confirmPlayingInventory;
private final HashMap<Integer, String> sizes; private final HashMap<Integer, String> sizes;
public BukkitTask schedulerGameOver;
// Statistics // Statistics
private final StatisticKey statisticsWonGamesTotal; private final StatisticKey statisticsWonGamesTotal;
@ -49,6 +56,8 @@ public class MinecleanerManager {
private Inventory settingsInventory; private Inventory settingsInventory;
private SettingKey minecleanerSettingTimerKey; private SettingKey minecleanerSettingTimerKey;
private SettingKey minecleanerAdditionalDisplaySettingKey; private SettingKey minecleanerAdditionalDisplaySettingKey;
private SettingKey minecleanerResetTimerSettingKey;
private SettingKey minecleanerAllowManualResetSettingKey;
public MinecleanerManager(MinecleanerPlugin plugin) { public MinecleanerManager(MinecleanerPlugin plugin) {
this.plugin = plugin; this.plugin = plugin;
@ -60,10 +69,8 @@ public class MinecleanerManager {
this.sizes.put(3, "experte"); this.sizes.put(3, "experte");
this.confirmPlayingInventory = plugin.getServer().createInventory(null, InventoryType.HOPPER, plugin.getDisplayedPluginName() + " starten?"); this.confirmPlayingInventory = plugin.getServer().createInventory(null, InventoryType.HOPPER, plugin.getDisplayedPluginName() + " starten?");
this.confirmPlayingInventory.setItem(1, this.confirmPlayingInventory.setItem(1, ItemStacks.rename(new ItemStack(Material.GREEN_CONCRETE), NamedTextColor.GREEN + "Bestätigen"));
ItemStacks.lore(ItemStacks.rename(new ItemStack(Material.GREEN_CONCRETE), ChatColor.GREEN + "Bestätigen"))); this.confirmPlayingInventory.setItem(3, ItemStacks.rename(new ItemStack(Material.GREEN_CONCRETE), NamedTextColor.RED + "Abbrechen"));
this.confirmPlayingInventory.setItem(3,
ItemStacks.lore(ItemStacks.rename(new ItemStack(Material.RED_CONCRETE), ChatColor.RED + "Abbrechen")));
// Settings // Settings
@ -76,6 +83,14 @@ public class MinecleanerManager {
minecleanerAdditionalDisplaySettingKey.setDefault(0); minecleanerAdditionalDisplaySettingKey.setDefault(0);
minecleanerAdditionalDisplaySettingKey.setDisplayName("Zusätzliche Anzeige in der Action Bar"); minecleanerAdditionalDisplaySettingKey.setDisplayName("Zusätzliche Anzeige in der Action Bar");
minecleanerResetTimerSettingKey = plugin.getCubesideStatistics().getSettingKey("minecleaner.settings.resettime");
minecleanerResetTimerSettingKey.setDefault(5);
minecleanerResetTimerSettingKey.setDisplayName("Dauer die das Spielfeld für das Zurücksetzen brauchen soll");
minecleanerAllowManualResetSettingKey = plugin.getCubesideStatistics().getSettingKey("minecleaner.settings.allowmanualreset");
minecleanerAllowManualResetSettingKey.setDefault(0);
minecleanerAllowManualResetSettingKey.setDisplayName("Erlaube das manuelle Zurücksetzen des Spielfeldes");
this.settingsInventory = plugin.getServer().createInventory(null, InventoryType.CHEST, this.settingsInventory = plugin.getServer().createInventory(null, InventoryType.CHEST,
plugin.getDisplayedPluginName() + " Einstellungen"); plugin.getDisplayedPluginName() + " Einstellungen");
@ -118,71 +133,173 @@ public class MinecleanerManager {
this.statisticsTimeRecord = null; this.statisticsTimeRecord = null;
this.statisticsTotalGamesPlayed = null; this.statisticsTotalGamesPlayed = null;
} }
} }
public void joinArena(Player player, MinecleanerArena arena) { public void joinArena(Player[] players, MinecleanerArena arena) {
if (!player.hasPermission(MinecleanerPlugin.PERMISSION_PLAY)) { if ((plugin.getGroupManager().getGroup(players[0]) == null && !players[0].hasPermission(MinecleanerPlugin.PERMISSION_PLAY)) || (plugin.getGroupManager().getGroup(players[0]) != null && !Bukkit.getPlayer(plugin.getGroupManager().getGroup(players[0]).getOwner()).hasPermission(MinecleanerPlugin.PERMISSION_PLAY))) {
return; return;
} }
Preconditions.checkArgument(plugin.getArenaList().getPlayerArena(player) == null, "player is in an arena");
Preconditions.checkArgument(plugin.getArenaList().getPlayerArena(players) == null, "player is in an arena");
Preconditions.checkArgument(arena.getArenaStatus() == ArenaStatus.INACTIVE, "arena is in use"); Preconditions.checkArgument(arena.getArenaStatus() == ArenaStatus.INACTIVE, "arena is in use");
arena.addJoiningPlayer(player);
plugin.getArenaList().setArenaForPlayer(player, arena); arena.addJoiningPlayers(players);
player.openInventory(confirmPlayingInventory); plugin.getArenaList().setArenaForPlayers(players, arena);
for(int i = 0; i < players.length; i++) {
if(plugin.getGroupManager().getGroup(players[i]) == null) {
players[i].openInventory(confirmPlayingInventory);
break;
}
if(players[i] == Bukkit.getPlayer(plugin.getGroupManager().getGroup(players[i]).getOwner())) {
players[i].openInventory(confirmPlayingInventory);
}
}
} }
public void leaveArena(Player player, boolean message) { public void leaveArena(Player[] players, boolean message, boolean reset) {
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player); getGroupLeaderOrPlayer player = getGetGroupLeaderOrPlayer(players);
Preconditions.checkArgument(arena != null, "player is in no arena"); Player[] players1 = player.group() != null ? new Player[player.group().getPlayers().size()] : new Player[1];
arena.removePlayer(); if(plugin.getGroupManager().getGroup(players[0]) != null) {
plugin.getArenaList().setArenaForPlayer(player, null); int i = 0;
for(Iterator<UUID> iterator = player.group().getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
players1[i] = iteratorPlayer;
i++;
}
} else {
players1 = players;
}
Preconditions.checkArgument(player.arena() != null, "player is in no arena");
if(reset) {
player.arena().setArenaStaus(ArenaStatus.INACTIVE);
for(int i = 0; i < players1.length; i++) {
players1[i].closeInventory();
}
player.arena().removePlayers();
if(message) { if(message) {
player.sendMessage(ChatColor.YELLOW + "Das " + plugin.getDisplayedPluginName() + "spiel wurde abgebrochen."); for(int i = 0; i < players.length; i++) {
players1[i].sendMessage(NamedTextColor.YELLOW + "Das " + plugin.getDisplayedPluginName() + "spiel wurde abgebrochen.");
}
} }
} }
public void startGame(Player player) { plugin.getArenaList().setArenaForPlayers(players1, null);
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player); }
private @NotNull getGroupLeaderOrPlayer getGetGroupLeaderOrPlayer(Player[] players) {
MinecleanerGroupManager.MinecleanerGroup group = null;
MinecleanerArena arena;
if(plugin.getGroupManager().getGroup(players[0]) != null) {
group = plugin.getGroupManager().getGroup(players[0]);
arena = plugin.getArenaList().getPlayerArena(Objects.requireNonNull(Bukkit.getPlayer(group.getOwner())));
} else {
arena = plugin.getArenaList().getPlayerArena(players);
}
return new getGroupLeaderOrPlayer(group, arena);
}
private record getGroupLeaderOrPlayer(MinecleanerGroupManager.MinecleanerGroup group, MinecleanerArena arena) {
}
public void startGame(Player[] players) {
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(players);
Preconditions.checkArgument(arena != null, "player is in no arena"); Preconditions.checkArgument(arena != null, "player is in no arena");
Preconditions.checkState(arena.getArenaStatus() == ArenaStatus.CONFIRM_PLAYING, "not confirming playing status"); Preconditions.checkState(arena.getArenaStatus() == ArenaStatus.CONFIRM_PLAYING, "not confirming playing status");
arena.startNewGame(); arena.startNewGame();
player.sendMessage(ChatColor.YELLOW + "Du hast eine neue Runde " + plugin.getDisplayedPluginName() + " gestartet.");
if(plugin.getGroupManager().getGroup(players[0]) != null) {
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(players[0]).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
assert iteratorPlayer != null;
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, "Du hast eine neue Runde " + plugin.getDisplayedPluginName() + " gestartet.");
}
} else {
ChatUtils.sendSimpleInfoMessage(players[0], "Du hast eine neue Runde " + plugin.getDisplayedPluginName() + " gestartet.");
}
} }
public void handleGameover(Player player, MinecleanerArena arena, boolean isSuccessfullyCleared) { public void handleGameover(Player[] player, MinecleanerArena arena, boolean isSuccessfullyCleared) {
World world = player.getWorld();
if(plugin.getGroupManager().getGroup(player[0]) != null) {
World world = player[0].getWorld();
MinecleanerGroupManager.MinecleanerGroup group = plugin.getGroupManager().getGroup(player[0]);
if(!isSuccessfullyCleared) {
world.playSound(Bukkit.getPlayer(group.getOwner()).getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.5f, 0.5f);
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player[0]).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
assert iteratorPlayer != null;
ChatUtils.sendSimpleInfoMessage(iteratorPlayer, "Game Over! Ihr konntest das " + plugin.getDisplayedPluginName() + "-Feld nicht erfolgreich lösen!");
if(plugin.isStatisticsEnabled()) {
PlayerStatistics ps = plugin.getCubesideStatistics().getStatistics(iteratorPlayer.getUniqueId());
ps.increaseScore(statisticsTotalGamesPlayed.get(arena.getWidthIndex()), 1);
}
}
arena.showMines();
scheduleArenaReset(Bukkit.getPlayer(plugin.getGroupManager().getGroup(player[0]).getOwner()), arena);
return;
}
int millis = (int) (System.currentTimeMillis() - arena.getCurrentGameStartTime());
world.playSound(Bukkit.getPlayer(group.getOwner()).getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 0.5f, 0.5f);
for(UUID currentPlayer : group.getPlayers()) {
Player iteratorPlayer = Bukkit.getPlayer(currentPlayer);
if(iteratorPlayer != null) {
iteratorPlayer.sendMessage(Component.text(
"Glückwunsch, ihr konntet das " + plugin.getDisplayedPluginName() + "-Feld in ", NamedTextColor.YELLOW)
.append(Component.text(MinecleanerStringUtil.timeToString(millis, false), NamedTextColor.RED))
.append(Component.text(" erfolgreich lösen!", NamedTextColor.YELLOW)));
}
if(!plugin.isStatisticsEnabled())
continue;
PlayerStatistics ps = plugin.getCubesideStatistics().getStatistics(currentPlayer);
ps.increaseScore(statisticsTotalGamesPlayed.get(arena.getWidthIndex()), 1);
ps.increaseScore(statisticsWonGamesTotal, 1);
ps.increaseScore(statisticsGames.get(arena.getWidthIndex()), 1);
int wIndex = arena.getWidthIndex();
increaseScore(wIndex, ps, group.getPlayers().size());
}
scheduleArenaReset(Bukkit.getPlayer(group.getOwner()), arena);
return;
}
World world = player[0].getWorld();
PlayerStatistics ps = null; PlayerStatistics ps = null;
StatisticKey sg = null; StatisticKey sg = null;
if(plugin.isStatisticsEnabled()) { if(plugin.isStatisticsEnabled()) {
ps = plugin.getCubesideStatistics().getStatistics(player.getUniqueId()); ps = plugin.getCubesideStatistics().getStatistics(player[0].getUniqueId());
sg = statisticsTotalGamesPlayed.get(arena.getWidthIndex()); sg = statisticsTotalGamesPlayed.get(arena.getWidthIndex());
} }
if(!isSuccessfullyCleared) { if(!isSuccessfullyCleared) {
world.playSound(player.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.5f, 0.5f); world.playSound(player[0].getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 0.5f, 0.5f);
player.sendMessage(ChatColor.YELLOW + "Game Over! Du konntest das " + plugin.getDisplayedPluginName() + "-Feld nicht erfolgreich lösen!"); ChatUtils.sendSimpleInfoMessage(player[0], "Game Over! Du konntest das " + plugin.getDisplayedPluginName() + "-Feld nicht erfolgreich lösen!");
arena.showMines(); arena.showMines();
if(sg != null && plugin.isStatisticsEnabled()) { if(sg != null && plugin.isStatisticsEnabled()) {
ps.increaseScore(sg, 1); ps.increaseScore(sg, 1);
} }
Bukkit.getScheduler().runTaskLater(plugin, () -> { scheduleArenaReset(player[0], arena);
if(arena.getCurrentPlayer() == null) {
arena.removePlayer();
} else {
leaveArena(player, false);
}
}, 100L);
return; return;
} }
int millis = (int) (System.currentTimeMillis() - arena.getCurrentGameStartTime()); int millis = (int) (System.currentTimeMillis() - arena.getCurrentGameStartTime());
world.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 0.5f, 0.5f); world.playSound(player[0].getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 0.5f, 0.5f);
if(sg != null && plugin.isStatisticsEnabled()) { if(sg != null && plugin.isStatisticsEnabled()) {
ps.increaseScore(sg, 1); ps.increaseScore(sg, 1);
@ -199,57 +316,83 @@ public class MinecleanerManager {
if(sg != null) { if(sg != null) {
ps.minScore(sg, millis, isUpdated -> { ps.minScore(sg, millis, isUpdated -> {
if(isUpdated != null && isUpdated) { if(isUpdated != null && isUpdated) {
player.sendMessage(ChatColor.GOLD + "Herzlichen Glückwunsch! Du hast eine neue Bestzeit erreicht! " + ChatColor.RED + MinecleanerStringUtil.timeToString(millis, false) ); player[0].sendMessage(NamedTextColor.GOLD + "Herzlichen Glückwunsch! Du hast eine neue Bestzeit erreicht! " + NamedTextColor.RED + MinecleanerStringUtil.timeToString(millis, false) );
} else { } else {
player.sendMessage(ChatColor.YELLOW + "Glückwunsch, du konntest das " + plugin.getDisplayedPluginName() + "-Feld in " + ChatColor.RED + MinecleanerStringUtil.timeToString(millis, false) + ChatColor.YELLOW + " erfolgreich lösen!"); player[0].sendMessage(NamedTextColor.YELLOW + "Glückwunsch, du konntest das " + plugin.getDisplayedPluginName() + "-Feld in " + NamedTextColor.RED + MinecleanerStringUtil.timeToString(millis, false) + NamedTextColor.YELLOW + " erfolgreich lösen!");
} }
}); });
} }
int wIndex = arena.getWidthIndex(); int wIndex = arena.getWidthIndex();
increaseScore(wIndex, ps, 1);
} else {
player[0].sendMessage(NamedTextColor.YELLOW + "Glückwunsch, du konntest das " + plugin.getDisplayedPluginName() + "-Feld in " + NamedTextColor.RED + MinecleanerStringUtil.timeToString(millis, false) + NamedTextColor.YELLOW + " erfolgreich lösen!");
}
scheduleArenaReset(player[0], arena);
}
private void increaseScore(int wIndex, PlayerStatistics ps, int groupSize) {
switch (wIndex) { switch (wIndex) {
case 0: { case 0: {
ps.increaseScore(statisticsPointsAcquired, plugin.getConfig().getInt("winpoints.size.small")); ps.increaseScore(statisticsPointsAcquired, (int) Math.floor((double) plugin.getConfig().getInt("winpoints.size.small") /groupSize));
break; break;
} }
case 1: { case 1: {
ps.increaseScore(statisticsPointsAcquired, plugin.getConfig().getInt("winpoints.size.medium")); ps.increaseScore(statisticsPointsAcquired, (int) Math.floor((double) plugin.getConfig().getInt("winpoints.size.medium") /groupSize));
break; break;
} }
case 2: { case 2: {
ps.increaseScore(statisticsPointsAcquired, plugin.getConfig().getInt("winpoints.size.large")); ps.increaseScore(statisticsPointsAcquired, (int) Math.floor((double) plugin.getConfig().getInt("winpoints.size.large") /groupSize));
break; break;
} }
case 3: { case 3: {
ps.increaseScore(statisticsPointsAcquired, plugin.getConfig().getInt("winpoints.size.expert")); ps.increaseScore(statisticsPointsAcquired, (int) Math.floor((double) plugin.getConfig().getInt("winpoints.size.expert") /groupSize));
break;
} }
default: { default: {
ps.increaseScore(statisticsPointsAcquired, 0); ps.increaseScore(statisticsPointsAcquired, 0);
break; break;
} }
} }
} else {
player.sendMessage(ChatColor.YELLOW + "Glückwunsch, du konntest das " + plugin.getDisplayedPluginName() + "-Feld in " + ChatColor.RED + MinecleanerStringUtil.timeToString(millis, false) + ChatColor.YELLOW + " erfolgreich lösen!");
} }
private void scheduleArenaReset(Player player, MinecleanerArena arena) {
plugin.getLogger().log(Level.INFO, "scheduled reset for arena '" + arena.getName() + "', loc: " + arena.getLocation() + " ArenaStatus: " + arena.getArenaStatus() + " in " + plugin.getManager().getSettingsValue("resettime", player) * 20 + " ticks. Current Players: " + Arrays.toString(arena.getCurrentPlayers()));
Bukkit.getScheduler().runTaskLater(plugin, () -> { Bukkit.getScheduler().runTaskLater(plugin, () -> {
if(arena.getCurrentPlayer() == null) { plugin.getLogger().log(Level.INFO, "ArenaStatus for arena '" + arena.getName() + "', loc: " + arena.getLocation() + " after 5 Ticks (should be completed): " + arena.getArenaStatus());
arena.removePlayer(); }, 5L);
schedulerGameOver = Bukkit.getScheduler().runTaskLater(plugin, () -> {
if(arena.getArenaStatus() == ArenaStatus.COMPLETED) {
if (arena.getCurrentPlayers() == null) {
arena.removePlayers();
} else { } else {
leaveArena(player, false); int arraySize = plugin.getGroupManager().getGroup(player) != null ? plugin.getGroupManager().getGroupSize(player) : 1;
Player[] players = new Player[arraySize];
int i = 0;
if(plugin.getGroupManager().getGroup(player) != null) {
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
players[i] = iteratorPlayer;
i++;
} }
}, 100L); } else {
Arrays.fill(players, player);
}
leaveArena(players, false, true);
}
}
}, plugin.getManager().getSettingsValue("resettime", player) * 20L);
} }
public void clearAllArenas() { public void clearAllArenas() {
for(MinecleanerArena arena : plugin.getArenaList().getArenas()) { for(MinecleanerArena arena : plugin.getArenaList().getArenas()) {
if(arena.hasPlayer()) { if(arena.hasPlayers()) {
leaveArena(arena.getCurrentPlayer(), true); leaveArena(arena.getCurrentPlayers(), true, true);
} }
} }
} }
public void handleFieldClick(@NotNull Player player, int x, int y, boolean hasRightClicked) { public void handleFieldClick(@NotNull Player player, int x, int y, boolean hasRightClicked) {
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player); MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player);
Preconditions.checkArgument(arena != null, "player is in no arena"); Preconditions.checkArgument(arena != null, "player is in no arena");
@ -364,31 +507,6 @@ public class MinecleanerManager {
} }
} }
public Inventory showSettingsInventory(Player player) {
int current = getSettingsValue("additionaldisplay", player);
if(current == 0) {
settingsInventory.setItem(12,
ItemStacks.lore(ItemStacks.rename(new ItemStack(Material.NAME_TAG), ChatColor.RED + "Zusätzliche Anzeige in der Action Bar")));
} else {
settingsInventory.setItem(12,
ItemStacks.lore(ItemStacks.rename(new ItemStack(Material.NAME_TAG), ChatColor.GREEN + "Zusätzliche Anzeige in der Action Bar")));
}
current = getSettingsValue("timer", player);
if(current == 0) {
settingsInventory.setItem(14,
ItemStacks.lore(ItemStacks.rename(new ItemStack(Material.CLOCK), ChatColor.RED + "Timer anzeigen")));
} else {
settingsInventory.setItem(14,
ItemStacks.lore(ItemStacks.rename(new ItemStack(Material.CLOCK), ChatColor.GREEN + "Timer anzeigen")));
}
return settingsInventory;
}
public int getSettingsValue(String settingsKeyString, Player player) { public int getSettingsValue(String settingsKeyString, Player player) {
PlayerStatistics playerStatistics = plugin.getCubesideStatistics().getStatistics(player.getUniqueId()); PlayerStatistics playerStatistics = plugin.getCubesideStatistics().getStatistics(player.getUniqueId());
SettingKey settingKey = plugin.getCubesideStatistics().getSettingKey("minecleaner.settings." + settingsKeyString); SettingKey settingKey = plugin.getCubesideStatistics().getSettingKey("minecleaner.settings." + settingsKeyString);
@ -421,4 +539,8 @@ public class MinecleanerManager {
public SettingKey getMinecleanerAdditionalDisplaySettingKey() { public SettingKey getMinecleanerAdditionalDisplaySettingKey() {
return minecleanerAdditionalDisplaySettingKey; return minecleanerAdditionalDisplaySettingKey;
} }
public SettingKey getMinecleanerResetTimeSettingKey() {return minecleanerResetTimerSettingKey; }
public BukkitTask getSchedulerGameOver() { return schedulerGameOver; }
} }

View file

@ -1,17 +1,30 @@
package de.lunarakai.minecleaner; package de.lunarakai.minecleaner;
import de.lunarakai.minecleaner.commands.CreateCommand;
import de.lunarakai.minecleaner.commands.DeleteCommand;
import de.lunarakai.minecleaner.commands.DeletePlayerScoreCommand;
import de.lunarakai.minecleaner.commands.HelpCommand;
import de.lunarakai.minecleaner.commands.InfoCommand;
import de.lunarakai.minecleaner.commands.ListCommand;
import de.lunarakai.minecleaner.commands.ListPlayersInArenaCommand;
import de.lunarakai.minecleaner.commands.SettingsCommand; import de.lunarakai.minecleaner.commands.SettingsCommand;
import de.lunarakai.minecleaner.commands.StatsCommand;
import de.lunarakai.minecleaner.commands.groups.AcceptCommand;
import de.lunarakai.minecleaner.commands.groups.DenyCommand;
import de.lunarakai.minecleaner.commands.groups.DismantleGroupCommand;
import de.lunarakai.minecleaner.commands.groups.InviteCommand;
import de.lunarakai.minecleaner.commands.groups.ListGroupMembersCommand;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.translation.GlobalTranslator;
import net.kyori.adventure.translation.TranslationRegistry;
import net.kyori.adventure.util.UTF8ResourceBundleControl;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import de.iani.cubesidestats.api.CubesideStatisticsAPI; import de.iani.cubesidestats.api.CubesideStatisticsAPI;
import de.iani.cubesideutils.bukkit.commands.CommandRouter; import de.iani.cubesideutils.bukkit.commands.CommandRouter;
import de.iani.playerUUIDCache.PlayerUUIDCache; import de.iani.playerUUIDCache.PlayerUUIDCache;
import de.lunarakai.minecleaner.commands.CreateCommand; import java.util.Locale;
import de.lunarakai.minecleaner.commands.DeleteCommand; import java.util.ResourceBundle;
import de.lunarakai.minecleaner.commands.DeletePlayerScoreCommand;
import de.lunarakai.minecleaner.commands.InfoCommand;
import de.lunarakai.minecleaner.commands.ListCommand;
import de.lunarakai.minecleaner.commands.StatsCommand;
import java.util.logging.Level; import java.util.logging.Level;
public final class MinecleanerPlugin extends JavaPlugin { public final class MinecleanerPlugin extends JavaPlugin {
@ -19,6 +32,7 @@ public final class MinecleanerPlugin extends JavaPlugin {
public static final String PERMISSION_ADMIN = "minecleaner.admin"; public static final String PERMISSION_ADMIN = "minecleaner.admin";
private MinecleanerManager minecleanerManager; private MinecleanerManager minecleanerManager;
private MinecleanerGroupManager minecleanerGroupManager;
private ArenaList arenaList; private ArenaList arenaList;
private CubesideStatisticsAPI cubesideStatistics; private CubesideStatisticsAPI cubesideStatistics;
private PlayerUUIDCache playerUUIDCache; private PlayerUUIDCache playerUUIDCache;
@ -26,21 +40,31 @@ public final class MinecleanerPlugin extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
this.saveDefaultConfig(); this.saveDefaultConfig();
TranslationRegistry registry = TranslationRegistry.create(Key.key("minecleaner:lang"));
ResourceBundle bundle_en_US = ResourceBundle.getBundle("lang.en_US", Locale.US, UTF8ResourceBundleControl.get());
registry.registerAll(Locale.US, bundle_en_US, true);
GlobalTranslator.translator().addSource(registry);
ResourceBundle bundle_de_DE = ResourceBundle.getBundle("lang.de_DE", Locale.GERMAN, UTF8ResourceBundleControl.get());
registry.registerAll(Locale.GERMAN, bundle_de_DE, true);
GlobalTranslator.translator().addSource(registry);
getServer().getScheduler().runTask(this, this::onLateEnable); getServer().getScheduler().runTask(this, this::onLateEnable);
} }
public void onLateEnable() { public void onLateEnable() {
playerUUIDCache = (PlayerUUIDCache) getServer().getPluginManager().getPlugin("PlayerUUIDCache"); checkForPlayerUUIDChache();
if(getServer().getPluginManager().getPlugin("CubesideStatistics") != null) {
cubesideStatistics = getServer().getServicesManager().load(CubesideStatisticsAPI.class); checkForCubesideStatistics();
} else {
this.getLogger().log(Level.WARNING, "Cubeside Statistics not found. No Statistics will be available");
}
arenaList = new ArenaList(this); arenaList = new ArenaList(this);
arenaList.load(); arenaList.load();
minecleanerManager = new MinecleanerManager(this); minecleanerManager = new MinecleanerManager(this);
minecleanerGroupManager = new MinecleanerGroupManager();
getServer().getPluginManager().registerEvents(new MinecleanerListener(this), this); getServer().getPluginManager().registerEvents(new MinecleanerListener(this), this);
CommandRouter minecleanerCommand = new CommandRouter(getCommand("minecleaner")); CommandRouter minecleanerCommand = new CommandRouter(getCommand("minecleaner"));
@ -48,7 +72,20 @@ public final class MinecleanerPlugin extends JavaPlugin {
minecleanerCommand.addCommandMapping(new DeleteCommand(this), "delete"); minecleanerCommand.addCommandMapping(new DeleteCommand(this), "delete");
minecleanerCommand.addCommandMapping(new ListCommand(this), "list"); minecleanerCommand.addCommandMapping(new ListCommand(this), "list");
minecleanerCommand.addCommandMapping(new InfoCommand(this), "info"); minecleanerCommand.addCommandMapping(new InfoCommand(this), "info");
minecleanerCommand.addCommandMapping(new ListPlayersInArenaCommand(this), "currentplayers");
minecleanerCommand.addCommandMapping(new HelpCommand(this), "help");
// Groups
minecleanerCommand.addCommandMapping(new InviteCommand(this), "invite");
minecleanerCommand.addCommandMapping(new AcceptCommand(this), "accept");
minecleanerCommand.addCommandMapping(new DenyCommand(this), "deny");
minecleanerCommand.addCommandMapping(new DismantleGroupCommand(this), "dismantlegroup");
minecleanerCommand.addCommandMapping(new ListGroupMembersCommand(this), "groupmembers");
enableCubesideStatisticsCommands(minecleanerCommand);
}
private void enableCubesideStatisticsCommands(CommandRouter minecleanerCommand) {
if(isStatisticsEnabled()) { if(isStatisticsEnabled()) {
minecleanerCommand.addCommandMapping(new SettingsCommand(this), "settings"); minecleanerCommand.addCommandMapping(new SettingsCommand(this), "settings");
minecleanerCommand.addCommandMapping(new StatsCommand(this), "stats"); minecleanerCommand.addCommandMapping(new StatsCommand(this), "stats");
@ -56,11 +93,30 @@ public final class MinecleanerPlugin extends JavaPlugin {
} }
} }
private void checkForCubesideStatistics() {
if(getServer().getPluginManager().getPlugin("CubesideStatistics") != null) {
cubesideStatistics = getServer().getServicesManager().load(CubesideStatisticsAPI.class);
} else {
this.getLogger().log(Level.WARNING, "Cubeside Statistics not found. No Statistics will be available");
}
}
private void checkForPlayerUUIDChache() {
if(getServer().getPluginManager().getPlugin("PlayerUUIDCache") != null) {
playerUUIDCache = (PlayerUUIDCache) getServer().getPluginManager().getPlugin("PlayerUUIDCache");
} else {
this.getLogger().log(Level.WARNING, "PlayerUUIDCache not found.");
}
}
@Override @Override
public void onDisable() { public void onDisable() {
if(minecleanerManager != null) { if(minecleanerManager != null) {
minecleanerManager.clearAllArenas(); minecleanerManager.clearAllArenas();
} }
if(minecleanerGroupManager != null) {
minecleanerGroupManager.deleteAllGroups();
}
} }
public ArenaList getArenaList() { public ArenaList getArenaList() {
@ -71,6 +127,8 @@ public final class MinecleanerPlugin extends JavaPlugin {
return minecleanerManager; return minecleanerManager;
} }
public MinecleanerGroupManager getGroupManager() { return minecleanerGroupManager; }
public boolean isStatisticsEnabled() { public boolean isStatisticsEnabled() {
return cubesideStatistics != null; return cubesideStatistics != null;
} }

View file

@ -0,0 +1,125 @@
package de.lunarakai.minecleaner;
import de.iani.cubesideutils.bukkit.inventory.AbstractWindow;
import de.lunarakai.minecleaner.utils.ItemUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.ItemStack;
public class MinecleanerSettingsInventory extends AbstractWindow {
private static final int SETTINGS_ALLOW_MANUEL_RESET = 10;
private static final int SETTINGS_ADDITIONAL_DISPLAY = 12;
private static final int SETTINGS_TIMER = 14;
private static final int SETTINGS_RESETTIME = 16;
private static final int WINDOW_SIZE = 27;
private MinecleanerPlugin plugin;
public MinecleanerSettingsInventory(Player player, MinecleanerPlugin plugin) {
super(player, Bukkit.createInventory(player, InventoryType.CHEST, plugin.getDisplayedPluginName() + " Einstellungen"));
this.plugin = plugin;
}
@Override
protected void rebuildInventory() {
Player player = getPlayer();
for (int i = 0; i < WINDOW_SIZE; i++) {
ItemStack item;
switch (i) {
case SETTINGS_ALLOW_MANUEL_RESET -> {
if (plugin.getManager().getSettingsValue("allowmanualreset", player) == 0) {
item = ItemUtil.createGuiItem(Material.SHEARS, Component.translatable("settings.manualreset.deny", NamedTextColor.RED));
} else {
item = ItemUtil.createGuiItem(Material.SHEARS, Component.translatable("settings.manualreset.allow", NamedTextColor.GREEN));
}
}
case SETTINGS_ADDITIONAL_DISPLAY -> {
if (plugin.getManager().getSettingsValue("additionaldisplay", player) == 0) {
item = ItemUtil.createGuiItem(Material.NAME_TAG, Component.translatable("settings.additionaltimer.deny", NamedTextColor.RED));
} else {
item = ItemUtil.createGuiItem(Material.NAME_TAG, Component.translatable("settings.additionaltimer.allow", NamedTextColor.GREEN));
}
}
case SETTINGS_TIMER -> {
if (plugin.getManager().getSettingsValue("timer", player) == 0) {
item = ItemUtil.createGuiItem(Material.CLOCK, Component.translatable("settings.timer.deny", NamedTextColor.RED));
} else {
item = ItemUtil.createGuiItem(Material.CLOCK, Component.translatable("settings.timer.allow", NamedTextColor.GREEN));
}
}
case SETTINGS_RESETTIME -> {
int current = plugin.getManager().getSettingsValue("resettime", player);
item = ItemUtil.createGuiItem(Material.CANDLE, Component.translatable("settings.resettime.text", NamedTextColor.GOLD).append(Component.text(": ")).append(Component.text(current, NamedTextColor.RED)).append(Component.text(" s", NamedTextColor.RED)));
}
default -> item = ItemUtil.EMPTY_ICON;
}
this.getInventory().setItem(i, item);
}
}
@Override
public void onItemClicked(InventoryClickEvent event) {
if (!mayAffectThisInventory(event)) {
return;
}
event.setCancelled(true);
if (!getInventory().equals(event.getClickedInventory())) {
return;
}
Player player = getPlayer();
int slot = event.getSlot();
switch (slot) {
case SETTINGS_ALLOW_MANUEL_RESET -> {
if(plugin.getManager().getSettingsValue("allowmanualreset", player) == 0) {
plugin.getManager().updateSettingsValue("allowmanualreset", 1, player);
} else {
plugin.getManager().updateSettingsValue("allowmanualreset", 0, player);
}
rebuildInventory();
}
case SETTINGS_ADDITIONAL_DISPLAY -> {
if(plugin.getManager().getSettingsValue("additionaldisplay", player) == 0) {
plugin.getManager().updateSettingsValue("additionaldisplay", 1, player);
} else {
plugin.getManager().updateSettingsValue("additionaldisplay", 0, player);
}
rebuildInventory();
}
case SETTINGS_TIMER -> {
if(plugin.getManager().getSettingsValue("timer", player) == 0) {
plugin.getManager().updateSettingsValue("timer", 1, player);
} else {
MinecleanerArena arena = plugin.getArenaList().getPlayerArena(player);
plugin.getManager().updateSettingsValue("timer", 0, player);
if(arena != null) {
arena.updateIngameInfoTexts();
}
}
rebuildInventory();
}
case SETTINGS_RESETTIME -> {
int current = plugin.getManager().getSettingsValue("resettime", player);
if(plugin.getManager().getSettingsValue("resettime", player) < 10) {
plugin.getManager().updateSettingsValue("resettime", current + 1, player);
} else {
plugin.getManager().updateSettingsValue("resettime", 1, player);
}
rebuildInventory();
}
default -> {
}
}
}
}

View file

@ -5,6 +5,8 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -22,6 +24,8 @@ import de.lunarakai.minecleaner.MinecleanerArena;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import static de.lunarakai.minecleaner.utils.MinecleanerComponentUtils.createLangComponent;
public class CreateCommand extends SubCommand { public class CreateCommand extends SubCommand {
private static final Pattern VALID_ARENA_NAME = Pattern.compile("^[a-z0-9_]+$"); private static final Pattern VALID_ARENA_NAME = Pattern.compile("^[a-z0-9_]+$");
@ -55,11 +59,11 @@ public class CreateCommand extends SubCommand {
} }
String name = args.getNext().toLowerCase().trim(); String name = args.getNext().toLowerCase().trim();
if(!VALID_ARENA_NAME.matcher(name).matches()) { if(!VALID_ARENA_NAME.matcher(name).matches()) {
sender.sendMessage(ChatColor.DARK_RED + "Ungültiger Arenaname. Erlaubt sind Buchstaben, Zahlen und der Unterstrich"); sender.sendMessage(createLangComponent("arena.name.invalid", NamedTextColor.DARK_RED));
return true; return true;
} }
if(plugin.getArenaList().getArena(name) != null) { if(plugin.getArenaList().getArena(name) != null) {
sender.sendMessage(ChatColor.DARK_RED + "Eine Arena mit diesem Namen existiert bereits"); sender.sendMessage(createLangComponent( "arena.name.exists", NamedTextColor.DARK_RED));
return true; return true;
} }
boolean noblocks = false; boolean noblocks = false;
@ -73,13 +77,13 @@ public class CreateCommand extends SubCommand {
try { try {
widthindex = Integer.parseInt(arg); widthindex = Integer.parseInt(arg);
} catch(NumberFormatException e) { } catch(NumberFormatException e) {
sender.sendMessage(ChatColor.DARK_RED + "Kein Valider Arena WidthIndex!"); sender.sendMessage(createLangComponent("arena.widthindex.invalid", NamedTextColor.DARK_RED));
sender.sendMessage(ChatColor.DARK_RED + "0 (oder weglassen) = 9*9, 1 = 12*12, 2 = 12*18, 3 = 12*33"); sender.sendMessage(createLangComponent("arena.widthindex.validOptions", NamedTextColor.DARK_RED));
return true; return true;
} }
if(widthindex > 3) { if(widthindex > 3) {
sender.sendMessage(ChatColor.DARK_RED + "Arena WidthIndex darf nicht größer als 3 sein"); sender.sendMessage(createLangComponent( "arena.widthindex.toolarge", NamedTextColor.DARK_RED));
sender.sendMessage(ChatColor.DARK_RED + "0 (oder weglassen) = 9*9, 1 = 12*12, 2 = 12*18, 3 = 12*33"); sender.sendMessage(createLangComponent("arena.widthindex.validOptions", NamedTextColor.DARK_RED));
return true; return true;
} }
} else { } else {
@ -94,12 +98,14 @@ public class CreateCommand extends SubCommand {
@Nullable @Nullable
RayTraceResult target = player.rayTraceBlocks(6); RayTraceResult target = player.rayTraceBlocks(6);
if(target == null || target.getHitBlock() == null) { if(target == null || target.getHitBlock() == null) {
sender.sendMessage(ChatColor.DARK_RED + "Bitte gucke den Block an, der im Zentrum des " + plugin.getDisplayedPluginName() + "-Spielfelds sein soll."); //sender.sendMessage(ChatColor.DARK_RED + "Bitte gucke den Block an, der im Zentrum des " + plugin.getDisplayedPluginName() + "-Spielfelds sein soll.");
sender.sendMessage(createLangComponent( "arena.create.lookAtCenter", plugin.getDisplayedPluginName(), NamedTextColor.DARK_RED));
return true; return true;
} }
BlockFace face = target.getHitBlockFace(); BlockFace face = target.getHitBlockFace();
if(face != BlockFace.NORTH && face != BlockFace.WEST && face != BlockFace.EAST && face != BlockFace.SOUTH) { if(face != BlockFace.NORTH && face != BlockFace.WEST && face != BlockFace.EAST && face != BlockFace.SOUTH) {
sender.sendMessage(ChatColor.DARK_RED + "Bitte gucke die Seite des Blockes an, wo das " + plugin.getDisplayedPluginName() + "-Spielfeld erstellt werden soll."); //sender.sendMessage(ChatColor.DARK_RED + "Bitte gucke die Seite des Blockes an, wo das " + plugin.getDisplayedPluginName() + "-Spielfeld erstellt werden soll.");
sender.sendMessage(createLangComponent("arena.create.lookAtSide", plugin.getDisplayedPluginName(), NamedTextColor.DARK_RED));
return true; return true;
} }
location = target.getHitBlock().getLocation(); location = target.getHitBlock().getLocation();
@ -107,7 +113,7 @@ public class CreateCommand extends SubCommand {
MinecleanerArena newArena = new MinecleanerArena(plugin, name, location, widthindex, orientation); MinecleanerArena newArena = new MinecleanerArena(plugin, name, location, widthindex, orientation);
if(plugin.getArenaList().collidesWithArena(newArena)) { if(plugin.getArenaList().collidesWithArena(newArena)) {
sender.sendMessage(ChatColor.DARK_RED + "An dieser Stelle befindet sich bereits eine Arena."); sender.sendMessage(createLangComponent("arena.create.otherArena", NamedTextColor.DARK_RED));
return true; return true;
} }
newArena.generateBlockDisplays(); newArena.generateBlockDisplays();
@ -115,7 +121,7 @@ public class CreateCommand extends SubCommand {
newArena.generateBackgroundBlocks(); newArena.generateBackgroundBlocks();
} }
plugin.getArenaList().addArena(newArena); plugin.getArenaList().addArena(newArena);
sender.sendMessage(ChatColor.GREEN + "Die Arena wurde erfolgreich angelegt."); sender.sendMessage(createLangComponent("arena.create.success", NamedTextColor.GREEN));
return true; return true;
} }
@ -151,5 +157,4 @@ public class CreateCommand extends SubCommand {
} }
return List.of(); return List.of();
} }
} }

View file

@ -2,6 +2,7 @@ package de.lunarakai.minecleaner.commands;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -16,7 +17,8 @@ import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser; import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerArena; import de.lunarakai.minecleaner.MinecleanerArena;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import net.md_5.bungee.api.ChatColor;
import static de.lunarakai.minecleaner.utils.MinecleanerComponentUtils.createLangComponent;
public class DeleteCommand extends SubCommand { public class DeleteCommand extends SubCommand {
private final MinecleanerPlugin plugin; private final MinecleanerPlugin plugin;
@ -52,9 +54,9 @@ public class DeleteCommand extends SubCommand {
} }
if(arena != null) { if(arena != null) {
plugin.getArenaList().removeArena(arena); plugin.getArenaList().removeArena(arena);
sender.sendMessage(ChatColor.YELLOW + "Die " + plugin.getDisplayedPluginName() + "-Arena " + arena.getName() + " wurde gelöscht."); sender.sendMessage(createLangComponent("arena.delete.success", plugin.getDisplayedPluginName(), arena.getName(), NamedTextColor.YELLOW));
} else { } else {
sender.sendMessage(ChatColor.YELLOW + "Hier befindet sich keine " + plugin.getDisplayedPluginName() + "-Arena."); sender.sendMessage(createLangComponent("arena.delete.noarena", plugin.getDisplayedPluginName(), NamedTextColor.YELLOW));
} }
return true; return true;
} }
@ -63,5 +65,4 @@ public class DeleteCommand extends SubCommand {
public Collection<String> onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) { public Collection<String> onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) {
return List.of(); return List.of();
} }
} }

View file

@ -1,5 +1,6 @@
package de.lunarakai.minecleaner.commands; package de.lunarakai.minecleaner.commands;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import de.iani.cubesideutils.bukkit.commands.SubCommand; import de.iani.cubesideutils.bukkit.commands.SubCommand;
@ -13,6 +14,8 @@ import de.iani.playerUUIDCache.CachedPlayer;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import static de.lunarakai.minecleaner.utils.MinecleanerComponentUtils.createLangComponent;
public class DeletePlayerScoreCommand extends SubCommand{ public class DeletePlayerScoreCommand extends SubCommand{
private final MinecleanerPlugin plugin; private final MinecleanerPlugin plugin;
@ -48,10 +51,10 @@ public class DeletePlayerScoreCommand extends SubCommand{
CachedPlayer cachedPlayer = plugin.getPlayerUUIDCache().getPlayer(player); CachedPlayer cachedPlayer = plugin.getPlayerUUIDCache().getPlayer(player);
if(cachedPlayer == null) { if(cachedPlayer == null) {
sender.sendMessage(ChatColor.DARK_RED + "Ein Spieler mit dem Namen '" + player + "' konnte nicht gefunden werden."); sender.sendMessage(createLangComponent("data.delete.playerNotFound", player, NamedTextColor.DARK_RED));
} }
plugin.getManager().deleteScores(cachedPlayer.getUUID()); plugin.getManager().deleteScores(cachedPlayer.getUUID());
sender.sendMessage(ChatColor.DARK_RED + "Alle " + plugin.getDisplayedPluginName() + "-Statistiken von Spieler '" + cachedPlayer.getName() + "' wurden gelöscht."); sender.sendMessage(createLangComponent("data.delete.deleted", plugin.getDisplayedPluginName(), cachedPlayer.getName(), NamedTextColor.DARK_RED));
return true; return true;
} }

View file

@ -0,0 +1,88 @@
package de.lunarakai.minecleaner.commands;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class HelpCommand extends SubCommand {
MinecleanerPlugin plugin;
public HelpCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "[(empty)|group]";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_PLAY;
}
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String commandString, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) commandSender;
String subMenu = "";
if(args.remaining() == 1) {
subMenu = args.getNext().toLowerCase().trim();
}
if(subMenu.equals("group")) {
showHelpGroup(player);
return true;
} else {
showGeneralHelp(player);
return true;
}
}
private void showGeneralHelp(Player player) {
player.sendMessage(Component.text("--- " + plugin.getDisplayedPluginName() + " Help ---", NamedTextColor.AQUA)
.append(Component.newline())
.append(Component.text(" /... info: ", NamedTextColor.BLUE))
.append(Component.text("Allgemeine Auskunft zum Plugin", NamedTextColor.GREEN))
.append(Component.newline())
.append(Component.text(" /... stats [playername]: ", NamedTextColor.BLUE))
.append(Component.text("Zeigt dir entweder deine eigenen Stats (leer lassen) oder die Stats anderer Spieler an", NamedTextColor.GREEN))
.append(Component.newline())
.append(Component.text(" /... settings: ", NamedTextColor.BLUE))
.append(Component.text("Öffnet ein Menü in dem du Veränderungen an deinen eigenen Einstellungen für " + plugin.getDisplayedPluginName() + " vornehmen kannst", NamedTextColor.GREEN))
.append(Component.newline())
.append(Component.text(" /... help [group]: ", NamedTextColor.BLUE))
.append(Component.text("Zeigt dieses Menü (frei lassen) oder die Hilfe für Gruppen an (group)", NamedTextColor.GREEN)));
}
private void showHelpGroup(Player player) {
player.sendMessage(Component.text("--- " + plugin.getDisplayedPluginName() + " Group Help ---", NamedTextColor.AQUA)
.append(Component.newline())
.append(Component.text(" /... invite <playername>: ", NamedTextColor.BLUE))
.append(Component.text("Lädt andere Spieler zu deiner " + plugin.getDisplayedPluginName() + " Gruppe ein", NamedTextColor.GREEN))
.append(Component.newline())
.append(Component.text(" /... accept | deny: ", NamedTextColor.BLUE))
.append(Component.text("Nehme eine erhaltene Einladung an (accept), oder lehne sie ab (deny)", NamedTextColor.GREEN))
.append(Component.newline())
.append(Component.text(" /... dismantlegroup: ", NamedTextColor.BLUE))
.append(Component.text("Löst die Gruppe, die du erstellt hast, auf", NamedTextColor.GREEN))
.append(Component.newline())
.append(Component.text(" /... groupmembers: ", NamedTextColor.BLUE))
.append(Component.text("Listet die Mitglieder deiner Gruppe auf", NamedTextColor.GREEN)));
}
}

View file

@ -1,5 +1,7 @@
package de.lunarakai.minecleaner.commands; package de.lunarakai.minecleaner.commands;
import de.iani.cubesideutils.NamedChatColor;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import de.iani.cubesideutils.bukkit.commands.SubCommand; import de.iani.cubesideutils.bukkit.commands.SubCommand;
@ -12,6 +14,8 @@ import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import static de.lunarakai.minecleaner.utils.MinecleanerComponentUtils.createLangComponent;
public class InfoCommand extends SubCommand{ public class InfoCommand extends SubCommand{
MinecleanerPlugin plugin; MinecleanerPlugin plugin;
@ -38,11 +42,11 @@ public class InfoCommand extends SubCommand{
public boolean onCommand(CommandSender sender, Command arg1, String arg2, String arg3, public boolean onCommand(CommandSender sender, Command arg1, String arg2, String arg3,
ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException,
NoPermissionException, IllegalSyntaxException, InternalCommandException { NoPermissionException, IllegalSyntaxException, InternalCommandException {
sender.sendMessage(ChatColor.GREEN + "--- " + ChatColor.AQUA + plugin.getName() + ChatColor.GREEN + " ---"); sender.sendMessage(NamedChatColor.GREEN + "--- " + ChatColor.AQUA + plugin.getName() + ChatColor.GREEN + " ---");
sender.sendMessage(ChatColor.AQUA + "Version: " + ChatColor.GREEN + plugin.getPluginMeta().getVersion()); sender.sendMessage(createLangComponent("minecleaner.info.version", ": ", plugin.getPluginMeta().getVersion(), NamedTextColor.AQUA, NamedTextColor.GREEN));
sender.sendMessage(ChatColor.AQUA + "Entwickelt von: " + ChatColor.GREEN + plugin.getPluginMeta().getAuthors().get(0)); sender.sendMessage(createLangComponent("minecleaner.info.developer", ": ", plugin.getPluginMeta().getAuthors().get(0), NamedTextColor.AQUA, NamedTextColor.GREEN));
sender.sendMessage(ChatColor.AQUA + "Website: " + ChatColor.GREEN + plugin.getPluginMeta().getWebsite()); sender.sendMessage(createLangComponent("minecleaner.info.website", ": ", plugin.getPluginMeta().getWebsite(), NamedTextColor.AQUA, NamedTextColor.GREEN));
sender.sendMessage(ChatColor.AQUA + "Lizenz: " + ChatColor.GREEN + "GPL-3.0"); sender.sendMessage(createLangComponent("minecleaner.info.license", ": ", "GPL-3.0", NamedTextColor.AQUA, NamedTextColor.GREEN));
return true; return true;
} }
} }

View file

@ -2,6 +2,7 @@ package de.lunarakai.minecleaner.commands;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -16,6 +17,8 @@ import de.lunarakai.minecleaner.MinecleanerArena;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import static de.lunarakai.minecleaner.utils.MinecleanerComponentUtils.createLangComponent;
public class ListCommand extends SubCommand{ public class ListCommand extends SubCommand{
private final MinecleanerPlugin plugin; private final MinecleanerPlugin plugin;
@ -41,7 +44,7 @@ public class ListCommand extends SubCommand{
@Override @Override
public boolean onCommand(CommandSender sender, Command arg1, String arg2, String commandString, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException { public boolean onCommand(CommandSender sender, Command arg1, String arg2, String commandString, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
sender.sendMessage(ChatColor.YELLOW + "Angelegte "+ plugin.getDisplayedPluginName() + "-Arenen"); sender.sendMessage(createLangComponent("arena.list.created", plugin.getDisplayedPluginName(), NamedTextColor.YELLOW));
boolean any = false; boolean any = false;
for(MinecleanerArena arena : plugin.getArenaList().getArenas()) { for(MinecleanerArena arena : plugin.getArenaList().getArenas()) {
Location location = arena.getLocation(); Location location = arena.getLocation();
@ -49,7 +52,7 @@ public class ListCommand extends SubCommand{
any = true; any = true;
} }
if(!any) { if(!any) {
sender.sendMessage(ChatColor.GRAY + " (keine)"); sender.sendMessage(" " + createLangComponent("arena.list.none", NamedTextColor.GRAY));
} }
return true; return true;
} }

View file

@ -0,0 +1,63 @@
package de.lunarakai.minecleaner.commands;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.*;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerArena;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.utils.ChatUtils;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class ListPlayersInArenaCommand extends SubCommand {
private final MinecleanerPlugin plugin;
public ListPlayersInArenaCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "<name>";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_ADMIN;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String s1, ArgsParser argsParser) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) sender;
MinecleanerArena arena = plugin.getArenaList().getArenaAtBlock(player.getLocation().getBlock().getRelative(BlockFace.DOWN));
if(arena == null) {
Block target = player.getTargetBlockExact(6);
if(target != null) {
arena = plugin.getArenaList().getArenaAtBlock(target);
}
}
if(arena != null) {
ChatUtils.sendSimpleSpecialMessage(player, "Players in Arena: " + Arrays.toString(arena.getCurrentPlayers()), NamedTextColor.GRAY);
} else {
ChatUtils.sendSimpleSpecialMessage(player, "arena.common.noarena", NamedTextColor.GRAY);
}
return true;
}
@Override
public Collection<String> onTabComplete(CommandSender sender, Command command, String alias, ArgsParser args) {
return List.of();
}
}

View file

@ -8,6 +8,7 @@ import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException; import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser; import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.MinecleanerSettingsInventory;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -39,7 +40,7 @@ public class SettingsCommand extends SubCommand {
public boolean onCommand(CommandSender sender, Command command, String s, String s1, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException { public boolean onCommand(CommandSender sender, Command command, String s, String s1, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) sender; Player player = (Player) sender;
player.openInventory(plugin.getManager().showSettingsInventory(player)); new MinecleanerSettingsInventory(player, plugin).open();
return true; return true;
} }
} }

View file

@ -2,10 +2,11 @@ package de.lunarakai.minecleaner.commands;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.function.Consumer; import java.util.function.Consumer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import de.iani.cubesideutils.StringUtil;
import de.iani.cubesideutils.bukkit.commands.SubCommand; import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException; import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException; import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
@ -16,7 +17,8 @@ import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin; import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.PlayerStatisticsData; import de.lunarakai.minecleaner.PlayerStatisticsData;
import de.lunarakai.minecleaner.utils.MinecleanerStringUtil; import de.lunarakai.minecleaner.utils.MinecleanerStringUtil;
import net.md_5.bungee.api.ChatColor;
import static de.lunarakai.minecleaner.utils.MinecleanerComponentUtils.createLangComponent;
public class StatsCommand extends SubCommand { public class StatsCommand extends SubCommand {
private final MinecleanerPlugin plugin; private final MinecleanerPlugin plugin;
@ -48,16 +50,30 @@ public class StatsCommand extends SubCommand {
@Override @Override
public void accept(PlayerStatisticsData data) { public void accept(PlayerStatisticsData data) {
if(data == null) { if(data == null) {
sender.sendMessage(ChatColor.GREEN + "Für Spieler '" + playerName + "' existieren keine Daten."); sender.sendMessage(createLangComponent("data.player.noData", playerName, NamedTextColor.GREEN));
return; return;
} }
if(playerName == null) { if(playerName == null) {
sender.sendMessage(ChatColor.AQUA + "Deine " + plugin.getDisplayedPluginName() + " Statistik:"); sender.sendMessage(createLangComponent("data.player.self", plugin.getDisplayedPluginName(), NamedTextColor.AQUA).append(Component.text(":")));
} else { } else {
sender.sendMessage(ChatColor.AQUA + plugin.getDisplayedPluginName() + "-Statistik von " + data.getPlayerName() + ":"); sender.sendMessage(createLangComponent("data.player.other", plugin.getDisplayedPluginName(), data.getPlayerName(), NamedTextColor.AQUA).append(Component.text(":")));
} }
sender.sendMessage(ChatColor.BLUE + " Punkte erspielt: " + ChatColor.GREEN + data.getPointsAcquiredTotal() + " (Dieser Monat: " + data.getPointsAquiredMonth() + ")");
sender.sendMessage(ChatColor.BLUE + " Runden gewonnen: " + ChatColor.GREEN + data.getWonGamesPlayed() + " (Dieser Monat: " + data.getWonGamesPlayedThisMonth() + ")"); sender.sendMessage(createLangComponent("data.player.pointsscored", NamedTextColor.BLUE)
.append(Component.text(": ", NamedTextColor.BLUE))
.append(Component.text(String.valueOf(data.getPointsAcquiredTotal()), NamedTextColor.GREEN))
.append(Component.text(" (", NamedTextColor.GREEN))
.append(createLangComponent("data.player.thismonth", NamedTextColor.GREEN))
.append(Component.text(": " + String.valueOf(data.getPointsAquiredMonth()) + ")", NamedTextColor.GREEN)));
sender.sendMessage(createLangComponent("data.player.roundswon", NamedTextColor.BLUE)
.append(Component.text(": ", NamedTextColor.BLUE))
.append(Component.text(String.valueOf(data.getWonGamesPlayed()), NamedTextColor.GREEN))
.append(Component.text(" (", NamedTextColor.GREEN))
.append(createLangComponent("data.player.thismonth", NamedTextColor.GREEN))
.append(Component.text(": " + String.valueOf(data.getWonGamesPlayedThisMonth()) + ")", NamedTextColor.GREEN)));
for(Entry<Integer, String> e : plugin.getManager().getSizes().entrySet()) { for(Entry<Integer, String> e : plugin.getManager().getSizes().entrySet()) {
int totalWonSize = data.getGamesPlayedSize(e.getKey()); int totalWonSize = data.getGamesPlayedSize(e.getKey());
int totalWonMonth = data.getGamesPlayedSizeThisMonth(e.getKey()); int totalWonMonth = data.getGamesPlayedSizeThisMonth(e.getKey());
@ -65,14 +81,35 @@ public class StatsCommand extends SubCommand {
int totalSizeMonth = data.getTotalGamesPlayedSizeThisMonth(e.getKey()); int totalSizeMonth = data.getTotalGamesPlayedSizeThisMonth(e.getKey());
if(totalSize > 0) { if(totalSize > 0) {
String sizeName = StringUtil.capitalizeFirstLetter(e.getValue(), false); String sizeName = e.getValue();
sender.sendMessage(ChatColor.AQUA + " " + sizeName + ":"); if(sizeName.equals("groß")) {
sender.sendMessage(ChatColor.BLUE + " Runden gewonnen: " + ChatColor.GREEN + totalWonSize + " von " + totalSize + " (" + MinecleanerStringUtil.percentageString(totalWonSize, totalSize)+ ") "); sizeName = "gross";
sender.sendMessage(ChatColor.BLUE + " Dieser Monat: " + ChatColor.GREEN + totalWonMonth + " von " + totalSizeMonth + " (" + MinecleanerStringUtil.percentageString(totalWonMonth, totalSizeMonth)+ ")"); }
sender.sendMessage(createLangComponent("arena.width." + sizeName, NamedTextColor.AQUA).append(Component.text(":", NamedTextColor.AQUA)));
sender.sendMessage(Component.text(" ")
.append(createLangComponent("data.player.roundswon", NamedTextColor.BLUE))
.append(Component.text(" "))
.append(Component.text(String.valueOf(totalWonSize), NamedTextColor.GREEN))
.append(Component.text(" "))
.append(createLangComponent("data.player.outof", NamedTextColor.GREEN))
.append(Component.text(" " + totalSize + " (" + MinecleanerStringUtil.percentageString(totalWonSize, totalSize) + ")", NamedTextColor.GREEN)));
sender.sendMessage(Component.text(" ")
.append(createLangComponent("data.player.thismonth", NamedTextColor.BLUE))
.append(Component.text(" "))
.append(Component.text(String.valueOf(totalWonMonth), NamedTextColor.GREEN))
.append(Component.text(" "))
.append(createLangComponent("data.player.outof", NamedTextColor.GREEN))
.append(Component.text(" " + totalSizeMonth + " (" + MinecleanerStringUtil.percentageString(totalWonMonth, totalSizeMonth) + ")", NamedTextColor.GREEN)));
Integer time = data.getBestTime(e.getKey()); Integer time = data.getBestTime(e.getKey());
Integer timeThisMonth = data.getBestTimeThisMonth(e.getKey()); Integer timeThisMonth = data.getBestTimeThisMonth(e.getKey());
sender.sendMessage(ChatColor.BLUE + " Bestzeit: " + ChatColor.GREEN + (time == null ? "-" : MinecleanerStringUtil.timeToString(time, false))); sender.sendMessage(Component.text(" ")
sender.sendMessage(ChatColor.BLUE + " Dieser Monat: " + ChatColor.GREEN + (timeThisMonth == null ? "-" : MinecleanerStringUtil.timeToString(timeThisMonth, false))); .append(createLangComponent("data.player.besttime",": ", (time == null ? "-" : MinecleanerStringUtil.timeToString(time, false)), NamedTextColor.BLUE, NamedTextColor.GREEN)));
sender.sendMessage(Component.text(" ")
.append(createLangComponent("data.player.thismonth", ": ", (timeThisMonth == null ? "-" : MinecleanerStringUtil.timeToString(timeThisMonth, false)), NamedTextColor.BLUE, NamedTextColor.GREEN)));
} }
} }
} }
@ -81,7 +118,7 @@ public class StatsCommand extends SubCommand {
if(sender instanceof Player) { if(sender instanceof Player) {
plugin.getManager().getStatisticsForPlayer((Player) sender, callback); plugin.getManager().getStatisticsForPlayer((Player) sender, callback);
} else { } else {
sender.sendMessage(ChatColor.GREEN + "Für die Konsole existieren keine Daten."); sender.sendMessage(createLangComponent("data.console.nodata", NamedTextColor.GREEN));
} }
} else { } else {
plugin.getManager().getStatisticsForPlayerIfExists(playerName, callback); plugin.getManager().getStatisticsForPlayerIfExists(playerName, callback);

View file

@ -0,0 +1,60 @@
package de.lunarakai.minecleaner.commands.groups;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class AcceptCommand extends SubCommand {
private final MinecleanerPlugin plugin;
public AcceptCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_PLAY;
}
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String s1, ArgsParser argsParser) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) commandSender;
if(plugin.getGroupManager().getInvitedGroup(player) != null && plugin.getGroupManager().getGroup(player) == null) {
Player groupOwner = Bukkit.getPlayer(plugin.getGroupManager().getInvitedGroup(player).getOwner());
if(plugin.getArenaList().getPlayerArena(groupOwner) != null) {
ChatUtils.sendSimpleWarningMessage(player, "group.invite.creatorinround");
return true;
}
plugin.getGroupManager().getInvitedGroup(player).addPlayerToGroup(player);
assert groupOwner != null;
ChatUtils.sendSimpleSuccessMessage(groupOwner, player.getName() + " hat deine Einladung angenommen.");
ChatUtils.sendSimpleSuccessMessage(player, "group.invite.accepted");
return true;
} else {
ChatUtils.sendSimpleInfoMessage(player, "group.invite.notinvited");
}
return true;
}
}

View file

@ -0,0 +1,63 @@
package de.lunarakai.minecleaner.commands.groups;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerGroupManager;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class DenyCommand extends SubCommand {
private final MinecleanerPlugin plugin;
public DenyCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_PLAY;
}
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String s1, ArgsParser argsParser) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) commandSender;
if(plugin.getGroupManager().getInvitedGroup(player) != null && plugin.getGroupManager().getGroup(player) == null) {
Player groupOwner = Bukkit.getPlayer(plugin.getGroupManager().getInvitedGroup(player).getOwner());
MinecleanerGroupManager.MinecleanerGroup invitedGroup = plugin.getGroupManager().getInvitedGroup(player);
invitedGroup.removePlayerFromInvitedList(player);
if(plugin.getGroupManager().getGroup(Bukkit.getPlayer(invitedGroup.getOwner())).invitedPlayers.isEmpty()) {
plugin.getGroupManager().deleteGroup(invitedGroup);
}
assert groupOwner != null;
ChatUtils.sendSimpleWarningMessage(groupOwner, player.getName() + " hat deine Einladung abgelehnt.");
ChatUtils.sendSimpleInfoMessage(player, "group.invite.denied");
return true;
} else {
ChatUtils.sendSimpleWarningMessage(player, "group.invite.notinvited");
}
return true;
}
}

View file

@ -0,0 +1,64 @@
package de.lunarakai.minecleaner.commands.groups;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.utils.ChatUtils;
import java.util.Iterator;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class DismantleGroupCommand extends SubCommand {
private final MinecleanerPlugin plugin;
public DismantleGroupCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_PLAY;
}
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String s1, ArgsParser argsParser) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) commandSender;
if(plugin.getGroupManager().getGroup(player) == null) {
ChatUtils.sendSimpleWarningMessage(player, "group.common.notingroup");
return true;
}
Player groupOwnerPlayer = Bukkit.getPlayer(plugin.getGroupManager().getGroup(player).getOwner());
if(player != groupOwnerPlayer) {
ChatUtils.sendSimpleWarningMessage(player, "group.dismantle.nopermission");
return true;
}
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
ChatUtils.sendSimpleWarningMessage(iteratorPlayer, "group.dismantle.yourgroup");
}
plugin.getGroupManager().deleteGroup(plugin.getGroupManager().getGroup(player));
return true;
}
}

View file

@ -0,0 +1,104 @@
package de.lunarakai.minecleaner.commands.groups;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerGroupManager;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.utils.ChatUtils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class InviteCommand extends SubCommand {
/*
TODO:
- Invite other Players to play in Duo Mode
- Add Functionality to support multiple Players in the same game
- use settings of player that invited the other player
*/
private final MinecleanerPlugin plugin;
public InviteCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "<Player>";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_PLAY;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String commandString, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) sender;
if(plugin.getArenaList().getPlayerArena(player) != null) {
ChatUtils.sendSimpleWarningMessage(player, "group.invite.notwhileinround");
return true;
}
if(args.remaining() < 1 || args.remaining() >= 2) {
ChatUtils.sendSimpleWarningMessage(player, commandString + getUsage());
return true;
}
String playerName = args.getNext().trim();
Player invitedPlayer = plugin.getServer().getPlayer(playerName);
if(invitedPlayer == null) {
ChatUtils.sendSimpleWarningMessage(player, "group.invite.offline");
return true;
}
if(invitedPlayer == player) {
ChatUtils.sendSimpleWarningMessage(player, "group.invite.notyourself");
return true;
}
if(plugin.getArenaList().getPlayerArena(invitedPlayer) != null) {
ChatUtils.sendSimpleWarningMessage(player, "group.invite.invitedinround");
return true;
}
MinecleanerGroupManager groupManager = plugin.getGroupManager();
if(groupManager.getInvitedGroup(player) != null) {
ChatUtils.sendSimpleInfoMessage(player, "group.invite.alreadyinvited");
return true;
}
if(groupManager.getGroup(player) != null && !Bukkit.getPlayer(groupManager.getGroup(player).getOwner()).equals(player)) {
ChatUtils.sendSimpleInfoMessage(player, "group.invite.nopermission");
return true;
}
if(groupManager.getGroup(player) == null) {
groupManager.createGroup(player);
}
assert invitedPlayer != null;
player.sendMessage(Component.text("Du hast " + invitedPlayer.getName() + " in eine " + plugin.getDisplayedPluginName() + "-Gruppe eingeladen", NamedTextColor.GREEN));
invitedPlayer.sendMessage(Component.text("Du wurdest von " + player.getName() + " in eine " + plugin.getDisplayedPluginName() + "-Gruppe eingeladen.", NamedTextColor.GREEN));
invitedPlayer.sendMessage(Component.text("[Annehmen] ", NamedTextColor.GREEN).clickEvent(ClickEvent.runCommand("/minesweeper accept")).append(Component.text(" [Ablehnen]", NamedTextColor.RED).clickEvent(ClickEvent.runCommand("/minesweeper deny"))));
groupManager.getGroup(player).invitePlayerToGroup(invitedPlayer);
return true;
}
}

View file

@ -0,0 +1,63 @@
package de.lunarakai.minecleaner.commands.groups;
import de.iani.cubesideutils.bukkit.commands.SubCommand;
import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException;
import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException;
import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException;
import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException;
import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException;
import de.iani.cubesideutils.commands.ArgsParser;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import de.lunarakai.minecleaner.utils.ChatUtils;
import java.util.Iterator;
import java.util.UUID;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ListGroupMembersCommand extends SubCommand {
private final MinecleanerPlugin plugin;
public ListGroupMembersCommand(MinecleanerPlugin plugin) {
this.plugin = plugin;
}
@Override
public String getUsage() {
return "";
}
@Override
public boolean requiresPlayer() {
return true;
}
@Override
public String getRequiredPermission() {
return MinecleanerPlugin.PERMISSION_PLAY;
}
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String s1, ArgsParser argsParser) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException {
Player player = (Player) commandSender;
if(plugin.getGroupManager().getGroup(player) == null) {
ChatUtils.sendSimpleInfoMessage(player, "group.common.notingroup");
return true;
}
ChatUtils.sendSimpleSpecialMessage(player, "-- Mitglieder deiner " + plugin.getDisplayedPluginName() + "gruppe --", NamedTextColor.AQUA);
for(Iterator<UUID> iterator = plugin.getGroupManager().getGroup(player).getPlayers().iterator(); iterator.hasNext();) {
Player iteratorPlayer = Bukkit.getPlayer(iterator.next());
String ownerString = "";
if(iteratorPlayer == Bukkit.getPlayer(plugin.getGroupManager().getGroup(player).getOwner())) {
ownerString = " (Ersteller der Gruppe)";
}
player.sendMessage(Component.text(" - " + iteratorPlayer.getName(), NamedTextColor.GREEN).append(Component.text(ownerString, NamedTextColor.RED)));
}
return true;
}
}

View file

@ -185,6 +185,7 @@ public class Game {
switch (cell.getType()) { switch (cell.getType()) {
case Mine: { case Mine: {
resetFloodedFlaggedCellCounter();
explode(cell); explode(cell);
break; break;
} }

View file

@ -0,0 +1,42 @@
package de.lunarakai.minecleaner.utils;
import java.util.regex.Pattern;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;
public class ChatUtils {
static Pattern langKeyPattern = Pattern.compile("^\\w+\\.\\w+\\.\\w+$");
public static void sendSimpleSuccessMessage(Player player, String message) {
if(message.matches(langKeyPattern.pattern())) {
player.sendMessage(Component.translatable(message, NamedTextColor.GREEN));
} else {
player.sendMessage(Component.text(message, NamedTextColor.GREEN));
}
}
public static void sendSimpleInfoMessage(Player player, String message) {
if(message.matches(langKeyPattern.pattern())) {
player.sendMessage(Component.translatable(message, NamedTextColor.GOLD));
} else {
player.sendMessage(Component.text(message, NamedTextColor.GOLD));
}
}
public static void sendSimpleWarningMessage(Player player, String message) {
if(message.matches(langKeyPattern.pattern())) {
player.sendMessage(Component.translatable(message, NamedTextColor.DARK_RED));
} else {
player.sendMessage(Component.text(message, NamedTextColor.DARK_RED));
}
}
public static void sendSimpleSpecialMessage(Player player, String message, NamedTextColor color) {
if(message.matches(langKeyPattern.pattern())) {
player.sendMessage(Component.translatable(message, color));
} else {
player.sendMessage(Component.text(message, color));
}
}
}

View file

@ -0,0 +1,33 @@
package de.lunarakai.minecleaner.utils;
import de.iani.cubesideutils.bukkit.items.ItemBuilder;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
public class ItemUtil {
public static final ItemStack EMPTY_ICON = createGuiItem(Material.GRAY_STAINED_GLASS_PANE, Component.text(" "), true, true);
public static ItemStack createGuiItem(Material material, Component name, String... lore) {
return createGuiItem(material, name, false, lore);
}
public static ItemStack createGuiItem(Material material, Component name, boolean glowing, boolean showTooltip, String... lore) {
ItemBuilder builder = ItemBuilder.fromMaterial(material).displayName(name).lore(lore);
if (glowing) {
builder.enchantment(Enchantment.UNBREAKING, 1, true).flag(ItemFlag.HIDE_ENCHANTS);
}
if (!showTooltip) {
builder.flag(ItemFlag.HIDE_ADDITIONAL_TOOLTIP);
}
return builder.build();
}
public static ItemStack createGuiItem(Material material, Component name, boolean glowing, String... lore) {
return createGuiItem(material, name, glowing, true, lore);
}
}

View file

@ -0,0 +1,52 @@
package de.lunarakai.minecleaner.utils;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.format.NamedTextColor;
public class MinecleanerComponentUtils {
public static TextComponent createLangComponent(String langKey, NamedTextColor namedColor) {
return Component.text()
.color(namedColor)
.append(Component.translatable(langKey))
.build();
}
public static TextComponent createLangComponent(String langKey, String arg0, NamedTextColor namedColor) {
return Component.text()
.color(namedColor)
.append(Component.translatable(langKey, Component.text(arg0)))
.build();
}
public static TextComponent createLangComponent(String langKey, String arg0, String arg1, NamedTextColor namedColor) {
return Component.text()
.color(namedColor)
.append(Component.translatable(langKey, Component.text(arg0), Component.text(arg1)))
.build();
}
public static TextComponent createLangComponent(String langKey, String filler, String arg1, NamedTextColor namedColor, NamedTextColor namedColorArg1) {
if(MinecleanerStringUtil.isValidURL(arg1)) {
TextComponent urlMessage = Component.text(arg1);
urlMessage = urlMessage.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, arg1));
urlMessage = urlMessage.color(namedColorArg1);
return Component.text()
.color(namedColor)
.append(Component.translatable(langKey))
.append(Component.text(filler))
.append(urlMessage)
.build();
} else {
return Component.text()
.color(namedColor)
.append(Component.translatable(langKey))
.append(Component.text(filler))
.append(Component.text(arg1, namedColorArg1))
.build();
}
}
}

View file

@ -1,14 +1,8 @@
package de.lunarakai.minecleaner.utils; package de.lunarakai.minecleaner.utils;
import java.util.Arrays; import de.iani.cubesideutils.bukkit.items.CustomHeads;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
import com.destroystokyo.paper.profile.PlayerProfile;
import com.destroystokyo.paper.profile.ProfileProperty;
public enum MinecleanerHeads { public enum MinecleanerHeads {
MINESWEEPER_TILE_0("38206373-5653-4431-85aa-6276f3f9a046", "Minesweeper Tile 0", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzRjMjg0YTRlOTc0MDA1ZWE4ZDFkNGQwNjc0ZWMwODk0ZWZkOGY2ZGQwMjQ4NjM5YTZjZmE5NGY4NTM4OCJ9fX0="), MINESWEEPER_TILE_0("38206373-5653-4431-85aa-6276f3f9a046", "Minesweeper Tile 0", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzRjMjg0YTRlOTc0MDA1ZWE4ZDFkNGQwNjc0ZWMwODk0ZWZkOGY2ZGQwMjQ4NjM5YTZjZmE5NGY4NTM4OCJ9fX0="),
@ -38,40 +32,11 @@ public enum MinecleanerHeads {
private ItemStack head; private ItemStack head;
private MinecleanerHeads(String ownerUUIDString, String ownerName, String texturesProperty) { MinecleanerHeads(String ownerUUIDString, String ownerName, String texturesProperty) {
head = createHead(UUID.fromString(ownerUUIDString), ownerName, texturesProperty); head = CustomHeads.createHead(UUID.fromString(ownerUUIDString), ownerName, texturesProperty);
} }
public ItemStack getHead() { public ItemStack getHead() {
return new ItemStack(head); return new ItemStack(head);
} }
public ItemStack getHead(String displayName) {
return getHead(displayName, (String[]) null);
}
public ItemStack getHead(String displayName, String... lore) {
ItemStack stack = getHead();
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
if (lore != null && lore.length > 0) {
meta.setLore(Arrays.asList(lore));
}
stack.setItemMeta(meta);
return stack;
}
public static ItemStack createHead(UUID ownerUUID, String ownerName, String texturesProperty) {
if (ownerName == null) {
ownerName = ownerUUID.toString().substring(0, 16);
}
ItemStack stack = new ItemStack(Material.PLAYER_HEAD);
SkullMeta meta = (SkullMeta) stack.getItemMeta();
PlayerProfile profile = Bukkit.createProfile(ownerUUID, ownerName);
profile.setProperty(new ProfileProperty("textures", texturesProperty));
meta.setPlayerProfile(profile);
stack.setItemMeta(meta);
return stack;
}
} }

View file

@ -1,5 +1,8 @@
package de.lunarakai.minecleaner.utils; package de.lunarakai.minecleaner.utils;
import java.net.URL;
import net.kyori.adventure.text.Component;
public class MinecleanerStringUtil { public class MinecleanerStringUtil {
private MinecleanerStringUtil() { private MinecleanerStringUtil() {
} }
@ -12,7 +15,7 @@ public class MinecleanerStringUtil {
min = min % 60; min = min % 60;
StringBuilder timeString = new StringBuilder(); StringBuilder timeString = new StringBuilder();
if (hours > 0) { if (hours > 0) {
String hoursString = " Stunden"; String hoursString = " " + Component.translatable("minecleaner.common.hours");
if(shorten) { if(shorten) {
hoursString = " h"; hoursString = " h";
} }
@ -22,7 +25,7 @@ public class MinecleanerStringUtil {
if (!timeString.isEmpty()) { if (!timeString.isEmpty()) {
timeString.append(", "); timeString.append(", ");
} }
String minString = " Minuten"; String minString = " " + Component.translatable("minecleaner.common.minutes");
if(shorten) { if(shorten) {
minString = " min"; minString = " min";
} }
@ -30,9 +33,9 @@ public class MinecleanerStringUtil {
} }
if (sec > 0 || !timeString.isEmpty()) { if (sec > 0 || !timeString.isEmpty()) {
if (!timeString.isEmpty()) { if (!timeString.isEmpty()) {
timeString.append(" und "); timeString.append(Component.text(" ")).append(Component.translatable("minecleaner.common.and").append(Component.text(" ")));
} }
String secondsString = " Sekunden"; String secondsString = " " + Component.translatable("minecleaner.common.seconds");
if(shorten) { if(shorten) {
secondsString = " s"; secondsString = " s";
} }
@ -50,4 +53,14 @@ public class MinecleanerStringUtil {
String percentageString = String.format("%.1f", percent); String percentageString = String.format("%.1f", percent);
return percentageString + "%"; return percentageString + "%";
} }
public static boolean isValidURL(String urlString) {
try {
URL url = new URL(urlString);
url.toURI();
return true;
} catch (Exception e) {
return false;
}
}
} }

View file

@ -0,0 +1,11 @@
package de.lunarakai.minecleaner.utils;
import de.lunarakai.minecleaner.MinecleanerPlugin;
import org.bukkit.entity.Player;
public class MinecleanerUtils {
public static boolean isPlayerInGroup(MinecleanerPlugin plugin, Player player) {
return plugin.getGroupManager().getGroup(player) != null;
}
}

View file

@ -0,0 +1,77 @@
minecleaner.info.version=Version
minecleaner.info.developer=Entwickelt von
minecleaner.info.website=Website
minecleaner.info.license=Lizenz
minecleaner.common.hours=Stunden
minecleaner.common.minutes=Minuten
minecleaner.common.seconds=Sekunden
minecleaner.common.and=und
settings.manualreset.allow=Manuelles Resetten aktiviert
settings.manualreset.deny=Manuelles Resetten deaktiviert
settings.additionaltimer.allow=Zusätzliche Anzeige in der Action Bar aktiviert
settings.additionaltimer.deny=Zusätzliche Anzeige in der Action Bar deaktiviert
settings.timer.allow=Timer wird angezeigt
settings.timer.deny=Timer wird nicht angezeigt
settings.resettime.text=Resetzeit
arena.name.invalid=Ungültiger Arenaname. Erlaubt sind Buchstaben, Zahlen und der Unterstrich
arena.name.exists=Eine Arena mit diesem Namen existiert bereits
arena.width.klein=Klein
arena.width.mittel=Mittel
arena.width.gross=Gross
arena.width.experte=Experte
arena.widthindex.invalid=Kein Valider Arena WidthIndex!
arena.widthindex.validOptions=0 (oder weglassen) = 9*9, 1 = 12*12, 2 = 12*18, 3 = 12*33
arena.widthindex.toolarge=Arena WidthIndex darf nicht grösser als 3 sein
arena.create.lookAtCenter=Bitte gucke den Block an, der im Zentrum des {0}-Spielfelds sein soll.
arena.create.lookAtSide=Bitte gucke die Seite des Blockes an, wo das {0}-Spielfeld erstellt werden soll.
arena.create.otherArena=An dieser Stelle befindet sich bereits eine Arena.
arena.create.success=Die Arena wurde erfolgreich angelegt.
arena.delete.success=Die {0}-Arena {1} wurde gelöscht.
arena.delete.noarena=Hier befindet sich keine {0}-Arena.
arena.common.noarena=Hier befindet sich keine Arena.
arena.common.toofaraway=Du hast dich zu weit von der Arena entfernt. Das Spiel wurde abgebrochen.
arena.common.groupleadertoofaraway=Der Ersteller der Gruppe hat sich zu weit von der Arena entfernt. Das Spiel wurde abgebrochen.
arena.list.created=Angelegte {0}-Arenen
arena.list.none=(keine)
data.player.noData=Für Spieler "{0}" existieren keine Daten.
data.player.self=Deine {0} Statistik
data.player.other={0}-Statistik von {1}
data.player.roundswon=Runden gewonnen
data.player.pointsscored=Punkte erspielt
data.player.outof=von
data.player.besttime=Bestzeit
data.player.thismonth=Dieser Monat
data.delete.playerNotFound=Ein Spieler mit dem Namen "{0}" konnte nicht gefunden werden.
data.delete.deleted=Alle {0}-Statistiken von Spieler "{1}" wurden gelöscht.
data.console.nodata=Für die Konsole existieren keine Daten.
group.common.notingroup=Du bist in keiner Gruppe.
group.invite.accepted=Du hast die Einladung angenommen.
group.invite.denied=Du hast die Einladung abgelehnt.
group.invite.notinvited=Du wurdest in keine Gruppe eingeladen.
group.invite.creatorinround=Du kannst keine Einladung annehmen während die Person, die dich eingeladen hat, in einer Runde ist.
group.invite.notwhileinround=Du kannst keine Einladung verschicken während du in einer Runde bist.
group.invite.offline=Du kannst keine Person einladen, die entweder offline oder auf einen anderen Server ist.
group.invite.notyourself=Du kannst dich nicht selber in eine Gruppe einladen.
group.invite.invitedinround=Du kannst Spieler nicht einladen, die bereits in einer Runde sind.
group.invite.alreadyinvited=Du wurdest bereits in eine Gruppe eingeladen. Bitte kümmere dich zuerst um die Einladung bevor du eine eigene Gruppe erstellst.
group.invite.nopermission=Nur als Ersteller der Gruppe bist du berechtigt Leute einzuladen.
group.invite.accept=Annehmen
group.invite.deny=Ablehnen
group.dismantle.nopermission=Du bist nicht berechtigt deine Gruppe aufzulösen.
group.dismantle.yourgroup=Die Gruppe in der du dich befindest wurde aufgelöst.
group.game.nopermission=Nur der Ersteller der Gruppe kann eine neue Runde starten!
group.creator.removed=Die Gruppe wurde aufgelöst, da die Person, welche die Gruppe erstellt hat, aus der Gruppe entfernt wurde.
group.dismantled.alone=Die Gruppe wurde aufgelöst, da du nur noch alleine in der Gruppe bist.

View file

@ -0,0 +1,76 @@
minecleaner.info.version=Version
minecleaner.info.developer=Developed by
minecleaner.info.website=Website
minecleaner.info.license=License
minecleaner.common.hours=hours
minecleaner.common.minutes=minutes
minecleaner.common.seconds=seconds
minecleaner.common.and=and
settings.manualreset.allow=Manual reset activated
settings.manualreset.deny=Manual reset deactivated
settings.additionaltimer.allow=Additional display activated in the action bar
settings.additionaltimer.deny=Additional display deactivated in the action bar
settings.timer.allow=Timer is displayed
settings.timer.deny=Timer is not displayed
settings.resettime.text=reset time
arena.name.invalid=Invalid arena name. Allowed are letters, numbers and the underscore
arena.name.exists=An arena with this name already exists
arena.width.klein=Small
arena.width.mittel=Medium
arena.width.gross=Large
arena.width.experte=Expert
arena.widthindex.invalid=Not a valid Arena WidthIndex
arena.widthindex.validOptions=0 (or leave empty) = 9*9, 1 = 12*12, 2 = 12*18, 3 = 12*33
arena.widthindex.toolarge=Arena WidthIndex must not be greater than 3
arena.create.lookAtCenter=Please look at the block that should be in the center of the {0} field.
arena.create.lookAtSide=Please look at the side of the block where the {0} field is to be created.
arena.create.otherArena=There is already an arena at this location.
arena.create.success=The arena has been created successfully.
arena.delete.success=The {0}-arena {1} has been deleted.
arena.delete.noarena=There is no {0}-arena here.
arena.common.noarena=There is no arena here.
arena.common.toofaraway=You have moved too far away from the arena. The match has been abandoned.
arena.common.groupleadertoofaraway=The creator of the group has moved too far away from the arena. The match has been abandoned.
arena.list.created=Created {0} arenas
arena.list.none=(none)
data.player.noData=No data exists for player "{0}".
data.player.self=Your {0} statistics
data.player.other={0} statistics from {1}
data.player.roundswon=Rounds won
data.player.pointsscored=Points scored
data.player.outof=out of
data.player.besttime=Best time
data.player.thismonth=This month
data.delete.playerNotFound=A player with the name "{0}" could not be found.
data.delete.deleted=All {0} stats of player "{1}" have been deleted.
data.console.nodata=No data exists for the console.
group.common.notingroup=You are not in a group.
group.invite.accepted=You have accepted the invitation.
group.invite.denied=You declined the invitation.
group.invite.notinvited=You have not been invited to any group.
group.invite.creatorinround=You cannot accept an invitation while the person who invited you is in a round.
group.invite.notwhileinround=You cannot send an invitation while you are in a round.
group.invite.offline=You cannot invite a person who is either offline or on another server.
group.invite.notyourself=You cannot invite yourself to a group.
group.invite.invitedinround=You cannot invite players who are already in a round.
group.invite.alreadyinvited=You have already been invited to a group. Please take care of the invitation first before you create your own group.
group.invite.nopermission=Only as the creator of the group are you authorized to invite people.
group.invite.accept=Accept
group.invite.deny=Deny
group.dismantle.nopermission=You are not authorized to dissolve your group.
group.dismantle.yourgroup=The group you are in has been disbanded.
group.game.nopermission=Only the creator of the group can start a new round!
group.creator.removed=The group has been dissolved because the person who created the group has been removed from the group.
group.dismantled.alone=The group has been dissolved as you are now only alone in the group.

View file

@ -4,6 +4,9 @@ author: LunarAkai
website: https://github.com/LunarAkai/Minecleaner website: https://github.com/LunarAkai/Minecleaner
main: de.lunarakai.minecleaner.MinecleanerPlugin main: de.lunarakai.minecleaner.MinecleanerPlugin
api-version: '1.20' api-version: '1.20'
depend:
- CubesideUtils
softdepend: [CubesideSettings, PlayerUUIDCache]
commands: commands:
minecleaner: minecleaner:
description: main command description: main command