diff --git a/.github/workflows/compile_snapshot.yml b/.github/workflows/compile_snapshot.yml
index 683cb18d1..3405ba91d 100644
--- a/.github/workflows/compile_snapshot.yml
+++ b/.github/workflows/compile_snapshot.yml
@@ -14,11 +14,11 @@ jobs:
name: development
url: https://repo.andrei1058.dev
steps:
- - uses: actions/checkout@v2
- - name: Set up JDK 17.0.5
- uses: actions/setup-java@v2
+ - uses: actions/checkout@v3
+ - name: Set up JDK
+ uses: actions/setup-java@v3
with:
- java-version: '17.0.5'
+ java-version: '19.0.2+7'
distribution: 'adopt'
- name: Deploy snapshot with Maven
env:
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 74211a889..a55e8fc42 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -11,11 +11,11 @@ jobs:
name: production
url: https://repo.andrei1058.com
steps:
- - uses: actions/checkout@v2
- - name: Set up JDK 17.0.5
- uses: actions/setup-java@v2
+ - uses: actions/checkout@v3
+ - name: Set up JDK
+ uses: actions/setup-java@v3
with:
- java-version: '17.0.5'
+ java-version: '19.0.2+7'
distribution: 'adopt'
- name: Deploy with Maven
env:
diff --git a/.github/workflows/deploy_snapshot.yml b/.github/workflows/deploy_snapshot.yml
index 0d5575620..a736953be 100644
--- a/.github/workflows/deploy_snapshot.yml
+++ b/.github/workflows/deploy_snapshot.yml
@@ -13,11 +13,11 @@ jobs:
name: development
url: https://repo.andrei1058.dev
steps:
- - uses: actions/checkout@v2
- - name: Set up JDK 17.0.5
- uses: actions/setup-java@v2
+ - uses: actions/checkout@v3
+ - name: Set up JDK
+ uses: actions/setup-java@v3
with:
- java-version: '17.0.5'
+ java-version: '19.0.2+7'
distribution: 'adopt'
- name: Deploy snapshot with Maven
env:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d2b45e7d1..3152091f5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -89,3 +89,18 @@ core team. |
| `under-review` | Pull requests being reviewed by maintainers. |
| `requires-changes` | Pull requests which need to be updated based on review comments and then reviewed again. |
| `needs-testing` | Pull requests which need manual testing. |
+
+# How to add support for a new Minecraft version
+
+First give a look at the project structure above on this page, clone the versionsupport of
+the latest supported version and then make sure to rename the package and class, plus update
+the pom file with the new version name.
+
+At this point make sure to map the following aspects on the new NMS:
+- Pathfinders for goals and targets in `DespawnableProvider`
+- `PlayerConnection` used to send packets in `v1_nn_Rx` class
+- Glass and other modified blocks in `v1_nn_Rx#registerTntWhitelist`
+- NBTTags in `v1_nn_Rx` for Item, Entity and ItemStacks
+- eventually other functions that were not mapped yet by spigot
+
+For your update to go live, [SidebarLib](https://github.com/andrei1058/SidebarLib) needs to be updated to your new version as well.
diff --git a/README.md b/README.md
index cfdce1492..7e8c75a33 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,12 @@
-[![Logo](./.github/assets/logo_open_source.png)](#)
+![Logo](./.github/assets/logo_open_source.png)
-[![Discord](https://discordapp.com/api/guilds/201345265821679617/widget.png?style=shield)](https://discord.gg/XdJfN2X) [![bStats](https://img.shields.io/bstats/servers/1885)](#)
As from November 1st 2021 BedWars1058 by Andrei Dascălu becomes open source under GNU GPL 3.0 license. If you are a developer I would really appreciate if you'd come with pull requests instead of making hundreds of forks. Let's make updates available for everyone!
+[![Discord](https://discordapp.com/api/guilds/201345265821679617/widget.png?style=shield)](https://discord.gg/XdJfN2X)
+
+[![Crowdin](https://support.crowdin.com/assets/badges/localization-at-white-rounded-bordered@1x.svg)](https://crowdin.com/project/bedwars1058)
+
# Description
BedWars is a mini-game where you have to defend your bed and destroy the others.
Once your bed is destroyed, you cannot respawn.
@@ -12,16 +15,20 @@ Once your bed is destroyed, you cannot respawn.
This software runs on [Spigot](https://www.spigotmc.org/) and NMS.
Spigot forks without compiled NMS code are not supported.
Officially supported servers are [spigot](https://www.spigotmc.org/) and [paper](https://papermc.io/).
-It is required to use Java 11 or newer.
+It is required to use **Java 11** or newer.
The internal world restore system is based on zipping and unzipping maps which can become
-heavy if you are still making use of HDD in 2021, and you do not have a decent CPU, for a better
-and faster restore system install [SlimeWorldManager](https://www.spigotmc.org/resources/slimeworldmanager.69974/) or [AdvancedWorldManager](https://www.spigotmc.org/resources/advanced-slimeworldmanager.87209/).
-BedWars1058 will hook into it and do everything for you.
+heavy if you are still making use of HDDs and you do not have a decent CPU, for a better
+and faster restore system we recommend using one of the following solutions:
+- [SlimeWorldManager](https://www.spigotmc.org/resources/slimeworldmanager.69974/) plug-in (v2.2.1 **only**)
+- [AdvancedWorldManager](https://www.spigotmc.org/resources/advanced-slimeworldmanager.87209/) plug-in (v2.8.0 **only**)
+- [AdvancedSlimePaper](https://github.com/InfernalSuite/AdvancedSlimePaper) server jar (**1.20 or newer**)
+
+BedWars1058 will hook into it and do everything for you, no additional configuration is needed.
-# Pre-made setups and community addons
+# Pre-made setups and community add-ons
-You can find a list of pre-made setups and community addons [on the wiki](https://wiki.andrei1058.dev/docs/BedWars1058/addons)
+You can find a list of pre-made server setups and a lot of community add-ons [on BedWars1058 Wiki](https://wiki.andrei1058.dev/docs/BedWars1058/addons).
# Main features
@@ -115,20 +122,25 @@ If you get disconnected, or if you leave a game (configurable) you can re-join i
###### Season events:
- Halloween special. It is enabled automatically based on your machine timezone and will provide cool effects.
-# Community servers
-Chosen by hundreds of servers all around the world.
-[![Fear Games Logo](.github/assets/servers/fear_games.png)](https://feargames.it/)
-[![Gamster Logo](.github/assets/servers/gamster.png)](https://www.gamster.org/)
-- mc.feargames.it
-- mc.gamster.org
+# Contributing
+Any help is appreciated, just give a quick look at [CONTRIBUTING.md](https://github.com/andrei1058/BedWars1058/blob/master/CONTRIBUTING.md) first!
+If you are not a programmer you can help answering people in the [Issues](https://github.com/andrei1058/BedWars1058/issues) section or even [translate the plugin in your languae on Crowdin](https://crowdin.com/project/bedwars1058).
+
+### Translation progress
+[Translation Chart](https://badges.awesome-crowdin.com/translation-12780139-594479.png)
# 3rd party libraries
- [bStats](https://bstats.org/getting-started/include-metrics)
-- [Sidebar API](https://github.com/andrei1058/SiderbarLib)
+- [SidebarLib](https://github.com/andrei1058/SiderbarLib)
- [Commons IO](https://mvnrepository.com/artifact/commons-io/commons-io)
- [HikariCP](https://mvnrepository.com/artifact/com.zaxxer/HikariCP)
- [SLF4J](http://www.slf4j.org/)
# Contact
[![Discord Server](https://discordapp.com/api/guilds/201345265821679617/widget.png?style=banner3)](https://discord.gg/XdJfN2X)
+
+# Special Thanks To
+[](https://www.jetbrains.com)
+
+Jetbrains supports BedWars1058 with their [Open Source Licenses](https://www.jetbrains.com/opensource/).
diff --git a/bedwars-api/pom.xml b/bedwars-api/pom.xml
index 5dcbe3698..733d6f250 100644
--- a/bedwars-api/pom.xml
+++ b/bedwars-api/pom.xml
@@ -5,7 +5,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT4.0.0bedwars-api
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/IArena.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/IArena.java
index 8ff0849b4..e15255569 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/IArena.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/IArena.java
@@ -21,6 +21,7 @@
package com.andrei1058.bedwars.api.arena;
import com.andrei1058.bedwars.api.arena.generator.IGenerator;
+import com.andrei1058.bedwars.api.arena.stats.GameStatsHolder;
import com.andrei1058.bedwars.api.arena.team.ITeam;
import com.andrei1058.bedwars.api.arena.team.ITeamAssigner;
import com.andrei1058.bedwars.api.configuration.ConfigManager;
@@ -34,14 +35,13 @@
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
+import org.jetbrains.annotations.Nullable;
import java.time.Instant;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
+@SuppressWarnings("unused")
public interface IArena {
/**
@@ -264,13 +264,22 @@ public interface IArena {
* @param p Target player
* @param finalKills True if you want to get the Final Kills. False for regular kills.
*/
+ @Deprecated
int getPlayerKills(Player p, boolean finalKills);
+ /**
+ * Session stats.
+ * @return stats container for this game.
+ */
+ @Nullable
+ GameStatsHolder getStatsHolder();
+
/**
* Get the player beds destroyed count
*
* @param p Target player
*/
+ @Deprecated
int getPlayerBedsDestroyed(Player p);
/**
@@ -318,11 +327,13 @@ default boolean isRespawning(Player p) {
/**
* Add a kill point to the game stats.
*/
+ @Deprecated
void addPlayerKill(Player p, boolean finalKill, Player victim);
/**
* Add a destroyed bed point to the player temp stats.
*/
+ @Deprecated
void addPlayerBedDestroyed(Player p);
@@ -343,6 +354,7 @@ default boolean isRespawning(Player p) {
/**
* Add a kill to the player temp stats.
*/
+ @Deprecated
void addPlayerDeath(Player p);
/**
@@ -392,6 +404,7 @@ default boolean isRespawning(Player p) {
/**
* Get player deaths.
*/
+ @Deprecated
int getPlayerDeaths(Player p, boolean finalDeaths);
/**
@@ -494,4 +507,33 @@ default boolean isRespawning(Player p) {
void setTeamAssigner(ITeamAssigner teamAssigner);
List getLeavingPlayers();
+
+
+ /**
+ * Check if breaking map is allowed, otherwise only placed blocks are allowed.
+ * Some blocks like have a special protections, like blocks under shopkeepers, bed, ecc.
+ */
+ @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+ boolean isAllowMapBreak();
+
+ /**
+ * Toggle map block break rule.
+ */
+ void setAllowMapBreak(boolean allowMapBreak);
+
+ /**
+ * Check if there is a player bed at given location.
+ */
+ boolean isTeamBed(Location location);
+
+ /**
+ * Get owner team of a bed based on location.
+ */
+ @Nullable ITeam getBedsTeam(Location location);
+
+ /**
+ * Provides the winner team.
+ * This is populated on restarting phase.
+ */
+ @Nullable ITeam getWinner();
}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/DefaultStatistics.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/DefaultStatistics.java
new file mode 100644
index 000000000..02c390555
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/DefaultStatistics.java
@@ -0,0 +1,29 @@
+package com.andrei1058.bedwars.api.arena.stats;
+
+import org.jetbrains.annotations.NotNull;
+
+@SuppressWarnings("SpellCheckingInspection")
+public enum DefaultStatistics {
+
+ KILLS("kills", true),
+ KILLS_FINAL("finalKills", true),
+ DEATHS("deaths", true),
+ DEATHS_FINAL("finalDeaths", true),
+ BEDS_DESTROYED("bedsDestroyed", true);
+
+ private final String id;
+ private final boolean incrementable;
+ DefaultStatistics(String id, boolean incrementable) {
+ this.id = id;
+ this.incrementable = incrementable;
+ }
+
+ @Override
+ public @NotNull String toString() {
+ return id;
+ }
+
+ public boolean isIncrementable() {
+ return incrementable;
+ }
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatistic.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatistic.java
new file mode 100644
index 000000000..f143e8fe6
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatistic.java
@@ -0,0 +1,29 @@
+package com.andrei1058.bedwars.api.arena.stats;
+
+import com.andrei1058.bedwars.api.language.Language;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Game statistic.
+ * @param statistic type. We usually work with integers.
+ */
+public interface GameStatistic extends Comparable> {
+
+ /**
+ * Current value.
+ */
+ T getValue();
+
+ /**
+ * Value displayed in tops etc.
+ * @param language - message receiver.
+ */
+ String getDisplayValue(@Nullable Language language);
+
+ /**
+ * Comparison for tops.
+ * @param o the object to be compared.
+ */
+ int compareTo(@NotNull GameStatistic o);
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatisticProvider.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatisticProvider.java
new file mode 100644
index 000000000..1e8d5b6e5
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatisticProvider.java
@@ -0,0 +1,30 @@
+package com.andrei1058.bedwars.api.arena.stats;
+
+import com.andrei1058.bedwars.api.language.Language;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.Nullable;
+
+public interface GameStatisticProvider> {
+
+ /**
+ * Unique statistic identifier.
+ */
+ String getIdentifier();
+
+ /**
+ * Plugin provider.
+ * @return statistic owner.
+ */
+ Plugin getOwner();
+
+ /**
+ * Default value used when initializing game stats.
+ */
+ T getDefault();
+
+ /**
+ * Display value for undetermined values.
+ * @param language desired translation.
+ */
+ String getVoidReplacement(@Nullable Language language);
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatsHolder.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatsHolder.java
new file mode 100644
index 000000000..aa5f588da
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/GameStatsHolder.java
@@ -0,0 +1,96 @@
+package com.andrei1058.bedwars.api.arena.stats;
+
+import com.andrei1058.bedwars.api.arena.IArena;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+@SuppressWarnings("unused")
+public interface GameStatsHolder {
+
+ IArena getArena();
+
+ /**
+ * Register statistic.
+ * Throws a runtime exception if statistic is already registered.
+ * @param statistic new statistic.
+ */
+ void register(@NotNull GameStatisticProvider> statistic);
+
+ /**
+ * Initialize game session stats for given player.
+ * @param player stats holder.
+ */
+ PlayerGameStats init(Player player);
+
+ /**
+ * Remove player tracked data.
+ * @param uuid holder.
+ */
+ void unregisterPlayer(UUID uuid);
+
+ /**
+ * Get existing or initialize statistic for given player.
+ * @param holder player holder.
+ * @return Existing or new statistic.
+ */
+ @NotNull PlayerGameStats getCreate(@NotNull Player holder);
+
+ /**
+ * Get existing or initialize statistic for given player.
+ * @param holder player holder.
+ * @return Existing or new statistic.
+ */
+ Optional get(@NotNull UUID holder);
+
+ /**
+ * Get existing or initialize statistic for given player.
+ * @param holder player holder.
+ * @return Existing or new statistic.
+ */
+ default Optional get(@NotNull Player holder) {
+ return get(holder.getUniqueId());
+ }
+
+ /**
+ * Get tracked players.
+ *
+ * @return Unmodifiable list of tracked players.
+ */
+ Collection> getTrackedPlayers();
+
+
+ /**
+ * @param statistic Order collection by given statistic.
+ * @return top list.
+ */
+ default Collection> getOrderedBy(@NotNull DefaultStatistics statistic) {
+ return getOrderedBy(statistic.toString());
+ }
+
+ /**
+ * @param statistic Order collection by given statistic.
+ * @return top list.
+ */
+ List> getOrderedBy(@NotNull String statistic);
+
+ /**
+ * Check if given statistic is registered.
+ */
+ boolean hasStatistic(String orderBy);
+
+ /**
+ * @return unmodifiable list of registered game statistics.
+ */
+ List getRegistered();
+
+ /**
+ * Get statistic provider.
+ */
+ @Nullable GameStatisticProvider> getProvider(String registered);
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/Incrementable.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/Incrementable.java
new file mode 100644
index 000000000..615e6d067
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/Incrementable.java
@@ -0,0 +1,6 @@
+package com.andrei1058.bedwars.api.arena.stats;
+
+public interface Incrementable {
+
+ void increment();
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/PlayerGameStats.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/PlayerGameStats.java
new file mode 100644
index 000000000..1b80736f9
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/stats/PlayerGameStats.java
@@ -0,0 +1,39 @@
+package com.andrei1058.bedwars.api.arena.stats;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+/**
+ * Player stats container for a game.
+ */
+public interface PlayerGameStats {
+
+ @NotNull UUID getPlayer();
+
+ /**
+ * @return player display name.
+ */
+ @NotNull String getDisplayPlayer();
+
+ /**
+ * @return player username.
+ */
+ @NotNull String getUsername();
+
+ void registerStatistic(@NotNull String id, @NotNull GameStatistic> defaultValue);
+
+ Optional> getStatistic(@NotNull String id);
+
+ default Optional> getStatistic(@NotNull DefaultStatistics id) {
+ return getStatistic(id.toString());
+ }
+
+ /**
+ * List of registered statistics.
+ */
+ @SuppressWarnings("unused")
+ List getRegistered();
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/team/ITeam.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/team/ITeam.java
index f55abf2e9..e0aefbea7 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/team/ITeam.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/arena/team/ITeam.java
@@ -38,6 +38,11 @@
public interface ITeam {
+ /**
+ * Runtime identifier.
+ */
+ UUID getIdentity();
+
/**
* Get team color.
*/
@@ -345,4 +350,17 @@ public interface ITeam {
* @param location x,y,z.
*/
void setKillDropsLocation(Vector location);
+
+ /**
+ * Check if bed is placed at given location.
+ * Or partial.
+ */
+ boolean isBed(Location location);
+
+ /**
+ * What happens when one of team beds is destroyed at given location.
+ */
+ default void onBedDestroy(Location location) {
+ throw new RuntimeException("Not implemented yet");
+ }
}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigManager.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigManager.java
index 17bcbfa38..b1f9d9f6f 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigManager.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigManager.java
@@ -47,6 +47,7 @@ public class ConfigManager {
*/
public ConfigManager(Plugin plugin, String name, String dir) {
File d = new File(dir);
+
if (!d.exists()) {
if (!d.mkdirs()) {
plugin.getLogger().log(Level.SEVERE, "Could not create " + d.getPath());
@@ -208,6 +209,10 @@ public int getInt(String path) {
return yml.getInt(path);
}
+ public double getDouble(String path) {
+ return yml.getDouble(path);
+ }
+
/**
* Get string at given path
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigPath.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigPath.java
index a867601e3..54c381226 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigPath.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/ConfigPath.java
@@ -23,6 +23,20 @@
@SuppressWarnings("WeakerAccess")
public class ConfigPath {
+ public static final String GAME_END_PATH = "game-end";
+ @GameMainOverridable
+ public static final String GENERAL_GAME_END_SHOW_ELIMINATED = GAME_END_PATH+".show-eliminated";
+ @GameMainOverridable
+ public static final String GENERAL_GAME_END_TELEPORT_ELIMINATED = GAME_END_PATH+".teleport-eliminated";
+ @GameMainOverridable
+ public static final String GENERAL_GAME_END_CHAT_TOP_STATISTIC = GAME_END_PATH+".chat-top.order-by";
+ @GameMainOverridable
+ public static final String GENERAL_GAME_END_CHAT_TOP_HIDE_MISSING = GAME_END_PATH+".chat-top.hide-missing";
+ @GameMainOverridable
+ public static final String GENERAL_GAME_END_SB_TOP_STATISTIC = GAME_END_PATH+".sb-top.order-by";
+ @GameMainOverridable
+ public static final String GENERAL_GAME_END_SB_TOP_HIDE_MISSING = GAME_END_PATH+".sb-top.hide-missing";
+
public static final String GENERATOR_STACK_ITEMS = "stack-items";
public static final String GENERATOR_IRON_DELAY = "iron.delay";
@@ -136,8 +150,13 @@ public class ConfigPath {
public static final String SB_CONFIG_SIDEBAR_LIST_FORMAT_PLAYING = "scoreboard-settings.player-list.format-playing-list";
public static final String SB_CONFIG_SIDEBAR_LIST_FORMAT_RESTARTING = "scoreboard-settings.player-list.format-restarting-list";
public static final String SB_CONFIG_SIDEBAR_LIST_REFRESH = "scoreboard-settings.player-list.names-refresh-interval";
+ public static final String SB_CONFIG_SIDEBAR_HEALTH_ENABLE = "scoreboard-settings.health.enable";
public static final String SB_CONFIG_SIDEBAR_HEALTH_IN_TAB = "scoreboard-settings.health.display-in-tab";
public static final String SB_CONFIG_SIDEBAR_HEALTH_REFRESH = "scoreboard-settings.health.animation-refresh-interval";
+
+ public static final String SB_CONFIG_TAB_HEADER_FOOTER_ENABLE = "scoreboard-settings.tab-header-footer.enable";
+ public static final String SB_CONFIG_TAB_HEADER_FOOTER_REFRESH_INTERVAL = "scoreboard-settings.tab-header-footer.refresh-interval";
+
public static final String GENERAL_CONFIGURATION_DISABLED_LANGUAGES = "disabled-languages";
public static final String GENERAL_CONFIGURATION_ARENA_SELECTOR_PATH = "arena-gui";
@@ -156,6 +175,7 @@ public class ConfigPath {
public static final String GENERAL_CONFIGURATION_ENABLE_GEN_SPLIT = "enable-gen-split";
public static final String GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP = "server-ip";
+ public static final String GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_POWERED_BY = "powered-by";
private static final String GENERAL_CHAT = "chat-settings.";
public static final String GENERAL_CHAT_FORMATTING = GENERAL_CHAT+"format";
@@ -211,6 +231,15 @@ public class ConfigPath {
public static final String GENERAL_TNT_JUMP_DAMAGE_TEAMMATES = GENERAL_TNT_JUMP_PATH + ".damage-teammates";
public static final String GENERAL_TNT_JUMP_DAMAGE_OTHERS = GENERAL_TNT_JUMP_PATH + ".damage-others";
+ public static final String GENERAL_TNT_BLAST_PROTECTION = "blast-protection";
+ public static final String GENERAL_TNT_PROTECTION_END_STONE_BLAST = GENERAL_TNT_BLAST_PROTECTION+".end-stone";
+ public static final String GENERAL_TNT_PROTECTION_GLASS_BLAST = GENERAL_TNT_BLAST_PROTECTION+".glass";
+ public static final String GENERAL_TNT_RAY_BLOCKED_BY_GLASS = GENERAL_TNT_BLAST_PROTECTION+".ray-blocked-by-glass";
+
+ public static final String GENERAL_TNT_PRIME = "tnt-prime-settings";
+ public static final String GENERAL_TNT_AUTO_IGNITE = GENERAL_TNT_PRIME+".auto-ignite";
+ public static final String GENERAL_TNT_FUSE_TICKS = GENERAL_TNT_PRIME+".fuse-ticks";
+
private static final String GENERAL_FIREBALL_PATH = "fireball";
public static final String GENERAL_FIREBALL_EXPLOSION_SIZE = GENERAL_FIREBALL_PATH + ".explosion-size";
public static final String GENERAL_FIREBALL_SPEED_MULTIPLIER = GENERAL_FIREBALL_PATH + ".speed-multiplier";
@@ -233,7 +262,7 @@ public class ConfigPath {
private static final String GENERAL_CONFIGURATION_HEAL_POOL = GENERAL_CONFIGURATION_PERFORMANCE_PATH+".heal-pool";
public static final String GENERAL_CONFIGURATION_HEAL_POOL_ENABLE = GENERAL_CONFIGURATION_HEAL_POOL+".enable";
- public static final String GENERAL_CONFIGURATION_HEAL_POOL_SEEN_TEAM_ONLY = GENERAL_CONFIGURATION_HEAL_POOL_ENABLE+".seen-by-team-only";
+ public static final String GENERAL_CONFIGURATION_HEAL_POOL_SEEN_TEAM_ONLY = GENERAL_CONFIGURATION_HEAL_POOL+".seen-by-team-only";
public static final String SHOP_SETTINGS_PATH = "shop-settings";
public static final String SHOP_SPECIALS_PATH = "shop-specials";
public static final String SHOP_QUICK_DEFAULTS_PATH = "quick-buy-defaults";
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/GameMainOverridable.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/GameMainOverridable.java
new file mode 100644
index 000000000..7627e2293
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/configuration/GameMainOverridable.java
@@ -0,0 +1,8 @@
+package com.andrei1058.bedwars.api.configuration;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface GameMainOverridable {
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/events/player/PlayerKillEvent.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/events/player/PlayerKillEvent.java
index 40198608d..d1e836114 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/events/player/PlayerKillEvent.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/events/player/PlayerKillEvent.java
@@ -21,18 +21,24 @@
package com.andrei1058.bedwars.api.events.player;
import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.function.Function;
+@SuppressWarnings("unused")
public class PlayerKillEvent extends Event {
private static final HandlerList HANDLERS = new HandlerList();
private final IArena arena;
private final Player victim;
+ private ITeam victimTeam;
private final Player killer;
+ private ITeam killerTeam;
private final PlayerKillCause cause;
private Function message;
private boolean playSound = true;
@@ -42,12 +48,46 @@ public class PlayerKillEvent extends Event {
*
* @param killer can be NULL.
*/
- public PlayerKillEvent(IArena arena, Player victim, Player killer, Function message, PlayerKillCause cause) {
+ @Deprecated()
+ public PlayerKillEvent(
+ @NotNull IArena arena,
+ Player victim,
+ Player killer,
+ Function message,
+ PlayerKillCause cause) {
+ victimTeam = arena.getTeam(victim);
+ if (null == victimTeam) {
+ victimTeam = arena.getExTeam(victim.getUniqueId());
+ }
+
+ if (null != killer) {
+ killerTeam = arena.getTeam(killer);
+ if (null == killerTeam) {
+ killerTeam = arena.getExTeam(killer.getUniqueId());
+ }
+ }
+ this.arena = arena;
+ this.victim = victim;
+ this.killer = killer;
+ this.message = message;
+ this.cause = cause;
+ }
+
+ public PlayerKillEvent(
+ @NotNull IArena arena,
+ @NotNull Player victim,
+ @Nullable ITeam victimTeam,
+ @Nullable Player killer,
+ @Nullable ITeam killerTeam,
+ @Nullable Function message,
+ @NotNull PlayerKillCause cause) {
this.arena = arena;
this.victim = victim;
this.killer = killer;
this.message = message;
this.cause = cause;
+ this.victimTeam = victimTeam;
+ this.killerTeam = killerTeam;
}
public enum PlayerKillCause {
@@ -109,14 +149,14 @@ public Player getKiller() {
/**
* Get kill chat message.
*/
- public Function getMessage() {
+ public @Nullable Function getMessage() {
return message;
}
/**
* Set chat message.
*/
- public void setMessage(Function message) {
+ public void setMessage(@Nullable Function message) {
this.message = message;
}
@@ -152,6 +192,23 @@ public void setPlaySound(boolean playSound) {
this.playSound = playSound;
}
+
+ public ITeam getKillerTeam() {
+ return killerTeam;
+ }
+
+ public ITeam getVictimTeam() {
+ return victimTeam;
+ }
+
+ public void setKillerTeam(ITeam killerTeam) {
+ this.killerTeam = killerTeam;
+ }
+
+ public void setVictimTeam(ITeam victimTeam) {
+ this.victimTeam = victimTeam;
+ }
+
public HandlerList getHandlers() {
return HANDLERS;
}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Language.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Language.java
index 4bf69bede..46d7ed201 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Language.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Language.java
@@ -24,11 +24,12 @@
import com.andrei1058.bedwars.api.configuration.ConfigManager;
import com.andrei1058.bedwars.api.configuration.ConfigPath;
import com.andrei1058.bedwars.api.events.player.PlayerLangChangeEvent;
+import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
import java.util.*;
@@ -45,6 +46,57 @@ public class Language extends ConfigManager {
public Language(Plugin plugin, String iso) {
super(plugin, "messages_" + iso, plugin.getDataFolder().getPath() + "/Languages");
this.iso = iso;
+
+ // replace old placeholders
+ List oldMsg = getYml().getStringList(Messages.GAME_END_TOP_PLAYER_CHAT);
+ if (!oldMsg.isEmpty()) {
+ String[] oldTop1 = new String[]{"{firstName}", "{secondName}", "{thirdName}"};
+ String[] oldTop2 = new String[]{"{firstKills}", "{secondKills}", "{thirdKills}"};
+
+ List newMsg = new ArrayList<>();
+ for (String oldString : oldMsg) {
+ for (String oldPlaceholder : oldTop1) {
+ oldString = oldString.replace(oldPlaceholder, "{topPlayerName}");
+ }
+ for (String oldPlaceholder : oldTop2) {
+ oldString = oldString.replace(oldPlaceholder, "{topValue}");
+ }
+ newMsg.add(oldString);
+ }
+
+ getYml().set(Messages.GAME_END_TOP_PLAYER_CHAT, newMsg);
+ }
+
+ if (null != getYml().get("scoreboard")) {
+ for (String group : getYml().getConfigurationSection("scoreboard").getKeys(false)) {
+ if (group.equalsIgnoreCase("lobby")) {
+ relocate("scoreboard." + group, "sidebar." + group);
+ } else {
+ Map stages = new HashMap<>();
+ stages.put("waiting", new String[]{Messages.SCOREBOARD_DEFAULT_WAITING, Messages.SCOREBOARD_DEFAULT_WAITING_SPEC});
+ stages.put("starting", new String[]{Messages.SCOREBOARD_DEFAULT_STARTING, Messages.SCOREBOARD_DEFAULT_STARTING_SPEC});
+
+ for (Map.Entry stage : stages.entrySet()) {
+ if (exists("scoreboard." + group + "." + stage.getKey() + ".player")) {
+ relocate("scoreboard." + group + "." + stage.getKey() + ".player", stage.getValue()[0].replace("Default", group));
+ } else {
+ relocate("scoreboard." + group + "." + stage.getKey(), stage.getValue()[0].replace("Default", group));
+ }
+ if (exists("scoreboard." + group + "." + stage.getKey() + ".spectator")) {
+ relocate("scoreboard." + group + "." + stage.getKey() + ".spectator", stage.getValue()[1].replace("Default", group));
+ }
+ }
+ if (exists("scoreboard." + group + ".playing.alive")) {
+ relocate("scoreboard." + group + ".playing.alive", Messages.SCOREBOARD_DEFAULT_PLAYING.replace("Default", group));
+ relocate("scoreboard." + group + ".playing.spectator", Messages.SCOREBOARD_DEFAULT_PLAYING.replace("Default", group));
+ } else {
+ relocate("scoreboard." + group + ".playing", Messages.SCOREBOARD_DEFAULT_PLAYING.replace("Default", group));
+ }
+ }
+ }
+ getYml().set("scoreboard", null);
+ }
+
languages.add(this);
}
@@ -62,8 +114,8 @@ public void setPrefixStatic(String prefix) {
/**
* Get scoreboard strings.
*/
- public static List getScoreboard(Player p, String path, String alternative) {
- Language language = getPlayerLanguage(p);
+ public static List getScoreboard(Player player, String path, String alternative) {
+ Language language = getPlayerLanguage(player);
if (language.exists(path)) {
return language.l(path);
} else {
@@ -92,16 +144,19 @@ public String getLangName() {
/**
* Get message in player's language.
*/
- public static String getMsg(Player p, String path) {
- if (p == null) return getDefaultLanguage().m(path);
- return langByPlayer.getOrDefault(p.getUniqueId(), getDefaultLanguage()).m(path).replace("{prefix}", (prefixStatic == null ? "" : prefixStatic));
+ public static String getMsg(Player player, String path) {
+ if (player == null) {
+ return getDefaultLanguage().m(path);
+ }
+ return langByPlayer.getOrDefault(player.getUniqueId(), getDefaultLanguage())
+ .m(path).replace("{prefix}", (prefixStatic == null ? "" : prefixStatic));
}
/**
* Retrieve a player language.
*/
- public static Language getPlayerLanguage(Player p) {
- return langByPlayer.getOrDefault(p.getUniqueId(), getDefaultLanguage());
+ public static Language getPlayerLanguage(@NotNull Player player) {
+ return langByPlayer.getOrDefault(player.getUniqueId(), getDefaultLanguage());
}
public static Language getPlayerLanguage(UUID p) {
@@ -118,8 +173,17 @@ public boolean exists(String path) {
/**
* Get a string list in player's language.
*/
- public static List getList(Player p, String path) {
- return langByPlayer.getOrDefault(p.getUniqueId(), getDefaultLanguage()).l(path);
+ public static List getList(@NotNull Player player, String path) {
+ return langByPlayer.getOrDefault(player.getUniqueId(), getDefaultLanguage()).l(path);
+ }
+
+ @SuppressWarnings("unused")
+ public void relocate(String from, String to) {
+ Object fromData = getYml().get(from);
+ if (null != fromData) {
+ this.getYml().set(to, fromData);
+ this.getYml().set(from, null);
+ }
}
/**
@@ -153,8 +217,6 @@ public String m(String path) {
return ChatColor.translateAlternateColorCodes('&', message
.replace("{prefix}", (prefix == null ? "" : prefix))
.replace("{serverIp}", serverIp == null ? "" : serverIp)
- // deprecated
- .replace("{server_ip}", serverIp == null ? "" : serverIp)
);
}
@@ -193,7 +255,7 @@ public static boolean isLanguageExist(String iso) {
/**
* Get language with given info.
*
- * @return null if could not find.
+ * @return null if you could not find.
*/
public static Language getLang(String iso) {
for (Language l : languages) {
@@ -241,7 +303,7 @@ public static void setupCustomStatsMessages() {
}
@SuppressWarnings("WeakerAccess")
- public void addDefaultStatsMsg(YamlConfiguration yml, String path, String name, String... lore) {
+ public void addDefaultStatsMsg(@NotNull YamlConfiguration yml, String path, String name, String... lore) {
if (yml.getDefaults() == null || !yml.getDefaults().contains(Messages.PLAYER_STATS_GUI_PATH + "-" + path + "-name"))
yml.addDefault(Messages.PLAYER_STATS_GUI_PATH + "-" + path + "-name", name);
if (yml.getDefaults() == null || !yml.getDefaults().contains(Messages.PLAYER_STATS_GUI_PATH + "-" + path + "-lore"))
@@ -328,7 +390,7 @@ public void setupUnSetCategories() {
/**
* Add required messages for a shop category to the given yml
*/
- public static void addCategoryMessages(YamlConfiguration yml, String categoryName, String invName, String itemName, List itemLore) {
+ public static void addCategoryMessages(@NotNull YamlConfiguration yml, String categoryName, String invName, String itemName, List itemLore) {
if (yml.getDefaults() == null || !yml.getDefaults().contains(Messages.SHOP_CATEGORY_INVENTORY_NAME.replace("%category%", categoryName)))
yml.addDefault(Messages.SHOP_CATEGORY_INVENTORY_NAME.replace("%category%", categoryName), invName);
if (yml.getDefaults() == null || !yml.getDefaults().contains(Messages.SHOP_CATEGORY_ITEM_NAME.replace("%category%", categoryName)))
@@ -340,7 +402,7 @@ public static void addCategoryMessages(YamlConfiguration yml, String categoryNam
/**
* Add required messages for a shop category to the given yml
*/
- public static void addContentMessages(YamlConfiguration yml, String contentName, String categoryName, String itemName, List itemLore) {
+ public static void addContentMessages(@NotNull YamlConfiguration yml, String contentName, String categoryName, String itemName, List itemLore) {
final String path1 = Messages.SHOP_CONTENT_TIER_ITEM_NAME.replace("%category%", categoryName).replace("%content%", contentName),
path2 = Messages.SHOP_CONTENT_TIER_ITEM_LORE.replace("%category%", categoryName).replace("%content%", contentName);
if (yml.getDefaults() == null || !yml.getDefaults().contains(path1)) yml.addDefault(path1, itemName);
@@ -391,7 +453,7 @@ public static boolean setPlayerLanguage(UUID uuid, String iso) {
return true;
}
- public static String[] getCountDownTitle(Language playerLang, int second) {
+ public static String @NotNull [] getCountDownTitle(@NotNull Language playerLang, int second) {
String[] result = new String[2];
result[0] = ChatColor.translateAlternateColorCodes('&', playerLang.getYml().get(Messages.ARENA_STATUS_START_COUNTDOWN_TITLE + "-" + second, playerLang.getString(Messages.ARENA_STATUS_START_COUNTDOWN_TITLE)).toString().replace("{second}", String.valueOf(second)));
if (result[0].isEmpty()) {
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Messages.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Messages.java
index 97e4759e9..17c8679d0 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Messages.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/language/Messages.java
@@ -27,7 +27,9 @@ public class Messages {
public static String PREFIX = "prefix";
- /** next event related */
+ /**
+ * next event related
+ */
public static String NEXT_EVENT_DIAMOND_UPGRADE_II = "next-event-diamondII";
public static String NEXT_EVENT_DIAMOND_UPGRADE_III = "next-event-diamondIII";
public static String NEXT_EVENT_EMERALD_UPGRADE_II = "next-event-emeraldII";
@@ -42,7 +44,9 @@ public class Messages {
public static String NEXT_EVENT_SUBTITLE_ANNOUNCE_SUDDEN_DEATH = "next-event-sudden-death-sub-title";
public static String NEXT_EVENT_CHAT_ANNOUNCE_SUDDEN_DEATH = "next-event-sudden-death-chat";
- /** General commands reply */
+ /**
+ * General commands reply
+ */
public static String COMMAND_MAIN = "cmd-main-list";
public static String COMMAND_LANG_LIST_HEADER = "cmd-lang-list-header";
public static String COMMAND_LANG_LIST_FORMAT = "cmd-lang-list-format";
@@ -101,7 +105,9 @@ public class Messages {
public static String COMMAND_FORCESTART_NO_PERM = "cmd-start-no-perm";
public static String COMMAND_COOLDOWN = "cmd-cooldown";
- /** Arena join/ leave related */
+ /**
+ * Arena join/ leave related
+ */
public static String ARENA_JOIN_VIP_KICK = "arena-kicked-by-vip";
public static String ARENA_START_COUNTDOWN_STOPPED_INSUFF_PLAYERS_CHAT = "arena-countdown-stopped";
//public static String ARENA_PLAYER_QUIT = "player.quit";
@@ -111,7 +117,9 @@ public class Messages {
public static String ARENA_SPECTATE_DENIED_SELECTOR = "arena-spectate-denied-selector";
public static String ARENA_LEAVE_PARTY_DISBANDED = "arena-leave-party-disbanded";
- /** Arena status/ status change related */
+ /**
+ * Arena status/ status change related
+ */
public static String ARENA_STATUS_WAITING_NAME = "arena-status-waiting";
public static String ARENA_STATUS_STARTING_NAME = "arena-status-starting";
public static String ARENA_STATUS_PLAYING_NAME = "arena-status-playing";
@@ -125,14 +133,18 @@ public class Messages {
public static String ARENA_STATUS_START_COUNTDOWN_CANCELLED_SUB_TITLE = "arena-countdown-stopped-subtitle";
public static String ARENA_DISPLAY_GROUP_PATH = "display-group-";
- /** Arena GUI related */
+ /**
+ * Arena GUI related
+ */
public static String ARENA_GUI_INV_NAME = "arena-selector-gui-name";
public static String ARENA_GUI_ARENA_CONTENT_NAME = "arena-selector-content-name";
public static String ARENA_GUI_ARENA_CONTENT_LORE = "arena-selector-content-lore";
public static String ARENA_GUI_SKIPPED_ITEM_NAME = "arena-selector-skipped-item-name";
public static String ARENA_GUI_SKIPPED_ITEM_LORE = "arena-selector-skipped-item-lore";
- /** Spectator related */
+ /**
+ * Spectator related
+ */
public static String ARENA_SPECTATOR_TELEPORTER_GUI_NAME = "spectator-tp-gui-name";
//{player} - returns display name, {prefix} - returns the player rank
public static String ARENA_SPECTATOR_TELEPORTER_GUI_HEAD_NAME = "spectator-tp-gui-head-name";
@@ -147,18 +159,24 @@ public class Messages {
public static String ARENA_SPECTATOR_FIRST_PERSON_LEAVE_TITLE = "spectator-first-person-quit-title";
public static String ARENA_SPECTATOR_FIRST_PERSON_LEAVE_SUBTITLE = "spectator-first-person-quit-subtitle";
- /** Stats related */
+ /**
+ * Stats related
+ */
public static String PLAYER_STATS_GUI_PATH = "stats";
- public static String PLAYER_STATS_GUI_INV_NAME = PLAYER_STATS_GUI_PATH+"-inv-name";
+ public static String PLAYER_STATS_GUI_INV_NAME = PLAYER_STATS_GUI_PATH + "-inv-name";
- /** Arena generators related */
+ /**
+ * Arena generators related
+ */
public static String GENERATOR_HOLOGRAM_TIER = "generator-tier";
public static String GENERATOR_HOLOGRAM_TYPE_DIAMOND = "generator-diamond";
public static String GENERATOR_HOLOGRAM_TYPE_EMERALD = "generator-emerald";
public static String GENERATOR_HOLOGRAM_TIMER = "generator-timer";
public static String GENERATOR_UPGRADE_CHAT_ANNOUNCEMENT = "generator-upgrade-announce";
- /** General formatting */
+ /**
+ * General formatting
+ */
public static String FORMATTING_CHAT_LOBBY = "format-chat-lobby";
public static String FORMATTING_CHAT_WAITING = "format-chat-waiting";
public static String FORMATTING_CHAT_SHOUT = "format-chat-global";
@@ -167,39 +185,80 @@ public class Messages {
public static String FORMATTING_SCOREBOARD_DATE = "format-sb-date";
public static String FORMATTING_SCOREBOARD_TEAM_GENERIC = "format-sb-team-generic";
public static String FORMATTING_SCOREBOARD_HEALTH = "format-sb-health";
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY = "format-sb-tab-prefix.lobby";
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY = "format-sb-tab-suffix.lobby";
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING = "format-sb-tab-prefix.waiting";
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING = "format-sb-tab-suffix.waiting";
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING = "format-sb-tab-prefix.starting";
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING = "format-sb-tab-suffix.starting";
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING = "format-sb-tab-prefix.playing";
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING = "format-sb-tab-suffix.playing";
-
- public static String FORMATTING_SIDEBAR_TAB_HEADER_LOBBY = "format-sb-tab-header.lobby";
- public static String FORMATTING_SIDEBAR_TAB_HEADER_WAITING = "format-sb-tab-header.waiting";
- public static String FORMATTING_SIDEBAR_TAB_HEADER_STARTING = "format-sb-tab-header.starting";
- public static String FORMATTING_SIDEBAR_TAB_HEADER_PLAYING = "format-sb-tab-header.playing";
- public static String FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING = "format-sb-tab-header.restarting";
- public static String FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR = "format-sb-tab-header.spectator";
-
- public static String FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY = "format-sb-tab-footer.lobby";
- public static String FORMATTING_SIDEBAR_TAB_FOOTER_WAITING = "format-sb-tab-footer.waiting";
- public static String FORMATTING_SIDEBAR_TAB_FOOTER_STARTING = "format-sb-tab-footer.starting";
- public static String FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING = "format-sb-tab-footer.playing";
- public static String FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING = "format-sb-tab-footer.restarting";
- public static String FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR = "format-sb-tab-footer.spectator";
- @Deprecated
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_PRESTARTING = "format-sb-tab-prefix.restarting";
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING = "format-sb-tab-prefix.restarting";
- @Deprecated
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_PRESTARTING = "format-sb-tab-suffix.restarting";
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING = "format-sb-tab-suffix.restarting";
- public static String FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR = "format-sb-tab-prefix.spectator";
- public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR = "format-sb-tab-suffix.spectator";
- public static String FORMATTING_SPECTATOR_TEAM = "format-spectator-team";
- @Deprecated
- public static String FORMATTING_SPECTATOR_COLOR = "format-spectator-color";
+
+ // TAB
+ public static String FORMATTING_SB_TAB_BASE = "format-tab";
+
+ // TAB LOBBY
+ public static String FORMATTING_SB_TAB_LOBBY_HEADER = FORMATTING_SB_TAB_BASE + ".lobby.header";
+ public static String FORMATTING_SB_TAB_LOBBY_FOOTER = FORMATTING_SB_TAB_BASE + ".lobby.footer";
+ public static String FORMATTING_SB_TAB_LOBBY_PREFIX = FORMATTING_SB_TAB_BASE + ".lobby.prefix";
+ public static String FORMATTING_SB_TAB_LOBBY_SUFFIX = FORMATTING_SB_TAB_BASE + ".lobby.suffix";
+
+ // TAB WAITING
+ public static String FORMATTING_SB_TAB_WAITING_HEADER = FORMATTING_SB_TAB_BASE+".waiting.player.header";
+ public static String FORMATTING_SB_TAB_WAITING_FOOTER = FORMATTING_SB_TAB_BASE+".waiting.player.footer";
+ public static String FORMATTING_SB_TAB_WAITING_PREFIX = FORMATTING_SB_TAB_BASE+".waiting.player.prefix";
+ public static String FORMATTING_SB_TAB_WAITING_SUFFIX = FORMATTING_SB_TAB_BASE+".waiting.player.suffix";
+ // TAB WAITING FOR SPECTATORS
+ public static String FORMATTING_SB_TAB_WAITING_HEADER_SPEC = FORMATTING_SB_TAB_BASE+".waiting.spectator.header";
+ public static String FORMATTING_SB_TAB_WAITING_FOOTER_SPEC = FORMATTING_SB_TAB_BASE+".waiting.spectator.footer";
+ public static String FORMATTING_SB_TAB_WAITING_PREFIX_SPEC = FORMATTING_SB_TAB_BASE+".waiting.spectator.prefix";
+ public static String FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC = FORMATTING_SB_TAB_BASE+".waiting.spectator.suffix";
+
+ // TAB STARTING
+ public static String FORMATTING_SB_TAB_STARTING_HEADER = FORMATTING_SB_TAB_BASE+".starting.player.header";
+ public static String FORMATTING_SB_TAB_STARTING_FOOTER = FORMATTING_SB_TAB_BASE+".starting.player.footer";
+ public static String FORMATTING_SB_TAB_STARTING_PREFIX = FORMATTING_SB_TAB_BASE+".starting.player.prefix";
+ public static String FORMATTING_SB_TAB_STARTING_SUFFIX = FORMATTING_SB_TAB_BASE+".starting.player.suffix";
+ // TAB STARTING FOR SPECTATORS
+ public static String FORMATTING_SB_TAB_STARTING_HEADER_SPEC = FORMATTING_SB_TAB_BASE+".starting.spectator.header";
+ public static String FORMATTING_SB_TAB_STARTING_FOOTER_SPEC = FORMATTING_SB_TAB_BASE+".starting.spectator.footer";
+ public static String FORMATTING_SB_TAB_STARTING_PREFIX_SPEC = FORMATTING_SB_TAB_BASE+".starting.player.prefix";
+ public static String FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC = FORMATTING_SB_TAB_BASE+".starting.player.suffix";
+
+ // TAB PLAYING
+ public static String FORMATTING_SB_TAB_PLAYING_HEADER = FORMATTING_SB_TAB_BASE+".playing.alive.header";
+ public static String FORMATTING_SB_TAB_PLAYING_FOOTER = FORMATTING_SB_TAB_BASE+".playing.alive.footer";
+ public static String FORMATTING_SB_TAB_PLAYING_PREFIX = FORMATTING_SB_TAB_BASE+".playing.alive.prefix";
+ public static String FORMATTING_SB_TAB_PLAYING_SUFFIX = FORMATTING_SB_TAB_BASE+".playing.alive.suffix";
+
+ // TAB PLAYING-ELIMINATED
+ public static String FORMATTING_SB_TAB_PLAYING_ELM_HEADER = FORMATTING_SB_TAB_BASE+".playing.eliminated.header";
+ public static String FORMATTING_SB_TAB_PLAYING_ELM_FOOTER = FORMATTING_SB_TAB_BASE+".playing.eliminated.footer";
+ public static String FORMATTING_SB_TAB_PLAYING_ELM_PREFIX = FORMATTING_SB_TAB_BASE+".playing.eliminated.prefix";
+ public static String FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX = FORMATTING_SB_TAB_BASE+".playing.eliminated.suffix";
+
+ // TAB PLAYING FOR SPECTATORS
+ public static String FORMATTING_SB_TAB_PLAYING_SPEC_HEADER = FORMATTING_SB_TAB_BASE+".playing.spectator.header";
+ public static String FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER = FORMATTING_SB_TAB_BASE+".playing.spectator.footer";
+ public static String FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX = FORMATTING_SB_TAB_BASE+".playing.spectator.prefix";
+ public static String FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX = FORMATTING_SB_TAB_BASE+".playing.spectator.suffix";
+
+ // TAB RESTARTING FOR WINNERS ALIVE
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER = FORMATTING_SB_TAB_BASE+".restarting.winner-alive.header";
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER = FORMATTING_SB_TAB_BASE+".restarting.winner-alive.footer";
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX = FORMATTING_SB_TAB_BASE+".restarting.winner-alive.prefix";
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX = FORMATTING_SB_TAB_BASE+".restarting.winner-alive.suffix";
+
+ // TAB RESTARTING FOR WINNERS DEAD
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER = FORMATTING_SB_TAB_BASE+".restarting.winner-dead.header";
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER = FORMATTING_SB_TAB_BASE+".restarting.winner-dead.footer";
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX = FORMATTING_SB_TAB_BASE+".restarting.winner-dead.prefix";
+ public static String FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX = FORMATTING_SB_TAB_BASE+".restarting.winner-dead.suffix";
+
+
+ // TAB RESTARTING FOR LOSERS
+ public static String FORMATTING_SB_TAB_RESTARTING_ELM_HEADER = FORMATTING_SB_TAB_BASE+".restarting.loser.header";
+ public static String FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER = FORMATTING_SB_TAB_BASE+".restarting.loser.footer";
+ public static String FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX = FORMATTING_SB_TAB_BASE+".restarting.loser.prefix";
+ public static String FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX = FORMATTING_SB_TAB_BASE+".restarting.loser.suffix";
+
+ // TAB RESTARTING FOR SPECTATORS
+ public static String FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER = FORMATTING_SB_TAB_BASE+".restarting.spectator.header";
+ public static String FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER = FORMATTING_SB_TAB_BASE+".restarting.spectator.footer";
+ public static String FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX = FORMATTING_SB_TAB_BASE+".restarting.spectator.prefix";
+ public static String FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX = FORMATTING_SB_TAB_BASE+".restarting.spectator.suffix";
public static String FORMATTING_SCOREBOARD_TEAM_ELIMINATED = "format-sb-team-eliminated";
public static String FORMATTING_SCOREBOARD_BED_DESTROYED = "format-sb-bed-destroyed";
@@ -224,8 +283,11 @@ public class Messages {
public static String FORMAT_UPGRADE_COLOR_CAN_AFFORD = "format-upgrade-color-can-afford";
public static String FORMAT_UPGRADE_COLOR_UNLOCKED = "format-upgrade-color-unlocked";
public static String FORMAT_UPGRADE_TRAP_COST = "format-upgrade-trap-cost";
+ public static String FORMAT_SPECTATOR_TARGET = "format-spectator-target";
- /** Meaning/ Translations */
+ /**
+ * Meaning/ Translations
+ */
public static String MEANING_FULL = "meaning-full";
public static String MEANING_SHOUT = "meaning-shout";
public static String MEANING_NEVER = "meaning-never";
@@ -242,13 +304,24 @@ public class Messages {
public static String MEANING_VAULT_PLURAL = "meaning-vault-plural";
public static String MEANING_NO_TRAP = "meaning-no-trap";
- /** Scoreboard related */
- public static String SCOREBOARD_DEFAULT_WAITING = "scoreboard.Default.waiting";
- public static String SCOREBOARD_DEFAULT_STARTING = "scoreboard.Default.starting";
- public static String SCOREBOARD_DEFAULT_PLAYING = "scoreboard.Default.playing";
- public static String SCOREBOARD_LOBBY = "scoreboard.lobby";
-
- /** Player interact related */
+ /**
+ * Scoreboard related
+ */
+ public static String SCOREBOARD_LOBBY = "sidebar.lobby";
+ public static String SCOREBOARD_DEFAULT_WAITING = "sidebar.Default.waiting.player";
+ public static String SCOREBOARD_DEFAULT_WAITING_SPEC = "sidebar.Default.waiting.spectator";
+ public static String SCOREBOARD_DEFAULT_STARTING = "sidebar.Default.starting.player";
+ public static String SCOREBOARD_DEFAULT_STARTING_SPEC = "sidebar.Default.starting.spectator";
+ public static String SCOREBOARD_DEFAULT_PLAYING = "sidebar.Default.playing.alive";
+ public static String SCOREBOARD_DEFAULT_PLAYING_SPEC = "sidebar.Default.playing.spectator";
+ public static String SCOREBOARD_DEFAULT_RESTARTING_SPEC = "sidebar.Default.restarting.spectator";
+ public static String SCOREBOARD_DEFAULT_RESTARTING_WIN1 = "sidebar.Default.restarting.winner-alive";
+ public static String SCOREBOARD_DEFAULT_RESTARTING_WIN2 = "sidebar.Default.restarting.winner-eliminated";
+ public static String SCOREBOARD_DEFAULT_RESTARTING_LOSER = "sidebar.Default.restarting.loser";
+
+ /**
+ * Player interact related
+ */
public static String INTERACT_CANNOT_PLACE_BLOCK = "interact-cant-place";
public static String INTERACT_CANNOT_BREAK_BLOCK = "interact-cant-break";
public static String INTERACT_CANNOT_BREAK_OWN_BED = "interact-cant-destroy-bed";
@@ -259,7 +332,9 @@ public class Messages {
public static String INTERACT_CHEST_CANT_OPEN_TEAM_ELIMINATED = "interact-cant-open-chest";
public static String INTERACT_INVISIBILITY_REMOVED_DAMGE_TAKEN = "interact-invisibility-removed-damaged";
- /** PvP related */
+ /**
+ * PvP related
+ */
public static String PLAYER_DIE_RESPAWN_TITLE = "player-respawn-title";
public static String PLAYER_DIE_RESPAWN_SUBTITLE = "player-respawn-subtitle";
public static String PLAYER_DIE_RESPAWN_CHAT = "player-respawn-timer-chat";
@@ -267,7 +342,7 @@ public class Messages {
public static String PLAYER_DIE_ELIMINATED_CHAT = "player-eliminated-chat";
public static String PLAYER_DIE_VOID_FALL_REGULAR_KILL = "player-die-void-regular";
- public static String PLAYER_DIE_VOID_FALL_FINAL_KILL = "player-die-void-final";
+ public static String PLAYER_DIE_VOID_FALL_FINAL_KILL = "player-die-void-final";
public static String PLAYER_DIE_KNOCKED_IN_VOID_REGULAR_KILL = "player-die-knocked-void-regular";
public static String PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL = "player-die-knocked-void-final";
public static String PLAYER_DIE_KNOCKED_BY_REGULAR_KILL = "player-die-knocked-fall-regular";
@@ -296,7 +371,9 @@ public class Messages {
public static String PLAYER_HIT_BOW = "player-hit-bow";
- /** Misc */
+ /**
+ * Misc
+ */
public static String GAME_END_GAME_OVER_PLAYER_TITLE = "game-end-game-over-title";
public static String GAME_END_VICTORY_PLAYER_TITLE = "game-end-victory-title";
public static String GAME_END_TOP_PLAYER_CHAT = "game-end-top-chat";
@@ -320,7 +397,9 @@ public class Messages {
public static String TEAM_ELIMINATED_CHAT = "team-eliminated";
- /** Upgrades/ Shop*/
+ /**
+ * Upgrades/ Shop
+ */
public static String NPC_NAME_TEAM_UPGRADES = "npc-team-upgrades";
public static String NPC_NAME_TEAM_SHOP = "npc-team-shop";
public static String NPC_NAME_SOLO_UPGRADES = "npc-solo-upgrades";
@@ -361,10 +440,10 @@ public class Messages {
public static final String SHOP_PATH = "shop-items-messages";
public static final String SHOP_LORE_STATUS_CANT_AFFORD = "shop-lore-status-cant-afford";
public static final String SHOP_LORE_STATUS_CAN_BUY = "shop-lore-status-can-buy";
- public static final String SHOP_LORE_STATUS_MAXED = "shop-lore-status-tier-maxed";
+ public static final String SHOP_LORE_STATUS_MAXED = "shop-lore-status-tier-maxed";
public static final String SHOP_LORE_STATUS_ARMOR = "shop-lore-status-armor";
- public static final String SHOP_LORE_QUICK_ADD = "shop-lore-quick-add";
- public static final String SHOP_LORE_QUICK_REMOVE = "shop-lore-quick-remove";
+ public static final String SHOP_LORE_QUICK_ADD = "shop-lore-quick-add";
+ public static final String SHOP_LORE_QUICK_REMOVE = "shop-lore-quick-remove";
public static final String SHOP_INDEX_NAME = SHOP_PATH + ".inventory-name";
public static final String SHOP_QUICK_ADD_NAME = SHOP_PATH + ".quick-buy-add-inventory-name";
public static final String SHOP_SEPARATOR_NAME = SHOP_PATH + ".separator-item-name";
@@ -379,18 +458,86 @@ public class Messages {
public static final String SHOP_CATEGORY_ITEM_LORE = SHOP_PATH + ".%category%.category-item-lore";
public static final String SHOP_CONTENT_TIER_ITEM_NAME = SHOP_PATH + ".%category%.content-item-%content%-name";
public static final String SHOP_CONTENT_TIER_ITEM_LORE = SHOP_PATH + ".%category%.content-item-%content%-lore";
- public static final String SHOP_CAN_BUY_COLOR = SHOP_PATH+ ".can-buy-color";
- public static final String SHOP_CANT_BUY_COLOR = SHOP_PATH+ ".cant-buy-color";
+ public static final String SHOP_CAN_BUY_COLOR = SHOP_PATH + ".can-buy-color";
+ public static final String SHOP_CANT_BUY_COLOR = SHOP_PATH + ".cant-buy-color";
/* MultiArena Lobby Item Messages */
- public static final String GENERAL_CONFIGURATION_LOBBY_ITEMS_NAME = ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_PATH+"-%path%-name";
- public static final String GENERAL_CONFIGURATION_LOBBY_ITEMS_LORE = ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_PATH+"-%path%-lore";
+ public static final String GENERAL_CONFIGURATION_LOBBY_ITEMS_NAME = ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_PATH + "-%path%-name";
+ public static final String GENERAL_CONFIGURATION_LOBBY_ITEMS_LORE = ConfigPath.GENERAL_CONFIGURATION_LOBBY_ITEMS_PATH + "-%path%-lore";
/* Spectator Items Messages */
- public static final String GENERAL_CONFIGURATION_SPECTATOR_ITEMS_NAME = ConfigPath.GENERAL_CONFIGURATION_SPECTATOR_ITEMS_PATH+"-%path%-name";
- public static final String GENERAL_CONFIGURATION_SPECTATOR_ITEMS_LORE = ConfigPath.GENERAL_CONFIGURATION_SPECTATOR_ITEMS_PATH+"-%path%-lore";
+ public static final String GENERAL_CONFIGURATION_SPECTATOR_ITEMS_NAME = ConfigPath.GENERAL_CONFIGURATION_SPECTATOR_ITEMS_PATH + "-%path%-name";
+ public static final String GENERAL_CONFIGURATION_SPECTATOR_ITEMS_LORE = ConfigPath.GENERAL_CONFIGURATION_SPECTATOR_ITEMS_PATH + "-%path%-lore";
/* Arena waiting Items Messages */
- public static final String GENERAL_CONFIGURATION_WAITING_ITEMS_NAME = ConfigPath.GENERAL_CONFIGURATION_PRE_GAME_ITEMS_PATH+"-%path%-name";
- public static final String GENERAL_CONFIGURATION_WAITING_ITEMS_LORE = ConfigPath.GENERAL_CONFIGURATION_PRE_GAME_ITEMS_PATH+"-%path%-lore";
+ public static final String GENERAL_CONFIGURATION_WAITING_ITEMS_NAME = ConfigPath.GENERAL_CONFIGURATION_PRE_GAME_ITEMS_PATH + "-%path%-name";
+ public static final String GENERAL_CONFIGURATION_WAITING_ITEMS_LORE = ConfigPath.GENERAL_CONFIGURATION_PRE_GAME_ITEMS_PATH + "-%path%-lore";
+
+
+
+ // DEPRECATIONS FOR REMOVAL
+
+ // LOBBY TAB
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_HEADER_LOBBY = FORMATTING_SB_TAB_LOBBY_HEADER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY = FORMATTING_SB_TAB_LOBBY_FOOTER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY = FORMATTING_SB_TAB_LOBBY_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY = FORMATTING_SB_TAB_LOBBY_SUFFIX;
+ // WAITING TAB
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_HEADER_WAITING = FORMATTING_SB_TAB_WAITING_HEADER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_FOOTER_WAITING = FORMATTING_SB_TAB_WAITING_FOOTER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING = FORMATTING_SB_TAB_WAITING_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING = FORMATTING_SB_TAB_WAITING_SUFFIX;
+ // STARTING TAB
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_HEADER_STARTING = FORMATTING_SB_TAB_STARTING_HEADER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_FOOTER_STARTING = FORMATTING_SB_TAB_STARTING_FOOTER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING = FORMATTING_SB_TAB_STARTING_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING = FORMATTING_SB_TAB_STARTING_SUFFIX;
+ // PLAYING TAB
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_HEADER_PLAYING = FORMATTING_SB_TAB_PLAYING_HEADER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING = FORMATTING_SB_TAB_PLAYING_FOOTER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING = FORMATTING_SB_TAB_PLAYING_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING = FORMATTING_SB_TAB_PLAYING_SUFFIX;
+ // SPECTATING TAB
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR = FORMATTING_SB_TAB_PLAYING_SPEC_HEADER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR = FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR = FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR = FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX;
+ // RESTARTING TAB
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_PRESTARTING = FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING = FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_PRESTARTING = FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING = FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING = FORMATTING_SB_TAB_RESTARTING_ELM_HEADER;
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING = FORMATTING_SB_TAB_PLAYING_SPEC_HEADER;
+
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SPECTATOR_TEAM = "format-spectator-team";
+ @Deprecated(forRemoval = true)
+ public static String FORMATTING_SPECTATOR_COLOR = FORMATTING_SPECTATOR_TEAM;
}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/RestoreAdapter.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/RestoreAdapter.java
index 8bcdc6fe7..bd8831a52 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/RestoreAdapter.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/RestoreAdapter.java
@@ -101,4 +101,6 @@ public Plugin getOwner() {
* Let them load on BedWars1058 main Thread so they will be converted before getting loaded.
*/
public abstract void convertWorlds();
+
+ public abstract String getDisplayName();
}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/VersionSupport.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/VersionSupport.java
index 0c0647ad8..873ef2fe9 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/VersionSupport.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/server/VersionSupport.java
@@ -25,9 +25,7 @@
import com.andrei1058.bedwars.api.arena.team.TeamColor;
import com.andrei1058.bedwars.api.entity.Despawnable;
import com.andrei1058.bedwars.api.exceptions.InvalidEffectException;
-import org.bukkit.Effect;
-import org.bukkit.Location;
-import org.bukkit.Material;
+import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.command.Command;
@@ -39,12 +37,10 @@
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;
-import org.bukkit.scoreboard.Team;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public abstract class VersionSupport {
@@ -55,8 +51,8 @@ public abstract class VersionSupport {
private Effect eggBridge;
- private static ConcurrentHashMap despawnables = new ConcurrentHashMap<>();
- private Plugin plugin;
+ private static final ConcurrentHashMap despawnables = new ConcurrentHashMap<>();
+ private final Plugin plugin;
public VersionSupport(Plugin plugin, String versionName) {
name2 = versionName;
@@ -137,6 +133,13 @@ protected void loadDefaultEffects() {
*/
public abstract boolean isInvisibilityPotion(ItemStack itemStack);
+ /**
+ * Check if type is a Glass type material
+ */
+ public boolean isGlass(Material type) {
+ return type != Material.AIR && (type == Material.GLASS || type.toString().contains("_GLASS"));
+ }
+
/**
* Register custom entities
*/
@@ -205,9 +208,9 @@ public boolean isDespawnable(Entity e) {
public abstract void colorBed(ITeam team);
/**
- * Register tnt whitelist
+ * Modify block blast resistance.
*/
- public abstract void registerTntWhitelist();
+ public abstract void registerTntWhitelist(float endStoneBlast, float glassBlast);
/**
* Egg bridge particles
@@ -245,8 +248,10 @@ public void setEggBridgeEffect(String eggBridge) throws InvalidEffectException {
/**
* Get a custom item tag.
+ *
* @return null if not present.
*/
+ @SuppressWarnings("unused")
public abstract String getTag(ItemStack itemStack, String key);
/**
@@ -266,8 +271,6 @@ public void setEggBridgeEffect(String eggBridge) throws InvalidEffectException {
public abstract ItemStack createItemStack(String material, int amount, short data);
- public abstract void teamCollideRule(Team team);
-
/**
* Check if is a player head
*/
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/sidebar/ISidebar.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/sidebar/ISidebar.java
index 201030526..403bd782b 100644
--- a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/sidebar/ISidebar.java
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/sidebar/ISidebar.java
@@ -48,13 +48,25 @@ public interface ISidebar {
*
* @param player format given player on current holder's sidebar.
* @param skipStateCheck will skip checking if tab formatting is disabled.
+ * @param spectator when you already know the player is a spectator. E.g. on join. Null will let the plugin whether the player is spectator or not.
*/
- void giveUpdateTabFormat(@NotNull Player player, boolean skipStateCheck);
+ void giveUpdateTabFormat(@NotNull Player player, boolean skipStateCheck, @Nullable Boolean spectator);
+
+ /**
+ * Will update tab prefix and suffix for the given player on current sidebar.
+ *
+ * @param player format given player on current holder's sidebar.
+ * @param skipStateCheck will skip checking if tab formatting is disabled.
+ */
+ default void giveUpdateTabFormat(@NotNull Player player, boolean skipStateCheck) {
+ giveUpdateTabFormat(player, skipStateCheck, null);
+ }
/**
- * @return true if tab formatting is disabled for current sidebar/ arena stage
+ * @return true if tab formatting is disabled for current sidebar/ arena stage.
*/
+ @Deprecated(forRemoval = true)
boolean isTabFormattingDisabled();
/**
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/util/BlastProtectionUtil.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/util/BlastProtectionUtil.java
new file mode 100644
index 000000000..538173b88
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/util/BlastProtectionUtil.java
@@ -0,0 +1,99 @@
+package com.andrei1058.bedwars.api.util;
+
+import com.andrei1058.bedwars.api.BedWars;
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.configuration.ConfigPath;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.util.Vector;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.LinkedList;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class BlastProtectionUtil {
+
+ private final VersionSupport versionSupport;
+ private final BedWars api;
+
+ public BlastProtectionUtil(VersionSupport versionSupport, BedWars api) {
+ this.versionSupport = versionSupport;
+ this.api = api;
+ }
+
+
+ /**
+ * Check if block is protected by blast-proof glass or an unbreakable block from a point of view
+ *
+ * if pov is null, block is checked by {@link VersionSupport#isGlass(Material)} and {@link IArena#isBlockPlaced(Block)} instead.
+ * Otherwise, a ray tracing is performed to check whether there is any glass block or an unbreakable block.
+ *
+ * If arena is null, then glass only be checked.
+ *
+ * @param arena Arena instance.
+ * @param pov the point of view.
+ * @param block the block instance.
+ * @param step how frequent to check the ray (0.25 - 0.5 recommended).
+ * @return whether there's unbreakable block between the pov and the block
+ */
+ public boolean isProtected(@NotNull IArena arena, Location pov, @NotNull Block block, double step) {
+
+ if (arena.isProtected(block.getLocation()) || arena.isTeamBed(block.getLocation())) {
+ return true;
+ }
+
+ boolean rayBlockedByGlass = api.getConfigs().getMainConfig().getBoolean(ConfigPath.GENERAL_TNT_RAY_BLOCKED_BY_GLASS);
+
+ // Trace blocks from pov to the block location
+ final Location target = block.getLocation();
+
+ LinkedList targetVectors = new LinkedList<>();
+
+ double alteredRayStep = 0.73;
+ // x
+ for (double XrayRadius = alteredRayStep * -1; XrayRadius <= alteredRayStep; XrayRadius+= alteredRayStep) {
+ // y
+ for (double YrayRadius = alteredRayStep * -1; YrayRadius <= alteredRayStep; YrayRadius+= alteredRayStep) {
+ // z
+ for (double ZrayRadius = alteredRayStep * -1; ZrayRadius <= alteredRayStep; ZrayRadius+= alteredRayStep) {
+ targetVectors.add(pov.clone().toVector().toBlockVector().add(new Vector(XrayRadius, YrayRadius, ZrayRadius)));
+ }
+ }
+ }
+
+ AtomicInteger protectedTimes = new AtomicInteger();
+ int totalRays = targetVectors.size();
+
+ targetVectors.forEach(targetVector -> {
+ BlockRay ray;
+ try {
+ ray = new BlockRay(block.getWorld(), targetVector, target.toVector(), step);
+ } catch (IllegalArgumentException ignored) {
+ return;
+ }
+
+ while (ray.hasNext()) {
+ Block nextBlock = ray.next();
+
+ if (nextBlock.getType() == Material.AIR) {
+ continue;
+ }
+
+ if (rayBlockedByGlass && versionSupport.isGlass(nextBlock.getType())) {
+ // If a block is a glass
+ protectedTimes.getAndIncrement();
+ return;
+ }
+
+ if (!arena.isBlockPlaced(nextBlock) && !arena.isAllowMapBreak()) {
+ protectedTimes.getAndIncrement();
+ return;
+ }
+ }
+ });
+
+ return totalRays - protectedTimes.get() < 6;
+ }
+}
diff --git a/bedwars-api/src/main/java/com/andrei1058/bedwars/api/util/BlockRay.java b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/util/BlockRay.java
new file mode 100644
index 000000000..77ab8cc7a
--- /dev/null
+++ b/bedwars-api/src/main/java/com/andrei1058/bedwars/api/util/BlockRay.java
@@ -0,0 +1,187 @@
+package com.andrei1058.bedwars.api.util;
+
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.util.NumberConversions;
+import org.bukkit.util.Vector;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/*
+ Used for tracing blocks between two vectors.
+ Note: this could return the same blocks multiple times.
+*/
+public class BlockRay implements Iterator {
+ private final World world;
+
+ private final Vector delta;
+
+ private final double multiple;
+ private final int parts;
+ private int consumed;
+
+ private final double xOffset;
+ private final double yOffset;
+ private final double zOffset;
+
+ private double lcx;
+ private double lcy;
+ private double lcz;
+
+ private int currentBlock;
+
+ private final Block[] blockQueue;
+
+ /**
+ * Constructs a BlockRay instance.
+ *
+ * @param world bukkit world to get the blocks from.
+ * @param src the source vector (where we shoot the ray).
+ * @param dst the destination vector.
+ * @param step how frequent to check the ray (0.25 - 0.5 recommended).
+ */
+ public BlockRay(World world, Vector src, Vector dst, double step) {
+
+ // How much `pov` needs to change in order to reach the target
+ this.delta = new Vector(
+ dst.getBlockX() - src.getBlockX(),
+ dst.getBlockY() - src.getBlockY(),
+ dst.getBlockZ() - src.getBlockZ()
+ );
+
+ if (delta.lengthSquared() == 0) {
+ throw new IllegalArgumentException("The source vector is the same as the destination vector");
+ }
+
+ this.world = world;
+
+ // Coordinates for where we should shoot our ray
+ // Exactly from the center.
+ this.xOffset = src.getBlockX() + 0.5;
+ this.yOffset = src.getBlockY() + 0.5;
+ this.zOffset = src.getBlockZ() + 0.5;
+
+ // The last vector components (last offset)
+ this.lcx = 0;
+ this.lcy = 0;
+ this.lcz = 0;
+
+ // How much one part is worth
+ this.multiple = (1 / (delta.length() / step));
+
+ // How many sections `delta` could be split up to
+ this.parts = NumberConversions.ceil(delta.length() / step);
+
+ // Where we hold our components per step
+ // 0 -> X component
+ // 1 -> Y component
+ // 2 -> Z component
+ // 3 -> XY component
+ // 4 -> XZ component
+ // 5 -> ZY component
+ // 6 -> Resultant
+ this.blockQueue = new Block[7];
+
+ // The current component (gets decremented whenever next() is called)
+ this.currentBlock = 6;
+
+ scan();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return consumed <= parts || currentBlock >= 0;
+ }
+
+ /**
+ * This could return similar blocks multiple times.
+ *
+ * @return Current block at the ray's position.
+ */
+ @Override
+ public Block next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException("No more blocks");
+ }
+
+ if (currentBlock < 0) {
+ scan();
+ currentBlock = 6;
+ }
+
+ return blockQueue[currentBlock--];
+
+ }
+
+ private void scan() {
+ double cx = (multiple * delta.getX() * consumed);
+ double cy = (multiple * delta.getY() * consumed);
+ double cz = (multiple * delta.getZ() * consumed);
+
+ int lastXFloor = NumberConversions.floor(xOffset + lcx);
+ int lastYFloor = NumberConversions.floor(yOffset + lcy);
+ int lastZFloor = NumberConversions.floor(zOffset + lcz);
+
+ int currentXFloor = NumberConversions.floor(xOffset + cx);
+ int currentYFloor = NumberConversions.floor(yOffset + cy);
+ int currentZFloor = NumberConversions.floor(zOffset + cz);
+
+
+ // Get the X component separately
+ blockQueue[0] = world.getBlockAt(
+ currentXFloor,
+ lastYFloor,
+ lastZFloor
+ );
+
+ // Get the Y component separately
+ blockQueue[1] = world.getBlockAt(
+ lastXFloor,
+ currentYFloor,
+ lastZFloor
+ );
+
+ // Get the Z component separately
+ blockQueue[2] = world.getBlockAt(
+ lastXFloor,
+ lastYFloor,
+ currentZFloor
+ );
+
+ // Get the XY separately
+ blockQueue[3] = world.getBlockAt(
+ currentXFloor,
+ currentYFloor,
+ lastZFloor
+ );
+
+ // Get the XZ separately
+ blockQueue[4] = world.getBlockAt(
+ currentXFloor,
+ lastYFloor,
+ currentZFloor
+ );
+
+ // Get the ZY separately
+ blockQueue[5] = world.getBlockAt(
+ lastXFloor,
+ currentYFloor,
+ currentZFloor
+ );
+
+ // Get the resultant (cx, cy, cz) together
+ blockQueue[6] = world.getBlockAt(
+ currentXFloor,
+ currentYFloor,
+ currentZFloor
+ );
+
+ lcx = cx;
+ lcy = cy;
+ lcz = cz;
+
+ consumed += 1;
+ }
+
+}
diff --git a/bedwars-plugin/pom.xml b/bedwars-plugin/pom.xml
index 366e9f5ac..07104ed6c 100644
--- a/bedwars-plugin/pom.xml
+++ b/bedwars-plugin/pom.xml
@@ -5,7 +5,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT4.0.0bedwars-plugin
@@ -94,13 +94,13 @@
org.bstatsbstats-bukkit
- 3.0.1
+ 3.0.2truede.simonsatorDevelopmentPAFSpigot
- 1.0.67
+ 1.0.239provided
@@ -177,6 +177,21 @@
versionsupport_v1_19_R2${project.version}
+
+ com.andrei1058.bedwars
+ versionsupport_v1_19_R3
+ ${project.version}
+
+
+ com.andrei1058.bedwars
+ versionsupport_v1_20_R1
+ ${project.version}
+
+
+ com.andrei1058.bedwars
+ versionsupport_v1_20_R2
+ ${project.version}
+ com.andrei1058.bedwarsversionsupport-common
@@ -191,7 +206,7 @@
me.clipplaceholderapi
- 2.11.2
+ 2.11.3provided
@@ -204,7 +219,7 @@
commons-iocommons-io
- 2.11.0
+ 2.13.0true
@@ -224,7 +239,7 @@
org.slf4jslf4j-simple
- 2.0.6
+ 2.0.7true
@@ -232,46 +247,84 @@
com.andrei1058.spigot.sidebarsidebar-base
- 23.3
+ 23.10
+ compile
+
+
+ com.andrei1058.spigot.sidebar
+ sidebar-v1_8_R3
+ 23.10
+ compile
+
+
+ com.andrei1058.spigot.sidebar
+ sidebar-v1_12_R1
+ 23.10compilecom.andrei1058.spigot.sidebar
- sidebar-eight
- 23.3
+ sidebar-v1_16_R1
+ 23.10compilecom.andrei1058.spigot.sidebar
- sidebar-twelve
- 23.3
+ sidebar-v1_17_R1
+ 23.10compilecom.andrei1058.spigot.sidebar
- sidebar-sixteen
- 23.3
+ sidebar-v1_18_R2
+ 23.10compilecom.andrei1058.spigot.sidebar
- sidebar-seventeen
- 23.3
+ sidebar-v1_19_R2
+ 23.10compilecom.andrei1058.spigot.sidebar
- sidebar-eighteen
- 23.3
+ sidebar-v1_19_R3
+ 23.10compilecom.andrei1058.spigot.sidebar
- sidebar-nineteen
- 23.3
+ sidebar-v1_20_R1
+ 23.10
+ compile
+
+
+ com.andrei1058.spigot.sidebar
+ sidebar-v1_20_R2
+ 23.10compile
+
+
+ com.andrei1058.bedwars
+ resetadapter-slimepaper
+ ${project.version}
+
+
+
+ com.andrei1058.bedwars
+ resetadapter-aswm
+ ${project.version}
+
+
+
+
+ net.md-5
+ bungeecord-chat
+ 1.18-R0.1-SNAPSHOT
+ provided
+
@@ -288,7 +341,7 @@
org.apache.maven.pluginsmaven-shade-plugin
- 3.4.1
+ 3.5.0
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/BedWars.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/BedWars.java
index ecc69ff9e..6f351c6b1 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/BedWars.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/BedWars.java
@@ -35,6 +35,7 @@
import com.andrei1058.bedwars.arena.despawnables.TargetListener;
import com.andrei1058.bedwars.arena.feature.SpoilPlayerTNTFeature;
import com.andrei1058.bedwars.arena.spectator.SpectatorListeners;
+import com.andrei1058.bedwars.arena.stats.DefaultStatsHandler;
import com.andrei1058.bedwars.arena.tasks.OneTick;
import com.andrei1058.bedwars.arena.tasks.Refresh;
import com.andrei1058.bedwars.arena.upgrades.BaseListener;
@@ -64,10 +65,7 @@
import com.andrei1058.bedwars.money.internal.MoneyListeners;
import com.andrei1058.bedwars.shop.ShopManager;
import com.andrei1058.bedwars.sidebar.*;
-import com.andrei1058.bedwars.sidebar.thread.RefreshTitleTask;
-import com.andrei1058.bedwars.sidebar.thread.RefreshPlaceholdersTask;
-import com.andrei1058.bedwars.sidebar.thread.RefreshLifeTask;
-import com.andrei1058.bedwars.sidebar.thread.RefreshTabListTask;
+import com.andrei1058.bedwars.sidebar.thread.*;
import com.andrei1058.bedwars.stats.StatsManager;
import com.andrei1058.bedwars.support.citizens.CitizensListener;
import com.andrei1058.bedwars.support.citizens.JoinNPC;
@@ -97,6 +95,7 @@
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin;
+import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin;
@@ -221,44 +220,9 @@ public void onEnable() {
nms.registerVersionListeners();
- if (Bukkit.getPluginManager().getPlugin("Enhanced-SlimeWorldManager") != null) {
- try {
- //noinspection rawtypes
- Constructor constructor = Class.forName("com.andrei1058.bedwars.arena.mapreset.eswm.ESlimeAdapter").getConstructor(Plugin.class);
- try {
- api.setRestoreAdapter((RestoreAdapter) constructor.newInstance(this));
- this.getLogger().info("Hook into Enhanced-SlimeWorldManager support!");
- } catch (InstantiationException e) {
- e.printStackTrace();
- api.setRestoreAdapter(new InternalAdapter(this));
- this.getLogger().info("Failed to hook into Enhanced-SlimeWorldManager support! Using the internal reset adapter.");
- }
- } catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException |
- InvocationTargetException e) {
- e.printStackTrace();
- api.setRestoreAdapter(new InternalAdapter(this));
- this.getLogger().info("Failed to hook into Enhanced-SlimeWorldManager support! Using the internal reset adapter.");
- }
- } else if (checkSWM()) {
- try {
- //noinspection rawtypes
- Constructor constructor = Class.forName("com.andrei1058.bedwars.arena.mapreset.slime.SlimeAdapter").getConstructor(Plugin.class);
- try {
- api.setRestoreAdapter((RestoreAdapter) constructor.newInstance(this));
- this.getLogger().info("Hook into SlimeWorldManager support!");
- } catch (InstantiationException e) {
- e.printStackTrace();
- api.setRestoreAdapter(new InternalAdapter(this));
- this.getLogger().info("Failed to hook into SlimeWorldManager support! Using internal reset adapter.");
- }
- } catch (NoSuchMethodException | ClassNotFoundException | IllegalAccessException |
- InvocationTargetException e) {
- e.printStackTrace();
- api.setRestoreAdapter(new InternalAdapter(this));
- this.getLogger().info("Failed to hook into SlimeWorldManager support! Using internal reset adapter.");
- }
- } else {
+ if (!this.handleWorldAdapter()) {
api.setRestoreAdapter(new InternalAdapter(this));
+ getLogger().info("Using internal world restore system.");
}
/* Register commands */
@@ -307,8 +271,13 @@ public void onEnable() {
}, 1L);
// Register events
- registerEvents(new EnderPearlLanded(), new QuitAndTeleportListener(), new BreakPlace(), new DamageDeathMove(), new Inventory(), new Interact(), new RefreshGUI(), new HungerWeatherSpawn(), new CmdProcess(),
- new FireballListener(), new EggBridge(), new SpectatorListeners(), new BaseListener(), new TargetListener(), new LangListener(), new Warnings(this), new ChatAFK(), new GameEndListener());
+ registerEvents(
+ new EnderPearlLanded(), new QuitAndTeleportListener(), new BreakPlace(), new DamageDeathMove(),
+ new Inventory(), new Interact(), new RefreshGUI(), new HungerWeatherSpawn(), new CmdProcess(),
+ new FireballListener(), new EggBridge(), new SpectatorListeners(), new BaseListener(),
+ new TargetListener(), new LangListener(), new Warnings(this), new ChatAFK(),
+ new GameEndListener(), new DefaultStatsHandler()
+ );
if (config.getBoolean(ConfigPath.GENERAL_CONFIGURATION_HEAL_POOL_ENABLE)) {
registerEvents(new HealPoolListner());
@@ -428,7 +397,7 @@ public void onEnable() {
ArenaSocket.sendMessage(Arena.getArenas().get(0));
}
}*/
- }, 40L);
+ }, 5L);
/* Save messages for stats gui items if custom items added, for each language */
Language.setupCustomStatsMessages();
@@ -487,7 +456,10 @@ public void onEnable() {
}
/* Protect glass walls from tnt explosion */
- nms.registerTntWhitelist();
+ nms.registerTntWhitelist(
+ (float) config.getDouble(ConfigPath.GENERAL_TNT_PROTECTION_END_STONE_BLAST),
+ (float) config.getDouble(ConfigPath.GENERAL_TNT_PROTECTION_GLASS_BLAST)
+ );
/* Prevent issues on reload */
for (Player p : Bukkit.getOnlinePlayers()) {
@@ -551,49 +523,61 @@ public void onEnable() {
int playerListRefreshInterval = config.getInt(ConfigPath.SB_CONFIG_SIDEBAR_LIST_REFRESH);
if (playerListRefreshInterval < 1) {
- Bukkit.getLogger().info("Scoreboard names list refresh is disabled. (Is set to " + playerListRefreshInterval + ").");
+ Bukkit.getLogger().info("Scoreboard names list refresh is disabled. (It is set to " + playerListRefreshInterval + ").");
} else {
if (playerListRefreshInterval < 20) {
Bukkit.getLogger().warning("Scoreboard names list refresh interval is set to: " + playerListRefreshInterval);
Bukkit.getLogger().warning("It is not recommended to use a value under 20 ticks.");
Bukkit.getLogger().warning("If you expect performance issues please increase its timer.");
}
- Bukkit.getScheduler().runTaskTimer(this, new RefreshTabListTask(), 23L, playerListRefreshInterval);
+ Bukkit.getScheduler().runTaskTimer(this, new RefreshPlayerListTask(), 1L, playerListRefreshInterval);
}
int placeholdersRefreshInterval = config.getInt(ConfigPath.SB_CONFIG_SIDEBAR_PLACEHOLDERS_REFRESH_INTERVAL);
if (placeholdersRefreshInterval < 1) {
- Bukkit.getLogger().info("Scoreboard placeholders refresh is disabled. (Is set to " + placeholdersRefreshInterval + ").");
+ Bukkit.getLogger().info("Scoreboard placeholders refresh is disabled. (It is set to " + placeholdersRefreshInterval + ").");
} else {
if (placeholdersRefreshInterval < 20) {
Bukkit.getLogger().warning("Scoreboard placeholders refresh interval is set to: " + placeholdersRefreshInterval);
Bukkit.getLogger().warning("It is not recommended to use a value under 20 ticks.");
Bukkit.getLogger().warning("If you expect performance issues please increase its timer.");
}
- Bukkit.getScheduler().runTaskTimer(this, new RefreshPlaceholdersTask(), 28L, placeholdersRefreshInterval);
+ Bukkit.getScheduler().runTaskTimer(this, new RefreshPlaceholdersTask(), 1L, placeholdersRefreshInterval);
}
int titleRefreshInterval = config.getInt(ConfigPath.SB_CONFIG_SIDEBAR_TITLE_REFRESH_INTERVAL);
if (titleRefreshInterval < 1) {
- Bukkit.getLogger().info("Scoreboard title refresh is disabled. (Is set to " + titleRefreshInterval + ").");
+ Bukkit.getLogger().info("Scoreboard title refresh is disabled. (It is set to " + titleRefreshInterval + ").");
} else {
if (titleRefreshInterval < 4) {
Bukkit.getLogger().warning("Scoreboard title refresh interval is set to: " + titleRefreshInterval);
Bukkit.getLogger().warning("If you expect performance issues please increase its timer.");
}
- Bukkit.getScheduler().runTaskTimerAsynchronously(this, new RefreshTitleTask(), 32L, titleRefreshInterval);
+ Bukkit.getScheduler().runTaskTimerAsynchronously(this, new RefreshTitleTask(), 1L, titleRefreshInterval);
}
int healthAnimationInterval = config.getInt(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_REFRESH);
if (healthAnimationInterval < 1) {
- Bukkit.getLogger().info("Scoreboard health animation refresh is disabled. (Is set to " + healthAnimationInterval + ").");
+ Bukkit.getLogger().info("Scoreboard health animation refresh is disabled. (It is set to " + healthAnimationInterval + ").");
} else {
if (healthAnimationInterval < 20) {
Bukkit.getLogger().warning("Scoreboard health animation refresh interval is set to: " + healthAnimationInterval);
Bukkit.getLogger().warning("It is not recommended to use a value under 20 ticks.");
Bukkit.getLogger().warning("If you expect performance issues please increase its timer.");
}
- Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new RefreshLifeTask(), 40L, healthAnimationInterval);
+ Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new RefreshLifeTask(), 1L, healthAnimationInterval);
+ }
+
+ int tabHeaderFooterRefreshInterval = config.getInt(ConfigPath.SB_CONFIG_TAB_HEADER_FOOTER_REFRESH_INTERVAL);
+ if (tabHeaderFooterRefreshInterval < 1 || !config.getBoolean(ConfigPath.SB_CONFIG_TAB_HEADER_FOOTER_ENABLE)) {
+ Bukkit.getLogger().info("Scoreboard Tab header-footer refresh is disabled.");
+ } else {
+ if (tabHeaderFooterRefreshInterval < 20) {
+ Bukkit.getLogger().warning("Scoreboard tab header-footer refresh interval is set to: " + tabHeaderFooterRefreshInterval);
+ Bukkit.getLogger().warning("It is not recommended to use a value under 20 ticks.");
+ Bukkit.getLogger().warning("If you expect performance issues please increase its timer.");
+ }
+ Bukkit.getScheduler().runTaskTimer(this, new RefreshTabHeaderFooterTask(), 1L, tabHeaderFooterRefreshInterval);
}
registerEvents(new ScoreboardListener());
@@ -606,6 +590,54 @@ public void onEnable() {
SpoilPlayerTNTFeature.init();
}
+ /**
+ * Try loading custom adapter support.
+ * @return true when custom adapter was registered.
+ */
+ private boolean handleWorldAdapter() {
+ Plugin swmPlugin = Bukkit.getPluginManager().getPlugin("SlimeWorldManager");
+
+ if (null == swmPlugin){
+ return false;
+ }
+ PluginDescriptionFile pluginDescription = swmPlugin.getDescription();
+ if (null == pluginDescription) {
+ return false;
+ }
+
+ String[] versionString = pluginDescription.getVersion().split("\\.");
+
+
+ try {
+ int major = Integer.parseInt(versionString[0]);
+ int minor = Integer.parseInt(versionString[1]);
+ int release = versionString.length > 2 ? Integer.parseInt(versionString[2]) : 0;
+
+ String adapterPath;
+ if (major == 2 && minor == 2 && release == 1) {
+ adapterPath = "com.andrei1058.bedwars.arena.mapreset.slime.SlimeAdapter";
+ } else if (major == 2 && minor == 8 && release == 0) {
+ adapterPath = "com.andrei1058.bedwars.arena.mapreset.slime.AdvancedSlimeAdapter";
+ } else if (major > 2 || major == 2 && minor >= 10) {
+ adapterPath = "com.andrei1058.bedwars.arena.mapreset.slime.SlimePaperAdapter";
+ } else {
+ return false;
+ }
+
+ Constructor> constructor = Class.forName(adapterPath).getConstructor(Plugin.class);
+ getLogger().info("Loading restore adapter: "+adapterPath+" ...");
+
+ RestoreAdapter candidate = (RestoreAdapter) constructor.newInstance(this);
+ api.setRestoreAdapter(candidate);
+ getLogger().info("Hook into "+candidate.getDisplayName()+" as restore adapter.");
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ this.getLogger().info("Something went wrong! Using internal reset adapter...");
+ }
+ return false;
+ }
+
private void registerDelayedCommands() {
if (!nms.isBukkitCommandRegistered("shout")) {
nms.registerCommand("shout", new ShoutCommand("shout"));
@@ -784,41 +816,6 @@ public static com.andrei1058.bedwars.api.BedWars getAPI() {
return api;
}
- /**
- * This is used to check if can hook in SlimeWorldManager support.
- *
- * @return true if can load swm support.
- */
- private boolean checkSWM() {
- Plugin plugin = Bukkit.getPluginManager().getPlugin("SlimeWorldManager");
- if (plugin == null) return false;
- switch (plugin.getDescription().getVersion()) {
- case "2.2.0":
- case "2.1.3":
- case "2.1.2":
- case "2.1.1":
- case "2.1.0":
- case "2.0.5":
- case "2.0.4":
- case "2.0.3":
- case "2.0.2":
- case "2.0.1":
- case "2.0.0":
- case "1.1.4":
- case "1.1.3":
- case "1.1.2":
- case "1.1.1":
- case "1.1.0":
- case "1.0.2":
- case "1.0.1":
- case "1.0.0-BETA":
- getLogger().warning("Could not hook into SlimeWorldManager support! You are running an unsupported version");
- return false;
- default:
- return true;
- }
- }
-
public static boolean isShuttingDown() {
return shuttingDown;
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Arena.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Arena.java
index 8af06c959..9b1236040 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Arena.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Arena.java
@@ -27,6 +27,7 @@
import com.andrei1058.bedwars.api.arena.generator.GeneratorType;
import com.andrei1058.bedwars.api.arena.generator.IGenerator;
import com.andrei1058.bedwars.api.arena.shop.ShopHolo;
+import com.andrei1058.bedwars.api.arena.stats.*;
import com.andrei1058.bedwars.api.arena.team.ITeam;
import com.andrei1058.bedwars.api.arena.team.ITeamAssigner;
import com.andrei1058.bedwars.api.arena.team.TeamColor;
@@ -46,9 +47,12 @@
import com.andrei1058.bedwars.api.language.Messages;
import com.andrei1058.bedwars.api.region.Region;
import com.andrei1058.bedwars.api.server.ServerType;
+import com.andrei1058.bedwars.api.sidebar.ISidebar;
import com.andrei1058.bedwars.api.tasks.PlayingTask;
import com.andrei1058.bedwars.api.tasks.RestartingTask;
import com.andrei1058.bedwars.api.tasks.StartingTask;
+import com.andrei1058.bedwars.arena.stats.GameStatsManager;
+import com.andrei1058.bedwars.arena.stats.StatisticsOrdered;
import com.andrei1058.bedwars.arena.tasks.GamePlayingTask;
import com.andrei1058.bedwars.arena.tasks.GameRestartingTask;
import com.andrei1058.bedwars.arena.tasks.GameStartingTask;
@@ -63,9 +67,10 @@
import com.andrei1058.bedwars.listeners.dropshandler.PlayerDrops;
import com.andrei1058.bedwars.money.internal.MoneyPerMinuteTask;
import com.andrei1058.bedwars.shop.ShopCache;
+import com.andrei1058.bedwars.sidebar.BwSidebar;
import com.andrei1058.bedwars.sidebar.SidebarService;
import com.andrei1058.bedwars.support.citizens.JoinNPC;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import com.andrei1058.bedwars.support.papi.SupportPAPI;
import com.andrei1058.bedwars.support.vault.WithEconomy;
import net.md_5.bungee.api.chat.ClickEvent;
@@ -85,6 +90,7 @@
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.time.Instant;
@@ -149,15 +155,7 @@ public class Arena implements IArena {
*/
private static final HashMap playerLocation = new HashMap<>();
- /**
- * temp stats. some of them use player name as key to keep names of players who left. at checkWinners for example.
- * Those maps are not used for db stats but is for internal use only.
- */
- private HashMap playerKills = new HashMap<>();
- private HashMap playerBedsDestroyed = new HashMap<>();
- private HashMap playerFinalKills = new HashMap<>();
- private HashMap playerDeaths = new HashMap<>();
- private HashMap playerFinalKillDeaths = new HashMap<>();
+ private final GameStatsManager gameStats = new GameStatsManager(this);
/* ARENA TASKS */
@@ -179,6 +177,9 @@ public class Arena implements IArena {
private Instant startTime;
private ITeamAssigner teamAssigner = new TeamAssigner();
+ private boolean allowMapBreak = false;
+ private @Nullable ITeam winner;
+
/**
* Load an arena.
* This will check if it was set up right.
@@ -212,11 +213,6 @@ public Arena(String name, Player p) {
cm = new ArenaConfig(BedWars.plugin, name, plugin.getDataFolder().getPath() + "/Arenas");
- //if (mapManager.isLevelWorld()) {
- // Main.plugin.getLogger().severe("COULD NOT LOAD ARENA: " + name);
- // //return;
- //}
-
yml = cm.getYml();
if (yml.get("Team") == null) {
if (p != null) p.sendMessage("You didn't set any team for arena: " + name);
@@ -233,6 +229,7 @@ public Arena(String name, Player p) {
minPlayers = yml.getInt("minPlayers");
allowSpectate = yml.getBoolean("allowSpectate");
islandRadius = yml.getInt(ConfigPath.ARENA_ISLAND_RADIUS);
+ allowMapBreak = yml.getBoolean(ConfigPath.ARENA_ALLOW_MAP_BREAK);
if (config.getYml().get("arenaGroups") != null) {
if (config.getYml().getStringList("arenaGroups").contains(yml.getString("group"))) {
group = yml.getString("group");
@@ -501,12 +498,12 @@ public boolean addPlayer(Player p, boolean skipOwnerCheck) {
for (Player on : players) {
on.sendMessage(
getMsg(on, Messages.COMMAND_JOIN_PLAYER_JOIN_MSG)
- .replace("{vPrefix}", getChatSupport().getPrefix(p))
- .replace("{vSuffix}", getChatSupport().getSuffix(p))
- .replace("{playername}", p.getName())
- .replace("{player}", p.getDisplayName())
- .replace("{on}", String.valueOf(getPlayers().size()))
- .replace("{max}", String.valueOf(getMaxPlayers()))
+ .replace("{vPrefix}", getChatSupport().getPrefix(p))
+ .replace("{vSuffix}", getChatSupport().getSuffix(p))
+ .replace("{playername}", p.getName())
+ .replace("{player}", p.getDisplayName())
+ .replace("{on}", String.valueOf(getPlayers().size()))
+ .replace("{max}", String.valueOf(getMaxPlayers()))
);
}
setArenaByPlayer(p, this);
@@ -548,9 +545,9 @@ public boolean addPlayer(Player p, boolean skipOwnerCheck) {
new PlayerGoods(p, true);
playerLocation.put(p, p.getLocation());
}
- PaperSupport.teleportC(p, getWaitingLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, getWaitingLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
- if (!isStatusChange){
+ if (!isStatusChange) {
SidebarService.getInstance().giveSidebar(p, this, false);
}
sendPreGameCommandItems(p);
@@ -655,16 +652,16 @@ public boolean addSpectator(@NotNull Player p, boolean playerBefore, Location st
if (!playerBefore) {
if (staffTeleport == null) {
- PaperSupport.teleportC(p, getSpectatorLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, getSpectatorLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
} else {
- PaperSupport.teleportC(p, staffTeleport, PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, staffTeleport, PlayerTeleportEvent.TeleportCause.PLUGIN);
}
}
p.setGameMode(GameMode.ADVENTURE);
Bukkit.getScheduler().runTaskLater(plugin, () -> {
- if(leaving.contains(p)) return;
+ if (leaving.contains(p)) return;
p.setAllowFlight(true);
p.setFlying(true);
}, 5L);
@@ -673,7 +670,7 @@ public boolean addSpectator(@NotNull Player p, boolean playerBefore, Location st
p.getPassenger().remove();
Bukkit.getScheduler().runTask(plugin, () -> {
- if(leaving.contains(p)) return;
+ if (leaving.contains(p)) return;
for (Player on : Bukkit.getOnlinePlayers()) {
if (on == p) continue;
if (getSpectators().contains(on)) {
@@ -691,12 +688,12 @@ public boolean addSpectator(@NotNull Player p, boolean playerBefore, Location st
if (!playerBefore) {
if (staffTeleport == null) {
- PaperSupport.teleportC(p, getSpectatorLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, getSpectatorLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
} else {
- PaperSupport.teleport(p, staffTeleport);
+ TeleportManager.teleport(p, staffTeleport);
}
} else {
- PaperSupport.teleport(p, getSpectatorLocation());
+ TeleportManager.teleport(p, getSpectatorLocation());
}
p.setAllowFlight(true);
@@ -748,7 +745,7 @@ public boolean addSpectator(@NotNull Player p, boolean playerBefore, Location st
* @param disconnect True if the player was disconnected
*/
public void removePlayer(@NotNull Player p, boolean disconnect) {
- if(leaving.contains(p)) {
+ if (leaving.contains(p)) {
return;
} else {
leaving.add(p);
@@ -761,7 +758,7 @@ public void removePlayer(@NotNull Player p, boolean disconnect) {
Arena.afkCheck.remove(p.getUniqueId());
BedWars.getAPI().getAFKUtil().setPlayerAFK(p, false);
- if (getStatus() == GameState.playing) {
+ if (status == GameState.playing) {
for (ITeam t : getTeams()) {
if (t.isMember(p)) {
team = t;
@@ -835,7 +832,7 @@ public void removePlayer(@NotNull Player p, boolean disconnect) {
}
} else if (alive_teams == 0 && !BedWars.isShuttingDown()) {
Bukkit.getScheduler().runTaskLater(BedWars.plugin, () -> changeStatus(GameState.restarting), 10L);
- } else if(!BedWars.isShuttingDown()) {
+ } else if (!BedWars.isShuttingDown()) {
//ReJoin feature
new ReJoin(p, this, team, cacheList);
}
@@ -853,24 +850,34 @@ public void removePlayer(@NotNull Player p, boolean disconnect) {
message = Messages.PLAYER_DIE_PVP_LOG_OUT_REGULAR;
cause = PlayerKillEvent.PlayerKillCause.PLAYER_DISCONNECT;
}
- PlayerKillEvent event = new PlayerKillEvent(this, p, lastDamager, player -> Language.getMsg(player, message), cause);
- for (Player inGame : getPlayers()) {
- Language lang = Language.getPlayerLanguage(inGame);
- inGame.sendMessage(event.getMessage().apply(inGame)
- .replace("{PlayerTeamName}", team.getDisplayName(lang))
- .replace("{PlayerColor}", team.getColor().chat().toString()).replace("{PlayerName}", p.getDisplayName())
- .replace("{KillerColor}", killerTeam.getColor().chat().toString())
- .replace("{KillerName}", lastDamager.getDisplayName())
- .replace("{KillerTeamName}", killerTeam.getDisplayName(lang)));
+
+ PlayerKillEvent event = new PlayerKillEvent(this, p, team, lastDamager, killerTeam,
+ player -> Language.getMsg(player, message), cause
+ );
+ Bukkit.getPluginManager().callEvent(event);
+
+ if (null != event.getMessage()) {
+ for (Player inGame : getPlayers()) {
+ Language lang = Language.getPlayerLanguage(inGame);
+ inGame.sendMessage(event.getMessage().apply(inGame)
+ .replace("{PlayerTeamName}", team.getDisplayName(lang))
+ .replace("{PlayerColor}", team.getColor().chat().toString()).replace("{PlayerName}", p.getDisplayName())
+ .replace("{KillerColor}", killerTeam.getColor().chat().toString())
+ .replace("{KillerName}", lastDamager.getDisplayName())
+ .replace("{KillerTeamName}", killerTeam.getDisplayName(lang)));
+ }
}
- for (Player inGame : getSpectators()) {
- Language lang = Language.getPlayerLanguage(inGame);
- inGame.sendMessage(event.getMessage().apply(inGame)
- .replace("{PlayerTeamName}", team.getDisplayName(lang))
- .replace("{PlayerColor}", team.getColor().chat().toString()).replace("{PlayerName}", p.getDisplayName())
- .replace("{KillerColor}", killerTeam.getColor().chat().toString())
- .replace("{KillerName}", lastDamager.getDisplayName())
- .replace("{KillerTeamName}", killerTeam.getDisplayName(lang)));
+
+ if (null != event.getMessage()) {
+ for (Player inGame : getSpectators()) {
+ Language lang = Language.getPlayerLanguage(inGame);
+ inGame.sendMessage(event.getMessage().apply(inGame)
+ .replace("{PlayerTeamName}", team.getDisplayName(lang))
+ .replace("{PlayerColor}", team.getColor().chat().toString()).replace("{PlayerName}", p.getDisplayName())
+ .replace("{KillerColor}", killerTeam.getColor().chat().toString())
+ .replace("{KillerName}", lastDamager.getDisplayName())
+ .replace("{KillerTeamName}", killerTeam.getDisplayName(lang)));
+ }
}
PlayerDrops.handlePlayerDrops(this, p, lastDamager, team, killerTeam, cause, new ArrayList<>(Arrays.asList(p.getInventory().getContents())));
}
@@ -917,7 +924,7 @@ public void removePlayer(@NotNull Player p, boolean disconnect) {
p.removePotionEffect(pf.getType());
}
- if(!BedWars.isShuttingDown()) {
+ if (!BedWars.isShuttingDown()) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> {
for (Player on : Bukkit.getOnlinePlayers()) {
if (on.equals(p)) continue;
@@ -989,7 +996,7 @@ public void removePlayer(@NotNull Player p, boolean disconnect) {
// fix #340
// remove player from party if leaves and the owner is still in the arena while waiting or starting
- if (getStatus() == GameState.waiting || getStatus() == GameState.starting) {
+ if (status == GameState.waiting || status == GameState.starting) {
if (BedWars.getParty().hasParty(p) && !BedWars.getParty().isOwner(p)) {
for (Player pl : BedWars.getParty().getMembers(p)) {
if (BedWars.getParty().isOwner(pl) && pl.getWorld().getName().equalsIgnoreCase(getArenaName())) {
@@ -1014,7 +1021,7 @@ public void removePlayer(@NotNull Player p, boolean disconnect) {
public void removeSpectator(@NotNull Player p, boolean disconnect) {
debug("Spectator removed: " + p.getName() + " arena: " + getArenaName());
- if(leaving.contains(p)) {
+ if (leaving.contains(p)) {
return;
} else {
leaving.add(p);
@@ -1058,7 +1065,7 @@ public void removeSpectator(@NotNull Player p, boolean disconnect) {
}
playerLocation.remove(p);
- if(!BedWars.isShuttingDown()) {
+ if (!BedWars.isShuttingDown()) {
Bukkit.getScheduler().runTask(plugin, () -> {
for (Player on : Bukkit.getOnlinePlayers()) {
if (on.equals(p)) continue;
@@ -1152,7 +1159,7 @@ public boolean reJoin(Player p) {
//new PlayerGoods(p, true, true);
playerLocation.put(p, p.getLocation());
}
- PaperSupport.teleportC(p, getSpectatorLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, getSpectatorLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
p.getInventory().clear();
//restore items before re-spawning in team
@@ -1200,7 +1207,7 @@ public void restart() {
if (getRestartingTask() != null) getRestartingTask().cancel();
if (getStartingTask() != null) getStartingTask().cancel();
if (getPlayingTask() != null) getPlayingTask().cancel();
- if (null != moneyperMinuteTask){
+ if (null != moneyperMinuteTask) {
moneyperMinuteTask.cancel();
}
if (null != perMinuteTask) {
@@ -1378,22 +1385,47 @@ public boolean isBlockPlaced(Block block) {
/**
* Get a player kills count.
*
- * @param p Target player
+ * @param player Target player
* @param finalKills True if you want to get the Final Kills. False for regular kills.
*/
- public int getPlayerKills(Player p, boolean finalKills) {
- if (finalKills) return playerFinalKills.getOrDefault(p, 0);
- return playerKills.getOrDefault(p.getName(), 0);
+ @Deprecated(forRemoval = true)
+ public int getPlayerKills(Player player, boolean finalKills) {
+ if (null == player || null == getStatsHolder()) {
+ return 0;
+ }
+
+ Optional> st = getStatsHolder().get(player).flatMap(stats ->
+ stats.getStatistic(finalKills ? DefaultStatistics.KILLS_FINAL : DefaultStatistics.BEDS_DESTROYED)
+ );
+
+ if (st.isEmpty()) {
+ return 0;
+ }
+
+ GameStatistic> gs = st.get();
+ return gs instanceof Incrementable ? (int) gs.getValue() : 0;
}
/**
* Get the player beds destroyed count
*
- * @param p Target player
+ * @param player Target player
*/
- public int getPlayerBedsDestroyed(Player p) {
- if (playerBedsDestroyed.containsKey(p)) return playerBedsDestroyed.get(p);
- return 0;
+ @Deprecated(forRemoval = true)
+ public int getPlayerBedsDestroyed(Player player) {
+ if (null == player || null == getStatsHolder()) {
+ return 0;
+ }
+
+ Optional> st = getStatsHolder().get(player)
+ .flatMap(stats -> stats.getStatistic(DefaultStatistics.BEDS_DESTROYED));
+
+ if (st.isEmpty()) {
+ return 0;
+ }
+
+ GameStatistic> gs = st.get();
+ return gs instanceof Incrementable ? (int) gs.getValue() : 0;
}
/**
@@ -1458,6 +1490,12 @@ public void setStatus(GameState status) {
* Change game status starting tasks.
*/
public void changeStatus(GameState status) {
+
+ // prevent called twice #https://github.com/andrei1058/BedWars1058/issues/774
+ if (status == this.status) {
+ return;
+ }
+
if (this.status != GameState.playing && status == GameState.playing) {
startTime = Instant.now();
}
@@ -1473,6 +1511,9 @@ public void changeStatus(GameState status) {
Arena.afkCheck.remove(p.getUniqueId());
BedWars.getAPI().getAFKUtil().setPlayerAFK(p, false);
}
+
+ // Initialize game stats
+ getPlayers().forEach(gameStats::init);
}
//Stop active tasks to prevent issues
@@ -1494,7 +1535,7 @@ public void changeStatus(GameState status) {
restartingTask.cancel();
}
restartingTask = null;
- if (null != moneyperMinuteTask){
+ if (null != moneyperMinuteTask) {
moneyperMinuteTask.cancel();
}
if (null != perMinuteTask) {
@@ -1622,32 +1663,15 @@ public List getSpectators() {
/**
* Add a kill point to the game stats.
*/
- public void addPlayerKill(Player p, boolean finalKill, Player victim) {
- if (p == null) return;
- if (playerKills.containsKey(p.getName())) {
- playerKills.replace(p.getName(), playerKills.get(p.getName()) + 1);
- } else {
- playerKills.put(p.getName(), 1);
- }
- if (finalKill) {
- if (playerFinalKills.containsKey(p)) {
- playerFinalKills.replace(p, playerFinalKills.get(p) + 1);
- } else {
- playerFinalKills.put(p, 1);
- }
- playerFinalKillDeaths.put(victim, 1);
- }
+ @Deprecated(forRemoval = true)
+ public void addPlayerKill(Player player, boolean finalKill, Player victim) {
}
/**
* Add a destroyed bed point to the player temp stats.
*/
- public void addPlayerBedDestroyed(Player p) {
- if (playerBedsDestroyed.containsKey(p)) {
- playerBedsDestroyed.replace(p, playerBedsDestroyed.get(p) + 1);
- return;
- }
- playerBedsDestroyed.put(p, 1);
+ @Deprecated(forRemoval = true)
+ public void addPlayerBedDestroyed(Player player) {
}
/**
@@ -1833,9 +1857,8 @@ public ITeam getPlayerTeam(String playerCache) {
* It will manage the arena restart and the needed stuff.
*/
public void checkWinner() {
- if (getStatus() != GameState.restarting) {
+ if (status != GameState.restarting) {
int max = getTeams().size(), eliminated = 0;
- ITeam winner = null;
for (ITeam t : getTeams()) {
if (t.getMembers().isEmpty()) {
eliminated++;
@@ -1851,15 +1874,9 @@ public void checkWinner() {
p.getInventory().clear();
}
}
- String firstName = "";
- String secondName = "";
- String thirdName = "";
StringBuilder winners = new StringBuilder();
//noinspection deprecation
for (Player p : winner.getMembersCache()) {
- if (p.getWorld().equals(getWorld())) {
- nms.sendTitle(p, getMsg(p, Messages.GAME_END_VICTORY_PLAYER_TITLE), null, 0, 70, 20);
- }
if (!winners.toString().contains(p.getDisplayName())) {
winners.append(p.getDisplayName()).append(" ");
}
@@ -1867,61 +1884,81 @@ public void checkWinner() {
if (winners.toString().endsWith(" ")) {
winners = new StringBuilder(winners.substring(0, winners.length() - 1));
}
- int first = 0, second = 0, third = 0;
- if (!playerKills.isEmpty()) {
+ StatisticsOrdered topInChat = null;
- LinkedHashMap reverseSortedMap = new LinkedHashMap<>();
+ if (null != getStatsHolder()) {
+ topInChat = new StatisticsOrdered(
+ this, getConfig().getGameOverridableString(ConfigPath.GENERAL_GAME_END_CHAT_TOP_STATISTIC)
+ );
+ // hide stats row completely when placeholders cannot be replaced
+ if (getConfig().getGameOverridableBoolean(ConfigPath.GENERAL_GAME_END_CHAT_TOP_HIDE_MISSING)) {
+ topInChat.setBoundsPolicy(StatisticsOrdered.BoundsPolicy.SKIP);
+ }
+ }
- //Use Comparator.reverseOrder() for reverse ordering
- playerKills.entrySet()
- .stream()
- .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
- .forEachOrdered(x -> reverseSortedMap.put(x.getKey(), x.getValue()));
+ // this is assigned to scoreboards
+ StatisticsOrdered topInSidebar = new StatisticsOrdered(
+ this, getConfig().getGameOverridableString(ConfigPath.GENERAL_GAME_END_SB_TOP_STATISTIC)
+ );
- int entry = 0;
- for (Map.Entry e : reverseSortedMap.entrySet()) {
- if (entry == 0) {
- firstName = e.getKey();
- Player onlinePlayer = Bukkit.getPlayerExact(e.getKey());
- if (onlinePlayer != null) {
- firstName = onlinePlayer.getDisplayName();
- }
- first = e.getValue();
- } else if (entry == 1) {
- secondName = e.getKey();
- Player onlinePlayer = Bukkit.getPlayerExact(e.getKey());
- if (onlinePlayer != null) {
- secondName = onlinePlayer.getDisplayName();
- }
- second = e.getValue();
- } else if (entry == 2) {
- thirdName = e.getKey();
- Player onlinePlayer = Bukkit.getPlayerExact(e.getKey());
- if (onlinePlayer != null) {
- thirdName = onlinePlayer.getDisplayName();
+ // hide stats row completely when placeholders cannot be replaced
+ if (getConfig().getGameOverridableBoolean(ConfigPath.GENERAL_GAME_END_SB_TOP_HIDE_MISSING)) {
+ topInSidebar.setBoundsPolicy(StatisticsOrdered.BoundsPolicy.SKIP);
+ }
+
+ List receivers = new ArrayList<>(getPlayers().size() + getSpectators().size());
+ receivers.addAll(getPlayers());
+ receivers.addAll(getSpectators());
+
+ if (null != topInChat) {
+ StatisticsOrdered.StringParser statParser = topInChat.newParser();
+
+ for (Player receiver : receivers) {
+
+ Language playerLang = Language.getPlayerLanguage(receiver);
+
+ String winnerTeamChat = playerLang.m(Messages.GAME_END_TEAM_WON_CHAT);
+ // check if message disabled
+ if (null != winnerTeamChat && !winnerTeamChat.isBlank()) {
+ receiver.sendMessage(winnerTeamChat.replace("{TeamColor}", winner.getColor().chat().toString())
+ .replace("{TeamName}", winner.getDisplayName(playerLang)));
+ }
+
+ if (winner.getMembers().contains(receiver) || winner.wasMember(receiver.getUniqueId())) {
+ nms.sendTitle(receiver, getMsg(receiver, Messages.GAME_END_VICTORY_PLAYER_TITLE), null, 0, 70, 20);
+ } else {
+ nms.sendTitle(receiver, playerLang.m(Messages.GAME_END_GAME_OVER_PLAYER_TITLE), null, 0, 70, 20);
+ }
+
+ statParser.resetIndex();
+
+ // check if message is disabled
+ List topChat = getList(receiver, Messages.GAME_END_TOP_PLAYER_CHAT);
+ if (topChat.isEmpty() || topChat.size() == 1 && topChat.get(0).isEmpty()) {
+ continue;
+ }
+
+ for (String s : topChat) {
+
+ String msg = statParser.parseString(s, playerLang, playerLang.m(Messages.MEANING_NOBODY));
+ if (null == msg) {
+ continue;
}
- third = e.getValue();
- break;
+
+ msg = msg.replace("{winnerFormat}", getMaxInTeam() > 1 ? playerLang.m(Messages.FORMATTING_TEAM_WINNER_FORMAT).replace("{members}", winners.toString()) : playerLang.m(Messages.FORMATTING_SOLO_WINNER_FORMAT).replace("{members}", winners.toString()))
+ .replace("{TeamColor}", winner.getColor().chat().toString()).replace("{TeamName}", winner.getDisplayName(playerLang));
+
+ receiver.sendMessage(SupportPAPI.getSupportPAPI().replace(receiver, msg));
+ }
+
+ ISidebar sidebar = SidebarService.getInstance().getSidebar(receiver);
+ if (sidebar instanceof BwSidebar) {
+ ((BwSidebar) sidebar).setTopStatistics(topInSidebar);
}
- entry++;
- }
- }
- for (Player p : world.getPlayers()) {
- p.sendMessage(getMsg(p, Messages.GAME_END_TEAM_WON_CHAT).replace("{TeamColor}", winner.getColor().chat().toString())
- .replace("{TeamName}", winner.getDisplayName(Language.getPlayerLanguage(p))));
- if (!winner.getMembers().contains(p)) {
- nms.sendTitle(p, getMsg(p, Messages.GAME_END_GAME_OVER_PLAYER_TITLE), null, 0, 70, 20);
- }
- for (String s : getList(p, Messages.GAME_END_TOP_PLAYER_CHAT)) {
- String message = s.replace("{firstName}", firstName.isEmpty() ? getMsg(p, Messages.MEANING_NOBODY) : firstName).replace("{firstKills}", String.valueOf(first))
- .replace("{secondName}", secondName.isEmpty() ? getMsg(p, Messages.MEANING_NOBODY) : secondName).replace("{secondKills}", String.valueOf(second))
- .replace("{thirdName}", thirdName.isEmpty() ? getMsg(p, Messages.MEANING_NOBODY) : thirdName).replace("{thirdKills}", String.valueOf(third))
- .replace("{winnerFormat}", getMaxInTeam() > 1 ? getMsg(p, Messages.FORMATTING_TEAM_WINNER_FORMAT).replace("{members}", winners.toString()) : getMsg(p, Messages.FORMATTING_SOLO_WINNER_FORMAT).replace("{members}", winners.toString()))
- .replace("{TeamColor}", winner.getColor().chat().toString()).replace("{TeamName}", winner.getDisplayName(Language.getPlayerLanguage(p)));
- p.sendMessage(SupportPAPI.getSupportPAPI().replace(p, message));
}
}
+
}
changeStatus(GameState.restarting);
@@ -1946,10 +1983,9 @@ public void checkWinner() {
}
}
Bukkit.getPluginManager().callEvent(new GameEndEvent(this, winners, losers, winner, aliveWinners));
- //
}
- if (players.size() == 0 && getStatus() != GameState.restarting) {
+ if (players.isEmpty() && status != GameState.restarting) {
changeStatus(GameState.restarting);
}
}
@@ -1958,12 +1994,8 @@ public void checkWinner() {
/**
* Add a kill to the player temp stats.
*/
- public void addPlayerDeath(Player p) {
- if (playerDeaths.containsKey(p)) {
- playerDeaths.replace(p, playerDeaths.get(p) + 1);
- } else {
- playerDeaths.put(p, 1);
- }
+ @Deprecated(forRemoval = true)
+ public void addPlayerDeath(Player player) {
}
@@ -2057,44 +2089,7 @@ public void updateNextEvent() {
setNextEvent(NextEvent.GAME_END);
}
- //if (nextEvent.getValue(this) > 0) return;
-
- //nextEvents.remove(nextEvent.toString());
-
- //for (String s : nextEvents) {
- // debug(s);
- //}
-
- //if (nextEvents.isEmpty()) return;
-
- //NextEvent next = NextEvent.valueOf(nextEvents.get(0));
- //int lowest = next.getValue(this);
-
- //for (String ne : nextEvents) {
- // int value = NextEvent.valueOf(ne).getValue(this);
- // if (value == -1) continue;
- // if (lowest > value) next = NextEvent.valueOf(ne);
- //}
-
debug("---");
-
- /*if (nextEvent == NextEvent.DIAMOND_GENERATOR_TIER_II) {
- setNextEvent(NextEvent.DIAMOND_GENERATOR_TIER_III);
- } else if (nextEvent == NextEvent.DIAMOND_GENERATOR_TIER_III) {
- if (emeraldTier == 1) {
- setNextEvent(NextEvent.EMERALD_GENERATOR_TIER_II);
- } else if (emeraldTier == 2) {
- setNextEvent(NextEvent.EMERALD_GENERATOR_TIER_III);
- } else {
- setNextEvent(NextEvent.BEDS_DESTROY);
- }
- } else if (emeraldTier >= 3 && diamondTier >= 3 && (playingTask != null && playingTask.getBedsDestroyCountdown() == 0)) {
- setNextEvent(NextEvent.BEDS_DESTROY);
- } else if (nextEvent == NextEvent.BEDS_DESTROY && (playingTask != null && playingTask.getDragonSpawnCountdown() >= 0)) {
- setNextEvent(NextEvent.ENDER_DRAGON);
- } else if (nextEvent == NextEvent.ENDER_DRAGON && (playingTask != null && playingTask.getBedsDestroyCountdown() == 0) && (playingTask != null && playingTask.getDragonSpawnCountdown() == 0)) {
- setNextEvent(NextEvent.GAME_END);
- }*/
debug(nextEvent.toString());
}
@@ -2314,9 +2309,22 @@ public List getNextEvents() {
/**
* Get player deaths.
*/
- public int getPlayerDeaths(Player p, boolean finalDeaths) {
- if (finalDeaths) return playerFinalKillDeaths.getOrDefault(p, 0);
- return playerDeaths.getOrDefault(p, 0);
+ @Deprecated(forRemoval = true)
+ public int getPlayerDeaths(Player player, boolean finalDeaths) {
+ if (null == player || null == getStatsHolder()) {
+ return 0;
+ }
+
+ Optional> st = getStatsHolder().get(player).flatMap(stats ->
+ stats.getStatistic(finalDeaths ? DefaultStatistics.DEATHS_FINAL : DefaultStatistics.DEATHS)
+ );
+
+ if (st.isEmpty()) {
+ return 0;
+ }
+
+ GameStatistic> gs = st.get();
+ return gs instanceof Incrementable ? (int) gs.getValue() : 0;
}
/**
@@ -2412,11 +2420,6 @@ public void destroyData() {
regionsList = null;
respawnSessions = null;
showTime = null;
- playerKills = null;
- playerBedsDestroyed = null;
- playerFinalKills = null;
- playerDeaths = null;
- playerFinalKillDeaths = null;
startingTask = null;
playingTask = null;
restartingTask = null;
@@ -2504,7 +2507,7 @@ public boolean startReSpawnSession(Player player, int seconds) {
if (playing.equals(player)) continue;
BedWars.nms.spigotHidePlayer(player, playing);
}
- PaperSupport.teleportC(player, getReSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(player, getReSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
player.setAllowFlight(true);
player.setFlying(true);
@@ -2520,7 +2523,7 @@ public boolean startReSpawnSession(Player player, int seconds) {
}
updateSpectatorCollideRule(player, false);
- PaperSupport.teleportC(player, getReSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(player, getReSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
}, 10L);
} else {
ITeam team = getTeam(player);
@@ -2546,16 +2549,18 @@ public static boolean canAutoScale(String arenaName) {
if (ar.getArenaName().equalsIgnoreCase(arenaName)) return false;
}
- if (Arena.getGamesBeforeRestart() != -1 && Arena.getArenas().size() >= Arena.getGamesBeforeRestart()) return false;
+ if (Arena.getGamesBeforeRestart() != -1 && Arena.getArenas().size() >= Arena.getGamesBeforeRestart())
+ return false;
int activeClones = 0;
for (IArena ar : Arena.getArenas()) {
if (ar.getArenaName().equalsIgnoreCase(arenaName)) {
// clone this arena only if there aren't available arena of the same kind
- if (ar.getStatus() == GameState.waiting || ar.getStatus() == GameState.starting) return false;
+ GameState status = ar.getStatus();
+ if (status == GameState.waiting || status == GameState.starting) return false;
}
// count active clones
- if (ar.getArenaName().equals(arenaName)){
+ if (ar.getArenaName().equals(arenaName)) {
activeClones++;
}
}
@@ -2589,13 +2594,9 @@ public boolean isProtected(Location location) {
@Override
public void abandonGame(Player player) {
- if (player == null) return;
-
- //this.playerKills.remove(player.getName());
- this.playerBedsDestroyed.remove(player);
- this.playerFinalKills.remove(player);
- this.playerDeaths.remove(player);
- this.playerFinalKillDeaths.remove(player);
+ if (player == null) {
+ return;
+ }
ITeam team = getTeams().stream().filter(team1 -> team1.wasMember(player.getUniqueId())).findFirst().orElse(null);
if (team != null) {
@@ -2647,18 +2648,59 @@ private void sendToMainLobby(Player player) {
if (BedWars.getServerType() == ServerType.SHARED) {
Location loc = playerLocation.get(player);
if (loc == null) {
- PaperSupport.teleportC(player, Bukkit.getWorlds().get(0).getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(player, Bukkit.getWorlds().get(0).getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
plugin.getLogger().log(Level.SEVERE, player.getName() + " was teleported to the main world because lobby location is not set!");
} else {
- player.teleport(loc, PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(player, loc, PlayerTeleportEvent.TeleportCause.PLUGIN);
}
} else if (BedWars.getServerType() == ServerType.MULTIARENA) {
if (BedWars.getLobbyWorld().isEmpty()) {
- PaperSupport.teleportC(player, Bukkit.getWorlds().get(0).getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(player, Bukkit.getWorlds().get(0).getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
plugin.getLogger().log(Level.SEVERE, player.getName() + " was teleported to the main world because lobby location is not set!");
} else {
- PaperSupport.teleportC(player, config.getConfigLoc("lobbyLoc"), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(player, config.getConfigLoc("lobbyLoc"), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ }
+ }
+ }
+
+ public boolean isAllowMapBreak() {
+ return allowMapBreak;
+ }
+
+ public void setAllowMapBreak(boolean allowMapBreak) {
+ this.allowMapBreak = allowMapBreak;
+ }
+
+ @Override
+ public @Nullable ITeam getBedsTeam(@NotNull Location location) {
+ if (!location.getWorld().getName().equals(this.worldName)) {
+ throw new RuntimeException("Given location is not on this game world.");
+ }
+
+ if (!nms.isBed(location.getBlock().getType())) {
+ return null;
+ }
+
+ for (ITeam team : this.teams) {
+ if (team.isBed(location)) {
+ return team;
}
}
+ return null;
+ }
+
+ @Override
+ public @Nullable ITeam getWinner() {
+ return winner;
+ }
+
+ @Override
+ public boolean isTeamBed(Location location) {
+ return null != getBedsTeam(location);
+ }
+
+ @Override
+ public GameStatsHolder getStatsHolder() {
+ return gameStats;
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/ArenaGUI.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/ArenaGUI.java
index c185ecf93..a3f43bf6d 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/ArenaGUI.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/ArenaGUI.java
@@ -111,7 +111,7 @@ public static void refreshInv(Player p, IArena arena, int players) {
for (String s : Language.getList(p, Messages.ARENA_GUI_ARENA_CONTENT_LORE)) {
if (!(s.contains("{group}") && arenas.get(arenaKey).getGroup().equalsIgnoreCase("default"))) {
lore.add(s.replace("{on}", String.valueOf(arena != null ? arena == arenas.get(arenaKey) ? players : arenas.get(arenaKey).getPlayers().size() : arenas.get(arenaKey).getPlayers().size())).replace("{max}",
- String.valueOf(arenas.get(arenaKey).getMaxPlayers())).replace("{status}", arenas.get(arenaKey).getDisplayStatus(Language.getPlayerLanguage(p)))
+ String.valueOf(arenas.get(arenaKey).getMaxPlayers())).replace("{status}", arenas.get(arenaKey).getDisplayStatus(Language.getPlayerLanguage(p)))
.replace("{group}", arenas.get(arenaKey).getDisplayGroup(p)));
}
}
@@ -135,7 +135,7 @@ public static void openGui(Player p, String group) {
//ash.setInv(inv);
String skippedSlotMaterial = BedWars.config.getString(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_MATERIAL.replace("%path%", "skipped-slot"));
- if(!skippedSlotMaterial.equalsIgnoreCase("none") && !skippedSlotMaterial.equalsIgnoreCase("air")) {
+ if (!skippedSlotMaterial.equalsIgnoreCase("none") && !skippedSlotMaterial.equalsIgnoreCase("air")) {
ItemStack i = BedWars.nms.createItemStack(skippedSlotMaterial,
1, (byte) BedWars.config.getInt(ConfigPath.GENERAL_CONFIGURATION_ARENA_SELECTOR_STATUS_DATA.replace("%path%", "skipped-slot")));
i = BedWars.nms.addCustomData(i, "RUNCOMMAND_bw join random");
@@ -144,16 +144,29 @@ public static void openGui(Player p, String group) {
im.setDisplayName(ChatColor.translateAlternateColorCodes(
'&',
Language.getMsg(p, Messages.ARENA_GUI_SKIPPED_ITEM_NAME)
- .replaceAll("\\{serverIp}", BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP))
+ .replaceAll(
+ "\\{serverIp}",
+ BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP)
+ )
+ .replaceAll(
+ "\\{poweredBy}",
+ BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_POWERED_BY)
+ )
));
List lore = new ArrayList<>();
- for(String s : Language.getList(p, Messages.ARENA_GUI_SKIPPED_ITEM_LORE)) {
- lore.add(
- s
- .replaceAll("\\{serverIp}", BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP))
- );
+ for (String line : Language.getList(p, Messages.ARENA_GUI_SKIPPED_ITEM_LORE)) {
+ line = line
+ .replaceAll(
+ "\\{serverIp}",
+ BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP)
+ )
+ .replaceAll(
+ "\\{poweredBy}",
+ BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_POWERED_BY)
+ );
+ lore.add(line);
}
- if(lore.size() > 0) {
+ if (lore.size() > 0) {
im.setLore(lore);
}
im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
@@ -177,7 +190,7 @@ public static class ArenaSelectorHolder implements InventoryHolder {
private String group;
//private Inventory inv;
- public ArenaSelectorHolder(String group){
+ public ArenaSelectorHolder(String group) {
this.group = group;
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Misc.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Misc.java
index bc0546818..f560643ff 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Misc.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/Misc.java
@@ -391,13 +391,13 @@ public static boolean isBuildProtected(Location l, IArena a) {
}
for (ITeam t : a.getTeams()) {
for (IGenerator o : t.getGenerators()) {
- if (o.getLocation().distance(l) <= 1) {
+ if (o.getLocation().distance(l) <= a.getConfig().getInt(ConfigPath.ARENA_GENERATOR_PROTECTION)) {
return true;
}
}
}
for (IGenerator o : a.getOreGenerators()) {
- if (o.getLocation().distance(l) <= 1) {
+ if (o.getLocation().distance(l) <= a.getConfig().getInt(ConfigPath.ARENA_GENERATOR_PROTECTION)) {
return true;
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/OreGenerator.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/OreGenerator.java
index 1bcf63020..95e217033 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/OreGenerator.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/OreGenerator.java
@@ -82,7 +82,7 @@ public OreGenerator(Location location, IArena arena, GeneratorType type, ITeam b
loadDefaults();
BedWars.debug("Initializing new generator at: " + location + " - " + type + " - " + (bwt == null ? "NOTEAM" : bwt.getName()));
- Cuboid c = new Cuboid(location, 1, true);
+ Cuboid c = new Cuboid(location, getArena().getConfig().getInt(ConfigPath.ARENA_GENERATOR_PROTECTION), true);
c.setMaxY(c.getMaxY() + 5);
c.setMinY(c.getMinY() - 2);
arena.getRegionsList().add(c);
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/SetupSession.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/SetupSession.java
index 721380505..a7d750551 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/SetupSession.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/SetupSession.java
@@ -30,7 +30,7 @@
import com.andrei1058.bedwars.api.server.SetupType;
import com.andrei1058.bedwars.commands.bedwars.MainCommand;
import com.andrei1058.bedwars.configuration.ArenaConfig;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import net.md_5.bungee.api.chat.ClickEvent;
import org.bukkit.*;
import org.bukkit.configuration.ConfigurationSection;
@@ -167,9 +167,9 @@ public void done() {
getSetupSessions().remove(this);
if (BedWars.getServerType() != ServerType.BUNGEE) {
try {
- PaperSupport.teleportC(getPlayer(), config.getConfigLoc("lobbyLoc"), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(getPlayer(), config.getConfigLoc("lobbyLoc"), PlayerTeleportEvent.TeleportCause.PLUGIN);
} catch (Exception ex) {
- PaperSupport.teleportC(getPlayer(), Bukkit.getWorlds().get(0).getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(getPlayer(), Bukkit.getWorlds().get(0).getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
}
}
getPlayer().removePotionEffect(PotionEffectType.SPEED);
@@ -211,7 +211,7 @@ public ArenaConfig getConfig() {
@Override
public void teleportPlayer() {
player.getInventory().clear();
- PaperSupport.teleport(player, Bukkit.getWorld(getWorldName()).getSpawnLocation());
+ TeleportManager.teleport(player, Bukkit.getWorld(getWorldName()).getSpawnLocation());
player.setGameMode(GameMode.CREATIVE);
Bukkit.getScheduler().runTaskLater(plugin, ()->{
player.setAllowFlight(true);
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/feature/SpoilPlayerTNTFeature.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/feature/SpoilPlayerTNTFeature.java
index de71788ea..7bce58bdd 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/feature/SpoilPlayerTNTFeature.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/feature/SpoilPlayerTNTFeature.java
@@ -122,14 +122,23 @@ public void onPlace(BlockPlaceEvent event) {
public void inventorySwitch(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
IArena arena = Arena.getArenaByPlayer(player);
- if (arena == null || !arena.isPlayer(player) || arena.isSpectator(player)) return;
+
+ // Ensure the player is in an arena, is not a spectator, and is indeed a player
+ if (arena == null || !arena.isPlayer(player) || arena.isSpectator(player)) {
+ return;
+ }
+
+ boolean hasTnt = player.getInventory().contains(Material.TNT);
+
if (instance.playersWithTnt.contains(player)) {
- if (player.getInventory().contains(Material.TNT)) return;
- instance.playersWithTnt.remove(player);
- } else if (!instance.playersWithTnt.contains(player)) {
- if (!player.getInventory().contains(Material.TNT)) return;
- instance.playersWithTnt.add(player);
+ if (!hasTnt) {
+ instance.playersWithTnt.remove(player);
+ }
+ } else {
+ if (hasTnt) {
+ instance.playersWithTnt.add(player);
+ }
}
}
}
-}
+}
\ No newline at end of file
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/spectator/TeleporterGUI.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/spectator/TeleporterGUI.java
index cd5d47087..64897370c 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/spectator/TeleporterGUI.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/spectator/TeleporterGUI.java
@@ -22,6 +22,8 @@
import com.andrei1058.bedwars.BedWars;
import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
import com.andrei1058.bedwars.api.language.Messages;
import com.andrei1058.bedwars.arena.Arena;
import org.bukkit.Bukkit;
@@ -74,20 +76,14 @@ public static void refreshInv(Player p, Inventory inv) {
public static void openGUI(Player p) {
IArena arena = Arena.getArenaByPlayer(p);
if (arena == null) return;
- int size = arena.getPlayers().size();
- if (size <= 9) {
- size = 9;
- } else if (size <= 18) {
- size = 18;
- } else if (size > 19 && size <= 27) {
- size = 27;
- } else if (size > 27 && size <= 36) {
- size = 36;
- } else if (size > 36 && size <= 45) {
- size = 45;
- } else {
+
+ int playerCount = arena.getPlayers().size();
+ int size = (playerCount % 9) == 0 ? playerCount : ((int) Math.ceil(playerCount / 9.0)) * 9;
+
+ if (size > 54) {
size = 54;
}
+
Inventory inv = Bukkit.createInventory(p, size, getMsg(p, Messages.ARENA_SPECTATOR_TELEPORTER_GUI_NAME));
refreshInv(p, inv);
refresh.put(p, inv);
@@ -117,9 +113,14 @@ private static ItemStack createHead(Player targetPlayer, Player GUIholder) {
ItemStack i = nms.getPlayerHead(targetPlayer, null);
ItemMeta im = i.getItemMeta();
assert im != null;
+ IArena currentArena = Arena.getArenaByPlayer(targetPlayer);
+ ITeam targetPlayerTeam = currentArena.getTeam(targetPlayer);
+
im.setDisplayName(getMsg(GUIholder, Messages.ARENA_SPECTATOR_TELEPORTER_GUI_HEAD_NAME)
.replace("{vPrefix}", BedWars.getChatSupport().getPrefix(targetPlayer))
.replace("{vSuffix}", BedWars.getChatSupport().getSuffix(targetPlayer))
+ .replace("{team}", targetPlayerTeam.getDisplayName(Language.getPlayerLanguage(GUIholder)))
+ .replace("{teamColor}", String.valueOf(targetPlayerTeam.getColor().chat()))
.replace("{player}", targetPlayer.getDisplayName())
.replace("{playername}", targetPlayer.getName()));
List lore = new ArrayList<>();
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/DefaultStatsHandler.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/DefaultStatsHandler.java
new file mode 100644
index 000000000..53220202b
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/DefaultStatsHandler.java
@@ -0,0 +1,79 @@
+package com.andrei1058.bedwars.arena.stats;
+
+import com.andrei1058.bedwars.api.arena.stats.*;
+import com.andrei1058.bedwars.api.events.player.PlayerBedBreakEvent;
+import com.andrei1058.bedwars.api.events.player.PlayerKillEvent;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Optional;
+
+/**
+ * Used to increase default session stats.
+ */
+public class DefaultStatsHandler implements Listener {
+
+ @EventHandler(ignoreCancelled = true)
+ public void onBedWarsKill(@NotNull PlayerKillEvent event) {
+
+ GameStatsHolder statsHolder = event.getArena().getStatsHolder();
+ if (null == statsHolder) {
+ return;
+ }
+
+ Player killer = event.getKiller();
+ Player victim = event.getVictim();
+
+ // INCREMENT KILLER STATS
+ if ((killer != null && !event.getVictimTeam().equals(event.getKillerTeam())) && !victim.equals(killer)) {
+ Optional killerStats = statsHolder.get(killer);
+
+ killerStats.flatMap(stats -> stats.getStatistic(DefaultStatistics.KILLS)).ifPresent(gameStatistic -> {
+ if (gameStatistic instanceof Incrementable) {
+ ((Incrementable) gameStatistic).increment();
+ }
+ });
+
+ if (event.getCause().isFinalKill()) {
+ killerStats.flatMap(stats -> stats.getStatistic(DefaultStatistics.KILLS_FINAL)).ifPresent(gameStatistic -> {
+ if (gameStatistic instanceof Incrementable) {
+ ((Incrementable) gameStatistic).increment();
+ }
+ });
+ }
+ }
+
+ // INCREMENT VICTIM STATS
+ Optional victimStats = statsHolder.get(victim);
+
+ victimStats.flatMap(stats -> stats.getStatistic(DefaultStatistics.DEATHS)).ifPresent(gameStatistic -> {
+ if (gameStatistic instanceof Incrementable) {
+ ((Incrementable) gameStatistic).increment();
+ }
+ });
+
+ if (event.getCause().isFinalKill()) {
+ victimStats.flatMap(stats -> stats.getStatistic(DefaultStatistics.DEATHS_FINAL)).ifPresent(gameStatistic -> {
+ if (gameStatistic instanceof Incrementable) {
+ ((Incrementable) gameStatistic).increment();
+ }
+ });
+ }
+ }
+
+ @EventHandler(ignoreCancelled = true)
+ public void onBedWarsBedBreak(@NotNull PlayerBedBreakEvent event) {
+ if (null == event.getArena().getStatsHolder()) {
+ return;
+ }
+
+ event.getArena().getStatsHolder().get(event.getPlayer()).flatMap(stats ->
+ stats.getStatistic(DefaultStatistics.BEDS_DESTROYED)).ifPresent(st -> {
+ if (st instanceof Incrementable) {
+ ((Incrementable) st).increment();
+ }
+ });
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/GameStatsManager.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/GameStatsManager.java
new file mode 100644
index 000000000..43bb7c7ff
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/GameStatsManager.java
@@ -0,0 +1,124 @@
+package com.andrei1058.bedwars.arena.stats;
+
+import com.andrei1058.bedwars.BedWars;
+import com.andrei1058.bedwars.api.arena.GameState;
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.stats.*;
+import com.andrei1058.bedwars.arena.stats.defaults.PlayerGameStatsContainer;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class GameStatsManager implements GameStatsHolder {
+
+ private final HashMap> registeredStats = new HashMap<>();
+ private final HashMap> playerSessionStats = new HashMap<>();
+
+ private final IArena arena;
+
+ public GameStatsManager(IArena arena) {
+ this.arena = arena;
+
+ for (DefaultStatistics statistic : DefaultStatistics.values()) {
+ if (statistic.isIncrementable()) {
+ register(new GenericStatistic(){
+ @Override
+ public String getIdentifier() {
+ return statistic.toString();
+ }
+ });
+ }
+ }
+ }
+
+ public void register(@NotNull GameStatisticProvider> statistic) {
+ if (statistic.getIdentifier().isBlank()) {
+ throw new RuntimeException("Identifier cannot be blank: "+ statistic.getClass().getName());
+ }
+ if (!statistic.getIdentifier().trim().equals(statistic.getIdentifier())) {
+ throw new RuntimeException("Identifier should not start/end with white spaces: "+statistic.getClass().getName());
+ }
+ if (null != registeredStats.getOrDefault(statistic.getIdentifier(), null)) {
+ throw new RuntimeException("Statistic already registered: "+statistic.getIdentifier());
+ }
+ registeredStats.put(statistic.getIdentifier(), statistic);
+ BedWars.debug("Registered new game statistic: "+statistic.getIdentifier());
+ }
+
+
+ @Override
+ public IArena getArena() {
+ return arena;
+ }
+
+ public PlayerGameStats init(@NotNull Player player) {
+ if (playerSessionStats.containsKey(player.getUniqueId())) {
+ throw new RuntimeException(player.getName()+" is already registered for game stats!");
+ }
+
+ PlayerGameStats stats = new PlayerGameStatsContainer(player);
+ this.registeredStats.forEach((id, provider) -> stats.registerStatistic(id, provider.getDefault()));
+
+ playerSessionStats.put(player.getUniqueId(), Optional.of(stats));
+ return stats;
+ }
+
+ @Override
+ public void unregisterPlayer(UUID uuid) {
+ if (getArena().getStatus() == GameState.restarting) {
+ throw new RuntimeException("You cannot unregister player stats during restarting phase!");
+ }
+ this.playerSessionStats.remove(uuid);
+ }
+
+ @Override
+ public @NotNull PlayerGameStats getCreate(@NotNull Player holder) {
+ Optional ps = playerSessionStats.getOrDefault(holder.getUniqueId(), Optional.empty());
+ if (ps.isEmpty()) {
+ PlayerGameStats stats = init(holder);
+ playerSessionStats.put(holder.getUniqueId(), Optional.of(stats));
+ return stats;
+ }
+ return ps.get();
+ }
+
+ @Override
+ public Optional get(@NotNull UUID holder) {
+ return playerSessionStats.getOrDefault(holder, Optional.empty());
+ }
+
+ @Override
+ public Collection> getTrackedPlayers() {
+ return Collections.unmodifiableCollection(playerSessionStats.values());
+ }
+
+ @Override
+ public List> getOrderedBy(@NotNull String statistic) {
+
+ //noinspection OptionalGetWithoutIsPresent
+ List> list = playerSessionStats.values().stream().filter(Optional::isPresent)
+ .filter(st -> st.get().getStatistic(statistic).isPresent())
+ .sorted(Comparator.comparing(a -> a.get().getStatistic(statistic).get()))
+ .collect(Collectors.toList());
+ Collections.reverse(list);
+ return list;
+ }
+
+ @Override
+ public boolean hasStatistic(String orderBy) {
+ return registeredStats.containsKey(orderBy);
+ }
+
+ @Override
+ public List getRegistered() {
+ return registeredStats.keySet().stream().collect(Collectors.toUnmodifiableList());
+ }
+
+ @Override
+ public @Nullable GameStatisticProvider> getProvider(String statistic) {
+ return registeredStats.getOrDefault(statistic, null);
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/GenericStatistic.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/GenericStatistic.java
new file mode 100644
index 000000000..62e38cfa3
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/GenericStatistic.java
@@ -0,0 +1,52 @@
+package com.andrei1058.bedwars.arena.stats;
+
+import com.andrei1058.bedwars.BedWars;
+import com.andrei1058.bedwars.api.arena.stats.Incrementable;
+import com.andrei1058.bedwars.api.arena.stats.GameStatistic;
+import com.andrei1058.bedwars.api.arena.stats.GameStatisticProvider;
+import com.andrei1058.bedwars.api.language.Language;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class GenericStatistic implements GameStatisticProvider {
+
+ @Override
+ public GenericStatistic.Value getDefault() {
+ return new Value();
+ }
+
+ @Override
+ public String getVoidReplacement(@Nullable Language language) {
+ return "0";
+ }
+
+ @Override
+ public Plugin getOwner() {
+ return BedWars.plugin;
+ }
+
+ public static class Value implements GameStatistic, Incrementable, Comparable> {
+ private int count = 0;
+
+ @Override
+ public Integer getValue() {
+ return count;
+ }
+
+ @Override
+ public String getDisplayValue(Language language) {
+ return String.valueOf(getValue());
+ }
+
+ @Override
+ public int compareTo(@NotNull GameStatistic o) {
+ return Integer.compare(this.count, o.getValue());
+ }
+
+ @Override
+ public void increment() {
+ count++;
+ }
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/StatisticsOrdered.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/StatisticsOrdered.java
new file mode 100644
index 000000000..e28145df4
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/StatisticsOrdered.java
@@ -0,0 +1,176 @@
+package com.andrei1058.bedwars.arena.stats;
+
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.stats.GameStatisticProvider;
+import com.andrei1058.bedwars.api.arena.stats.PlayerGameStats;
+import com.andrei1058.bedwars.api.arena.stats.GameStatistic;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * This cannot be used for live tops.
+ */
+public class StatisticsOrdered {
+
+ private final List> ordered;
+ private final IArena arena;
+ private BoundsPolicy boundsPolicy = BoundsPolicy.EMPTY;
+ private final String orderBy;
+
+ public StatisticsOrdered(@NotNull IArena arena, String orderBy) {
+ this.arena = arena;
+ if (null == arena.getStatsHolder()) {
+ throw new RuntimeException("Arena stats holder is null.");
+ }
+ if (!arena.getStatsHolder().hasStatistic(orderBy)) {
+ throw new RuntimeException("Invalid order by. Provided: " + orderBy);
+ }
+ ordered = arena.getStatsHolder().getOrderedBy(orderBy);
+ this.orderBy = orderBy;
+ }
+
+ public StringParser newParser() {
+ return new StringParser();
+ }
+
+ public class StringParser {
+ private int index = 0;
+
+ /**
+ * @param string string to be placeholder replaced.
+ * @param emptyReplacement replace empty top position with this string.
+ */
+ public @Nullable String parseString(String string, @Nullable Language lang, String emptyReplacement) {
+ if (null == arena.getStatsHolder()) {
+ return null;
+ }
+
+ if (index >= ordered.size()) {
+ if (boundsPolicy == BoundsPolicy.SKIP) {
+ if (string.isBlank()){
+ return string;
+ }
+
+ boolean hasPlaceholders = false;
+
+ for (String placeholder : new String[]{
+ "{topPlayerName}", "{topPlayerDisplayName}", "{topTeamColor}", "{topTeamName}", "{topValue}"
+ }) {
+ if (string.contains(placeholder)) {
+ hasPlaceholders = true;
+ break;
+ }
+ }
+
+ if (!hasPlaceholders) {
+ for (String registered : arena.getStatsHolder().getRegistered()) {
+ if (string.contains("{topValue-" + registered + "}")) {
+ hasPlaceholders = true;
+ break;
+ }
+ }
+ }
+ return hasPlaceholders ? null : string;
+ }
+
+ string = string
+ .replace("{topPlayerName}", emptyReplacement)
+ .replace("{topPlayerDisplayName}", emptyReplacement)
+ .replace("{topTeamColor}", "")
+ .replace("{topTeamName}", "")
+ .replace("{topValue}", "{topValue-"+orderBy+"}");
+
+ for (String registered : arena.getStatsHolder().getRegistered()) {
+ String displayValue = "null";
+ GameStatisticProvider> provider = arena.getStatsHolder().getProvider(registered);
+ if (null != provider) {
+ displayValue = provider.getVoidReplacement(lang);
+ }
+ string = string.replace("{topValue-" + registered + "}", displayValue);
+ }
+
+ return string;
+ }
+
+ Optional statsOptional = ordered.get(index);
+
+ if (statsOptional.isEmpty()) {
+ return string;
+ }
+
+ PlayerGameStats stats = statsOptional.get();
+
+ boolean increment = string.contains("{topPlayerName}") || string.contains("{topPlayerDisplayName}");
+
+ Player online = Bukkit.getPlayer(stats.getPlayer());
+ ITeam team = null == online ? arena.getExTeam(stats.getPlayer()) : arena.getTeam(online);
+ if (null == team) {
+ // if player online but eliminated
+ team = arena.getExTeam(stats.getPlayer());
+ }
+
+ string = string.replace("{topPlayerName}", stats.getUsername())
+ .replace("{topPlayerDisplayName}", stats.getDisplayPlayer())
+ .replace("{topTeamColor}", null == team ? "" : team.getColor().chat().toString())
+ .replace("{topTeamName}", null == team ? "" : team.getDisplayName(lang))
+ .replace("{topValue}", "{topValue-"+orderBy+"}");
+
+ for (String registered : arena.getStatsHolder().getRegistered()) {
+ Optional> statistic = stats.getStatistic(registered);
+
+ if (!increment && string.contains("{topValue-" + registered + "}")) {
+ increment = true;
+ }
+
+ String displayValue = statistic.map(gameStatistic -> gameStatistic.getDisplayValue(lang)).orElse(null);
+ if (null == displayValue) {
+ GameStatisticProvider> provider = arena.getStatsHolder().getProvider(registered);
+ if (null == provider) {
+ displayValue = "null";
+ } else {
+ displayValue = provider.getVoidReplacement(lang);
+ }
+ }
+
+ string = string.replace("{topValue-" + registered + "}", displayValue);
+ }
+
+ if (increment) {
+ index++;
+ }
+ return string;
+ }
+
+ public void resetIndex() {
+ index = 0;
+ }
+
+ }
+
+ public void setBoundsPolicy(BoundsPolicy boundsPolicy) {
+ this.boundsPolicy = boundsPolicy;
+ }
+
+ /**
+ * What to do when iterating stats line and there are no more players to show.
+ * This is used when there are more placeholders used than the actual player count.
+ */
+
+ public enum BoundsPolicy {
+ /**
+ * Skip line. Do not send it to receivers.
+ */
+ SKIP,
+ /**
+ * Send empty line to receivers.
+ */
+ EMPTY
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/defaults/PlayerGameStatsContainer.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/defaults/PlayerGameStatsContainer.java
new file mode 100644
index 000000000..36a211505
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/stats/defaults/PlayerGameStatsContainer.java
@@ -0,0 +1,66 @@
+package com.andrei1058.bedwars.arena.stats.defaults;
+
+import com.andrei1058.bedwars.api.arena.stats.PlayerGameStats;
+import com.andrei1058.bedwars.api.arena.stats.GameStatistic;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+public class PlayerGameStatsContainer implements PlayerGameStats {
+
+ private final UUID player;
+ private final String username;
+ // last tracked display name
+ private final String lastDisplayName;
+ private final HashMap>> statsById = new HashMap<>();
+
+ public PlayerGameStatsContainer(@NotNull Player player) {
+ this.player = player.getUniqueId();
+ this.username = player.getName();
+ this.lastDisplayName = player.getDisplayName();
+ }
+
+ @Override
+ public @NotNull UUID getPlayer() {
+ return player;
+ }
+
+ @Override
+ public @NotNull String getDisplayPlayer() {
+ Player online = Bukkit.getPlayer(getPlayer());
+ if (null == online) {
+ return lastDisplayName;
+ }
+ return online.getDisplayName();
+ }
+
+ @Override
+ public @NotNull String getUsername() {
+ return username;
+ }
+
+ @Override
+ public void registerStatistic(@NotNull String id, @NotNull GameStatistic> defaultValue) {
+ if (statsById.containsKey(id)) {
+ throw new RuntimeException("Statistic "+id+" already registered for player "+ getPlayer());
+ }
+ statsById.put(id, Optional.of(defaultValue));
+ }
+
+ @Override
+ public @Nullable Optional> getStatistic(@NotNull String id) {
+ return statsById.getOrDefault(id, Optional.empty());
+ }
+
+ @Override
+ public List getRegistered() {
+ return statsById.keySet().stream().collect(Collectors.toUnmodifiableList());
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameRestartingTask.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameRestartingTask.java
index dbff3ef70..3c7fc3e30 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameRestartingTask.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameRestartingTask.java
@@ -30,19 +30,24 @@
import com.andrei1058.bedwars.arena.Arena;
import com.andrei1058.bedwars.arena.Misc;
import com.andrei1058.bedwars.configuration.Sounds;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import org.bukkit.Bukkit;
+import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
+import java.util.Random;
public class GameRestartingTask implements Runnable, RestartingTask {
private Arena arena;
- private int restarting = BedWars.config.getInt(ConfigPath.GENERAL_CONFIGURATION_RESTART) + 3;
+ private int restarting = BedWars.config.getInt(ConfigPath.GENERAL_CONFIGURATION_RESTART) + 5;
private final BukkitTask task;
public GameRestartingTask(@NotNull Arena arena) {
@@ -50,6 +55,36 @@ public GameRestartingTask(@NotNull Arena arena) {
task = Bukkit.getScheduler().runTaskTimer(BedWars.plugin, this, 0, 20L);
Sounds.playSound("game-end", arena.getPlayers());
Sounds.playSound("game-end", arena.getSpectators());
+
+ // teleport to alive players
+ if (arena.getConfig().getGameOverridableBoolean(ConfigPath.GENERAL_GAME_END_TELEPORT_ELIMINATED)) {
+ if (!arena.getPlayers().isEmpty()) {
+ Random r = new Random();
+ for (Player spectator : arena.getSpectators()) {
+ Player target = arena.getPlayers().get(r.nextInt(arena.getPlayers().size()));
+ Location loc = target.getLocation().clone();
+ loc.setDirection(target.getLocation().getDirection().multiply(-1));
+ loc.add(0,2,0);
+
+ TeleportManager.teleportC(spectator, loc, PlayerTeleportEvent.TeleportCause.PLUGIN);
+ }
+ }
+ }
+
+ // show eliminated players
+ if (arena.getConfig().getGameOverridableBoolean(ConfigPath.GENERAL_GAME_END_SHOW_ELIMINATED)) {
+ for (Player spectator : arena.getSpectators()) {
+ ITeam exTeam = arena.getExTeam(spectator.getUniqueId());
+ if (null == exTeam) {
+ continue;
+ }
+ spectator.removePotionEffect(PotionEffectType.INVISIBILITY);
+ for (Player player : arena.getPlayers()) {
+ BedWars.nms.spigotShowPlayer(player, spectator);
+ BedWars.nms.spigotShowPlayer(spectator, player);
+ }
+ }
+ }
}
/**
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameStartingTask.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameStartingTask.java
index 999f23874..919762c6c 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameStartingTask.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/tasks/GameStartingTask.java
@@ -92,13 +92,13 @@ public BukkitTask getBukkitTask() {
@Override
public void run() {
if (countdown == 0) {
+
if (BedWars.config.getBoolean(ConfigPath.GENERAL_CONFIGURATION_EXPERIMENTAL_TEAM_ASSIGNER)) {
getArena().getTeamAssigner().assignTeams(getArena());
} else {
LegacyTeamAssigner.assignTeams(getArena());
}
-
//Color bed block if possible
//Destroy bed if team is empty
//Spawn shops and upgrades
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/team/BedWarsTeam.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/team/BedWarsTeam.java
index a33a99aba..d25d62c93 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/team/BedWarsTeam.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/team/BedWarsTeam.java
@@ -37,7 +37,7 @@
import com.andrei1058.bedwars.arena.OreGenerator;
import com.andrei1058.bedwars.configuration.Sounds;
import com.andrei1058.bedwars.shop.ShopCache;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import org.bukkit.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.ArmorStand;
@@ -97,6 +97,7 @@ public class BedWarsTeam implements ITeam {
// Invulnerability at re-spawn
// Fall invulnerability when teammates respawn
public static HashMap reSpawnInvulnerability = new HashMap<>();
+ private UUID identity;
public BedWarsTeam(String name, TeamColor color, Location spawn, Location bed, Location shop, Location teamUpgrades, Arena arena) {
if (arena == null) return;
@@ -114,6 +115,7 @@ public BedWarsTeam(String name, TeamColor color, Location spawn, Location bed, L
if (drops != null) {
setKillDropsLocation(drops);
}
+ this.identity = UUID.randomUUID();
}
public int getSize() {
@@ -142,7 +144,7 @@ public void addPlayers(Player... players) {
*/
public void firstSpawn(Player p) {
if (p == null) return;
- PaperSupport.teleportC(p, spawn, PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, spawn, PlayerTeleportEvent.TeleportCause.PLUGIN);
p.setGameMode(GameMode.SURVIVAL);
p.setCanPickupItems(true);
nms.setCollide(p, getArena(), true);
@@ -163,12 +165,12 @@ public void spawnNPCs() {
nms.spawnShop(getArena().getConfig().getArenaLoc("Team." + getName() + ".Shop"), (getArena().getMaxInTeam() > 1 ? Messages.NPC_NAME_TEAM_SHOP : Messages.NPC_NAME_SOLO_SHOP), getArena().getPlayers(), getArena());
}, 20L);
- Cuboid c1 = new Cuboid(getArena().getConfig().getArenaLoc("Team." + getName() + ".Upgrade"), 1, true);
+ Cuboid c1 = new Cuboid(getArena().getConfig().getArenaLoc("Team." + getName() + ".Upgrade"), getArena().getConfig().getInt(ConfigPath.ARENA_UPGRADES_PROTECTION), true);
c1.setMinY(c1.getMinY() - 1);
c1.setMaxY(c1.getMaxY() + 4);
getArena().getRegionsList().add(c1);
- Cuboid c2 = new Cuboid(getArena().getConfig().getArenaLoc("Team." + getName() + ".Shop"), 1, true);
+ Cuboid c2 = new Cuboid(getArena().getConfig().getArenaLoc("Team." + getName() + ".Shop"), getArena().getConfig().getInt(ConfigPath.ARENA_SHOP_PROTECTION), true);
c2.setMinY(c2.getMinY() - 1);
c2.setMaxY(c2.getMaxY() + 4);
getArena().getRegionsList().add(c2);
@@ -340,7 +342,7 @@ public void respawnMember(@NotNull Player p) {
} else {
reSpawnInvulnerability.put(p.getUniqueId(), System.currentTimeMillis() + config.getInt(ConfigPath.GENERAL_CONFIGURATION_RE_SPAWN_INVULNERABILITY));
}
- PaperSupport.teleportC(p, getSpawn(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, getSpawn(), PlayerTeleportEvent.TeleportCause.PLUGIN);
p.setVelocity(new Vector(0, 0, 0));
p.removePotionEffect(PotionEffectType.INVISIBILITY);
nms.setCollide(p, arena, true);
@@ -348,15 +350,15 @@ public void respawnMember(@NotNull Player p) {
p.setFlying(false);
p.setHealth(20);
- Bukkit.getScheduler().runTaskLater(plugin, ()-> {
+ Bukkit.getScheduler().runTaskLater(plugin, () -> {
getArena().getRespawnSessions().remove(p); //Fixes https://github.com/andrei1058/BedWars1058/issues/669
- for (Player inGame : arena.getPlayers()){
+ for (Player inGame : arena.getPlayers()) {
if (inGame.equals(p)) continue;
BedWars.nms.spigotShowPlayer(p, inGame);
BedWars.nms.spigotShowPlayer(inGame, p);
}
- for (Player spectator : arena.getSpectators()){
+ for (Player spectator : arena.getSpectators()) {
BedWars.nms.spigotShowPlayer(p, spectator);
}
}, 8L);
@@ -480,6 +482,11 @@ public void sendArmor(Player p) {
if (p.getInventory().getBoots() == null) p.getInventory().setBoots(createArmor(Material.LEATHER_BOOTS));
}
+ @Override
+ public UUID getIdentity() {
+ return identity;
+ }
+
/**
* Creates a hologram on the team bed's per player
*/
@@ -601,7 +608,7 @@ public void addSwordEnchantment(Enchantment e, int a) {
for (Player p : getMembers()) {
for (ItemStack i : p.getInventory().getContents()) {
if (i == null) continue;
- if (nms.isSword(i)) {
+ if (nms.isSword(i) || nms.isAxe(i)) {
ItemMeta im = i.getItemMeta();
im.addEnchant(e, a, true);
i.setItemMeta(im);
@@ -869,6 +876,18 @@ public void setKillDropsLocation(Vector loc) {
this.killDropsLoc = new Vector(loc.getBlockX() + 0.5, loc.getBlockY(), loc.getBlockZ() + 0.5);
}
+ @Override
+ public boolean isBed(@NotNull Location location) {
+ for (int x = location.getBlockX() - 1; x < location.getBlockX() + 1; x++) {
+ for (int z = location.getBlockZ() - 1; z < location.getBlockZ() + 1; z++) {
+ if (getBed().getBlockX() == x && getBed().getBlockY() == location.getBlockY() && getBed().getBlockZ() == z) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
public void setKillDropsLocation(Location loc) {
if (loc == null) {
this.killDropsLoc = null;
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/upgrades/HealPoolListner.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/upgrades/HealPoolListner.java
index c27da4a08..cbd9370fd 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/upgrades/HealPoolListner.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/arena/upgrades/HealPoolListner.java
@@ -13,7 +13,7 @@
public class HealPoolListner implements Listener {
@EventHandler
public void onTeamUpgrade(UpgradeBuyEvent e){
- if (e.getTeamUpgrade().getName().equalsIgnoreCase("upgrade-heal-pool")){
+ if (e.getTeamUpgrade().getName().contains("heal-pool")){
IArena a = e.getArena();
if (a == null) return;
ITeam bwt = a.getTeam(e.getPlayer());
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/Misc.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/Misc.java
index 8ddbd5a43..29133ed24 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/Misc.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/Misc.java
@@ -22,7 +22,7 @@
import com.andrei1058.bedwars.BedWars;
import com.andrei1058.bedwars.arena.SetupSession;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@@ -106,7 +106,7 @@ public static void autoSetGen(Player p, String command, SetupSession setupSessio
Bukkit.getScheduler().runTaskLater(BedWars.plugin, () -> {
for (Location l : setupSession.getSkipAutoCreateGen()) {
Bukkit.getScheduler().runTaskLater(BedWars.plugin, () -> {
- PaperSupport.teleport(p, l);
+ TeleportManager.teleport(p, l);
Bukkit.dispatchCommand(p, command + (l.add(0, -1, 0).getBlock().getType() == Material.EMERALD_BLOCK ? "emerald" : "diamond"));
}, 20);
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdStart.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdStart.java
index 260a322c9..00cede074 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdStart.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdStart.java
@@ -25,6 +25,7 @@
import com.andrei1058.bedwars.api.arena.IArena;
import com.andrei1058.bedwars.api.command.ParentCommand;
import com.andrei1058.bedwars.api.command.SubCommand;
+import com.andrei1058.bedwars.api.configuration.ConfigPath;
import com.andrei1058.bedwars.api.language.Messages;
import com.andrei1058.bedwars.arena.Arena;
import com.andrei1058.bedwars.arena.SetupSession;
@@ -94,7 +95,8 @@ public boolean canSee(CommandSender s, com.andrei1058.bedwars.api.BedWars api) {
IArena a = Arena.getArenaByPlayer(p);
if (a != null){
- if (a.getStatus() == GameState.waiting || a.getStatus() == GameState.starting){
+ GameState status = a.getStatus();
+ if (status == GameState.waiting || status == GameState.starting){
if (!a.isPlayer(p)) return false;
} else {
return false;
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdTpStaff.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdTpStaff.java
index b20291688..658d89e3a 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdTpStaff.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/regular/CmdTpStaff.java
@@ -27,7 +27,7 @@
import com.andrei1058.bedwars.api.language.Language;
import com.andrei1058.bedwars.api.language.Messages;
import com.andrei1058.bedwars.arena.Arena;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -76,7 +76,7 @@ public boolean execute(String[] args, CommandSender s) {
if (a2.isPlayer(p2)) a2.removePlayer(p2, false);
if (a2.isSpectator(p2)) {
if (a2.getArenaName().equals(a.getArenaName())) {
- PaperSupport.teleport(p2, p.getLocation());
+ TeleportManager.teleport(p2, p.getLocation());
return true;
} else a2.removeSpectator(p2, false);
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/DisableArena.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/DisableArena.java
index 34e9a3a0a..d7b9e55f0 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/DisableArena.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/DisableArena.java
@@ -21,6 +21,7 @@
package com.andrei1058.bedwars.commands.bedwars.subcmds.sensitive;
import com.andrei1058.bedwars.BedWars;
+import com.andrei1058.bedwars.api.arena.GameState;
import com.andrei1058.bedwars.api.arena.IArena;
import com.andrei1058.bedwars.api.command.ParentCommand;
import com.andrei1058.bedwars.api.command.SubCommand;
@@ -66,6 +67,10 @@ public boolean execute(String[] args, CommandSender s) {
p.sendMessage("§c▪ §7This arena is disabled yet!");
return true;
}
+ if (a.getStatus() == GameState.playing) {
+ p.sendMessage("§6 ▪ §7There is a game running on this Arena, please disable after the game!");
+ return true;
+ }
p.sendMessage("§6 ▪ §7Disabling arena...");
a.disable();
return true;
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/Save.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/Save.java
index 121955706..1627e8bf2 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/Save.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/Save.java
@@ -26,7 +26,7 @@
import com.andrei1058.bedwars.arena.Misc;
import com.andrei1058.bedwars.arena.SetupSession;
import com.andrei1058.bedwars.configuration.Permissions;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import net.md_5.bungee.api.chat.ClickEvent;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -64,9 +64,9 @@ public boolean execute(String[] args, CommandSender s) {
}
if (Bukkit.getWorld(BedWars.getLobbyWorld()) != null) {
- PaperSupport.teleport(p, Bukkit.getWorld(BedWars.getLobbyWorld()).getSpawnLocation());
+ TeleportManager.teleport(p, Bukkit.getWorld(BedWars.getLobbyWorld()).getSpawnLocation());
} else {
- PaperSupport.teleport(p, Bukkit.getWorlds().get(0).getSpawnLocation());
+ TeleportManager.teleport(p, Bukkit.getWorlds().get(0).getSpawnLocation());
}
ss.done();
p.sendMessage(ss.getPrefix() + "Arena changes saved!");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/SetSpawn.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/SetSpawn.java
index 5d4c7a97d..45c2a9bb9 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/SetSpawn.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/commands/bedwars/subcmds/sensitive/setup/SetSpawn.java
@@ -27,7 +27,7 @@
import com.andrei1058.bedwars.arena.Misc;
import com.andrei1058.bedwars.arena.SetupSession;
import com.andrei1058.bedwars.configuration.Permissions;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import net.md_5.bungee.api.chat.ClickEvent;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -94,7 +94,7 @@ public boolean execute(String[] args, CommandSender s) {
for (int z = -radius; z < radius; z++) {
Block b = l.clone().add(x, y, z).getBlock();
if (BedWars.nms.isBed(b.getType())) {
- PaperSupport.teleport(p, b.getLocation());
+ TeleportManager.teleport(p, b.getLocation());
Bukkit.dispatchCommand(p, getParent().getName() + " setBed " + args[0]);
return true;
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/ArenaConfig.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/ArenaConfig.java
index 6d54c7713..569211a7d 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/ArenaConfig.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/ArenaConfig.java
@@ -20,15 +20,23 @@
package com.andrei1058.bedwars.configuration;
+import com.andrei1058.bedwars.BedWars;
import com.andrei1058.bedwars.api.configuration.ConfigManager;
import com.andrei1058.bedwars.api.configuration.ConfigPath;
+import com.andrei1058.bedwars.api.configuration.GameMainOverridable;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.List;
public class ArenaConfig extends ConfigManager {
+ @SuppressWarnings({"SpellCheckingInspection"})
+ private List cachedGameOverridables = new ArrayList<>();
+
public ArenaConfig(Plugin plugin, String name, String dir) {
super(plugin, name, dir);
@@ -81,9 +89,55 @@ public ArenaConfig(Plugin plugin, String name, String dir) {
if (yml.get("islandRadius") != null) {
set(ConfigPath.ARENA_ISLAND_RADIUS, yml.getInt("islandRadius"));
}
- if (yml.get("voidKill") != null){
+ if (yml.get("voidKill") != null) {
set("voidKill", null);
}
set(ConfigPath.GENERAL_CONFIGURATION_ENABLE_GEN_SPLIT, null);
+
+ cachedGameOverridables = getGameOverridables();
+ }
+
+ @SuppressWarnings({"SpellCheckingInspection"})
+ private @NotNull List getGameOverridables() {
+ List paths = new ArrayList<>();
+ for (Field field : ConfigPath.class.getDeclaredFields()) {
+ if (field.isAnnotationPresent(GameMainOverridable.class)) {
+ try {
+ Object value = field.get(field);
+ if (value instanceof String) {
+ paths.add((String) value);
+ }
+ } catch (IllegalAccessException ignored) {
+ }
+ }
+ }
+
+ return paths;
+ }
+
+ public boolean isGameOverridable(String path) {
+ return cachedGameOverridables.contains(path);
+ }
+
+ public Object getGameOverridableValue(String path) {
+ if (!isGameOverridable(path)) {
+ throw new RuntimeException("Given path is not game-overridable: "+path);
+ }
+
+ Object value = getYml().get(path, null);
+ if (null == value){
+ return BedWars.config.getYml().get(path);
+ }
+ return value;
+ }
+
+ public Boolean getGameOverridableBoolean(String path) {
+ Object value = getGameOverridableValue(path);
+ return value instanceof Boolean ? (Boolean) value : false;
+ }
+
+ public String getGameOverridableString(String path) {
+ Object value = getGameOverridableValue(path);
+ return value instanceof String ? (String) value : "invalid";
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/MainConfig.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/MainConfig.java
index 14718f90d..ddf3733f8 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/MainConfig.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/MainConfig.java
@@ -21,6 +21,7 @@
package com.andrei1058.bedwars.configuration;
import com.andrei1058.bedwars.BedWars;
+import com.andrei1058.bedwars.api.arena.stats.DefaultStatistics;
import com.andrei1058.bedwars.api.configuration.ConfigManager;
import com.andrei1058.bedwars.api.configuration.ConfigPath;
import com.andrei1058.bedwars.api.language.Language;
@@ -71,8 +72,12 @@ public MainConfig(Plugin plugin, String name) {
yml.addDefault(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_PLAYING, true);
yml.addDefault(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_RESTARTING, true);
yml.addDefault(ConfigPath.SB_CONFIG_SIDEBAR_LIST_REFRESH, 1200);
+ yml.addDefault(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_ENABLE, true);
yml.addDefault(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_IN_TAB, true);
yml.addDefault(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_REFRESH, 300);
+ yml.addDefault(ConfigPath.SB_CONFIG_TAB_HEADER_FOOTER_ENABLE, true);
+ yml.addDefault(ConfigPath.SB_CONFIG_TAB_HEADER_FOOTER_REFRESH_INTERVAL, 10);
+
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_REJOIN_TIME, 60 * 5);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_RE_SPAWN_INVULNERABILITY, 4000);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_MODE_GAMES_BEFORE_RESTART, 30);
@@ -82,13 +87,14 @@ public MainConfig(Plugin plugin, String name) {
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_START_COUNTDOWN_REGULAR, 40);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_START_COUNTDOWN_HALF, 25);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_START_COUNTDOWN_SHORTENED, 5);
- yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_RESTART, 15);
+ yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_RESTART, 45);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_RE_SPAWN_COUNTDOWN, 5);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_BEDS_DESTROY_COUNTDOWN, 360);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_DRAGON_SPAWN_COUNTDOWN, 600);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_GAME_END_COUNTDOWN, 120);
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_SHOUT_COOLDOWN, 30);
yml.addDefault(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP, "yourServer.Com");
+ yml.addDefault(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_POWERED_BY, "BedWars1058");
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_SERVER_ID, "bw1");
yml.addDefault(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_BWP_TIME_OUT, 5000);
@@ -108,6 +114,16 @@ public MainConfig(Plugin plugin, String name) {
yml.addDefault(ConfigPath.GENERAL_TNT_JUMP_DAMAGE_SELF, 1);
yml.addDefault(ConfigPath.GENERAL_TNT_JUMP_DAMAGE_TEAMMATES, 5);
yml.addDefault(ConfigPath.GENERAL_TNT_JUMP_DAMAGE_OTHERS, 10);
+
+ // tnd block blast resistance
+ yml.addDefault(ConfigPath.GENERAL_TNT_PROTECTION_END_STONE_BLAST, 12f);
+ yml.addDefault(ConfigPath.GENERAL_TNT_PROTECTION_GLASS_BLAST, 300f);
+ yml.addDefault(ConfigPath.GENERAL_TNT_RAY_BLOCKED_BY_GLASS, true);
+
+ // tnt prime settings
+ yml.addDefault(ConfigPath.GENERAL_TNT_AUTO_IGNITE, true);
+ yml.addDefault(ConfigPath.GENERAL_TNT_FUSE_TICKS, 45);
+
// fireball category
yml.addDefault(ConfigPath.GENERAL_FIREBALL_EXPLOSION_SIZE, 3);
yml.addDefault(ConfigPath.GENERAL_FIREBALL_SPEED_MULTIPLIER, 10);
@@ -188,6 +204,13 @@ public MainConfig(Plugin plugin, String name) {
yml.addDefault(ConfigPath.LOBBY_VOID_TELEPORT_ENABLED, true);
yml.addDefault(ConfigPath.LOBBY_VOID_TELEPORT_HEIGHT, 0);
+ yml.addDefault(ConfigPath.GENERAL_GAME_END_SHOW_ELIMINATED, true);
+ yml.addDefault(ConfigPath.GENERAL_GAME_END_TELEPORT_ELIMINATED, true);
+ yml.addDefault(ConfigPath.GENERAL_GAME_END_CHAT_TOP_STATISTIC, DefaultStatistics.KILLS.toString());
+ yml.addDefault(ConfigPath.GENERAL_GAME_END_CHAT_TOP_HIDE_MISSING, true);
+
+ yml.addDefault(ConfigPath.GENERAL_GAME_END_SB_TOP_STATISTIC, DefaultStatistics.KILLS.toString());
+ yml.addDefault(ConfigPath.GENERAL_GAME_END_SB_TOP_HIDE_MISSING, true);
yml.options().copyDefaults(true);
save();
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/UpgradesConfig.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/UpgradesConfig.java
index 1c255b592..abe056d35 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/UpgradesConfig.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/configuration/UpgradesConfig.java
@@ -28,6 +28,7 @@
import java.util.Collections;
import java.util.List;
+import static com.andrei1058.bedwars.BedWars.getForCurrentVersion;
import static com.andrei1058.bedwars.BedWars.plugin;
public class UpgradesConfig extends ConfigManager {
@@ -73,13 +74,12 @@ public UpgradesConfig(String name, String dir) {
yml.addDefault("upgrade-miner.tier-1.currency", "diamond");
yml.addDefault("upgrade-miner.tier-1.cost", 2);
- addDefaultDisplayItem("upgrade-miner.tier-1", "GOLD_PICKAXE", 0, 1, false);
+ addDefaultDisplayItem("upgrade-miner.tier-1", getForCurrentVersion("GOLD_PICKAXE", "GOLD_PICKAXE", "GOLDEN_PICKAXE"), 0, 1, false);
yml.addDefault("upgrade-miner.tier-1.receive", Collections.singletonList("player-effect: FAST_DIGGING,0,0,team"));
yml.addDefault("upgrade-miner.tier-2.currency", "diamond");
yml.addDefault("upgrade-miner.tier-2.cost", 4);
- addDefaultDisplayItem("upgrade-miner.tier-2", "GOLD_PICKAXE", 0, 2, false);
- yml.addDefault("upgrade-miner.tier-2.receive", Collections.singletonList("player-effect: FAST_DIGGING,1,0,team"));
+ addDefaultDisplayItem("upgrade-miner.tier-2", getForCurrentVersion("GOLD_PICKAXE", "GOLD_PICKAXE", "GOLDEN_PICKAXE"), 0, 2, false); yml.addDefault("upgrade-miner.tier-2.receive", Collections.singletonList("player-effect: FAST_DIGGING,1,0,team"));
yml.addDefault("upgrade-forge.tier-1.currency", "diamond");
yml.addDefault("upgrade-forge.tier-1.cost", 2);
@@ -118,17 +118,17 @@ public UpgradesConfig(String name, String dir) {
"base-trap-3,12", "base-trap-4,13", "separator-back,31"));
yml.addDefault("separator-glass.on-click", "");
- addDefaultDisplayItem("separator-glass", BedWars.getForCurrentVersion("STAINED_GLASS_PANE", "STAINED_GLASS_PANE",
+ addDefaultDisplayItem("separator-glass", getForCurrentVersion("STAINED_GLASS_PANE", "STAINED_GLASS_PANE",
"GRAY_STAINED_GLASS_PANE"), 7, 1, false);
yml.addDefault("trap-slot-first.trap", 1);
- addDefaultDisplayItem("trap-slot-first", BedWars.getForCurrentVersion("STAINED_GLASS", "STAINED_GLASS",
+ addDefaultDisplayItem("trap-slot-first", getForCurrentVersion("STAINED_GLASS", "STAINED_GLASS",
"GRAY_STAINED_GLASS"), 8, 1, false);
yml.addDefault("trap-slot-second.trap", 2);
- addDefaultDisplayItem("trap-slot-second", BedWars.getForCurrentVersion("STAINED_GLASS", "STAINED_GLASS",
+ addDefaultDisplayItem("trap-slot-second", getForCurrentVersion("STAINED_GLASS", "STAINED_GLASS",
"GRAY_STAINED_GLASS"), 8, 2, false);
yml.addDefault("trap-slot-third.trap", 3);
- addDefaultDisplayItem("trap-slot-third", BedWars.getForCurrentVersion("STAINED_GLASS", "STAINED_GLASS",
+ addDefaultDisplayItem("trap-slot-third", getForCurrentVersion("STAINED_GLASS", "STAINED_GLASS",
"GRAY_STAINED_GLASS"), 8, 3, false);
addDefaultDisplayItem("base-trap-1", "TRIPWIRE_HOOK", 0, 1, false);
@@ -137,7 +137,7 @@ public UpgradesConfig(String name, String dir) {
addDefaultDisplayItem("base-trap-2", "FEATHER", 0, 1, false);
yml.addDefault("base-trap-2.receive", Collections.singletonList("player-effect: SPEED,1,15,base"));
- addDefaultDisplayItem("base-trap-3", BedWars.getForCurrentVersion("REDSTONE_TORCH_ON", "REDSTONE_TORCH", "REDSTONE_TORCH"), 0, 1, false);
+ addDefaultDisplayItem("base-trap-3", getForCurrentVersion("REDSTONE_TORCH_ON", "REDSTONE_TORCH", "REDSTONE_TORCH"), 0, 1, false);
yml.addDefault("base-trap-3.custom-announce", true);
yml.addDefault("base-trap-3.receive", Collections.singletonList("remove-effect: INVISIBILITY,enemy"));
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Bangla.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Bangla.java
index bac183ab1..33fdd4a17 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Bangla.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Bangla.java
@@ -54,20 +54,6 @@ public Bangla() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
-
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Upolopdho Bhasa:");
yml.addDefault(Messages.COMMAND_LANG_LIST_FORMAT, "&a▪ &7{iso} - &f{name}");
@@ -191,19 +177,6 @@ public Bangla() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aHealth"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -283,9 +256,10 @@ public Bangla() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &ateam khela jitlen!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &lPrhthom Killer &7- {firstName} - {firstKills}",
- "&6 &lDitio Killer &7- {secondName} - {secondKills}",
- "&c &lTritio Killer &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &lPrhthom Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &lDitio Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &lCaturtha Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lApnar Bichana rokkha korun!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lApnar Bichana dhongso hoye giyeche!");
@@ -351,20 +325,529 @@ public Bangla() {
addDefaultStatsMsg(yml, "last-play", "&6Last Play", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Games Played", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fWaiting...", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fStarting in &a{time}s", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fYour Level: {level}",
+ "",
+ "&fProgress: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fCoins: &a{money}" ,
+ "",
+ "&fTotal Wins: &a{wins}",
+ "&fTotal Kills: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "§fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "§fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fYour Level: {level}", "", "&fProgress: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fCoins: &a{money}"
- , "", "&fTotal Wins: &a{wins}", "&fTotal Kills: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Quick Buy");
@@ -462,6 +945,7 @@ public Bangla() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "No trap!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Cost: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/English.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/English.java
index 0648d5c7d..2cdcbc76a 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/English.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/English.java
@@ -176,33 +176,6 @@ public English() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aHealth"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}\n");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING, "&a{serverIp}\n");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}\n");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}\n");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}\n");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR, "&9{serverIp}\n");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "\n&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "\n&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING, "\n&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "\n&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "\n&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR, "\n&9{serverIp}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -280,11 +253,13 @@ public English() {
yml.addDefault(Messages.GAME_END_GAME_OVER_PLAYER_TITLE, "&c&lGAME OVER!");
yml.addDefault(Messages.GAME_END_VICTORY_PLAYER_TITLE, "&6&lVICTORY!");
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &ahas won the game!");
- yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
+ yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("",
+ "&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &l1st Killer &7- {firstName} - {firstKills}",
- "&6 &l2nd Killer &7- {secondName} - {secondKills}",
- "&c &l3rd Killer &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &l1st Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &l2nd Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &l3rd Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lDefend your bed!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lYour bed was destroyed!");
@@ -350,21 +325,544 @@ public English() {
addDefaultStatsMsg(yml, "last-play", "&6Last Play", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Games Played", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fWaiting...", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fStarting in &a{time}s", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fYour Level: {level}",
+ "",
+ "&fProgress: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fCoins: &a{money}" ,
+ "",
+ "&fTotal Wins: &a{wins}",
+ "&fTotal Kills: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "§fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "§fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "",
- "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&7&oYou are spectating"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oYou are spectating"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fYour Level: {level}", "", "&fProgress: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fCoins: &a{money}"
- , "", "&fTotal Wins: &a{wins}", "&fTotal Kills: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Quick Buy");
@@ -464,6 +962,7 @@ public English() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "No trap!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Cost: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Hindi.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Hindi.java
index a8b9925c8..08daf4bb7 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Hindi.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Hindi.java
@@ -53,19 +53,6 @@ public Hindi() {
yml.set(Messages.PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL, yml.getString("player-die-knocked-final"));
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Upalabdh bhaasa:");
@@ -189,19 +176,6 @@ public Hindi() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aHealth"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -281,9 +255,9 @@ public Hindi() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &ateam game jeete!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &lPehla Killer &7- {firstName} - {firstKills}",
- "&6 &lDusra Killer &7- {secondName} - {secondKills}",
- "&c &lTeesra Killer &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &lPehla Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &lDusra Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &lTeesra Killer &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lApke bistar ko rakhsha kare!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lApka bistar tut gaya!");
@@ -349,28 +323,541 @@ public Hindi() {
addDefaultStatsMsg(yml, "last-play", "&6Last Play", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Games Played", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fWaiting...", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fStarting in &a{time}s", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{TeamRedColor}R&f {TeamRedName}&f&f: {TeamRedStatus}",
- "{TeamBlueColor}B&f {TeamBlueName}&f: {TeamBlueStatus}", "{TeamGreenColor}G&f {TeamGreenName}&f: {TeamGreenStatus}", "{TeamYellowColor}Y &f{TeamYellowName}&f: {TeamYellowStatus}",
- "{TeamAquaColor}A &f{TeamAquaName}&f: {TeamAquaStatus}", "{TeamWhiteColor}W &f{TeamWhiteName}&f: {TeamWhiteStatus}", "{TeamPinkColor}P &f{TeamPinkName}&f: {TeamPinkStatus}",
- "{TeamGrayColor}S &f{TeamGrayName}&f: {TeamGrayStatus}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fYour Level: {level}",
+ "",
+ "&fProgress: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fCoins: &a{money}" ,
+ "",
+ "&fTotal Wins: &a{wins}",
+ "&fTotal Kills: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+
+ "&7{date} &8{server}",
+ "&o&lSpectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "§fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "§fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{TeamRedColor}R&f {TeamRedName}&f&f: {TeamRedStatus}",
- "{TeamBlueColor}B&f {TeamBlueName}&f: {TeamBlueStatus}", "{TeamGreenColor}G&f {TeamGreenName}&f: {TeamGreenStatus}", "{TeamYellowColor}Y &f{TeamYellowName}&f: {TeamYellowStatus}",
- "{TeamAquaColor}A &f{TeamAquaName}&f: {TeamAquaStatus}", "{TeamWhiteColor}W &f{TeamWhiteName}&f: {TeamWhiteStatus}", "{TeamPinkColor}P &f{TeamPinkName}&f: {TeamPinkStatus}",
- "{TeamGrayColor}S &f{TeamGrayName}&f: {TeamGrayStatus}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{TeamRedColor}R&f {TeamRedName}&f&f: {TeamRedStatus}",
- "{TeamBlueColor}B&f {TeamBlueName}&f: {TeamBlueStatus}", "{TeamGreenColor}G&f {TeamGreenName}&f: {TeamGreenStatus}", "{TeamYellowColor}Y &f{TeamYellowName}&f: {TeamYellowStatus}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&e&lBED WARS",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&e&lBED WARS",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{TeamRedColor}R&f {TeamRedName}&f&f: {TeamRedStatus}",
- "{TeamBlueColor}B&f {TeamBlueName}&f: {TeamBlueStatus}", "{TeamGreenColor}G&f {TeamGreenName}&f: {TeamGreenStatus}", "{TeamYellowColor}Y &f{TeamYellowName}&f: {TeamYellowStatus}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fYour Level: {level}", "", "&fProgress: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fCoins: &a{money}"
- , "", "&fTotal Wins: &a{wins}", "&fTotal Kills: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Quick Buy");
@@ -467,6 +954,7 @@ public Hindi() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "No trap!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Cost: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Indonesia.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Indonesia.java
index ff5d58025..4e44c86cf 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Indonesia.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Indonesia.java
@@ -53,19 +53,6 @@ public Indonesia() {
yml.set(Messages.PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL, yml.getString("player-die-knocked-final"));
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Bahasa Tersedia:");
@@ -189,19 +176,6 @@ public Indonesia() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "&f{team} {level}{vPrefix}&7{player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "&7[PENONTON] {level}{vPrefix}{player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, List.of("&c❤"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "PENONTON");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -281,9 +255,9 @@ public Indonesia() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &atelah memenangkan permainan!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lPerang Kasur", "", "{winnerFormat}", "", "",
- "&e &lPembunuh Pertama &7- {firstName} - {firstKills}",
- "&6 &lPembunuh Kedua &7- {secondName} - {secondKills}",
- "&c &lPembunuh Ketiga &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &lPembunuh Pertama &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &lPembunuh Kedua &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &lPembunuh Ketiga &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lPertahankan Kasur Anda!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lKasur anda telah dihancurkan!");
@@ -349,21 +323,538 @@ public Indonesia() {
addDefaultStatsMsg(yml, "last-play", "&6Terakhir Kali Bermain", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Pertandingan Dimainkan", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&fPERANG KASUR", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fWaiting...", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lPERANG KASUR", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayers: &a{on}/{max}", "", "&fStarting in &a{time}s", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lPERANG KASUR", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fLevel Anda: {level}",
+ "",
+ "&fProgres: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fKoin: &a{money}",
+ "",
+ "&fTotal Kemenangan: &a{wins}",
+ "&fTotal Membunuh: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "", "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fWaiting,&fWaiting.,&fWaiting..,&fWaiting...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "", "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayers: &a{on}/{max}",
+ "",
+ "&fStarting in &a{time}s",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lPERANG KASUR", "&7{date}", "", "&f{nextEvent} in &a{time}", "",
- "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fPembunuhan Terakhir: &a{finalKills}",
+ "&fBed Dihancurkan: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fPembunuhan Terakhir: &a{finalKills}",
+ "&fBed Dihancurkan: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lPERANG KASUR", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lPERANG KASUR", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fPembunuhan Terakhir: &a{finalKills}", "&fBed Dihancurkan: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fLevel Anda: {level}", "", "&fProgres: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fKoin: &a{money}"
- , "", "&fTotal Kemenangan: &a{wins}", "&fTotal Membunuh: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Quick Buy");
@@ -461,6 +952,7 @@ public Indonesia() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "Tidak ada Perangkap!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Biaya: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Italian.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Italian.java
index 62a092616..9d9cc0ddb 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Italian.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Italian.java
@@ -54,19 +54,6 @@ public Italian() {
yml.set(Messages.PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL, yml.getString("player-die-knocked-final"));
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_JOIN_USAGE, "§a▪ §7Utilizzo: /" + mainCmd + " join §o");
@@ -191,19 +178,6 @@ public Italian() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aVita"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_ELIMINATED, "&c&l✘");
@@ -279,9 +253,9 @@ public Italian() {
yml.addDefault(Messages.GAME_END_VICTORY_PLAYER_TITLE, "&6&lVITTORIA!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &l1° Uccisore &7- {firstName} - {firstKills}",
- "&6 &l2° Uccisore &7- {secondName} - {secondKills}",
- "&c &l3° Uccisore &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &l1° Uccisore &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &l2° Uccisore &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &l3° Uccisore &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &aha vinto il gioco!");
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lDifendi il tuo letto!");
@@ -338,21 +312,539 @@ public Italian() {
addDefaultStatsMsg(yml, "last-play", "&6Ultima partita", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Partite giocate", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMappa: &a{map}", "", "&fGiocatori: &a{on}/{max}", "", "&fIn attesa...", "", "§fMode: &a{group}", "&fVersione: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMappa: &a{map}", "", "&fGiocatori: &a{on}/{max}", "", "&fInizio in &a{time}s", "", "§fMode: &a{group}", "&fVersione: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMappa: &a{map}",
+ "",
+ "&fGiocatori: &a{on}/{max}",
+ "",
+ "&fIn attesa&fIn attesa.,&fIn attesa..,&fIn attesa...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersione: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Guardando",
+ "&fMappa: &a{map}",
+ "",
+ "&fGiocatori: &a{on}/{max}",
+ "",
+ "&fIn attesa&fIn attesa.,&fIn attesa..,&fIn attesa...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersione: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMappa: &a{map}",
+ "",
+ "&fGiocatori: &a{on}/{max}",
+ "",
+ "&fInizio in &a{time}s",
+ "",
+ "&fMode: &a{group}",
+ "&fVersione: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Guardando",
+ "&fMappa: &a{map}",
+ "",
+ "&fGiocatori: &a{on}/{max}",
+ "",
+ "&fInizio in &a{time}s",
+ "",
+ "&fMode: &a{group}",
+ "&fVersione: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Guardando {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fUccisioni: &a{kills}", "&fUccisioni Finali: &a{finalKills}", "&fLetti Distrutti: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fUccisioni: &a{kills}", "&fUccisioni Finali: &a{finalKills}", "&fLetti Distrutti: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars", "&fLivello: {level}", "", "&fProgresso: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fSoldi: &a{money}"
- , "", "&fVittorie: &a{wins}", "&fUccisioni: &a{kills}", "", "&e{serverIp}"));
+ yml.addDefault(SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Guardando {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUccisioni: &a{kills}",
+ "&fUccisioni Finali: &a{finalKills}",
+ "&fLetti Distrutti: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Guardando {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUccisioni: &a{kills}",
+ "&fUccisioni Finali: &a{finalKills}",
+ "&fLetti Distrutti: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUccisioni: &a{kills}",
+ "&fUccisioni Finali: &a{finalKills}",
+ "&fLetti Distrutti: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Guardando {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUccisioni: &a{kills}",
+ "&fUccisioni Finali: &a{finalKills}",
+ "&fLetti Distrutti: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ // End of Sidebar
+
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
+
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fLivello: {level}",
+ "",
+ "&fProgresso: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fSoldi: &a{money}",
+ "",
+ "&fVittorie: &a{wins}",
+ "&fUccisioni: &a{kills}",
+ "", "&e{serverIp}")
+ );
yml.addDefault(Messages.TEAM_ELIMINATED_CHAT, "\n&f&lTEAM ELIMINATO > Il team {TeamColor}{TeamName} &cè stato eliminato\n");
yml.addDefault(Messages.XP_REWARD_PER_MINUTE, "{prefix}&6+{xp} Esperienza BedWars ricevuta (Tempo di Gioco).");
yml.addDefault(Messages.XP_REWARD_WIN, "{prefix}&6+{xp} Esperienza BedWars ricevuta (Vittoria).");
@@ -446,6 +938,7 @@ public Italian() {
addContentMessages(yml, "Compact Pop-up Tower", ConfigPath.SHOP_PATH_CATEGORY_UTILITY, "{color}Torre Pop-up Compatta", Arrays.asList("&7Costo: {cost} {currency}", "", "&7Piazza una Torre Pop-up", "&7compatta per difenderti!", "", "{quick_buy}", "{buy_status}"));
yml.addDefault(Messages.MEANING_NO_TRAP, "Nessuna Trappola!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Costo: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Persian.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Persian.java
index 70e2dbf2a..660ad0a1d 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Persian.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Persian.java
@@ -55,20 +55,6 @@ public Persian() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR, "&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR, "&9{serverIp}");
-
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Zaban haye mojood:");
yml.addDefault(Messages.COMMAND_LANG_LIST_FORMAT, "&a▪ &7{iso} - &f{name}");
@@ -191,19 +177,6 @@ public Persian() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aHealth"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -283,9 +256,9 @@ public Persian() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &abarande bazi shodan!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &lMagham #1 &7- {firstName} - {firstKills}",
- "&6 &lMagham #2 &7- {secondName} - {secondKills}",
- "&c &lMagham #3 &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &lMagham #1 &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &lMagham #2 &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &lMagham #3 &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lAz Bed khodetoon hefazat konid!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lBed shoma az bein raft!");
@@ -351,20 +324,548 @@ public Persian() {
addDefaultStatsMsg(yml, "last-play", "&6Akharin Bazi Anjam Shode", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Tedad Bazi Anjam Shode", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayer Ha: &a{on}/{max}", "", "&fDar Entezar...", "", "§fNo: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fPlayer Ha: &a{on}/{max}", "", "&fShoroo dar &a{time}s", "", "§fNo: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fLevel Shoma: {level}",
+ "",
+ "&fPishraft: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fCoins: &a{money}",
+ "",
+ "&fMajmoo Win: &a{wins}",
+ "&fMajmoo Kill: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayer Ha: &a{on}/{max}",
+ "",
+ "&fDar Entezar,&fDar Entezar.,&fDar Entezar..,&fDar Entezar...",
+ "",
+ "&fNo: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayer Ha: &a{on}/{max}",
+ "",
+ "&fDar Entezar,&fDar Entezar.,&fDar Entezar..,&fDar Entezar...",
+ "",
+ "&fNo: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayer Ha: &a{on}/{max}",
+ "",
+ "&fShoroo dar &a{time}s",
+ "",
+ "&fNo: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMap: &a{map}",
+ "",
+ "&fPlayer Ha: &a{on}/{max}",
+ "",
+ "&fShoroo dar &a{time}s",
+ "",
+ "&fNo: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} dar &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} dar &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} dar &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} dar &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} dar &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} dar &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} dar &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} dar &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} dar &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fLevel Shoma: {level}", "", "&fPishraft: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fCoins: &a{money}"
- , "", "&fMajmoo Win: &a{wins}", "&fMajmoo Kill: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Kharid Sari");
@@ -462,6 +963,7 @@ public Persian() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "Hich tale i nadarid!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Gheimat: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Polish.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Polish.java
index 527f2d20b..818434441 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Polish.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Polish.java
@@ -54,20 +54,6 @@ public Polish() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
-
yml.addDefault(Messages.COMMAND_JOIN_USAGE, "§a▪ §7Uzyj: /" + mainCmd + " join §o");
yml.addDefault(Messages.COMMAND_NOT_ALLOWED_IN_GAME, "{prefix}&cNie mozesz tego zrobic.");
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
@@ -190,19 +176,6 @@ public Polish() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aZYCIA"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_ELIMINATED, "&c&l✘");
@@ -280,9 +253,9 @@ public Polish() {
yml.addDefault(Messages.GAME_END_VICTORY_PLAYER_TITLE, "&6&lWYGRANA!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &lTOP 1 Zabojca &7- {firstName} - {firstKills}",
- "&6 &lTOP 2 Zabojca &7- {secondName} - {secondKills}",
- "&c &lTOP 3 Zabojca &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &lTOP 1 Zabojca &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &lTOP 2 Zabojca &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &lTOP 3 Zabojca &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &awygral gre!");
yml.addDefault(Messages.NEXT_EVENT_BEDS_DESTROY, "&dZniszczenie lozek&f:");
@@ -317,20 +290,539 @@ public Polish() {
yml.addDefault(Messages.GENERAL_CONFIGURATION_SPECTATOR_ITEMS_NAME.replace("%path%", "leave"), "&eWroc do lobby");
yml.addDefault(Messages.GENERAL_CONFIGURATION_SPECTATOR_ITEMS_LORE.replace("%path%", "leave"), Collections.singletonList("&fPPM aby wyjsc do lobby!"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMapa: &a{map}", "", "&fGracze: &a{on}/{max}", "", "&fOczekiwanie...", "", "§fTryb: &a{group}", "&fWersja: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMapa: &a{map}", "", "&fGracze: &a{on}/{max}", "", "&fRozpoczecie &a{time}s", "", "§fTryb: &a{group}", "&fWersja: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fTwoj poziom: {level}",
+ "",
+ "&fProgress: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fMonety: &a{money}",
+ "",
+ "&fWygrane: &a{wins}",
+ "&fZabojstwa: &a{kills}",
+ "", "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMapa: &a{map}",
+ "",
+ "&fGracze: &a{on}/{max}",
+ "",
+ "&fOczekiwanie,&fOczekiwanie.,&fOczekiwanie..,&fOczekiwanie...",
+ "",
+ "&fTryb: &a{group}",
+ "&fWersja: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMapa: &a{map}",
+ "",
+ "&fGracze: &a{on}/{max}",
+ "",
+ "&fOczekiwanie,&fOczekiwanie.,&fOczekiwanie..,&fOczekiwanie...",
+ "",
+ "&fTryb: &a{group}",
+ "&fWersja: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMapa: &a{map}",
+ "",
+ "&fGracze: &a{on}/{max}",
+ "",
+ "&fRozpoczecie &a{time}s",
+ "",
+ "&fTryb: &a{group}",
+ "&fWersja: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMapa: &a{map}",
+ "",
+ "&fGracze: &a{on}/{max}",
+ "",
+ "&fRozpoczecie &a{time}s",
+ "",
+ "&fTryb: &a{group}",
+ "&fWersja: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fZabojstwa: &a{kills}",
+ "&fOstateczne Zabojstwa: &a{finalKills}",
+ "&fZniszczone Lozka: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fZabojstwa: &a{kills}",
+ "&fOstateczne Zabojstwa: &a{finalKills}",
+ "&fZniszczone Lozka: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fZabojstwa: &a{kills}",
+ "&fOstateczne Zabojstwa: &a{finalKills}",
+ "&fZniszczone Lozka: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fZabojstwa: &a{kills}",
+ "&fOstateczne Zabojstwa: &a{finalKills}",
+ "&fZniszczone Lozka: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fZabojstwa: &a{kills}", "&fOstateczne Zabojstwa: &a{finalKills}", "&fZniszczone Lozka: &a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fZabojstwa: &a{kills}", "&fOstateczne Zabojstwa: &a{finalKills}", "&fZniszczone Lozka: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars", "&fTwoj poziom: {level}", "", "&fProgress: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fMonety: &a{money}"
- , "", "&fWygrane: &a{wins}", "&fZabojstwa: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
yml.addDefault(Messages.XP_REWARD_PER_MINUTE, "{prefix}&6+{xp} Otrzymano doswiedczenie BedWars (Czas grania).");
yml.addDefault(Messages.XP_REWARD_WIN, "{prefix}&6+{xp} Otrzymano doswiedczenie BedWars (Wygrana gra).");
@@ -484,6 +976,7 @@ public Polish() {
yml.addDefault(Messages.REJOIN_ALLOWED, "{prefix}&eDołączasz do &a{arena}&e!");
yml.addDefault(Messages.MEANING_NO_TRAP, "No trap!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Cost: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Portuguese.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Portuguese.java
index a7fad27bf..ba5ff5daf 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Portuguese.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Portuguese.java
@@ -53,20 +53,6 @@ public Portuguese() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
-
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Idiomas disponíveis:");
yml.addDefault(Messages.COMMAND_LANG_LIST_FORMAT, "&a▪ &7{iso} - &f{name}");
@@ -189,19 +175,6 @@ public Portuguese() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aVida"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "ESPEC");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -281,9 +254,9 @@ public Portuguese() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &aganhou o jogo!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &l1º Assassino &7- {firstName} - {firstKills}",
- "&6 &l2º Assassino &7- {secondName} - {secondKills}",
- "&c &l3º Assassino &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &l1º Assassino &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &l2º Assassino &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &l3º Assassino &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lDefenda sua cama!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lSua cama foi destruída!");
@@ -349,21 +322,539 @@ public Portuguese() {
addDefaultStatsMsg(yml, "last-play", "&6Última Partida", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Partidas", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMapa: &a{map}", "", "&fJogadores: &a{on}/{max}", "", "&fEsperando...", "", "§fModo: &a{group}", "&fVersão: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMapa: &a{map}", "", "&fJogadores: &a{on}/{max}", "", "&fInicio em &a{time}s", "", "§fModo: &a{group}", "&fVersão: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} em &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fSeu nivel: {level}",
+ "",
+ "&fProgresso: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fMoedas: &a{money}",
+ "",
+ "&fTotal de vitórias: &a{wins}",
+ "&fTotal de abates: &a{kills}",
+ "", "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMapa: &a{map}",
+ "",
+ "&fJogadores: &a{on}/{max}",
+ "",
+ "&fEsperando,&fEsperando.,&fEsperando..,&fEsperando...",
+ "",
+ "&fModo: &a{group}",
+ "&fVersão: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMapa: &a{map}",
+ "",
+ "&fJogadores: &a{on}/{max}",
+ "",
+ "&fEsperando,&fEsperando.,&fEsperando..,&fEsperando...",
+ "",
+ "&fModo: &a{group}",
+ "&fVersão: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMapa: &a{map}",
+ "",
+ "&fJogadores: &a{on}/{max}",
+ "",
+ "&fInicio em &a{time}s",
+ "",
+ "&fModo: &a{group}",
+ "&fVersão: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMapa: &a{map}",
+ "",
+ "&fJogadores: &a{on}/{max}",
+ "",
+ "&fInicio em &a{time}s",
+ "",
+ "&fModo: &a{group}",
+ "&fVersão: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} em &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} em &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} em &a{time}", "",
- "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fKills: &a{kills}",
+ "&fFinal Kills: &a{finalKills}",
+ "&fBeds Broken: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} em &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} em &a{time}", "", "{team}", "{team}", "{team}", "{team}",
- "", "&fKills: &a{kills}", "&fFinal Kills: &a{finalKills}", "&fBeds Broken: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fSeu nivel: {level}", "", "&fProgresso: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fMoedas: &a{money}"
- , "", "&fTotal de vitórias: &a{wins}", "&fTotal de abates: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Compra rápida");
@@ -461,6 +952,7 @@ public Portuguese() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "Sem armadilha!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Preço: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Romanian.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Romanian.java
index 558f5f6a2..6d8677ae3 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Romanian.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Romanian.java
@@ -43,30 +43,17 @@ public Romanian() {
// this must stay here
// move message to new path
- if (yml.get("player-die-knocked-regular") != null && yml.get(Messages.PLAYER_DIE_KNOCKED_IN_VOID_REGULAR_KILL) == null){
+ if (yml.get("player-die-knocked-regular") != null && yml.get(Messages.PLAYER_DIE_KNOCKED_IN_VOID_REGULAR_KILL) == null) {
yml.set(Messages.PLAYER_DIE_KNOCKED_IN_VOID_REGULAR_KILL, yml.getString("player-die-knocked-regular"));
yml.set("player-die-knocked-regular", null);
}
- if (yml.get("player-die-knocked-final") != null && yml.get(Messages.PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL) == null){
+ if (yml.get("player-die-knocked-final") != null && yml.get(Messages.PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL) == null) {
yml.set(Messages.PLAYER_DIE_KNOCKED_IN_VOID_FINAL_KILL, yml.getString("player-die-knocked-final"));
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
-
yml.options().copyDefaults(true);
+
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_JOIN_DENIED_IS_FULL, "{prefix}&cArena este plina!\n&aAi putea lua in considerare donarea pentru mai multe facilitati. &7&o(click)");
yml.addDefault(Messages.COMMAND_JOIN_DENIED_IS_FULL_OF_VIPS, "{prefix}&cNe pare rau dar arena este plina.\n&cStim ca esti donator dar arena este deja plina cu persoane care au prioritate.");
@@ -123,7 +110,7 @@ public Romanian() {
yml.addDefault(Messages.COMMAND_PARTY_PROMOTE_OWNER, "{prefix}&eAi fost promovat ca proprietar al petrecerii");
yml.addDefault(Messages.COMMAND_PARTY_PROMOTE_NEW_OWNER, "{prefix}&7 &e{player} a fost promovat ca proprietar");
yml.addDefault(Messages.COMMAND_PARTY_INFO_OWNER, "\n{prefix}&eProprietarul petrecerii este: &7{owner}");
- yml.addDefault(Messages.COMMAND_PARTY_INFO_PLAYERS,"{prefix}&eMembrii sunt:");
+ yml.addDefault(Messages.COMMAND_PARTY_INFO_PLAYERS, "{prefix}&eMembrii sunt:");
yml.addDefault(Messages.COMMAND_PARTY_INFO_PLAYER, "&7{player}");
yml.addDefault(Messages.COMMAND_NOT_FOUND_OR_INSUFF_PERMS, "{prefix}&cComanda nu a fost gasita sau nu ai permisiunea!");
yml.addDefault(Messages.COMMAND_FORCESTART_NOT_IN_GAME, "§c▪ §7Nu esti in joc!");
@@ -191,19 +178,7 @@ public Romanian() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aViață"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
+
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_ELIMINATED, "&c&l✘");
@@ -276,9 +251,9 @@ public Romanian() {
yml.addDefault(Messages.GAME_END_VICTORY_PLAYER_TITLE, "&6&lVICTORIE!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &lPrimul Ucigas &7- {firstName} - {firstKills}",
- "&6 &lAl 2-lea Ucigas &7- {secondName} - {secondKills}",
- "&c &lAl 3-lea Ucigas &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &lPrimul Ucigas &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &lAl 2-lea Ucigas &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &lAl 3-lea Ucigas &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}Echipa {TeamName} &aa castigat!");
yml.addDefault(Messages.NPC_NAME_TEAM_UPGRADES, "&bTEAM UPGRADES,&e&lCLICK DREAPTA");
@@ -337,21 +312,549 @@ public Romanian() {
addDefaultStatsMsg(yml, "last-play", "&6Ultimul Meci", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Partide Jucate", "&f{gamesPlayed}");
+ // start of sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fNivelul tau: {level}",
+ "",
+ "&fProgres: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fBani: &a{money}",
+ "",
+ "&fVictorii: &a{wins}",
+ "&fUcideri: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fHarta: &a{map}",
+ "",
+ "&fJucatori: &a{on}/{max}",
+ "",
+ "&fIn asteptare,&fIn asteptare.,&fIn asteptare..,&fIn asteptare...",
+ "",
+ "&fMod: &a{group}",
+ "&fVersiune: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Esti spectator",
+ "&fHarta: &a{map}",
+ "",
+ "&fJucatori: &a{on}/{max}",
+ "",
+ "&fIn asteptare,&fIn asteptare.,&fIn asteptare..,&fIn asteptare...",
+ "",
+ "&fMod: &a{group}",
+ "&fVersiune: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMap: &a{map}",
+ "",
+ "&fJucatori: &a{on}/{max}",
+ "",
+ "&fIncepe in &a{time}s",
+ "",
+ "§fMod: &a{group}",
+ "&fVersiune: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Esti spectator",
+ "&fMap: &a{map}",
+ "",
+ "&fJucatori: &a{on}/{max}",
+ "",
+ "&fIncepe in &a{time}s",
+ "",
+ "§fMod: &a{group}",
+ "&fVersiune: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fHarta: &a{map}", "", "&fJucatori: &a{on}/{max}", "", "&fIn asteptare...", "", "§fMod: &a{group}", "&fVersiune: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMap: &a{map}", "", "&fJucatori: &a{on}/{max}", "", "&fIncepe in &a{time}s", "", "§fMod: &a{group}", "&fVersiune: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUcideri: &a{kills}",
+ "&fUcideri Finale: &a{finalKills}",
+ "&fPaturi Distruse: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUcideri: &a{kills}",
+ "&fUcideri Finale: &a{finalKills}",
+ "&fPaturi Distruse: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUcideri: &a{kills}",
+ "&fUcideri Finale: &a{finalKills}",
+ "&fPaturi Distruse: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fUcideri: &a{kills}",
+ "&fUcideri Finale: &a{finalKills}",
+ "&fPaturi Distruse: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // end of sidebar
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fUcideri: &a{kills}", "&fUcideri Finale: &a{finalKills}", "&fPaturi Distruse: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fUcideri: &a{kills}", "&fUcideri Finale: &a{finalKills}", "&fPaturi Distruse: &a{beds}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars", "&fNivelul tau: {level}", "", "&fProgres: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fBani: &a{money}"
- , "", "&fVictorii: &a{wins}", "&fUcideri: &a{kills}", "", "&e{serverIp}"));
yml.addDefault(Messages.XP_REWARD_PER_MINUTE, "{prefix}&6+{xp} BedWars Experience Received (Play Time).");
yml.addDefault(Messages.XP_REWARD_WIN, "{prefix}&6+{xp} BedWars Experience Received (Game Win).");
yml.addDefault(Messages.XP_REWARD_PER_TEAMMATE, "{prefix}&6+{xp} BedWars Experience Received (Team Support).");
@@ -479,6 +982,7 @@ public Romanian() {
yml.addDefault(Messages.UPGRADES_UPGRADE_BOUGHT_CHAT, "&a{player} a cumparat &6{upgradeName}");
yml.addDefault(Messages.MEANING_NO_TRAP, "No trap!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Cost: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Russian.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Russian.java
index 79311a77b..0a375a7c7 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Russian.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Russian.java
@@ -52,20 +52,6 @@ public Russian() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
-
yml.options().copyDefaults(true);
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o<арена/тип>", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.ARENA_JOIN_VIP_KICK, "{prefix}&cИзвините, но вас выгнали, потому что к арене присоединился донатер.\n&aЧтобы иметь больше возможностей - купите донат. &7&o(жми)");
@@ -130,32 +116,525 @@ public Russian() {
yml.addDefault(Messages.MEANING_SHOUT, "shout");
yml.addDefault(Messages.ARENA_STATUS_START_PLAYER_TITLE, "&aПОГНАЛИ");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fКарта: &a{map}", "", "&fИгроков: &a{on}/{max}", "", "&fОжидание...", "", "§fТип: &a{group}", "&fВерсия: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fКарта: &a{map}", "", "&fИгроков: &a{on}/{max}", "", "&fСтарт через &a{time}s", "", "§fТип: &a{group}", "&fВерсия: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fКарта: &a{map}",
+ "",
+ "&fИгроков: &a{on}/{max}",
+ "",
+ "&fОжидание,&fОжидание.,&fОжидание..,&fОжидание...",
+ "",
+ "&fТип: &a{group}",
+ "&fВерсия: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fКарта: &a{map}",
+ "",
+ "&fИгроков: &a{on}/{max}",
+ "",
+ "&fОжидание,&fОжидание.,&fОжидание..,&fОжидание...",
+ "",
+ "&fТип: &a{group}",
+ "&fВерсия: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fКарта: &a{map}",
+ "",
+ "&fИгроков: &a{on}/{max}",
+ "",
+ "&fСтарт через &a{time}s",
+ "",
+ "&fТип: &a{group}",
+ "&fВерсия: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fКарта: &a{map}",
+ "",
+ "&fИгроков: &a{on}/{max}",
+ "",
+ "&fСтарт через &a{time}s",
+ "",
+ "&fТип: &a{group}",
+ "&fВерсия: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fУбийств: &a{kills}", "&fФинальных убийств: &a{finalKills}", "&fКроватей уничтожено: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fУбийств: &a{kills}", "&fФинальных убийств: &a{finalKills}", "&fКроватей уничтожено: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&e&lBED WARS",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fУбийств: &a{kills}",
+ "&fФинальных убийств: &a{finalKills}",
+ "&fКроватей уничтожено: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&e&lBED WARS",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fУбийств: &a{kills}",
+ "&fФинальных убийств: &a{finalKills}",
+ "&fКроватей уничтожено: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fУбийств: &a{kills}",
+ "&fФинальных убийств: &a{finalKills}",
+ "&fКроватей уничтожено: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fУбийств: &a{kills}",
+ "&fФинальных убийств: &a{finalKills}",
+ "&fКроватей уничтожено: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ // End of Sidebar
+
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aЗдоровье"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_ELIMINATED, "&c&l✘");
@@ -199,9 +678,9 @@ public Russian() {
yml.addDefault(Messages.GAME_END_VICTORY_PLAYER_TITLE, "&6&lПОБЕДА!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &l1-1 Убийца &7- {firstName} - {firstKills}",
- "&6 &l2-й Убийца &7- {secondName} - {secondKills}",
- "&c &l3-й Убийца &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &l1-1 Убийца &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &l2-й Убийца &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &l3-й Убийца &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
//yml.addDefault(gameOverReward, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
// "&f &lReward Summary", "", "",
@@ -397,8 +876,22 @@ public Russian() {
yml.addDefault(Messages.FORMATTING_STATS_DATE_FORMAT, "yyyy/MM/dd HH:mm");
yml.addDefault(Messages.MEANING_NEVER, "Никогда");
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars", "&fВаш уровень: {level}", "", "&fПрогресс: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fМонет: &a{money}"
- , "", "&fВсего побед: &a{wins}", "&fВсего убйиств: &a{kills}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fВаш уровень: {level}",
+ "",
+ "&fПрогресс: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fМонет: &a{money}",
+ "",
+ "&fВсего побед: &a{wins}",
+ "&fВсего убйиств: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
/* party commands */
yml.addDefault(Messages.COMMAND_PARTY_HELP, Arrays.asList("&6▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
@@ -499,6 +992,7 @@ public Russian() {
yml.addDefault(Messages.MEANING_NO_TRAP, "Ловушки отсутствуют!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Цена: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/SimplifiedChinese.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/SimplifiedChinese.java
index f9fa5d535..4489826dc 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/SimplifiedChinese.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/SimplifiedChinese.java
@@ -176,33 +176,6 @@ public SimplifiedChinese() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[旁观者] {player}{vSuffix}:{message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&a生命值"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "旁观者");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR, "&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR, "&9{serverIp}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "yy/MM/dd");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}:{TeamStatus}");
@@ -282,9 +255,9 @@ public SimplifiedChinese() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName}&a赢得了这场游戏!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &l起床战争", "", "{winnerFormat}", "", "",
- "&e &l击杀第一名 &7- {firstName} - {firstKills}",
- "&6 &l击杀第二名 &7- {secondName} - {secondKills}",
- "&c &l击杀第三名 &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &l击杀第一名 &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &l击杀第二名 &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &l击杀第三名 &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&l保护你的床!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&l你的床被破坏了!");
@@ -350,21 +323,540 @@ public SimplifiedChinese() {
addDefaultStatsMsg(yml, "last-play", "&6上次游玩", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6总游玩场数", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&l起床战争", "&7{date} &8{server}", "", "&f地图:&a{map}", "", "&f玩家数:&a{on}/{max}", "", "&f等待中...", "", "&f模式:&a{group}", "&f版本:&7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&l起床战争", "&7{date} &8{server}", "", "&f地图:&a{map}", "", "&f玩家数:&a{on}/{max}", "", "&f &a{time} &f秒后开始", "", "&f模式:&a{group}", "&f模式:&7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&l起床战争", "&7{date}", "", "&f{nextEvent} - &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&6&l起床战争,&4&l起&6&l床战争,&6&l起&4&l床&6&l战争,&6&l起床&4&l战&6&l争,&6&l起床战&4&l争,&6&l起床战争",
+ "&f等级:{level}",
+ "",
+ "&f进度:&a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&f金币:&a{money}",
+ "",
+ "&f总胜场:&a{wins}",
+ "&f总击杀:&a{kills}",
+ "", "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&l起床战争",
+ "&7{date} &8{server}",
+ "",
+ "&f地图:&a{map}",
+ "",
+ "&f玩家数:&a{on}/{max}",
+ "",
+ "&f等待中,&f等待中.,&f等待中..,&f等待中...",
+ "",
+ "&f模式:&a{group}",
+ "&f版本:&7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&l起床战争",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&f地图:&a{map}",
+ "",
+ "&f玩家数:&a{on}/{max}",
+ "",
+ "&f等待中,&f等待中.,&f等待中..,&f等待中...",
+ "",
+ "&f模式:&a{group}",
+ "&f版本:&7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&l起床战争",
+ "&7{date} &8{server}",
+ "",
+ "&f地图:&a{map}",
+ "",
+ "&f玩家数:&a{on}/{max}",
+ "",
+ "&f &a{time} &f秒后开始",
+ "",
+ "&f模式:&a{group}",
+ "&f模式:&7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&l起床战争",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&f地图:&a{map}",
+ "",
+ "&f玩家数:&a{on}/{max}",
+ "",
+ "&f &a{time} &f秒后开始",
+ "",
+ "&f模式:&a{group}",
+ "&f模式:&7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&f击杀:&a{kills}",
+ "&f最终击杀:&a{finalKills}",
+ "&f破坏床:&a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&f击杀:&a{kills}",
+ "&f最终击杀:&a{finalKills}",
+ "&f破坏床:&a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&f击杀:&a{kills}",
+ "&f最终击杀:&a{finalKills}",
+ "&f破坏床:&a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&e&l起床战争",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} - &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&f击杀:&a{kills}",
+ "&f最终击杀:&a{finalKills}",
+ "&f破坏床:&a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&l起床战争", "&7{date}", "", "&f{nextEvent} - &a{time}", "",
- "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&l起床战争", "&7{date}", "", "&f{nextEvent} - &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&f击杀:&a{kills}", "&f最终击杀:&a{finalKills}", "&f破坏床:&a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&l起床战争", "&7{date}", "", "&f{nextEvent} - &a{time}", "", "{team}", "{team}", "{team}", "{team}",
- "", "&f击杀:&a{kills}", "&f最终击杀:&a{finalKills}", "&f破坏床:&a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&l起床战争,&4&l起&6&l床战争,&6&l起&4&l床&6&l战争,&6&l起床&4&l战&6&l争,&6&l起床战&4&l争,&6&l起床战争",
- "&f等级:{level}", "", "&f进度:&a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&f金币:&a{money}", "", "&f总胜场:&a{wins}", "&f总击杀:&a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8快速购买");
yml.addDefault(Messages.SHOP_QUICK_ADD_NAME, "&8添加到快速购买...");
@@ -463,6 +955,7 @@ public SimplifiedChinese() {
"&7放置一个袖珍弹出塔", "&7塔防!", "", "{quick_buy}", "{buy_status}"));
yml.addDefault(Messages.MEANING_NO_TRAP, "无陷阱!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7花费:{currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Spanish.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Spanish.java
index 8600bedb1..20b4a2753 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Spanish.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Spanish.java
@@ -53,20 +53,6 @@ public Spanish() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR, "&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR, "&9{serverIp}");
-
yml.options().copyDefaults(true);
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.ARENA_JOIN_VIP_KICK, "{prefix}&cHas sido expulsado ya que un VIP se ha unido a la partida.\n&aConsidere hacer una donación para obtener más funciones. &7&o(click)");
@@ -131,34 +117,508 @@ public Spanish() {
yml.addDefault(Messages.MEANING_SHOUT, "grita");
yml.addDefault(Messages.ARENA_STATUS_START_PLAYER_TITLE, "&aVAMOS");
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMapa: &a{map}",
+ "",
+ "&fJugador: &a{on}/{max}",
+ "",
+ "&fEsperando,&fEsperando.,&fEsperando..,&fEsperando...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMapa: &a{map}",
+ "",
+ "&fJugador: &a{on}/{max}",
+ "",
+ "&fEsperando,&fEsperando.,&fEsperando..,&fEsperando...",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fMapa: &a{map}",
+ "",
+ "&fJugador: &a{on}/{max}",
+ "",
+ "&fomenzando en &a{time}s",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fMapa: &a{map}",
+ "",
+ "&fJugador: &a{on}/{max}",
+ "",
+ "&fomenzando en &a{time}s",
+ "",
+ "&fMode: &a{group}",
+ "&fVersion: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMapa: &a{map}", "", "&fJugador: &a{on}/{max}", "", "&fEsperando...", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fMapa: &a{map}", "", "&fJugador: &a{on}/{max}", "", "&fomenzando en &a{time}s", "", "§fMode: &a{group}", "&fVersion: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&finalKills: &a{kills}", "&fAsesinatos Finales: &a{finalKills}", "&fCamas Destruidas: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&f{nextEvent} in &a{time}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fAsesinatos: &a{kills}", "&fAsesinatos Finales: &a{finalKills}", "&fCamas Destruidas: &a{beds}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&finalKills: &a{kills}",
+ "&fAsesinatos Finales: &a{finalKills}",
+ "&fCamas Destruidas: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&finalKills: &a{kills}",
+ "&fAsesinatos Finales: &a{finalKills}",
+ "&fCamas Destruidas: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&f{nextEvent} in &a{time}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fAsesinatos: &a{kills}",
+ "&fAsesinatos Finales: &a{finalKills}",
+ "&fCamas Destruidas: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+ // End of Sidebar
+
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aSalud"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SPECT");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_ELIMINATED, "&c&l✘");
@@ -200,9 +660,9 @@ public Spanish() {
yml.addDefault(Messages.GAME_END_VICTORY_PLAYER_TITLE, "&6&lVICTORIA!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &lBedWars", "", "{winnerFormat}", "", "",
- "&e &l1er Asesino &7- {firstName} - {firstKills}",
- "&6 &l2do Asesino &7- {secondName} - {secondKills}",
- "&c &l3er Asesino &7- {thirdName} - {thirdKills}", "",
+ "&6 &6⭐ &l1er Asesino &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&e &l2do Asesino &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}",
+ "&c &l3er Asesino &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue}", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
//yml.addDefault(gameOverReward, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
// "&f &lReward Summary", "", "",
@@ -290,8 +750,22 @@ public Spanish() {
yml.addDefault(Messages.FORMATTING_STATS_DATE_FORMAT, "yyyy/MM/dd HH:mm");
yml.addDefault(Messages.MEANING_NEVER, "Nunca");
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars", "&fTu nivel: {level}", "", "&fProgreso: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fDinero: &a{money}"
- , "", "&fVictorias totales: &a{wins}", "&fAsesinatos totales: &a{kills}", "", "&e{serverIp}"));
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fTu nivel: {level}",
+ "",
+ "&fProgreso: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fDinero: &a{money}",
+ "",
+ "&fVictorias totales: &a{wins}",
+ "&fAsesinatos totales: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
/* party commands */
yml.addDefault(Messages.COMMAND_PARTY_HELP, Arrays.asList("&6▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
@@ -487,9 +961,6 @@ public Spanish() {
addContentMessages(yml, "sponge", ConfigPath.SHOP_PATH_CATEGORY_UTILITY, "{color}Esponja", Arrays.asList("&7Precio: {cost} {currency}", "", "&7Genial para absorber agua.",
"", "{quick_buy}", "{buy_status}"));
-
-
-
/* Lobby Command Items */
yml.addDefault(Messages.GENERAL_CONFIGURATION_LOBBY_ITEMS_NAME.replace("%path%", "stats"), "&lEstadistícas");
yml.addDefault(Messages.GENERAL_CONFIGURATION_LOBBY_ITEMS_LORE.replace("%path%", "stats"), Arrays.asList("&7Utiliza este objeto para", "&7ver tus estadísticas."));
@@ -521,6 +992,7 @@ public Spanish() {
yml.addDefault(Messages.REJOIN_ALLOWED, "{prefix}&eHas ingresado nuevamente a &a{arena}&e!");
yml.addDefault(Messages.MEANING_NO_TRAP, "Sin trampa!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Precio: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Turkish.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Turkish.java
index ddc57c5f2..9a38acec7 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Turkish.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/language/Turkish.java
@@ -55,20 +55,6 @@ public Turkish() {
yml.set("player-die-knocked-final", null);
}
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING,"&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR,"&9{serverIp}");
-
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY, "&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING, "&a{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING,"&6{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING, "&d{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING, "&c{serverIp}");
- yml.addDefault(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR,"&9{serverIp}");
-
yml.addDefault(Messages.COMMAND_MAIN, Arrays.asList("", "&2▪ &7/" + mainCmd + " stats", "&2▪ &7/" + mainCmd + " join &o", "&2▪ &7/" + mainCmd + " leave", "&2▪ &7/" + mainCmd + " lang", "&2▪ &7/" + mainCmd + " gui", "&2▪ &7/" + mainCmd + " start &3(vip)"));
yml.addDefault(Messages.COMMAND_LANG_LIST_HEADER, "{prefix} &2Mevcut diller:");
yml.addDefault(Messages.COMMAND_LANG_LIST_FORMAT, "&a▪ &7{iso} - &f{name}");
@@ -191,19 +177,6 @@ public Turkish() {
yml.addDefault(Messages.FORMATTING_CHAT_TEAM, "{level}{vPrefix}&f{team}&7 {player}{vSuffix} {message}");
yml.addDefault(Messages.FORMATTING_CHAT_SPECTATOR, "{level}{vPrefix}&7[SPECTATOR] {player}{vSuffix}: {message}");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_HEALTH, Arrays.asList("&c❤", "&aCan"));
- yml.addDefault(Messages.FORMATTING_SPECTATOR_TEAM, "SEYIRCI");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, "&7");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, "");
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, Arrays.asList("{teamColor}&l{teamLetter} &r{teamColor}", "{team} ", "{vPrefix} {teamColor}&l{teamLetter} &r{teamColor}"));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, new ArrayList<>());
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, List.of("{vPrefix} "));
- yml.addDefault(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, new ArrayList<>());
yml.addDefault(Messages.FORMATTING_SCOREBOARD_DATE, "dd/MM/yyyy");
yml.addDefault(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC, "{TeamColor}{TeamLetter}&f {TeamName}: {TeamStatus}");
@@ -283,9 +256,9 @@ public Turkish() {
yml.addDefault(Messages.GAME_END_TEAM_WON_CHAT, "{prefix}{TeamColor}{TeamName} &aoyunu kazandı!");
yml.addDefault(Messages.GAME_END_TOP_PLAYER_CHAT, Arrays.asList("&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬",
"&f &l&cBed&r&lWars", "", "{winnerFormat}", "", "",
- "&e &l1. Oyuncu &7- {firstName} - {firstKills} öldürme",
- "&6 &l2. Oyuncu &7- {secondName} - {secondKills} öldürme",
- "&c &l3. Oyuncu &7- {thirdName} - {thirdKills} öldürme", "",
+ "&6 &6⭐ &l1. Oyuncu &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue} &7öldürme",
+ "&e &l2. Oyuncu &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue} &7öldürme",
+ "&c &l3. Oyuncu &7- {topTeamColor}{topPlayerDisplayName} &7- &l{topValue} &7öldürme", "",
"&a▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"));
yml.addDefault(Messages.BED_HOLOGRAM_DEFEND, "&c&lYatağını savun!");
yml.addDefault(Messages.BED_HOLOGRAM_DESTROYED, "&c&lYatağın kırıldı!");
@@ -351,21 +324,541 @@ public Turkish() {
addDefaultStatsMsg(yml, "last-play", "&6Son Oyun", "&f{lastPlay}");
addDefaultStatsMsg(yml, "games-played", "&6Oynanan Oyun", "&f{gamesPlayed}");
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fHarita: &a{map}", "", "&fOyuncular: &a{on}/{max}", "", "&fBekleniyor...", "", "§fTür: &a{group}", "&fSürüm: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList("&f&lBED WARS", "&7{date} &8{server}", "", "&fHarita: &a{map}", "", "&fOyuncular: &a{on}/{max}", "", "&f&a{time}s sonra başlatılıyor", "", "§fTür: &a{group}", "&fSürüm: &7{version}", "", "&e{serverIp}"));
- yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList("&e&lBED WARS", "&7{date}", "", "&a{time} sonra &f{nextEvent}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
+ // Start of Sidebar
+ yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&fSeviyen: {level}",
+ "",
+ "&fİlerleme: &a{currentXp}&7/&b{requiredXp}",
+ "{progress}",
+ "",
+ "&7{player}",
+ "",
+ "&fPara: &a{money}",
+ "",
+ "&fGalibiyet: &a{wins}",
+ "&fToplam Öldürme: &a{kills}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fHarita: &a{map}",
+ "",
+ "&fOyuncular: &a{on}/{max}",
+ "",
+ "&fBekleniyor,&fBekleniyor.,&fBekleniyor..,&fBekleniyor...",
+ "",
+ "&fTür: &a{group}",
+ "&fSürüm: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_WAITING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fHarita: &a{map}",
+ "",
+ "&fOyuncular: &a{on}/{max}",
+ "",
+ "&fBekleniyor,&fBekleniyor.,&fBekleniyor..,&fBekleniyor...",
+ "",
+ "&fTür: &a{group}",
+ "&fSürüm: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "",
+ "&fHarita: &a{map}",
+ "",
+ "&fOyuncular: &a{on}/{max}",
+ "",
+ "&f&a{time}s sonra başlatılıyor",
+ "",
+ "&fTür: &a{group}",
+ "&fSürüm: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_STARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date} &8{server}",
+ "&o&7Spectating",
+ "&fHarita: &a{map}",
+ "",
+ "&fOyuncular: &a{on}/{max}",
+ "",
+ "&f&a{time}s sonra başlatılıyor",
+ "",
+ "&fTür: &a{group}",
+ "&fSürüm: &7{version}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER, Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&6Winner: {winnerTeamColor}{winnerTeamName} &6⭐",
+ "",
+ "&7&lTop Kills:",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "&f{topTeamColor}{topPlayerDisplayName}&7 - &l{topValue}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "Doubles"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fÖldürme: &a{kills}",
+ "&fFinal Öldürme: &a{finalKills}",
+ "&fYatak Kırma: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "3v3v3v3"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fÖldürme: &a{kills}",
+ "&fFinal Öldürme: &a{finalKills}",
+ "&fYatak Kırma: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fÖldürme: &a{kills}",
+ "&fFinal Öldürme: &a{finalKills}",
+ "&fYatak Kırma: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
+
+ yml.addDefault(Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC.replaceFirst("Default", "4v4v4v4"), Arrays.asList(
+ "&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&lBED WARS,&f&l{poweredBy},&f&l{poweredBy},&f&l{poweredBy},&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&lBED WARS,&e&l{poweredBy},&e&l{poweredBy},&e&l{poweredBy}",
+ "&7{date}",
+ "&o&7Spectating {spectatorTarget}",
+ "&a{time} sonra &f{nextEvent}",
+ "",
+ "{team}",
+ "{team}",
+ "{team}",
+ "{team}",
+ "",
+ "&fÖldürme: &a{kills}",
+ "&fFinal Öldürme: &a{finalKills}",
+ "&fYatak Kırma: &a{beds}",
+ "",
+ "&e{serverIp}")
+ );
- yml.addDefault("scoreboard.Doubles.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&a{time} sonra &f{nextEvent}", "",
- "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "", "&e{serverIp}"));
- yml.addDefault("scoreboard.3v3v3v3.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&a{time} sonra &f{nextEvent}", "", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}", "{team}",
- "", "&fÖldürme: &a{kills}", "&fFinal Öldürme: &a{finalKills}", "&fYatak Kırma: &a{beds}", "", "&e{serverIp}"));
+ // End of Sidebar
- yml.addDefault("scoreboard.4v4v4v4.playing", Arrays.asList("&e&lBED WARS", "&7{date}", "", "&a{time} sonra &f{nextEvent}", "", "{team}", "{team}", "{team}", "{team}",
- "", "&fÖldürme: &a{kills}", "&fFinal Öldürme: &a{finalKills}", "&fYatak Kırma: &a{beds}", "", "&e{serverIp}"));
+ // start of TAB
+ // main lobby tab format
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_FOOTER, List.of(
+ "",
+ "&fThere are {on} players on this lobby",
+ "Powered by {poweredBy},&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, List.of(" {level}"));
+ // player waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER, List.of(
+ "",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, List.of(" {level}"));
+ // spectator waiting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC, List.of(
+ "",
+ "&7&oYou are spectating",
+ "Waiting for more players,Waiting for more players.,Waiting for more players.., Waiting for more players...",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, List.of("{vPrefix}"));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, List.of(" {level}"));
+ // player starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, List.of(" {level}"));
+ // spectator starting lobby
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC, List.of(
+ "",
+ "&fStarting in &a{time} &fseconds,&fStarting in &a{time} &fseconds.,&fStarting in &a{time} &fseconds..,&fStarting in &a{time} &fseconds..",
+ "&f{on}&a/&f{max}",
+ "",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, List.of("{vPrefix} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, List.of(" {level}"));
+ // player playing
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_FOOTER, List.of(
+ "",
+ "&fYou are playing on the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // player eliminated - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ "",
+ "&7&oAYou've been eliminated,&f&oAYou've been eliminated"
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have played in the {teamColor}{teamName} Team",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, List.of(" &c&oEliminated {teamColor}&o{teamName}", " {teamColor}&oEliminated {vPrefix}", "{teamColor}&oEliminated {level}"));
+ // spectator - playing state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "{nextEvent} in {time}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner alive - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&lYour team won the game! &6⭐",
+ "&7{date}", "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // winner dead - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER, List.of(
+ "",
+ "&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&6&lYou won in the {teamColor}&l{teamName} Team&6&l!,&f&lYou won in the {teamColor}&l{teamName} Team&f&l!",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
- yml.addDefault(Messages.SCOREBOARD_LOBBY, Arrays.asList("&6&lBedWars,&4&lB&6edWars,&6&lB&4e&6dWars,&6&lBe&4d&6Wars,&6&lBed&4W&6ars,&6&lBedW&4a&6rs,&6&lBedWa&4r&6s,&6&lBedWar&4s,&6&lBedWars", "&fSeviyen: {level}", "", "&fİlerleme: &a{currentXp}&7/&b{requiredXp}", "{progress}", "", "&7{player}", "", "&fPara: &a{money}"
- , "", "&fGalibiyet: &a{wins}", "&fToplam Öldürme: &a{kills}", "", "&e{serverIp}"));
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, List.of("&6&l⭐ {teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // loser - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER, List.of(
+ " ",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER, List.of(
+ "",
+ "&fYou have lost in the {teamColor}{teamName} Team",
+ "&7Statistics from this match",
+ "&eKills: &f{kills} &8| &eFinal Kills: &f{finalKills} &8| &eBeds Destroyed: &f{beds} &8| &eDeaths: &f{deaths},&eKills: &7{kills} &8| &eFinal Kills: &7{finalKills} &8| &eBeds Destroyed: &7{beds} &8| &eDeaths: &7{deaths}",
+ "&fThanks for playing {player}!",
+ "&a{serverIp}",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, List.of("{teamColor}{teamName} "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, List.of(" {vPrefix}", " &c&oEliminated", " {level}", " &c&oEliminated"));
+ // spectator - restarting state
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER, List.of(
+ " ",
+ "&a{serverIp}",
+ "&6⭐ {winnerTeamColor}&l{winnerTeamName} Team won the game! &6⭐",
+ "&7{date}",
+ "&7Map: &f{map} &7Mode: &f{group}",
+ "",
+ "&fThanks for playing {player}!",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER, List.of(
+ "",
+ "&fPowered by {poweredBy}",
+ ""
+ ));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, List.of("&f&oSpectator "));
+ yml.addDefault(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, List.of(" {vPrefix}", " {level}"));
+ // end of tab
//
yml.addDefault(Messages.SHOP_INDEX_NAME, "&8Hızlı Alım");
@@ -463,6 +956,7 @@ public Turkish() {
//
yml.addDefault(Messages.MEANING_NO_TRAP, "Tuzak yok!");
+ yml.addDefault(Messages.FORMAT_SPECTATOR_TARGET, "{targetTeamColor}{targetDisplayName}");
yml.addDefault(Messages.FORMAT_UPGRADE_TRAP_COST, "&7Ücret: {currencyColor}{cost} {currency}");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CAN_AFFORD, "&e");
yml.addDefault(Messages.FORMAT_UPGRADE_COLOR_CANT_AFFORD, "&c");
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/BreakPlace.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/BreakPlace.java
index 277ece85d..e6fbd79f0 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/BreakPlace.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/BreakPlace.java
@@ -33,10 +33,10 @@
import com.andrei1058.bedwars.api.language.Messages;
import com.andrei1058.bedwars.api.region.Region;
import com.andrei1058.bedwars.api.server.ServerType;
+import com.andrei1058.bedwars.api.util.BlastProtectionUtil;
import com.andrei1058.bedwars.arena.Arena;
-import com.andrei1058.bedwars.commands.bedwars.subcmds.sensitive.setup.AutoCreateTeams;
import com.andrei1058.bedwars.configuration.Sounds;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import com.andrei1058.bedwars.popuptower.TowerEast;
import com.andrei1058.bedwars.popuptower.TowerNorth;
import com.andrei1058.bedwars.popuptower.TowerSouth;
@@ -44,7 +44,6 @@
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
-import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import org.bukkit.entity.EntityType;
@@ -61,11 +60,10 @@
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerBucketFillEvent;
import org.bukkit.event.player.PlayerInteractEvent;
+import org.jetbrains.annotations.NotNull;
import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
import static com.andrei1058.bedwars.BedWars.*;
import static com.andrei1058.bedwars.api.language.Language.getMsg;
@@ -74,9 +72,11 @@ public class BreakPlace implements Listener {
private static final List buildSession = new ArrayList<>();
private final boolean allowFireBreak;
+ private final BlastProtectionUtil blastProtection;
public BreakPlace() {
allowFireBreak = config.getBoolean(ConfigPath.GENERAL_CONFIGURATION_ALLOW_FIRE_EXTINGUISH);
+ blastProtection = new BlastProtectionUtil(nms, BedWars.getAPI());
}
@EventHandler
@@ -101,29 +101,15 @@ public void onCactus(BlockPhysicsEvent e) {
@EventHandler(ignoreCancelled = true)
- public void onBurn(BlockBurnEvent event) {
+ public void onBurn(@NotNull BlockBurnEvent event) {
IArena arena = Arena.getArenaByIdentifier(event.getBlock().getWorld().getName());
if (arena == null) return;
- if (!arena.getConfig().getBoolean(ConfigPath.ARENA_ALLOW_MAP_BREAK)) {
+ if (!arena.isAllowMapBreak()) {
event.setCancelled(true);
return;
}
- // check if bed if allow map break
- if (nms.isBed(event.getBlock().getType())) {
- for (ITeam t : arena.getTeams()) {
- for (int x = event.getBlock().getX() - 2; x < event.getBlock().getX() + 2; x++) {
- for (int y = event.getBlock().getY() - 2; y < event.getBlock().getY() + 2; y++) {
- for (int z = event.getBlock().getZ() - 2; z < event.getBlock().getZ() + 2; z++) {
- if (t.getBed().getBlockX() == x && t.getBed().getBlockY() == y && t.getBed().getBlockZ() == z) {
- if (!t.isBedDestroyed()) {
- event.setCancelled(true);
- break;
- }
- }
- }
- }
- }
- }
+ if (arena.isTeamBed(event.getBlock().getLocation())){
+ event.setCancelled(true);
}
}
@@ -173,7 +159,7 @@ public void onBlockPlace(BlockPlaceEvent e) {
// prevent modifying wood if protected
// issue #531
if (e.getBlockPlaced().getType().toString().contains("STRIPPED_") && e.getBlock().getType().toString().contains("_WOOD")) {
- if (!a.getConfig().getBoolean(ConfigPath.ARENA_ALLOW_MAP_BREAK)) {
+ if (null != arena && !arena.isAllowMapBreak()) {
e.setCancelled(true);
return;
}
@@ -181,11 +167,13 @@ public void onBlockPlace(BlockPlaceEvent e) {
a.addPlacedBlock(e.getBlock());
if (e.getBlock().getType() == Material.TNT) {
- e.getBlockPlaced().setType(Material.AIR);
- TNTPrimed tnt = Objects.requireNonNull(e.getBlock().getLocation().getWorld()).spawn(e.getBlock().getLocation().add(0.5, 0, 0.5), TNTPrimed.class);
- tnt.setFuseTicks(45);
- nms.setSource(tnt, p);
- return;
+ if (config.getBoolean(ConfigPath.GENERAL_TNT_AUTO_IGNITE)) {
+ e.getBlockPlaced().setType(Material.AIR);
+ TNTPrimed tnt = Objects.requireNonNull(e.getBlock().getLocation().getWorld()).spawn(e.getBlock().getLocation().add(0.5, 0, 0.5), TNTPrimed.class);
+ tnt.setFuseTicks(config.getInt(ConfigPath.GENERAL_TNT_FUSE_TICKS));
+ nms.setSource(tnt, p);
+ return;
+ }
} else if (BedWars.shop.getBoolean(ConfigPath.SHOP_SPECIAL_TOWER_ENABLE)) {
if (e.getBlock().getType() == Material.valueOf(shop.getString(ConfigPath.SHOP_SPECIAL_TOWER_MATERIAL))) {
@@ -315,12 +303,11 @@ public void onBlockBreak(BlockBreakEvent e) {
p.sendMessage(getMsg(p, Messages.INTERACT_CANNOT_BREAK_OWN_BED));
e.setCancelled(true);
if (e.getPlayer().getLocation().getBlock().getType().toString().contains("BED")) {
- PaperSupport.teleport(e.getPlayer(), e.getPlayer().getLocation().add(0, 0.5, 0));
+ TeleportManager.teleport(e.getPlayer(), e.getPlayer().getLocation().add(0, 0.5, 0));
}
} else {
e.setCancelled(false);
t.setBedDestroyed(true);
- a.addPlayerBedDestroyed(p);
PlayerBedBreakEvent breakEvent;
Bukkit.getPluginManager().callEvent(breakEvent = new PlayerBedBreakEvent(e.getPlayer(), a.getTeam(p), t, a,
player -> {
@@ -376,7 +363,7 @@ public void onBlockBreak(BlockBreakEvent e) {
}
}
- if (!a.getConfig().getBoolean(ConfigPath.ARENA_ALLOW_MAP_BREAK)) {
+ if (!a.isAllowMapBreak()) {
if (!a.isBlockPlaced(e.getBlock())) {
p.sendMessage(getMsg(p, Messages.INTERACT_CANNOT_BREAK_BLOCK));
e.setCancelled(true);
@@ -528,41 +515,29 @@ public void onBucketEmpty(PlayerBucketEmptyEvent e) {
}
}
-
@EventHandler
- public void onBlow(EntityExplodeEvent e) {
+ public void onBlow(@NotNull EntityExplodeEvent e) {
if (e.isCancelled()) return;
- if (e.blockList().isEmpty()) return;
- IArena a = Arena.getArenaByIdentifier(e.blockList().get(0).getWorld().getName());
+
+ IArena a = Arena.getArenaByIdentifier(e.getLocation().getWorld().getName());
if (a != null) {
- if (a.getNextEvent() != NextEvent.GAME_END) {
- List destroyed = e.blockList();
- for (Block block : new ArrayList<>(destroyed)) {
- if (!a.isBlockPlaced(block)) {
- e.blockList().remove(block);
- } else if (AutoCreateTeams.is13Higher()) {
- if (block.getType().toString().contains("_GLASS")) e.blockList().remove(block);
- }
- }
+ if (a.getStatus() == GameState.playing) {
+ e.blockList().removeIf((b) -> blastProtection.isProtected(a, e.getLocation(), b, 0.3));
+ return;
}
+ e.blockList().clear();
}
}
@EventHandler
- public void onBlockExplode(BlockExplodeEvent e) {
+ public void onBlockExplode(@NotNull BlockExplodeEvent e) {
if (e.isCancelled()) return;
if (e.blockList().isEmpty()) return;
+
IArena a = Arena.getArenaByIdentifier(e.blockList().get(0).getWorld().getName());
if (a != null) {
if (a.getNextEvent() != NextEvent.GAME_END) {
- List destroyed = e.blockList();
- for (Block block : new ArrayList<>(destroyed)) {
- if (!a.isBlockPlaced(block)) {
- e.blockList().remove(block);
- } else if (AutoCreateTeams.is13Higher()) {
- if (block.getType().toString().contains("_GLASS")) e.blockList().remove(block);
- }
- }
+ e.blockList().removeIf((b) -> blastProtection.isProtected(a, e.getBlock().getLocation(), b, 0.3));
}
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/DamageDeathMove.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/DamageDeathMove.java
index e741331a8..5d6241907 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/DamageDeathMove.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/DamageDeathMove.java
@@ -40,7 +40,7 @@
import com.andrei1058.bedwars.arena.team.BedWarsTeam;
import com.andrei1058.bedwars.configuration.Sounds;
import com.andrei1058.bedwars.listeners.dropshandler.PlayerDrops;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@@ -56,6 +56,7 @@
import org.bukkit.potion.PotionEffectType;
import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.util.Vector;
+import org.jetbrains.annotations.NotNull;
import java.text.DecimalFormat;
import java.util.Map;
@@ -124,9 +125,8 @@ public void onDamage(EntityDamageEvent e) {
}
// show player health on bow hit
- @EventHandler(priority = EventPriority.MONITOR)
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBowHit(EntityDamageByEntityEvent e) {
- if(e.isCancelled()) return;
if (e.getEntity().getType() != EntityType.PLAYER) return;
if (!(e.getDamager() instanceof Projectile)) return;
Projectile projectile = (Projectile) e.getDamager();
@@ -325,7 +325,7 @@ public void onDamageByEntity(EntityDamageByEntityEvent e) {
}
@EventHandler
- public void onDeath(PlayerDeathEvent e) {
+ public void onDeath(@NotNull PlayerDeathEvent e) {
Player victim = e.getEntity(), killer = e.getEntity().getKiller();
ITeam killersTeam = null;
IArena a = Arena.getArenaByPlayer(victim);
@@ -438,39 +438,44 @@ public void onDeath(PlayerDeathEvent e) {
if (killer != null) killersTeam = a.getTeam(killer);
String finalMessage = message;
- PlayerKillEvent playerKillEvent = new PlayerKillEvent(a, victim, killer, player -> Language.getMsg(player, finalMessage), cause);
+
+ PlayerKillEvent playerKillEvent = new PlayerKillEvent(a, victim, victimsTeam, killer, killersTeam,
+ player -> Language.getMsg(player, finalMessage), cause
+ );
Bukkit.getPluginManager().callEvent(playerKillEvent);
- if(killer != null && playerKillEvent.playSound()) {
+
+ if (killer != null && playerKillEvent.playSound()) {
Sounds.playSound(ConfigPath.SOUNDS_KILL, killer);
}
- for (Player on : a.getPlayers()) {
- Language lang = Language.getPlayerLanguage(on);
- on.sendMessage(playerKillEvent.getMessage().apply(on).
- replace("{PlayerColor}", victimsTeam.getColor().chat().toString())
- .replace("{PlayerName}", victim.getDisplayName())
- .replace("{PlayerNameUnformatted}", victim.getName())
- .replace("{PlayerTeamName}", victimsTeam.getDisplayName(lang))
- .replace("{KillerColor}", killersTeam == null ? "" : killersTeam.getColor().chat().toString())
- .replace("{KillerName}", killer == null ? "" : killer.getDisplayName())
- .replace("{KillerNameUnformatted}", killer == null ? "" : killer.getName())
- .replace("{KillerTeamName}", killersTeam == null ? "" : killersTeam.getDisplayName(lang)));
- }
- for (Player on : a.getSpectators()) {
- Language lang = Language.getPlayerLanguage(on);
- on.sendMessage(playerKillEvent.getMessage().apply(on).
- replace("{PlayerColor}", victimsTeam.getColor().chat().toString())
- .replace("{PlayerName}", victim.getDisplayName())
- .replace("{PlayerNameUnformatted}", victim.getName())
- .replace("{KillerColor}", killersTeam == null ? "" : killersTeam.getColor().chat().toString())
- .replace("{PlayerTeamName}", victimsTeam.getDisplayName(lang))
- .replace("{KillerName}", killer == null ? "" : killer.getDisplayName())
- .replace("{KillerNameUnformatted}", killer == null ? "" : killer.getName())
- .replace("{KillerTeamName}", killersTeam == null ? "" : killersTeam.getDisplayName(lang)));
+
+ if (null != playerKillEvent.getMessage()) {
+ for (Player on : a.getPlayers()) {
+ Language lang = Language.getPlayerLanguage(on);
+ on.sendMessage(playerKillEvent.getMessage().apply(on).
+ replace("{PlayerColor}", victimsTeam.getColor().chat().toString())
+ .replace("{PlayerName}", victim.getDisplayName())
+ .replace("{PlayerNameUnformatted}", victim.getName())
+ .replace("{PlayerTeamName}", victimsTeam.getDisplayName(lang))
+ .replace("{KillerColor}", killersTeam == null ? "" : killersTeam.getColor().chat().toString())
+ .replace("{KillerName}", killer == null ? "" : killer.getDisplayName())
+ .replace("{KillerNameUnformatted}", killer == null ? "" : killer.getName())
+ .replace("{KillerTeamName}", killersTeam == null ? "" : killersTeam.getDisplayName(lang)));
+ }
}
- // increase stats to killer
- if ((killer != null && !victimsTeam.equals(killersTeam)) && !victim.equals(killer)) {
- a.addPlayerKill(killer, cause.isFinalKill(), victim);
+ if (null != playerKillEvent.getMessage()) {
+ for (Player on : a.getSpectators()) {
+ Language lang = Language.getPlayerLanguage(on);
+ on.sendMessage(playerKillEvent.getMessage().apply(on).
+ replace("{PlayerColor}", victimsTeam.getColor().chat().toString())
+ .replace("{PlayerName}", victim.getDisplayName())
+ .replace("{PlayerNameUnformatted}", victim.getName())
+ .replace("{KillerColor}", killersTeam == null ? "" : killersTeam.getColor().chat().toString())
+ .replace("{PlayerTeamName}", victimsTeam.getDisplayName(lang))
+ .replace("{KillerName}", killer == null ? "" : killer.getDisplayName())
+ .replace("{KillerNameUnformatted}", killer == null ? "" : killer.getName())
+ .replace("{KillerTeamName}", killersTeam == null ? "" : killersTeam.getDisplayName(lang)));
+ }
}
// handle drops
@@ -480,7 +485,6 @@ public void onDeath(PlayerDeathEvent e) {
// send respawn packet
Bukkit.getScheduler().runTaskLater(plugin, () -> victim.spigot().respawn(), 3L);
- a.addPlayerDeath(victim);
// reset last damager
LastHit lastHit = LastHit.getLastHit(victim);
@@ -489,7 +493,7 @@ public void onDeath(PlayerDeathEvent e) {
}
- if (victimsTeam.isBedDestroyed() && victimsTeam.getSize() == 1 && a.getConfig().getBoolean(ConfigPath.ARENA_DISABLE_GENERATOR_FOR_EMPTY_TEAMS)) {
+ if (victimsTeam.isBedDestroyed() && victimsTeam.getSize() == 1 && a.getConfig().getBoolean(ConfigPath.ARENA_DISABLE_GENERATOR_FOR_EMPTY_TEAMS)) {
for (IGenerator g : victimsTeam.getGenerators()) {
g.disable();
}
@@ -608,7 +612,7 @@ public void onMove(PlayerMoveEvent e) {
if (a.isSpectator(e.getPlayer()) || a.isReSpawning(e.getPlayer())) {
if (e.getTo().getY() < 0) {
- PaperSupport.teleportC(e.getPlayer(), a.isSpectator(e.getPlayer()) ? a.getSpectatorLocation() : a.getReSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(e.getPlayer(), a.isSpectator(e.getPlayer()) ? a.getSpectatorLocation() : a.getReSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
e.getPlayer().setAllowFlight(true);
e.getPlayer().setFlying(true);
// how to remove fall velocity?
@@ -643,9 +647,9 @@ public void onMove(PlayerMoveEvent e) {
if (e.getPlayer().getLocation().getBlockY() <= 0) {
ITeam bwt = a.getTeam(e.getPlayer());
if (bwt != null) {
- PaperSupport.teleport(e.getPlayer(), bwt.getSpawn());
+ TeleportManager.teleport(e.getPlayer(), bwt.getSpawn());
} else {
- PaperSupport.teleport(e.getPlayer(), a.getSpectatorLocation());
+ TeleportManager.teleport(e.getPlayer(), a.getSpectatorLocation());
}
}
}
@@ -653,7 +657,7 @@ public void onMove(PlayerMoveEvent e) {
} else {
if (config.getBoolean(ConfigPath.LOBBY_VOID_TELEPORT_ENABLED) && e.getPlayer().getWorld().getName().equalsIgnoreCase(config.getLobbyWorldName()) && BedWars.getServerType() == ServerType.MULTIARENA) {
if (e.getTo().getY() < config.getInt(ConfigPath.LOBBY_VOID_TELEPORT_HEIGHT)) {
- PaperSupport.teleportC(e.getPlayer(), config.getConfigLoc("lobbyLoc"), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(e.getPlayer(), config.getConfigLoc("lobbyLoc"), PlayerTeleportEvent.TeleportCause.PLUGIN);
}
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/QuitAndTeleportListener.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/QuitAndTeleportListener.java
index 68f70380c..2afbcc221 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/QuitAndTeleportListener.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/QuitAndTeleportListener.java
@@ -21,7 +21,6 @@
package com.andrei1058.bedwars.listeners;
import com.andrei1058.bedwars.BedWars;
-import com.andrei1058.bedwars.api.arena.GameState;
import com.andrei1058.bedwars.api.arena.IArena;
import com.andrei1058.bedwars.api.configuration.ConfigPath;
import com.andrei1058.bedwars.api.language.Language;
@@ -35,10 +34,11 @@
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerQuitEvent;
-import org.bukkit.event.player.PlayerTeleportEvent;
+import org.jetbrains.annotations.NotNull;
import java.util.UUID;
@@ -47,7 +47,7 @@
public class QuitAndTeleportListener implements Listener {
@EventHandler
- public void onLeave(PlayerQuitEvent e) {
+ public void onLeave(@NotNull PlayerQuitEvent e) {
Player p = e.getPlayer();
// Remove from arena
IArena a = Arena.getArenaByPlayer(p);
@@ -100,54 +100,31 @@ public void onLeave(PlayerQuitEvent e) {
CmdStats.getStatsCoolDown().remove(e.getPlayer().getUniqueId());
}
- @EventHandler
- public void onTeleport(PlayerTeleportEvent e) {
- if (e == null) return;
- if (e.isCancelled()) return;
- if (e.getTo() == null) return;
- if (e.getTo().getWorld() == null) return;
- IArena a = Arena.getArenaByPlayer(e.getPlayer());
- if (a != null) {
- IArena a1 = Arena.getArenaByIdentifier(e.getTo().getWorld().getName());
- if (a1 != null) {
- if (!a1.equals(a)) {
- if (a.isSpectator(e.getPlayer())) a.removeSpectator(e.getPlayer(), false);
- if (a.isPlayer(e.getPlayer())) a.removePlayer(e.getPlayer(), false);
- e.getPlayer().sendMessage("PlayerTeleportEvent something went wrong. You have joined an arena world while playing on a different map.");
- }
- }
+ /**
+ * Handle players teleported outside.
+ */
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onWorldChange(@NotNull PlayerChangedWorldEvent e) {
+
+ // if player was teleported outside arena
+ IArena arena = Arena.getArenaByPlayer(e.getPlayer());
+
+ if (null == arena) {
+ return;
}
- }
- @EventHandler
- public void onWorldChange(PlayerChangedWorldEvent e) {
- // I think this for shared mode should be removed
- if (BedWars.getServerType() == ServerType.SHARED) {
- if (BedWars.config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_USE_LOBBY_SIDEBAR)) {
- //Bukkit.getScheduler().runTaskLater(plugin, ()-> {
- if (e.getPlayer().getWorld().getName().equalsIgnoreCase(BedWars.getLobbyWorld())) {
- SidebarService.getInstance().giveSidebar(e.getPlayer(), null, true);
- } else {
- SidebarService.getInstance().remove(e.getPlayer());
- }
- //}, 2L);
- }
- } else if (BedWars.getServerType() == ServerType.MULTIARENA) {
- if (BedWars.config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_USE_LOBBY_SIDEBAR)) {
- if (e.getPlayer().getWorld().getName().equalsIgnoreCase(BedWars.getLobbyWorld())) {
- SidebarService.getInstance().giveSidebar(e.getPlayer(), null, true);
- }
- }
+ if (e.getPlayer().getWorld().getName().equals(arena.getWorldName())) {
+ return;
}
- IArena a = Arena.getArenaByPlayer(e.getPlayer());
- if (a != null) {
- if (a.isPlayer(e.getPlayer())) {
- if (a.getStatus() == GameState.waiting || a.getStatus() == GameState.starting) return;
- if (!e.getPlayer().getWorld().getName().equalsIgnoreCase(a.getWorld().getName())) {
- a.removePlayer(e.getPlayer(), BedWars.getServerType() == ServerType.BUNGEE);
- debug(e.getPlayer().getName() + " was removed from " + a.getDisplayName() + " because he was teleported outside the arena.");
- }
- }
+
+ if (arena.isPlayer(e.getPlayer())) {
+ // it will teleport you to the lobby world or cached location
+ arena.removePlayer(e.getPlayer(), false);
+ }
+
+ if (arena.isSpectator(e.getPlayer())) {
+ // it will teleport you to the lobby world or cached location
+ arena.removeSpectator(e.getPlayer(), false);
}
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/Warnings.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/Warnings.java
index 15df75e18..55a394cd9 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/Warnings.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/Warnings.java
@@ -4,6 +4,7 @@
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
@@ -14,6 +15,7 @@ public Warnings(BedWars plugin) {
this.plugin = plugin;
}
+ @EventHandler
public void onJoin(PlayerJoinEvent e) {
Player player = e.getPlayer();
if(!player.isOp()) return;
@@ -26,7 +28,7 @@ public void onJoin(PlayerJoinEvent e) {
if(Bukkit.getServer().getSpawnRadius() > 0) {
Bukkit.getScheduler().runTaskLater(plugin, () -> {
- player.sendMessage(ChatColor.RED + "[BedWars1058] Your spawn-protection in server.properties is enabled. "+ChatColor.YELLOW+"This might mess with BedWars arenas!"+ChatColor.GRAY+" I highly reccomend setting it to 0.");
+ player.sendMessage(ChatColor.RED + "[BedWars1058] Your spawn-protection in server.properties is enabled. "+ChatColor.YELLOW+"This might mess with BedWars arenas!"+ChatColor.GRAY+" It is highly reccomend setting it to 0.");
}, 5);
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/arenaselector/ArenaSelectorListener.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/arenaselector/ArenaSelectorListener.java
index 231032c98..8ac6346a9 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/arenaselector/ArenaSelectorListener.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/arenaselector/ArenaSelectorListener.java
@@ -63,21 +63,25 @@ public void onArenaSelectorClick(InventoryClickEvent event) {
String arenaName = data.split("=")[1];
IArena arena = Arena.getArenaByName(arenaName);
if (arena == null) return;
+ GameState status = arena.getStatus();
if (event.getClick() == ClickType.LEFT) {
- if ((arena.getStatus() == GameState.waiting || arena.getStatus() == GameState.starting) && arena.addPlayer(player, false)) {
+ if ((status == GameState.waiting || status == GameState.starting) && arena.addPlayer(player, false)) {
Sounds.playSound("join-allowed", player);
} else {
Sounds.playSound("join-denied", player);
player.sendMessage(Language.getMsg(player, Messages.ARENA_JOIN_DENIED_SELECTOR));
}
} else if (event.getClick() == ClickType.RIGHT) {
- if (arena.getStatus() == GameState.playing && arena.addSpectator(player, false, null)) {
+ if (status == GameState.playing && arena.addSpectator(player, false, null)) {
Sounds.playSound("spectate-allowed", player);
} else {
player.sendMessage(Language.getMsg(player, Messages.ARENA_SPECTATE_DENIED_SELECTOR));
Sounds.playSound("spectate-denied", player);
}
+ } else {
+ // Incorrect click
+ return;
}
player.closeInventory();
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/blockstatus/BlockStatusListener.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/blockstatus/BlockStatusListener.java
index 6345d3374..b3873da83 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/blockstatus/BlockStatusListener.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/blockstatus/BlockStatusListener.java
@@ -70,6 +70,8 @@ public static void updateBlock(Arena a) {
path = ConfigPath.SIGNS_STATUS_BLOCK_RESTARTING_MATERIAL;
data = ConfigPath.SIGNS_STATUS_BLOCK_RESTARTING_DATA;
break;
+ default:
+ throw new IllegalStateException("Unhandled game status!");
}
BedWars.nms.setJoinSignBackground(s.getState(), Material.valueOf(BedWars.signs.getString(path)));
BedWars.nms.setJoinSignBackgroundBlockData(s.getState(), (byte) BedWars.signs.getInt(data));
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerBungee.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerBungee.java
index a25fb8d45..1262b0779 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerBungee.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerBungee.java
@@ -30,7 +30,7 @@
import com.andrei1058.bedwars.configuration.Permissions;
import com.andrei1058.bedwars.configuration.Sounds;
import com.andrei1058.bedwars.lobbysocket.LoadedUser;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import com.andrei1058.bedwars.support.preloadedparty.PreLoadedParty;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -74,34 +74,42 @@ public void onLogin(PlayerLoginEvent e) {
}
IArena arena = Arena.getArenaByIdentifier(proxyUser.getArenaIdentifier());
+ GameState status = arena != null ? arena.getStatus() : null;
+
// check if arena is not available, time out etc.
- if (arena == null || proxyUser.isTimedOut() || arena.getStatus() == GameState.restarting) {
+ if (arena == null || proxyUser.isTimedOut() || status == GameState.restarting) {
e.disallow(PlayerLoginEvent.Result.KICK_OTHER, playerLang.m(Messages.ARENA_STATUS_RESTARTING_NAME));
proxyUser.destroy("Time out or game unavailable at PlayerLoginEvent");
return;
}
// Player logic
- if (arena.getStatus() == GameState.starting || arena.getStatus() == GameState.waiting) {
- // Vip join/ kick feature
- if (arena.getPlayers().size() >= arena.getMaxPlayers() && Arena.isVip(p)) {
- boolean canJoin = false;
- for (Player inGame : arena.getPlayers()) {
- if (!Arena.isVip(inGame)) {
- canJoin = true;
- inGame.kickPlayer(getMsg(inGame, Messages.ARENA_JOIN_VIP_KICK));
- break;
+ switch (status) {
+ case starting:
+ case waiting:
+ // Vip join/ kick feature
+ if (arena.getPlayers().size() >= arena.getMaxPlayers() && Arena.isVip(p)) {
+ boolean canJoin = false;
+ for (Player inGame : arena.getPlayers()) {
+ if (!Arena.isVip(inGame)) {
+ canJoin = true;
+ inGame.kickPlayer(getMsg(inGame, Messages.ARENA_JOIN_VIP_KICK));
+ break;
+ }
+ }
+ if (!canJoin) {
+ e.disallow(PlayerLoginEvent.Result.KICK_FULL, playerLang.m(Messages.COMMAND_JOIN_DENIED_IS_FULL_OF_VIPS));
}
}
- if (!canJoin) {
- e.disallow(PlayerLoginEvent.Result.KICK_FULL, playerLang.m(Messages.COMMAND_JOIN_DENIED_IS_FULL_OF_VIPS));
+ break;
+ case playing:
+ // Spectator logic
+ if (!arena.isAllowSpectate()) {
+ e.disallow(PlayerLoginEvent.Result.KICK_OTHER, playerLang.m(Messages.COMMAND_JOIN_SPECTATOR_DENIED_MSG));
}
- }
- } else if (arena.getStatus() == GameState.playing) {
- // Spectator logic
- if (!arena.isAllowSpectate()){
- e.disallow(PlayerLoginEvent.Result.KICK_OTHER, playerLang.m(Messages.COMMAND_JOIN_SPECTATOR_DENIED_MSG));
- }
+ break;
+ default:
+ throw new IllegalStateException("Unhandled game status!");
}
}
@@ -123,7 +131,7 @@ public void onPlayerJoin(PlayerJoinEvent e) {
Bukkit.dispatchCommand(p, "bw");
World mainWorld = Bukkit.getWorlds().get(0);
if (mainWorld != null) {
- PaperSupport.teleportC(p, mainWorld.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ TeleportManager.teleportC(p, mainWorld.getSpawnLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
}
// hide admin to in game users
for (Player inGame : Bukkit.getOnlinePlayers()){
@@ -160,9 +168,10 @@ public void onPlayerJoin(PlayerJoinEvent e) {
// There's nothing to re-join, so he might want to join an arena
IArena arena = Arena.getArenaByIdentifier(proxyUser.getArenaIdentifier());
+ GameState status = arena != null ? arena.getStatus() : null;
// Check if the arena is still available or request time-out etc.
- if (arena == null || proxyUser.isTimedOut() || arena.getStatus() == GameState.restarting) {
+ if (arena == null || proxyUser.isTimedOut() || status == GameState.restarting) {
p.kickPlayer(playerLang.m(Messages.ARENA_STATUS_RESTARTING_NAME));
proxyUser.destroy("Time out or game unavailable at PlayerLoginEvent");
return;
@@ -173,58 +182,64 @@ public void onPlayerJoin(PlayerJoinEvent e) {
JoinHandlerCommon.displayCustomerDetails(p);
// Join as player
- if (arena.getStatus() == GameState.starting || arena.getStatus() == GameState.waiting) {
- Sounds.playSound("join-allowed", p);
-
- // If has no party
- if (proxyUser.getPartyOwnerOrSpectateTarget() == null) {
- // Add to arena
- if (!arena.addPlayer(p, true)){
- p.kickPlayer(Language.getMsg(p, Messages.ARENA_JOIN_DENIED_NO_PROXY));
- }
- } else {
- // If is member or owner of a remote party
-
- Player partyOwner = Bukkit.getPlayer(proxyUser.getPartyOwnerOrSpectateTarget());
- // If party owner is connected
- if (partyOwner != null && partyOwner.isOnline()) {
- // If joiner is the party owner create the party
- if (partyOwner.equals(p)) {
- BedWars.getParty().createParty(p);
-
- // Handle to-be-teamed-up players. A list used if some party members join before the party owner.
- PreLoadedParty preLoadedParty = PreLoadedParty.getPartyByOwner(partyOwner.getName());
- if (preLoadedParty != null) {
- preLoadedParty.teamUp();
+ switch (status) {
+ case starting:
+ case waiting:
+ Sounds.playSound("join-allowed", p);
+
+ // If has no party
+ if (proxyUser.getPartyOwnerOrSpectateTarget() == null) {
+ // Add to arena
+ if (!arena.addPlayer(p, true)) {
+ p.kickPlayer(Language.getMsg(p, Messages.ARENA_JOIN_DENIED_NO_PROXY));
+ }
+ } else {
+ // If is member or owner of a remote party
+
+ Player partyOwner = Bukkit.getPlayer(proxyUser.getPartyOwnerOrSpectateTarget());
+ // If party owner is connected
+ if (partyOwner != null && partyOwner.isOnline()) {
+ // If joiner is the party owner create the party
+ if (partyOwner.equals(p)) {
+ BedWars.getParty().createParty(p);
+
+ // Handle to-be-teamed-up players. A list used if some party members join before the party owner.
+ PreLoadedParty preLoadedParty = PreLoadedParty.getPartyByOwner(partyOwner.getName());
+ if (preLoadedParty != null) {
+ preLoadedParty.teamUp();
+ }
+ } else {
+ // Add to a existing party
+ BedWars.getParty().addMember(partyOwner, p);
}
} else {
- // Add to a existing party
- BedWars.getParty().addMember(partyOwner, p);
+ // If a party member joined before the party owner create a waiting list
+ // to-be-teamed-up players, when the owner will join
+ PreLoadedParty preLoadedParty = PreLoadedParty.getPartyByOwner(proxyUser.getPartyOwnerOrSpectateTarget());
+ if (preLoadedParty == null) {
+ preLoadedParty = new PreLoadedParty(proxyUser.getPartyOwnerOrSpectateTarget());
+ }
+ preLoadedParty.addMember(p);
}
- } else {
- // If a party member joined before the party owner create a waiting list
- // to-be-teamed-up players, when the owner will join
- PreLoadedParty preLoadedParty = PreLoadedParty.getPartyByOwner(proxyUser.getPartyOwnerOrSpectateTarget());
- if (preLoadedParty == null) {
- preLoadedParty = new PreLoadedParty(proxyUser.getPartyOwnerOrSpectateTarget());
+ if (!arena.addPlayer(p, true)) {
+ p.kickPlayer(Language.getMsg(p, Messages.ARENA_JOIN_DENIED_NO_PROXY));
}
- preLoadedParty.addMember(p);
- }
- if (!arena.addPlayer(p, true)){
- p.kickPlayer(Language.getMsg(p, Messages.ARENA_JOIN_DENIED_NO_PROXY));
}
- }
- } else {
- // Join as spectator
- Sounds.playSound("spectate-allowed", p);
- Location spectatorTarget = null;
- if (proxyUser.getPartyOwnerOrSpectateTarget() != null) {
- Player targetPlayer = Bukkit.getPlayer(proxyUser.getPartyOwnerOrSpectateTarget());
- if (targetPlayer != null) {
- spectatorTarget = targetPlayer.getLocation();
+ break;
+ case playing:
+ // Join as spectator
+ Sounds.playSound("spectate-allowed", p);
+ Location spectatorTarget = null;
+ if (proxyUser.getPartyOwnerOrSpectateTarget() != null) {
+ Player targetPlayer = Bukkit.getPlayer(proxyUser.getPartyOwnerOrSpectateTarget());
+ if (targetPlayer != null) {
+ spectatorTarget = targetPlayer.getLocation();
+ }
}
- }
- arena.addSpectator(p, false, spectatorTarget);
+ arena.addSpectator(p, false, spectatorTarget);
+ break;
+ default:
+ throw new IllegalStateException("Unhandled game status!");
}
proxyUser.destroy("Joined as player or spectator. PreLoaded user no longer needed.");
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerMultiArena.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerMultiArena.java
index 0d2b5832e..98b568145 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerMultiArena.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/listeners/joinhandler/JoinListenerMultiArena.java
@@ -24,7 +24,7 @@
import com.andrei1058.bedwars.arena.Arena;
import com.andrei1058.bedwars.arena.ReJoin;
import com.andrei1058.bedwars.sidebar.SidebarService;
-import com.andrei1058.bedwars.support.paper.PaperSupport;
+import com.andrei1058.bedwars.support.paper.TeleportManager;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -82,7 +82,7 @@ public void onJoin(PlayerJoinEvent e) {
// Teleport to lobby location
Location lobbyLocation = config.getConfigLoc("lobbyLoc");
if (lobbyLocation != null && lobbyLocation.getWorld() != null) {
- PaperSupport.teleport(p, lobbyLocation);
+ TeleportManager.teleport(p, lobbyLocation);
}
// Send items
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/maprestore/internal/InternalAdapter.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/maprestore/internal/InternalAdapter.java
index 7fb324c2b..20fab597e 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/maprestore/internal/InternalAdapter.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/maprestore/internal/InternalAdapter.java
@@ -322,6 +322,11 @@ public void convertWorlds() {
});
}
+ @Override
+ public String getDisplayName() {
+ return "Internal Restore Adapter";
+ }
+
private void deleteWorldTrash(String world) {
for (File f : new File[]{new File(Bukkit.getWorldContainer(), world + "/level.dat"),
new File(Bukkit.getWorldContainer(), world + "/level.dat_mcr"),
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/ShopManager.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/ShopManager.java
index 06a85e418..3df402c44 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/ShopManager.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/ShopManager.java
@@ -352,7 +352,7 @@ private void saveDefaults() {
adCategoryContentTier(ConfigPath.SHOP_PATH_CATEGORY_UTILITY, "tower", 31, "tier1",
BedWars.getForCurrentVersion("CHEST", "CHEST", "CHEST"), 0, 1, false, 24, "iron", false, false);
- addBuyItem(ConfigPath.SHOP_PATH_CATEGORY_UTILITY, "tower", "tier1", "tower", BedWars.getForCurrentVersion("TOWER", "TOWER", "TOWER"),
+ addBuyItem(ConfigPath.SHOP_PATH_CATEGORY_UTILITY, "tower", "tier1", "tower", BedWars.getForCurrentVersion("CHEST", "CHEST", "CHEST"),
0, 1, "", "", "", false);
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/listeners/SpecialsListener.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/listeners/SpecialsListener.java
index 6e806985a..09c28a0b8 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/listeners/SpecialsListener.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/shop/listeners/SpecialsListener.java
@@ -29,7 +29,9 @@
import com.andrei1058.bedwars.arena.Arena;
import com.andrei1058.bedwars.arena.Misc;
import org.bukkit.Bukkit;
+import org.bukkit.Location;
import org.bukkit.Material;
+import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -52,6 +54,10 @@ public void onSpecialInteract(PlayerInteractEvent e) {
if (a == null) return;
if (a.getRespawnSessions().containsKey(e.getPlayer())) return;
if (!a.isPlayer(p)) return;
+ Block b = e.getClickedBlock();
+ if (b == null) return;
+ Location l = b.getLocation();
+
if (BedWars.shop.getYml().getBoolean(ConfigPath.SHOP_SPECIAL_SILVERFISH_ENABLE)) {
if (!Misc.isProjectile(Material.valueOf(BedWars.shop.getYml().getString(ConfigPath.SHOP_SPECIAL_SILVERFISH_MATERIAL)))) {
if (i.getType() == Material.valueOf(BedWars.shop.getYml().getString(ConfigPath.SHOP_SPECIAL_SILVERFISH_MATERIAL))
@@ -59,7 +65,7 @@ public void onSpecialInteract(PlayerInteractEvent e) {
e.setCancelled(true);
ITeam playerTeam = a.getTeam(p);
PlayerBedBugSpawnEvent event = new PlayerBedBugSpawnEvent(p, playerTeam, a);
- nms.spawnSilverfish(p.getLocation().add(0, 1, 0), playerTeam, BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_SILVERFISH_SPEED),
+ nms.spawnSilverfish(l.add(0, 1, 0), playerTeam, BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_SILVERFISH_SPEED),
BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_SILVERFISH_HEALTH), BedWars.shop.getInt(ConfigPath.SHOP_SPECIAL_SILVERFISH_DESPAWN),
BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_SILVERFISH_DAMAGE));
Bukkit.getPluginManager().callEvent(event);
@@ -77,7 +83,7 @@ public void onSpecialInteract(PlayerInteractEvent e) {
e.setCancelled(true);
ITeam playerTeam = a.getTeam(p);
PlayerDreamDefenderSpawnEvent event = new PlayerDreamDefenderSpawnEvent(p, playerTeam, a);
- nms.spawnIronGolem(p.getLocation().add(0, 1, 0), playerTeam, BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_IRON_GOLEM_SPEED),
+ nms.spawnIronGolem(l.add(0, 1, 0), playerTeam, BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_IRON_GOLEM_SPEED),
BedWars.shop.getYml().getDouble(ConfigPath.SHOP_SPECIAL_IRON_GOLEM_HEALTH), BedWars.shop.getInt(ConfigPath.SHOP_SPECIAL_IRON_GOLEM_DESPAWN));
Bukkit.getPluginManager().callEvent(event);
if (!nms.isProjectile(i)) {
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwSidebar.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwSidebar.java
index dce146f14..a8deb3fd9 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwSidebar.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwSidebar.java
@@ -3,6 +3,7 @@
import com.andrei1058.bedwars.BedWars;
import com.andrei1058.bedwars.api.arena.GameState;
import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.stats.DefaultStatistics;
import com.andrei1058.bedwars.api.arena.team.ITeam;
import com.andrei1058.bedwars.api.configuration.ConfigPath;
import com.andrei1058.bedwars.api.language.Language;
@@ -10,24 +11,23 @@
import com.andrei1058.bedwars.api.server.ServerType;
import com.andrei1058.bedwars.api.sidebar.ISidebar;
import com.andrei1058.bedwars.arena.Arena;
+import com.andrei1058.bedwars.arena.stats.StatisticsOrdered;
import com.andrei1058.bedwars.levels.internal.PlayerLevel;
import com.andrei1058.bedwars.stats.PlayerStats;
import com.andrei1058.spigot.sidebar.*;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
-import org.bukkit.World;
import org.bukkit.entity.Player;
-import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;
+import java.util.concurrent.ConcurrentLinkedQueue;
import static com.andrei1058.bedwars.BedWars.*;
-import static com.andrei1058.bedwars.api.language.Language.getMsg;
+import static com.andrei1058.bedwars.api.language.Language.*;
public class BwSidebar implements ISidebar {
@@ -38,31 +38,40 @@ public class BwSidebar implements ISidebar {
}
};
- private static final String SPECTATOR_TAB = "spectators010101";
- private static final String TEAM_PREFIX = "?_";
-
private final Player player;
private IArena arena;
private Sidebar handle;
+ private TabHeaderFooter headerFooter;
private final SimpleDateFormat dateFormat;
private final SimpleDateFormat nextEventDateFormat;
- private final HashMap tabList = new HashMap<>();
- private final List persistentProviders = new ArrayList<>();
+ private final ConcurrentLinkedQueue persistentProviders = new ConcurrentLinkedQueue<>();
+
+ private final BwTabList tabList;
+ public @Nullable StatisticsOrdered topStatistics;
protected BwSidebar(Player player) {
this.player = player;
nextEventDateFormat = new SimpleDateFormat(getMsg(player, Messages.FORMATTING_SCOREBOARD_NEXEVENT_TIMER));
nextEventDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
dateFormat = new SimpleDateFormat(getMsg(player, Messages.FORMATTING_SCOREBOARD_DATE));
+ this.tabList = new BwTabList(this);
+
+ // Persistent placeholders
+ String poweredBy = BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_POWERED_BY);
+ this.registerPersistentPlaceholder(new PlaceholderProvider("{poweredBy}", () -> poweredBy));
+ String serverId = config.getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_SERVER_ID);
+ this.registerPersistentPlaceholder(new PlaceholderProvider("{server}", () -> serverId));
+ String serverIp = BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP);
+ this.registerPersistentPlaceholder(new PlaceholderProvider("{serverIp}", () -> serverIp));
}
public void remove() {
if (handle == null) {
return;
}
- tabList.forEach((k, v) -> handle.removeTab(k));
+ tabList.onSidebarRemoval();
handle.remove(player);
}
@@ -71,7 +80,12 @@ public void setContent(List titleArray, List lineArray, @Nullabl
SidebarLine title = this.normalizeTitle(titleArray);
List lines = this.normalizeLines(lineArray);
- List placeholders = this.getPlaceholders();
+ if (null == arena) {
+ // clean up
+ setTopStatistics(null);
+ }
+
+ ConcurrentLinkedQueue placeholders = this.getPlaceholders(this.getPlayer());
placeholders.addAll(this.persistentProviders);
// if it is the first time setting content we create the handle
@@ -79,9 +93,7 @@ public void setContent(List titleArray, List lineArray, @Nullabl
handle = SidebarService.getInstance().getSidebarHandler().createSidebar(title, lines, placeholders);
handle.add(player);
} else {
- while (handle.lineCount() > 0) {
- handle.removeLine(0);
- }
+ handle.clearLines();
Bukkit.getScheduler().runTaskLater(plugin, () -> {
new ArrayList<>(handle.getPlaceholders()).forEach(p -> handle.removePlaceholder(p.getPlaceholder()));
placeholders.forEach(p -> handle.addPlaceholder(p));
@@ -89,8 +101,8 @@ public void setContent(List titleArray, List lineArray, @Nullabl
lines.forEach(l -> handle.addLine(l));
}, 2L);
}
- handlePlayerList();
- setHeaderFooter();
+ tabList.handlePlayerList();
+ assignTabHeaderFooter();
}
public Player getPlayer() {
@@ -99,38 +111,46 @@ public Player getPlayer() {
@SuppressWarnings("ConstantConditions")
public SidebarLine normalizeTitle(@Nullable List titleArray) {
- String[] aolo = new String[titleArray.size()];
+ String[] data = new String[titleArray.size()];
for (int x = 0; x < titleArray.size(); x++) {
- aolo[x] = titleArray.get(x);
+ data[x] = titleArray.get(x);
}
return null == titleArray || titleArray.isEmpty() ?
EMPTY_TITLE :
- new SidebarLineAnimated(aolo);
+ new SidebarLineAnimated(data);
}
+ /**
+ * Normalize lines where subject player is sidebar holder.
+ */
@Contract(pure = true)
- public @NotNull List normalizeLines(@NotNull List lineArray) {
- List lines = new ArrayList<>();
+ public @NotNull LinkedList normalizeLines(@NotNull List lineArray) {
+ LinkedList lines = new LinkedList<>();
int teamCount = 0;
Language language = Language.getPlayerLanguage(player);
String genericTeamFormat = language.m(Messages.FORMATTING_SCOREBOARD_TEAM_GENERIC);
+ StatisticsOrdered.StringParser statParser = null == topStatistics ? null : topStatistics.newParser();
+
for (String line : lineArray) {
// convert old placeholders
line = line.replace("{server_ip}", "{serverIp}");
// generic team placeholder {team}
- if (arena != null) {
+ if (null != arena) {
if (line.trim().equals("{team}")) {
if (arena.getTeams().size() > teamCount) {
ITeam team = arena.getTeams().get(teamCount++);
String teamName = team.getDisplayName(language);
+ String teamLetter = String.valueOf(!teamName.isEmpty() ? teamName.charAt(0) : "");
+
line = genericTeamFormat
- .replace("{TeamLetter}", String.valueOf(teamName.length() != 0 ? teamName.charAt(0) : ""))
+ .replace("{TeamLetter}", teamLetter)
.replace("{TeamColor}", team.getColor().chat().toString())
.replace("{TeamName}", teamName)
.replace("{TeamStatus}", "{Team" + team.getName() + "Status}");
+
} else {
// skip line
continue;
@@ -144,48 +164,106 @@ public SidebarLine normalizeTitle(@Nullable List titleArray) {
for (ITeam currentTeam : arena.getTeams()) {
final ChatColor color = currentTeam.getColor().chat();
+ final String teamName = currentTeam.getDisplayName(language);
+ final String teamLetter = String.valueOf(!teamName.isEmpty() ? teamName.charAt(0) : "");
+
// Static team placeholders
line = line
.replace("{Team" + currentTeam.getName() + "Color}", color.toString())
- .replace("{Team" + currentTeam.getName() + "Name}", currentTeam.getDisplayName(language));
+ .replace("{Team" + currentTeam.getName() + "Name}", teamName)
+ .replace("{Team" + currentTeam.getName() + "Letter}", teamLetter);
+
+ boolean isMember = currentTeam.isMember(getPlayer()) || currentTeam.wasMember(getPlayer().getUniqueId());
+ if (isMember) {
+ HashMap replacements = tabList.getTeamReplacements(currentTeam);
+ for (Map.Entry entry : replacements.entrySet()) {
+ line = line.replace(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ if (arena.getWinner() != null) {
+ String winnerDisplayName = arena.getWinner().getDisplayName(Language.getPlayerLanguage(getPlayer()));
+ line = line
+ .replace(
+ "{winnerTeamName}",
+ winnerDisplayName
+ ).replace(
+ "{winnerTeamLetter}",
+ arena.getWinner().getColor().chat() + (winnerDisplayName.substring(0, 1))
+ ).replace(
+ "{winnerTeamColor}",
+ arena.getWinner().getColor().chat().toString()
+ );
+ }
+
+ if (null != this.topStatistics && null != statParser) {
+ line = statParser.parseString(line, language, language.m(Messages.MEANING_NOBODY));
+ if (null == line) {
+ continue;
+ }
}
}
// General static placeholders
line = line
.replace("{serverIp}", BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP))
+ .replace("{poweredBy}", BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_POWERED_BY))
.replace("{version}", plugin.getDescription().getVersion())
.replace("{server}", config.getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_SERVER_ID))
- .replace("{playername}", player.getName())
- .replace("{player}", player.getDisplayName())
- .replace("{money}", String.valueOf(getEconomy().getMoney(player)));
+ ;
// Add the line to the sidebar
String finalTemp = line;
- lines.add(new SidebarLine() {
- @Override
- public @NotNull String getLine() {
- return finalTemp;
- }
- });
+ String[] divided = finalTemp.split(",");
+
+ SidebarLine sidebarLine;
+
+ if (divided.length > 1) {
+ sidebarLine = normalizeTitle(Arrays.asList(divided));
+ } else {
+ sidebarLine = new SidebarLine() {
+ @Override
+ public @NotNull String getLine() {
+ return finalTemp;
+ }
+ };
+ }
+
+ lines.add(sidebarLine);
}
return lines;
}
- @Contract(pure = true)
- private @NotNull List getPlaceholders() {
- List providers = new ArrayList<>();
+ @Override
+ public void giveUpdateTabFormat(@NotNull Player player, boolean skipStateCheck, @Nullable Boolean spectator) {
+ tabList.giveUpdateTabFormat(player, skipStateCheck, spectator);
+ }
+ @SuppressWarnings("removal")
+ @Override
+ public boolean isTabFormattingDisabled() {
+ return tabList.isTabFormattingDisabled();
+ }
+
+ /**
+ * Get placeholders for given player.
+ *
+ * @param player subject.
+ * @return placeholders.
+ */
+ @Contract(pure = true)
+ @NotNull ConcurrentLinkedQueue getPlaceholders(@NotNull Player player) {
+ ConcurrentLinkedQueue providers = new ConcurrentLinkedQueue<>();
providers.add(new PlaceholderProvider("{player}", player::getDisplayName));
- providers.add(new PlaceholderProvider("{playerName}", player::getCustomName));
providers.add(new PlaceholderProvider("{money}", () -> String.valueOf(getEconomy().getMoney(player))));
+ providers.add(new PlaceholderProvider("{playerName}", player::getCustomName));
providers.add(new PlaceholderProvider("{date}", () -> dateFormat.format(new Date(System.currentTimeMillis()))));
- providers.add(new PlaceholderProvider("{serverIp}", () -> BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP)));
+ // fixme 29/08/2023: disabled for now because this is not a dynamic placeholder. Let's see what's the impact.
+// providers.add(new PlaceholderProvider("{serverIp}", () -> BedWars.config.getString(ConfigPath.GENERAL_CONFIG_PLACEHOLDERS_REPLACEMENTS_SERVER_IP)));
providers.add(new PlaceholderProvider("{version}", () -> plugin.getDescription().getVersion()));
- providers.add(new PlaceholderProvider("{server}", () -> config.getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_SERVER_ID)));
- PlayerLevel level = PlayerLevel.getLevelByPlayer(getPlayer().getUniqueId());
+ PlayerLevel level = PlayerLevel.getLevelByPlayer(player.getUniqueId());
if (null != level) {
providers.add(new PlaceholderProvider("{progress}", level::getProgress));
providers.add(new PlaceholderProvider("{level}", () -> String.valueOf(level.getLevelName())));
@@ -194,47 +272,70 @@ public SidebarLine normalizeTitle(@Nullable List titleArray) {
providers.add(new PlaceholderProvider("{requiredXp}", level::getFormattedRequiredXp));
}
- if (noArena()) {
+ if (hasNoArena()) {
providers.add(new PlaceholderProvider("{on}", () ->
String.valueOf(Bukkit.getOnlinePlayers().size()))
);
- PlayerStats stats = BedWars.getStatsManager().get(getPlayer().getUniqueId());
+ PlayerStats persistentStats = BedWars.getStatsManager().get(player.getUniqueId());
//noinspection ConstantConditions
- if (null != stats) {
+ if (null != persistentStats) {
providers.add(new PlaceholderProvider("{kills}", () ->
- String.valueOf(stats.getKills()))
+ String.valueOf(persistentStats.getKills()))
);
providers.add(new PlaceholderProvider("{finalKills}", () ->
- String.valueOf(stats.getFinalKills()))
+ String.valueOf(persistentStats.getFinalKills()))
);
providers.add(new PlaceholderProvider("{beds}", () ->
- String.valueOf(stats.getBedsDestroyed()))
+ String.valueOf(persistentStats.getBedsDestroyed()))
);
providers.add(new PlaceholderProvider("{deaths}", () ->
- String.valueOf(stats.getDeaths()))
+ String.valueOf(persistentStats.getDeaths()))
);
providers.add(new PlaceholderProvider("{finalDeaths}", () ->
- String.valueOf(stats.getFinalDeaths()))
+ String.valueOf(persistentStats.getFinalDeaths()))
);
providers.add(new PlaceholderProvider("{wins}", () ->
- String.valueOf(stats.getWins()))
+ String.valueOf(persistentStats.getWins()))
);
providers.add(new PlaceholderProvider("{losses}", () ->
- String.valueOf(stats.getLosses()))
+ String.valueOf(persistentStats.getLosses()))
);
providers.add(new PlaceholderProvider("{gamesPlayed}", () ->
- String.valueOf(stats.getGamesPlayed()))
+ String.valueOf(persistentStats.getGamesPlayed()))
);
}
} else {
providers.add(new PlaceholderProvider("{on}", () -> String.valueOf(arena.getPlayers().size())));
providers.add(new PlaceholderProvider("{max}", () -> String.valueOf(arena.getMaxPlayers())));
providers.add(new PlaceholderProvider("{nextEvent}", this::getNextEventName));
+
+ if (arena.isSpectator(player)) {
+ Language lang = getPlayerLanguage(player);
+ String targetFormat = lang.m(Messages.FORMAT_SPECTATOR_TARGET);
+
+ providers.add(new PlaceholderProvider("{spectatorTarget}", () -> {
+ if (null == player.getSpectatorTarget() || !(player.getSpectatorTarget() instanceof Player)) {
+ return "";
+ }
+ Player target = (Player) player.getSpectatorTarget();
+ ITeam targetTeam = arena.getTeam(target);
+
+ if (null == targetTeam) {
+ return "";
+ }
+ return targetFormat.replace("{targetTeamColor}", targetTeam.getColor().chat().toString())
+ .replace("{targetDisplayName}", target.getDisplayName())
+ .replace("{targetName}", target.getDisplayName())
+ .replace("{targetTeamName}", targetTeam.getDisplayName(lang));
+ }));
+ }
+
providers.add(new PlaceholderProvider("{time}", () -> {
- if (this.arena.getStatus() == GameState.playing || this.arena.getStatus() == GameState.restarting) {
+ GameState status = this.arena.getStatus();
+ if (status == GameState.playing || status == GameState.restarting) {
return getNextEventTime();
} else {
- if (this.arena.getStatus() == GameState.starting) {
+ if (status == GameState.starting) {
if (arena.getStartingTask() != null) {
return String.valueOf(arena.getStartingTask().getCountdown() + 1);
}
@@ -242,21 +343,36 @@ public SidebarLine normalizeTitle(@Nullable List titleArray) {
return dateFormat.format(new Date(System.currentTimeMillis()));
}
}));
- providers.add(new PlaceholderProvider("{kills}", () ->
- String.valueOf(arena.getPlayerKills(player, false))
- ));
- providers.add(new PlaceholderProvider("{finalKills}", () ->
- String.valueOf(arena.getPlayerKills(player, true))
- ));
- providers.add(new PlaceholderProvider("{beds}", () ->
- String.valueOf(arena.getPlayerBedsDestroyed(player))
- ));
- providers.add(new PlaceholderProvider("{deaths}", () ->
- String.valueOf(arena.getPlayerDeaths(player, false))
- ));
+
+ if (null != arena.getStatsHolder()) {
+
+ arena.getStatsHolder().get(player).ifPresent(holder -> {
+ holder.getStatistic(DefaultStatistics.KILLS).ifPresent(st ->
+ providers.add(new PlaceholderProvider("{kills}", () ->
+ String.valueOf(st.getDisplayValue(null))
+ )));
+
+ holder.getStatistic(DefaultStatistics.KILLS_FINAL).ifPresent(st ->
+ providers.add(new PlaceholderProvider("{finalKills}", () ->
+ String.valueOf(st.getDisplayValue(null))
+ )));
+
+ holder.getStatistic(DefaultStatistics.BEDS_DESTROYED).ifPresent(st ->
+ providers.add(new PlaceholderProvider("{beds}", () ->
+ String.valueOf(st.getDisplayValue(null))
+ )));
+
+ holder.getStatistic(DefaultStatistics.DEATHS).ifPresent(st ->
+ providers.add(new PlaceholderProvider("{deaths}", () ->
+ String.valueOf(st.getDisplayValue(null))
+ )));
+ });
+ }
// Dynamic team placeholders
for (ITeam currentTeam : arena.getTeams()) {
+ boolean isMember = currentTeam.isMember(player) || currentTeam.wasMember(player.getUniqueId());
+
providers.add(new PlaceholderProvider("{Team" + currentTeam.getName() + "Status}", () -> {
String result;
if (currentTeam.isBedDestroyed()) {
@@ -269,11 +385,24 @@ public SidebarLine normalizeTitle(@Nullable List titleArray) {
} else {
result = getMsg(getPlayer(), Messages.FORMATTING_SCOREBOARD_TEAM_ALIVE);
}
- if (currentTeam.isMember(getPlayer())) {
+ if (isMember) {
result += getMsg(getPlayer(), Messages.FORMATTING_SCOREBOARD_YOUR_TEAM);
}
return result;
}));
+
+ if (isMember) {
+ providers.add(new PlaceholderProvider("{teamStatus}", () -> {
+ if (currentTeam.isBedDestroyed()) {
+ if (currentTeam.getSize() > 0) {
+ return getMsg(getPlayer(), Messages.FORMATTING_SCOREBOARD_BED_DESTROYED)
+ .replace("{remainingPlayers}", String.valueOf(currentTeam.getSize()));
+ }
+ return getMsg(getPlayer(), Messages.FORMATTING_SCOREBOARD_TEAM_ELIMINATED);
+ }
+ return getMsg(getPlayer(), Messages.FORMATTING_SCOREBOARD_TEAM_ALIVE);
+ }));
+ }
}
}
@@ -339,321 +468,101 @@ private String getNextEventTime() {
return time == 0 ? "0" : nextEventDateFormat.format(new Date(time));
}
- private boolean noArena() {
+ private boolean hasNoArena() {
return null == arena;
}
- private void handlePlayerList() {
- if (null != handle) {
- tabList.forEach((k, v) -> handle.removeTab(k));
- }
-
- handleHealthIcon();
-
- if (this.isTabFormattingDisabled()) {
- return;
- }
-
- if (noArena()) {
- // if tab formatting is enabled in lobby world
- if (config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_LOBBY) &&
- !config.getLobbyWorldName().trim().isEmpty()) {
-
- World lobby = Bukkit.getWorld(config.getLobbyWorldName());
- if (null == lobby) {
- return;
- }
- lobby.getPlayers().forEach(inLobby -> giveUpdateTabFormat(inLobby, true));
- }
- return;
- }
-
- handleHealthIcon();
-
- arena.getPlayers().forEach(playing -> giveUpdateTabFormat(playing, true));
- arena.getSpectators().forEach(spectating -> giveUpdateTabFormat(spectating, true));
- }
-
- /**
- * Handle given player in sidebar owner tab list.
- * Will remove existing tab and give a new one based on game conditions list like spectator, team red, etc.
- * Will handle invisibility potion as well.
- */
- public void giveUpdateTabFormat(@NotNull Player player, boolean skipStateCheck) {
- // if sidebar was not created
- if (handle == null) {
+ // Provide header and footer for current game state
+ private void assignTabHeaderFooter() {
+ if (!config.getBoolean(ConfigPath.SB_CONFIG_TAB_HEADER_FOOTER_ENABLE)) {
return;
}
- // unique tab list name
- String tabListName = player.getName();
+ Language lang = Language.getPlayerLanguage(player);
- if (tabList.containsKey(tabListName)) {
- handle.removeTab(tabListName);
- tabList.remove(tabListName);
- // SidebarManager.getInstance().sendHeaderFooter(player, "", "");
- }
+ String headerPath;
+ String footerPath;
- if (!skipStateCheck) {
- if (this.isTabFormattingDisabled()) {
+ if (hasNoArena()) {
+ if (getServerType() == ServerType.SHARED) {
+ this.headerFooter = null;
return;
}
- }
-
- SidebarLine prefix;
- SidebarLine suffix;
-
- if (noArena()) {
- prefix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_LOBBY, player, null);
- suffix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_LOBBY, player, null);
-
- PlayerTab tab = handle.playerTabCreate(
- tabListName, player, prefix, suffix, PlayerTab.PushingRule.NEVER
- );
- tab.add(player);
- tabList.put(tabListName, tab);
- return;
- }
-
- // in-game tab has a special treatment
- if (arena.isSpectator(player)) {
- PlayerTab tab = tabList.get(SPECTATOR_TAB);
- if (null == tab) {
- prefix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_SPECTATOR, player, null);
- suffix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_SPECTATOR, player, null);
- tab = handle.playerTabCreate(SPECTATOR_TAB, null, prefix, suffix, PlayerTab.PushingRule.NEVER);
- tabList.put(SPECTATOR_TAB, tab);
- }
- tab.add(player);
-
- return;
- }
-
- if (arena.getStatus() != GameState.playing) {
- if (arena.getStatus() == GameState.waiting) {
- prefix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_WAITING, player, null);
- suffix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_WAITING, player, null);
- } else if (arena.getStatus() == GameState.starting) {
- prefix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_STARTING, player, null);
- suffix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_STARTING, player, null);
- } else if (arena.getStatus() == GameState.restarting) {
-
- ITeam team = arena.getTeam(player);
- if (null == team) {
- team = arena.getExTeam(player.getUniqueId());
+ headerPath = Messages.FORMATTING_SB_TAB_LOBBY_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_LOBBY_FOOTER;
+ } else {
+ if (arena.isSpectator(player)) {
+
+ ITeam exTeam = arena.getExTeam(player.getUniqueId());
+ if (null == exTeam) {
+ switch (arena.getStatus()) {
+ case waiting:
+ headerPath = Messages.FORMATTING_SB_TAB_WAITING_HEADER_SPEC;
+ footerPath = Messages.FORMATTING_SB_TAB_WAITING_FOOTER_SPEC;
+ break;
+ case starting:
+ headerPath = Messages.FORMATTING_SB_TAB_STARTING_HEADER_SPEC;
+ footerPath = Messages.FORMATTING_SB_TAB_STARTING_FOOTER_SPEC;
+ break;
+ case playing:
+ headerPath = Messages.FORMATTING_SB_TAB_PLAYING_SPEC_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_PLAYING_SPEC_FOOTER;
+ break;
+ case restarting:
+ headerPath = Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_FOOTER;
+ break;
+ default:
+ throw new IllegalStateException("Unhandled arena status");
+ }
+ } else {
+ // eliminated player
+ if (arena.getStatus() == GameState.restarting) {
+ if (null != arena.getWinner() && arena.getWinner().equals(exTeam)) {
+ headerPath = Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_FOOTER;
+ } else {
+ headerPath = Messages.FORMATTING_SB_TAB_RESTARTING_ELM_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_RESTARTING_ELM_FOOTER;
+ }
+ } else {
+ headerPath = Messages.FORMATTING_SB_TAB_PLAYING_ELM_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_PLAYING_ELM_FOOTER;
+ }
}
- String displayName = null == team ? "" : team.getDisplayName(Language.getPlayerLanguage(this.player));
-
- HashMap replacements = new HashMap<>();
- replacements.put("{team}", null == team ? "" : team.getColor().chat() + displayName);
- replacements.put("{teamLetter}", null == team ? "" : team.getColor().chat() + (displayName.substring(0, 1)));
- replacements.put("{teamColor}", null == team ? "" : team.getColor().chat().toString());
-
-
- prefix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_RESTARTING, player, replacements);
- suffix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_RESTARTING, player, replacements);
} else {
- throw new RuntimeException("Unhandled game status!");
- }
- PlayerTab t = handle.playerTabCreate(tabListName, player, prefix, suffix, PlayerTab.PushingRule.NEVER);
- t.add(player);
- tabList.put(tabListName, t);
- return;
- }
-
- ITeam team = arena.getTeam(player);
- if (null == team) {
- team = arena.getExTeam(player.getUniqueId());
- }
- if (null == team) {
- throw new RuntimeException("Wtf dude");
- }
-
- String tabName = this.getTabName(team);
- String tabNameInvisible = tabName = tabName.substring(0, tabName.length() >= 16 ? 15 : tabName.length());
- tabNameInvisible += "^!";
-
- if (player.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
- if (!team.isMember(getPlayer())) {
- // remove player from its tab group (if team tab group)
- PlayerTab teamTab = tabList.getOrDefault(tabName, null);
- if (null != teamTab) {
- teamTab.remove(player);
-
- // create or get tab group for the invisible players in that team
- // set tab group name visibility to false
- // identifier for invisibility
- tabName = tabNameInvisible;
+ switch (arena.getStatus()) {
+ case waiting:
+ headerPath = Messages.FORMATTING_SB_TAB_WAITING_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_WAITING_FOOTER;
+ break;
+ case starting:
+ headerPath = Messages.FORMATTING_SB_TAB_STARTING_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_STARTING_FOOTER;
+ break;
+ case playing:
+ headerPath = Messages.FORMATTING_SB_TAB_PLAYING_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_PLAYING_FOOTER;
+ break;
+ case restarting:
+ headerPath = Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_HEADER;
+ footerPath = Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_FOOTER;
+ break;
+ default:
+ throw new IllegalStateException("Unhandled arena status");
}
}
- } else {
- PlayerTab invTab = tabList.getOrDefault(tabNameInvisible, null);
- if (null != invTab) {
- invTab.remove(player);
- }
- }
-
- PlayerTab teamTab = tabList.get(tabName);
- if (null == teamTab) {
- String displayName = team.getDisplayName(Language.getPlayerLanguage(this.player));
- HashMap replacements = new HashMap<>();
- replacements.put("{team}", team.getColor().chat() + displayName);
- replacements.put("{teamLetter}", team.getColor().chat() + (displayName.substring(0, 1)));
- replacements.put("{teamColor}", team.getColor().chat().toString());
-
- prefix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_PREFIX_PLAYING, player, replacements);
- suffix = getTabText(Messages.FORMATTING_SCOREBOARD_TAB_SUFFIX_PLAYING, player, replacements);
-
- teamTab = handle.playerTabCreate(tabName, null, prefix, suffix, PlayerTab.PushingRule.PUSH_OTHER_TEAMS);
- tabList.put(tabName, teamTab);
- if (player.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
- teamTab.setNameTagVisibility(PlayerTab.NameTagVisibility.NEVER);
- }
}
- teamTab.add(player);
- }
-
- // Provide header and footer for current game state
- private void setHeaderFooter() {
-// if (isTabFormattingDisabled()) {
-// return;
-// }
- Language lang = Language.getPlayerLanguage(player);
-
- if (noArena()) {
- SidebarManager.getInstance().sendHeaderFooter(
- player, lang.m(Messages.FORMATTING_SIDEBAR_TAB_HEADER_LOBBY),
- lang.m(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_LOBBY)
- );
- return;
- }
- if (arena.isSpectator(player)) {
- SidebarManager.getInstance().sendHeaderFooter(
- player, lang.m(Messages.FORMATTING_SIDEBAR_TAB_HEADER_SPECTATOR),
- lang.m(Messages.FORMATTING_SIDEBAR_TAB_FOOTER_SPECTATOR)
- );
- return;
- }
-
-
- String headerPath = null;
- String footerPath = null;
-
- switch (arena.getStatus()) {
- case waiting:
- headerPath = Messages.FORMATTING_SIDEBAR_TAB_HEADER_WAITING;
- footerPath = Messages.FORMATTING_SIDEBAR_TAB_FOOTER_WAITING;
- break;
- case starting:
- headerPath = Messages.FORMATTING_SIDEBAR_TAB_HEADER_STARTING;
- footerPath = Messages.FORMATTING_SIDEBAR_TAB_FOOTER_STARTING;
- break;
- case playing:
- headerPath = Messages.FORMATTING_SIDEBAR_TAB_HEADER_PLAYING;
- footerPath = Messages.FORMATTING_SIDEBAR_TAB_FOOTER_PLAYING;
- break;
- case restarting:
- headerPath = Messages.FORMATTING_SIDEBAR_TAB_HEADER_RESTARTING;
- footerPath = Messages.FORMATTING_SIDEBAR_TAB_FOOTER_RESTARTING;
- break;
- }
-
- SidebarManager.getInstance().sendHeaderFooter(
- player, lang.m(headerPath),
- lang.m(footerPath)
+ this.headerFooter = new TabHeaderFooter(
+ this.normalizeLines(lang.l(headerPath)),
+ this.normalizeLines(lang.l(footerPath)),
+ getPlaceholders(this.getPlayer())
);
- }
- private @NotNull String getTabName(@NotNull ITeam team) {
- String tabName = TEAM_PREFIX + Base64.getEncoder().encodeToString((team.getName()).getBytes(StandardCharsets.UTF_8));
- if (tabName.length() > 16) {
- tabName = tabName.substring(0, 16);
- }
- return tabName;
- }
-
- @NotNull
- private SidebarLine getTabText(String path, Player targetPlayer, @Nullable HashMap replacements) {
- List strings = Language.getList(getPlayer(), path);
- if (strings.isEmpty()) {
- return new SidebarLine() {
- @NotNull
- @Override
- public String getLine() {
- return "";
- }
- };
- }
-
- strings = new ArrayList<>();
- for (String string : Language.getList(getPlayer(), path)) {
- String parsed = string.replace("{vPrefix}", BedWars.getChatSupport().getPrefix(targetPlayer))
- .replace("{vSuffix}", BedWars.getChatSupport().getSuffix(targetPlayer));
-
- if (null != replacements) {
- for (Map.Entry entry : replacements.entrySet()) {
- parsed = parsed.replace(entry.getKey(), entry.getValue());
- }
- }
-
- strings.add(parsed);
- }
-
- if (strings.size() == 1) {
- final String line = strings.get(0);
- return new SidebarLine() {
- @NotNull
- @Override
- public String getLine() {
- return line;
- }
- };
- }
-
- final String[] lines = new String[strings.size()];
- for (int i = 0; i < lines.length; i++) {
- lines[i] = strings.get(i);
- }
- return new SidebarLineAnimated(lines);
- }
-
- /**
- * @return true if tab formatting is disabled for current sidebar/ arena stage
- */
- public boolean isTabFormattingDisabled() {
- if (noArena()) {
-
- if (getServerType() == ServerType.SHARED) {
- if (config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_LOBBY) &&
- !config.getLobbyWorldName().trim().isEmpty()) {
-
- World lobby = Bukkit.getWorld(config.getLobbyWorldName());
- return null != lobby;
- }
- }
-
- return !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_LOBBY);
- }
- // if tab formatting is disabled in game
- if (arena.getStatus() == GameState.playing && config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_PLAYING)) {
- return false;
- }
-
- // if tab formatting is disabled in starting
- if (arena.getStatus() == GameState.starting && config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_STARTING)) {
- return false;
- }
-
- // if tab formatting is disabled in waiting
- if (arena.getStatus() == GameState.waiting && config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_WAITING)) {
- return false;
- }
-
- // if tab formatting is disabled in restarting
- return arena.getStatus() != GameState.restarting || !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_RESTARTING);
+ SidebarManager.getInstance().sendHeaderFooter(player, headerFooter);
}
@Override
@@ -662,53 +571,6 @@ public boolean registerPersistentPlaceholder(PlaceholderProvider placeholderProv
return true;
}
- public void handleHealthIcon() {
- if (null == handle) {
- return;
- }
-
- if (noArena()) {
- handle.hidePlayersHealth();
- return;
- } else if (arena.getStatus() != GameState.playing) {
- handle.hidePlayersHealth();
- return;
- }
-
- List animation = Language.getList(player, Messages.FORMATTING_SCOREBOARD_HEALTH);
- if (animation.isEmpty()) return;
- SidebarLine line;
- if (animation.size() > 1) {
- String[] lines = new String[animation.size()];
- for (int i = 0; i < animation.size(); i++) {
- lines[i] = animation.get(i);
- }
- line = new SidebarLineAnimated(lines);
- } else {
- final String text = animation.get(0);
- line = new SidebarLine() {
- @NotNull
- @Override
- public String getLine() {
- return text;
- }
- };
- }
-
- if (config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_IN_TAB)) {
- handle.showPlayersHealth(line, true);
- }
-
- Bukkit.getScheduler().runTaskLater(plugin, () -> {
- if (arena != null && handle != null) {
- arena.getPlayers().forEach(player -> handle.setPlayerHealth(player, (int) Math.ceil(player.getHealth())));
- if (arena.isSpectator(getPlayer())) {
- arena.getSpectators().forEach(player -> handle.setPlayerHealth(player, (int) Math.ceil(player.getHealth())));
- }
- }
- }, 20L);
- }
-
/**
* Hide player name tag on head when he drinks an invisibility potion.
* This is required because not all clients hide it automatically.
@@ -729,4 +591,18 @@ public Sidebar getHandle() {
public IArena getArena() {
return arena;
}
+
+ @Nullable
+ public TabHeaderFooter getHeaderFooter() {
+ return headerFooter;
+ }
+
+ @SuppressWarnings("unused")
+ public void setHeaderFooter(@Nullable TabHeaderFooter headerFooter) {
+ this.headerFooter = headerFooter;
+ }
+
+ public void setTopStatistics(@Nullable StatisticsOrdered topStatistics) {
+ this.topStatistics = topStatistics;
+ }
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwTabList.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwTabList.java
new file mode 100644
index 000000000..08a5af309
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/BwTabList.java
@@ -0,0 +1,508 @@
+/*
+ * BedWars1058 - A bed wars mini-game.
+ * Copyright (C) 2023 Andrei Dascălu
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Contact e-mail: andrew.dascalu@gmail.com
+ */
+
+package com.andrei1058.bedwars.sidebar;
+
+import com.andrei1058.bedwars.BedWars;
+import com.andrei1058.bedwars.api.arena.GameState;
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.configuration.ConfigPath;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.ServerType;
+import com.andrei1058.spigot.sidebar.PlayerTab;
+import com.andrei1058.spigot.sidebar.Sidebar;
+import com.andrei1058.spigot.sidebar.SidebarLine;
+import com.andrei1058.spigot.sidebar.SidebarLineAnimated;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.entity.Player;
+import org.bukkit.potion.PotionEffectType;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.*;
+
+import static com.andrei1058.bedwars.BedWars.*;
+
+public class BwTabList {
+
+ private static final char SPECTATOR_PREFIX = 'z';
+ private static final char ELIMINATED_FROM_TEAM_PREFIX = 'z';
+
+ // Player list container. Used to manipulate deployed player tab: lines ecc.
+ // Key is player uuid.
+ private final HashMap deployedPerPlayerTabList = new HashMap<>();
+ // playing-restarting team order prefix for tab
+ // this is concatenated to player identifier to keep tab-list ordered
+ // and still let players have individual placeholders
+ private final HashMap teamOrderPrefix = new HashMap<>();
+ private int teamOrderIndex = 0;
+ // unique string used for tab ordering. Does not track team here.
+ private final HashMap playerTabIdentifier = new HashMap<>();
+ // used to prevent tab identifier duplication. Keeps an index of concurrent identifiers
+ // concatenated later to playerTabIdentifier
+ private final HashMap playerTabIdentifierDuplication = new HashMap<>();
+
+ private final BwSidebar sidebar;
+
+ public BwTabList(BwSidebar sidebar) {
+ this.sidebar = sidebar;
+ }
+
+ /**
+ * Triggered when sidebar context changes.
+ * Arena/ game state change.
+ */
+ void handlePlayerList() {
+
+ // clear existing formatted player tab-lists
+ if (null != sidebar.getHandle()) {
+ deployedPerPlayerTabList.clear();
+ sidebar.getHandle().removeTabs();
+ }
+
+ handleHealthIcon();
+
+ if (this.isTabFormattingDisabled()) {
+ return;
+ }
+
+ if (null == sidebar.getArena()) {
+ // if tab formatting is enabled in lobby world
+ if (config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_LOBBY) &&
+ !config.getLobbyWorldName().trim().isEmpty()) {
+
+ World lobby = Bukkit.getWorld(config.getLobbyWorldName());
+ if (null == lobby) {
+ return;
+ }
+ lobby.getPlayers().forEach(inLobby -> giveUpdateTabFormat(inLobby, true, null));
+ }
+ // sometimes due to timing issues player is not listed yet in lobby players
+ giveUpdateTabFormat(sidebar.getPlayer(), true, null);
+ return;
+ }
+
+ handleHealthIcon();
+
+ sidebar.getArena().getPlayers().forEach(playing -> giveUpdateTabFormat(playing, true, null));
+ sidebar.getArena().getSpectators().forEach(spectating -> giveUpdateTabFormat(spectating, true, null));
+ }
+
+ public void handleHealthIcon() {
+ if (null == sidebar.getHandle()) {
+ return;
+ }
+
+ if (null == sidebar.getArena()) {
+ sidebar.getHandle().hidePlayersHealth();
+ return;
+ } else if (sidebar.getArena().getStatus() != GameState.playing) {
+ sidebar.getHandle().hidePlayersHealth();
+ return;
+ }
+
+ List animation = Language.getList(sidebar.getPlayer(), Messages.FORMATTING_SCOREBOARD_HEALTH);
+ if (animation.isEmpty()) return;
+ SidebarLine line;
+ if (animation.size() > 1) {
+ String[] lines = new String[animation.size()];
+ for (int i = 0; i < animation.size(); i++) {
+ lines[i] = animation.get(i);
+ }
+ line = new SidebarLineAnimated(lines);
+ } else {
+ final String text = animation.get(0);
+ line = new SidebarLine() {
+ @NotNull
+ @Override
+ public String getLine() {
+ return text;
+ }
+ };
+ }
+
+ if (config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_ENABLE)) {
+ sidebar.getHandle().showPlayersHealth(line, config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_HEALTH_IN_TAB));
+ }
+
+ Bukkit.getScheduler().runTaskLater(plugin, () -> {
+ if (null != sidebar.getArena() && null != sidebar.getHandle()) {
+ sidebar.getArena().getPlayers().forEach(player -> sidebar.getHandle().setPlayerHealth(player, (int) Math.ceil(player.getHealth())));
+ if (sidebar.getArena().isSpectator(sidebar.getPlayer())) {
+ sidebar.getArena().getSpectators().forEach(player -> sidebar.getHandle().setPlayerHealth(player, (int) Math.ceil(player.getHealth())));
+ }
+ }
+ }, 10L);
+ }
+
+ /**
+ * @return true if tab formatting is disabled for current sidebar/ arena stage
+ */
+ public boolean isTabFormattingDisabled() {
+ if (null == sidebar.getArena()) {
+
+ if (getServerType() == ServerType.SHARED) {
+ if (config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_LOBBY) &&
+ !config.getLobbyWorldName().trim().isEmpty()) {
+
+ World lobby = Bukkit.getWorld(config.getLobbyWorldName());
+ return null == lobby || !sidebar.getPlayer().getWorld().getName().equals(lobby.getName());
+ }
+ }
+
+ return !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_LOBBY);
+ }
+ GameState status = sidebar.getArena().getStatus();
+
+ // if tab formatting is disabled in game
+ if (status == GameState.playing) {
+ return !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_PLAYING);
+ }
+
+ // if tab formatting is disabled in starting
+ if (status == GameState.starting) {
+ return !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_STARTING);
+ }
+
+ // if tab formatting is disabled in waiting
+ if (status == GameState.waiting) {
+ return !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_WAITING);
+ }
+
+ // if tab formatting is disabled in restarting
+ return status != GameState.restarting || !config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_RESTARTING);
+ }
+
+ /**
+ * Handle given player in sidebar owner tab list.
+ * Will remove existing tab and give a new one based on game conditions list like spectator, team red, etc.
+ * Will handle invisibility potion as well.
+ */
+ public void giveUpdateTabFormat(@NotNull Player player, boolean skipStateCheck, @Nullable Boolean spectator) {
+ // if sidebar was not created
+ if (sidebar.getHandle() == null) {
+ return;
+ }
+
+ // unique tab list name
+ String playerTabId = getCreatePlayerTabIdentifier(player);
+
+ // clear existing tab formatting for given player
+ PlayerTab playerTab = deployedPerPlayerTabList.getOrDefault(player.getUniqueId(), null);
+ if (null != playerTab) {
+ sidebar.getHandle().removeTab(playerTab.getIdentifier());
+ deployedPerPlayerTabList.remove(player.getUniqueId());
+ }
+
+ if (!skipStateCheck) {
+ if (this.isTabFormattingDisabled()) {
+ return;
+ }
+ }
+
+ SidebarLine prefix;
+ SidebarLine suffix;
+ IArena arena = sidebar.getArena();
+ Sidebar handle = sidebar.getHandle();
+
+ if (null == arena) {
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_LOBBY_PREFIX, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_LOBBY_SUFFIX, player, null);
+
+ PlayerTab tab = handle.playerTabCreate(
+ playerTabId, player, prefix, suffix, PlayerTab.PushingRule.NEVER,
+ this.sidebar.getPlaceholders(player)
+ );
+ deployedPerPlayerTabList.put(player.getUniqueId(), tab);
+ return;
+ }
+
+ // in-game tab has a special treatment
+ if (arena.isSpectator(player) || (spectator != null && spectator)) {
+
+ // if has been eliminated from a team
+ ITeam exTeam = arena.getExTeam(player.getUniqueId());
+
+ // when player leaves but decides to join to spectate later
+ if (null != exTeam) {
+
+ HashMap replacements = getTeamReplacements(exTeam);
+
+ if (arena.getStatus() == GameState.restarting && null != arena.getWinner()) {
+ if (arena.getWinner().equals(exTeam)) {
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_PREFIX, player, replacements);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_WIN2_SUFFIX, player, replacements);
+ } else {
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_PREFIX, player, replacements);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_ELM_SUFFIX, player, replacements);
+ }
+ } else {
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_PLAYING_ELM_PREFIX, player, replacements);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_PLAYING_ELM_SUFFIX, player, replacements);
+ }
+
+ PlayerTab tab = handle.playerTabCreate(
+ getPlayerTabIdentifierEliminatedInTeam(exTeam, playerTabId),
+ player, prefix, suffix, PlayerTab.PushingRule.NEVER,
+ this.sidebar.getPlaceholders(player)
+ );
+ deployedPerPlayerTabList.put(player.getUniqueId(), tab);
+ return;
+ }
+
+ switch (arena.getStatus()) {
+ case waiting:
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_WAITING_PREFIX_SPEC, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX_SPEC, player, null);
+ break;
+ case starting:
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_STARTING_PREFIX_SPEC, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX_SPEC, player, null);
+ break;
+ case playing:
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_PREFIX, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_PLAYING_SPEC_SUFFIX, player, null);
+ break;
+ case restarting:
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_PREFIX, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_SPEC_SUFFIX, player, null);
+ break;
+ default:
+ throw new RuntimeException("Unhandled game state..");
+ }
+
+ PlayerTab tab = handle.playerTabCreate(
+ getPlayerTabIdentifierSpectator(null, playerTabId),
+ player, prefix, suffix, PlayerTab.PushingRule.NEVER,
+ this.sidebar.getPlaceholders(player)
+ );
+ deployedPerPlayerTabList.put(player.getUniqueId(), tab);
+ return;
+ }
+
+ // this is reached only by alive players
+ GameState status = arena.getStatus();
+ if (status != GameState.playing) {
+
+ String currentTabId = playerTabId;
+
+ switch (status) {
+ case waiting:
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_WAITING_PREFIX, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_WAITING_SUFFIX, player, null);
+ break;
+ case starting:
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_STARTING_PREFIX, player, null);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_STARTING_SUFFIX, player, null);
+ break;
+ case restarting:
+ ITeam team = arena.getTeam(player);
+ currentTabId = getPlayerTabIdentifierAliveInTeam(team, playerTabId);
+
+ HashMap replacements = getTeamReplacements(team);
+
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_PREFIX, player, replacements);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_RESTARTING_WIN1_SUFFIX, player, replacements);
+ break;
+ default:
+ throw new IllegalStateException("Unhandled game status!");
+ }
+ PlayerTab t = handle.playerTabCreate(
+ currentTabId, player, prefix, suffix, PlayerTab.PushingRule.NEVER, this.sidebar.getPlaceholders(player)
+ );
+ deployedPerPlayerTabList.put(player.getUniqueId(), t);
+ return;
+ }
+
+ // if status is playing and player is alive
+
+ ITeam team = arena.getTeam(player);
+ // tab list of playing state
+ HashMap replacements = getTeamReplacements(team);
+
+ prefix = getTabText(Messages.FORMATTING_SB_TAB_PLAYING_PREFIX, player, replacements);
+ suffix = getTabText(Messages.FORMATTING_SB_TAB_PLAYING_SUFFIX, player, replacements);
+
+ PlayerTab teamTab = handle.playerTabCreate(
+ getPlayerTabIdentifierAliveInTeam(team, playerTabId),
+ player, prefix, suffix, PlayerTab.PushingRule.PUSH_OTHER_TEAMS,
+ this.sidebar.getPlaceholders(player)
+ );
+ deployedPerPlayerTabList.put(player.getUniqueId(), teamTab);
+ if (player.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
+ teamTab.setNameTagVisibility(PlayerTab.NameTagVisibility.NEVER);
+ }
+ }
+
+ @NotNull
+ private SidebarLine getTabText(String path, Player targetPlayer, @Nullable HashMap replacements) {
+ List strings = Language.getList(sidebar.getPlayer(), path);
+ if (strings.isEmpty()) {
+ return new SidebarLine() {
+ @NotNull
+ @Override
+ public String getLine() {
+ return "";
+ }
+ };
+ }
+
+ strings = new ArrayList<>();
+ for (String string : Language.getList(sidebar.getPlayer(), path)) {
+ String parsed = string.replace("{vPrefix}", BedWars.getChatSupport().getPrefix(targetPlayer))
+ .replace("{vSuffix}", BedWars.getChatSupport().getSuffix(targetPlayer));
+
+ if (null != replacements) {
+ for (Map.Entry entry : replacements.entrySet()) {
+ parsed = parsed.replace(entry.getKey(), entry.getValue());
+ }
+ }
+
+ strings.add(parsed);
+ }
+
+ if (strings.size() == 1) {
+ final String line = strings.get(0);
+ return new SidebarLine() {
+ @NotNull
+ @Override
+ public String getLine() {
+ return line;
+ }
+ };
+ }
+
+ final String[] lines = new String[strings.size()];
+ for (int i = 0; i < lines.length; i++) {
+ lines[i] = strings.get(i);
+ }
+ return new SidebarLineAnimated(lines);
+ }
+
+ /**
+ * Gets/generates a prefix string to be concatenated to the player tab-list identifier, it keeps tab-list ordered by team.
+ *
+ * @param team target.
+ * @return prefix string.
+ */
+ private String getCreateTeamTabOrderPrefix(@NotNull ITeam team) {
+ String prefix = teamOrderPrefix.getOrDefault(team.getIdentity(), null);
+ if (null == prefix) {
+ teamOrderIndex++;
+ prefix = teamOrderIndex + "";
+ teamOrderPrefix.put(team.getIdentity(), prefix);
+ if (prefix.length() > 3) {
+ throw new RuntimeException("Could not generate new order prefixes. Char limit exceeded. Max value is 999.");
+ }
+
+ // todo how do we clean up index? when arena became null?
+ }
+ return prefix;
+ }
+
+ /**
+ * Get existing or create player unique identifier for tab ordering
+ *
+ * @param player target.
+ * @return unique tab identifier for given player.
+ */
+ private String getCreatePlayerTabIdentifier(@NotNull Player player) {
+ String id = playerTabIdentifier.getOrDefault(player.getUniqueId(), null);
+ if (null == id) {
+ id = player.getName().substring(0, Math.min(player.getName().length(), 9));
+
+ if (hasPlayerIdentifier(id)) {
+ Integer lastDuplicationIndex = playerTabIdentifierDuplication.getOrDefault(id, 0);
+
+ lastDuplicationIndex++;
+ id += lastDuplicationIndex.toString();
+ playerTabIdentifierDuplication.put(id, lastDuplicationIndex);
+ }
+
+ playerTabIdentifier.put(player.getUniqueId(), id);
+ }
+ return id;
+ }
+
+
+ private boolean hasPlayerIdentifier(@NotNull String id) {
+ for (String string : playerTabIdentifier.values()) {
+ if (string.equals(id)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unused")
+ private @NotNull String getPlayerTabIdentifierAliveInTeam(ITeam team, Player player) {
+ return getPlayerTabIdentifierAliveInTeam(team, getCreatePlayerTabIdentifier(player));
+ }
+
+ private @NotNull String getPlayerTabIdentifierAliveInTeam(ITeam team, String playerId) {
+ return getCreateTeamTabOrderPrefix(team) + playerId;
+ }
+
+ @SuppressWarnings("unused")
+ private @NotNull String getPlayerTabIdentifierEliminatedInTeam(ITeam team, Player player) {
+ return getPlayerTabIdentifierEliminatedInTeam(team, getCreatePlayerTabIdentifier(player));
+ }
+
+ private @NotNull String getPlayerTabIdentifierEliminatedInTeam(ITeam team, String playerId) {
+ return ELIMINATED_FROM_TEAM_PREFIX + getCreateTeamTabOrderPrefix(team) + playerId;
+ }
+
+ @SuppressWarnings("unused")
+ private @NotNull String getPlayerTabIdentifierSpectator(@Nullable ITeam team, Player player) {
+ return getPlayerTabIdentifierSpectator(team, getCreatePlayerTabIdentifier(player));
+ }
+
+ private @NotNull String getPlayerTabIdentifierSpectator(@Nullable ITeam team, String playerId) {
+ if (null == team) {
+ return SPECTATOR_PREFIX + playerId;
+ }
+ return getPlayerTabIdentifierEliminatedInTeam(team, playerId);
+ }
+
+ @NotNull HashMap getTeamReplacements(@Nullable ITeam team) {
+ HashMap replacements = new HashMap<>();
+ String displayName = null == team ? "" : team.getDisplayName(Language.getPlayerLanguage(sidebar.getPlayer()));
+ replacements.put("{teamName}", displayName);
+ replacements.put("{teamLetter}", null == team ? "" : team.getColor().chat() + (displayName.substring(0, 1)));
+ replacements.put("{teamColor}", null == team ? "" : team.getColor().chat().toString());
+
+ return replacements;
+ }
+
+ /**
+ * Clear tab lines from instance.
+ */
+ public void onSidebarRemoval() {
+ sidebar.getHandle().clearLines();
+ deployedPerPlayerTabList.clear();
+ playerTabIdentifier.clear();
+ playerTabIdentifierDuplication.clear();
+ teamOrderPrefix.clear();
+ teamOrderIndex = 0;
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/ScoreboardListener.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/ScoreboardListener.java
index b50b9aa63..2bf53f8d3 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/ScoreboardListener.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/ScoreboardListener.java
@@ -22,11 +22,8 @@
import com.andrei1058.bedwars.BedWars;
import com.andrei1058.bedwars.api.arena.IArena;
-import com.andrei1058.bedwars.api.configuration.ConfigPath;
-import com.andrei1058.bedwars.api.events.player.PlayerBedBreakEvent;
-import com.andrei1058.bedwars.api.events.player.PlayerKillEvent;
-import com.andrei1058.bedwars.api.events.player.PlayerReJoinEvent;
-import com.andrei1058.bedwars.api.events.player.PlayerReSpawnEvent;
+import com.andrei1058.bedwars.api.events.player.*;
+import com.andrei1058.bedwars.api.server.ServerType;
import com.andrei1058.bedwars.arena.Arena;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -34,73 +31,91 @@
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.jetbrains.annotations.NotNull;
public class ScoreboardListener implements Listener {
- @EventHandler(priority = EventPriority.MONITOR)
- public void onPlayerDamage(EntityDamageEvent e) {
- if (e == null) return;
- if (e.isCancelled()) return;
- if (!(e.getEntity() instanceof Player)) return;
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onPlayerDamage(@NotNull EntityDamageEvent e) {
+ if (!(e.getEntity() instanceof Player)) {
+ return;
+ }
+
final Player player = (Player) e.getEntity();
final IArena arena = Arena.getArenaByPlayer(player);
- int health = (int) Math.ceil((player.getHealth() - e.getFinalDamage()));
- if (arena == null) return;
+ if (arena == null) {
+ return;
+ }
+ int health = (int) Math.ceil((player.getHealth() - e.getFinalDamage()));
SidebarService.getInstance().refreshHealth(arena, player, health);
}
- @EventHandler(priority = EventPriority.MONITOR)
- public void onRegain(EntityRegainHealthEvent e) {
- if (e == null) return;
- if (e.isCancelled()) return;
- if (!(e.getEntity() instanceof Player)) return;
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onRegain(@NotNull EntityRegainHealthEvent e) {
+ if (!(e.getEntity() instanceof Player)) {
+ return;
+ }
+
final Player player = (Player) e.getEntity();
final IArena arena = Arena.getArenaByPlayer(player);
- if (arena == null) return;
+ if (arena == null) {
+ return;
+ }
int health = (int) Math.ceil(player.getHealth() + e.getAmount());
-
SidebarService.getInstance().refreshHealth(arena, player, health);
}
@EventHandler(priority = EventPriority.MONITOR)
- public void onReSpawn(PlayerReSpawnEvent e) {
- if (e == null) return;
+ public void onReSpawn(@NotNull PlayerReSpawnEvent e) {
final IArena arena = e.getArena();
SidebarService.getInstance().refreshHealth(arena, e.getPlayer(), (int) Math.ceil(e.getPlayer().getHealth()));
}
- @EventHandler(priority = EventPriority.LOWEST)
- public void reJoin(PlayerReJoinEvent e) {
- if (e == null) return;
- if (e.isCancelled()) return;
- if (!BedWars.config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_LIST_FORMAT_PLAYING)) return;
- final IArena arena = e.getArena();
- final Player player = e.getPlayer();
-
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void reJoin(@NotNull PlayerReJoinEvent e) {
// re-add player to scoreboard tab list
- SidebarService.getInstance().handleReJoin(arena, player);
+ SidebarService.getInstance().handleReJoin(e.getArena(), e.getPlayer());
}
- @EventHandler
- public void onBedDestroy(PlayerBedBreakEvent e) {
- if (e == null) return;
- final IArena arena = e.getArena();
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void arenaJoin(@NotNull PlayerJoinArenaEvent e) {
+ // add player to scoreboard tab list
+ SidebarService.getInstance().handleJoin(e.getArena(), e.getPlayer(), e.isSpectator());
+ }
- // refresh placeholders in case placeholders refresh is disabled
- SidebarService.getInstance().refreshPlaceholders(arena);
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void serverJoin(@NotNull PlayerJoinEvent e) {
+ if (BedWars.getServerType() == ServerType.MULTIARENA || BedWars.getServerType() == ServerType.SHARED) {
+ // add player to scoreboard tab list
+ SidebarService.getInstance().applyLobbyTab(e.getPlayer());
+ }
}
- @EventHandler
- public void onFinalKill(PlayerKillEvent e) {
- if (e == null) return;
- if (!e.getCause().isFinalKill()) return;
- final IArena arena = e.getArena();
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void arenaLeave(@NotNull PlayerLeaveArenaEvent e) {
+ if (BedWars.getServerType() == ServerType.MULTIARENA || BedWars.getServerType() == ServerType.SHARED) {
+ // add player to scoreboard tab list
+ SidebarService.getInstance().applyLobbyTab(e.getPlayer());
+ }
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBedDestroy(@NotNull PlayerBedBreakEvent e) {
+ // refresh placeholders in case placeholders refresh is disabled
+ SidebarService.getInstance().refreshPlaceholders(e.getArena());
+ }
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onFinalKill(@NotNull PlayerKillEvent e) {
+ if (!e.getCause().isFinalKill()) {
+ return;
+ }
// refresh placeholders in case placeholders refresh is disabled
- SidebarService.getInstance().refreshPlaceholders(arena);
+ SidebarService.getInstance().refreshPlaceholders(e.getArena());
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/SidebarService.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/SidebarService.java
index fbc54206a..a1dbeda84 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/SidebarService.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/SidebarService.java
@@ -47,8 +47,9 @@ public void giveSidebar(@NotNull Player player, @Nullable IArena arena, boolean
// check if we might need to remove the existing sidebar
if (null != sidebar) {
if (null == arena) {
- // if sidebar is disabled in lobby on shared mode
- if (!config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_USE_LOBBY_SIDEBAR)) {
+ // if sidebar is disabled in lobby on shared or multi-arena mode
+ if (!config.getBoolean(ConfigPath.SB_CONFIG_SIDEBAR_USE_LOBBY_SIDEBAR) ||
+ BedWars.getServerType() == ServerType.SHARED) {
this.remove(sidebar);
return;
}
@@ -79,11 +80,39 @@ public void giveSidebar(@NotNull Player player, @Nullable IArena arena, boolean
}
} else {
if (arena.getStatus() == GameState.waiting) {
- lines = getScoreboard(player, "scoreboard." + arena.getGroup() + ".waiting", Messages.SCOREBOARD_DEFAULT_WAITING);
+ if (arena.isSpectator(player)) {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".waiting.spectator", Messages.SCOREBOARD_DEFAULT_WAITING_SPEC);
+ } else {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".waiting.player", Messages.SCOREBOARD_DEFAULT_WAITING);
+ }
} else if (arena.getStatus() == GameState.starting) {
- lines = getScoreboard(player, "scoreboard." + arena.getGroup() + ".starting", Messages.SCOREBOARD_DEFAULT_STARTING);
- } else if (arena.getStatus() == GameState.playing || arena.getStatus() == GameState.restarting) {
- lines = getScoreboard(player, "scoreboard." + arena.getGroup() + ".playing", Messages.SCOREBOARD_DEFAULT_PLAYING);
+ if (arena.isSpectator(player)) {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".starting.spectator", Messages.SCOREBOARD_DEFAULT_STARTING_SPEC);
+ } else {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".starting.player", Messages.SCOREBOARD_DEFAULT_STARTING);
+ }
+ } else if (arena.getStatus() == GameState.playing) {
+ if (arena.isSpectator(player)) {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".playing.spectator", Messages.SCOREBOARD_DEFAULT_PLAYING_SPEC);
+ } else {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".playing.alive", Messages.SCOREBOARD_DEFAULT_PLAYING);
+ }
+ } else if (arena.getStatus() == GameState.restarting) {
+
+ ITeam holderTeam = arena.getTeam(player);
+ ITeam holderExTeam = null == holderTeam ? arena.getExTeam(player.getUniqueId()) : null;
+
+ if (null == holderTeam && null == holderExTeam) {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".restarting.spectator", Messages.SCOREBOARD_DEFAULT_RESTARTING_SPEC);
+ } else {
+ if (null == holderTeam && holderExTeam.equals(arena.getWinner())) {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".restarting.winner-eliminated", Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN2);
+ } else if (null == holderExTeam && holderTeam.equals(arena.getWinner())) {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".restarting.winner-alive", Messages.SCOREBOARD_DEFAULT_RESTARTING_WIN1);
+ } else {
+ lines = getScoreboard(player, "sidebar." + arena.getGroup() + ".restarting.loser", Messages.SCOREBOARD_DEFAULT_RESTARTING_LOSER);
+ }
+ }
}
}
@@ -154,9 +183,10 @@ public void refreshPlaceholders() {
public void refreshPlaceholders(IArena arena) {
this.sidebars.forEach((k, v) -> {
- if (v.getArena().equals(arena)) {
- v.getHandle().refreshPlaceholders();
- }
+ if (v.getArena() != null)
+ if (v.getArena().equals(arena)) {
+ v.getHandle().refreshPlaceholders();
+ }
});
}
@@ -164,11 +194,19 @@ public void refreshTabList() {
this.sidebars.forEach((k, v) -> v.getHandle().playerTabRefreshAnimation());
}
+ public void refreshTabHeaderFooter() {
+ this.sidebars.forEach((k, v) -> {
+ if (null != v && null != v.getHeaderFooter()) {
+ this.sidebarHandler.sendHeaderFooter(v.getPlayer(), v.getHeaderFooter());
+ }
+ });
+ }
+
public void refreshHealth() {
this.sidebars.forEach((k, v) -> {
if (null != v.getArena()) {
v.getHandle().playerHealthRefreshAnimation();
- for (Player player : v.getArena().getPlayers()){
+ for (Player player : v.getArena().getPlayers()) {
v.getHandle().setPlayerHealth(player, (int) Math.ceil(player.getHealth()));
}
}
@@ -181,7 +219,7 @@ public void refreshHealth() {
}
public void refreshHealth(IArena arena, Player player, int health) {
- this.sidebars.forEach((k,v) -> {
+ this.sidebars.forEach((k, v) -> {
if (null != v.getArena() && v.getArena().equals(arena)) {
v.getHandle().setPlayerHealth(player, health);
}
@@ -189,15 +227,35 @@ public void refreshHealth(IArena arena, Player player, int health) {
}
public void handleReJoin(IArena arena, Player player) {
- this.sidebars.forEach((k,v) -> {
+ this.sidebars.forEach((k, v) -> {
if (null != v.getArena() && v.getArena().equals(arena)) {
v.giveUpdateTabFormat(player, false);
}
});
}
+ public void handleJoin(IArena arena, Player player, @Nullable Boolean spectator) {
+ this.sidebars.forEach((k, v) -> {
+ if (null != v.getArena() && v.getArena().equals(arena)) {
+ if (!v.getPlayer().equals(player)) {
+ v.giveUpdateTabFormat(player, false, spectator);
+ }
+ }
+ });
+ }
+
+ public void applyLobbyTab(Player player) {
+ this.sidebars.forEach((k, v) -> {
+ if (null == v.getArena()) {
+ if (!v.getPlayer().equals(player)) {
+ v.giveUpdateTabFormat(player, false);
+ }
+ }
+ });
+ }
+
public void handleInvisibility(ITeam team, Player player, boolean toggle) {
- this.sidebars.forEach((k,v) -> {
+ this.sidebars.forEach((k, v) -> {
if (null != v.getArena() && v.getArena().equals(team.getArena())) {
v.handleInvisibilityPotion(player, toggle);
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshTabListTask.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshPlayerListTask.java
similarity index 94%
rename from bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshTabListTask.java
rename to bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshPlayerListTask.java
index cbd61ac76..64d257f0e 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshTabListTask.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshPlayerListTask.java
@@ -22,7 +22,7 @@
import com.andrei1058.bedwars.sidebar.SidebarService;
-public class RefreshTabListTask implements Runnable {
+public class RefreshPlayerListTask implements Runnable {
@Override
public void run() {
SidebarService.getInstance().refreshTabList();
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshTabHeaderFooterTask.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshTabHeaderFooterTask.java
new file mode 100644
index 000000000..c198e33b2
--- /dev/null
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/sidebar/thread/RefreshTabHeaderFooterTask.java
@@ -0,0 +1,33 @@
+/*
+ * BedWars1058 - A bed wars mini-game.
+ * Copyright (C) 2023 Andrei Dascălu
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Contact e-mail: andrew.dascalu@gmail.com
+ */
+
+package com.andrei1058.bedwars.sidebar.thread;
+
+import com.andrei1058.bedwars.sidebar.SidebarService;
+
+/**
+ * Refresh TAB header and footer.
+ */
+public class RefreshTabHeaderFooterTask implements Runnable {
+ @Override
+ public void run() {
+ SidebarService.getInstance().refreshTabHeaderFooter();
+ }
+}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/stats/StatsListener.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/stats/StatsListener.java
index c6563f22b..54c255f3a 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/stats/StatsListener.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/stats/StatsListener.java
@@ -37,6 +37,7 @@
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
+import org.jetbrains.annotations.NotNull;
import java.time.Instant;
import java.util.UUID;
@@ -117,7 +118,7 @@ public void onGameEnd(GameEndEvent event) {
}
@EventHandler
- public void onArenaLeave(PlayerLeaveArenaEvent event) {
+ public void onArenaLeave(@NotNull PlayerLeaveArenaEvent event) {
final Player player = event.getPlayer();
ITeam team = event.getArena().getExTeam(player.getUniqueId());
@@ -129,9 +130,11 @@ public void onArenaLeave(PlayerLeaveArenaEvent event) {
return; // Game didn't start
}
- PlayerStats playerStats = BedWars.getStatsManager().get(player.getUniqueId());
+ PlayerStats playerStats = BedWars.getStatsManager().getUnsafe(player.getUniqueId());
// sometimes can be null due to scheduling delays
- if (playerStats == null) return;
+ if (playerStats == null) {
+ return;
+ }
// Update last play and first play (if required)
Instant now = Instant.now();
@@ -140,56 +143,57 @@ public void onArenaLeave(PlayerLeaveArenaEvent event) {
playerStats.setFirstPlay(now);
}
+ // 28/10/2023 this should be handled by PlayerKillEvent now. It wasn't called for pvp log out before.
// Check quit abuse
- if (event.getArena().getStatus() == GameState.playing) {
- // Only if the player left the arena while the game was running
- if (team.isBedDestroyed()) {
- // Only if the team had the bed destroyed
-
- // Punish player if bed is destroyed and he disconnects without getting killed
- // if he is not in the spectators list it means he did not pass trough player kill event and he did not receive
- // the penalty bellow.
- if (event.getArena().isPlayer(player)) {
- playerStats.setFinalDeaths(playerStats.getFinalDeaths() + 1);
- playerStats.setLosses(playerStats.getLosses() + 1);
- }
-
- // Reward attacker
- // if attacker is not null it means the victim did pvp log out
- Player damager = event.getLastDamager();
- ITeam killerTeam = event.getArena().getTeam(damager);
- if (damager != null && event.getArena().isPlayer(damager) && killerTeam != null) {
- PlayerStats damagerStats = BedWars.getStatsManager().get(damager.getUniqueId());
- damagerStats.setFinalKills(damagerStats.getFinalKills() + 1);
- event.getArena().addPlayerKill(damager, true, player);
- }
- } else {
- // Prevent pvp log out abuse
- Player damager = event.getLastDamager();
- ITeam killerTeam = event.getArena().getTeam(damager);
-
- // killer is null if if he already received kill point.
- // LastHit damager is set to null at PlayerDeathEvent so this part is not duplicated for sure.
- // damager is not null if the victim disconnected during pvp only.
- if (event.getLastDamager() != null && event.getArena().isPlayer(damager) && killerTeam != null) {
- // Punish player
- playerStats.setDeaths(playerStats.getDeaths() + 1);
- event.getArena().addPlayerDeath(player);
-
- // Reward attacker
- event.getArena().addPlayerKill(damager, false, player);
- PlayerStats damagerStats = BedWars.getStatsManager().get(damager.getUniqueId());
- damagerStats.setKills(damagerStats.getKills() + 1);
- }
- }
- }
-
- //save or replace stats for player
- Bukkit.getScheduler().runTaskAsynchronously(BedWars.plugin, () -> BedWars.getRemoteDatabase().saveStats(playerStats));
+// if (event.getArena().getStatus() == GameState.playing) {
+// // Only if the player left the arena while the game was running
+// if (team.isBedDestroyed()) {
+// // Only if the team had the bed destroyed
+//
+// // Punish player if bed is destroyed and he disconnects without getting killed
+// // if he is not in the spectators list it means he did not pass trough player kill event and he did not receive
+// // the penalty bellow.
+// if (event.getArena().isPlayer(player)) {
+// playerStats.setFinalDeaths(playerStats.getFinalDeaths() + 1);
+// playerStats.setLosses(playerStats.getLosses() + 1);
+// }
+//
+// // Reward attacker
+// // if attacker is not null it means the victim did pvp log out
+// Player damager = event.getLastDamager();
+// ITeam killerTeam = event.getArena().getTeam(damager);
+// if (damager != null && event.getArena().isPlayer(damager) && killerTeam != null) {
+// PlayerStats damagerStats = BedWars.getStatsManager().get(damager.getUniqueId());
+// damagerStats.setFinalKills(damagerStats.getFinalKills() + 1);
+// event.getArena().addPlayerKill(damager, true, player);
+// }
+// } else {
+// // Prevent pvp log out abuse
+// Player damager = event.getLastDamager();
+// ITeam killerTeam = event.getArena().getTeam(damager);
+//
+// // killer is null if if he already received kill point.
+// // LastHit damager is set to null at PlayerDeathEvent so this part is not duplicated for sure.
+// // damager is not null if the victim disconnected during pvp only.
+// if (event.getLastDamager() != null && event.getArena().isPlayer(damager) && killerTeam != null) {
+// // Punish player
+// playerStats.setDeaths(playerStats.getDeaths() + 1);
+// event.getArena().addPlayerDeath(player);
+//
+// // Reward attacker
+// event.getArena().addPlayerKill(damager, false, player);
+// PlayerStats damagerStats = BedWars.getStatsManager().get(damager.getUniqueId());
+// damagerStats.setKills(damagerStats.getKills() + 1);
+// }
+// }
+// }
+
+ //save or replace stats for player - run later because PlayerKillEvent is triggered after PlayerLeaveArenaEvent
+ Bukkit.getScheduler().runTaskLaterAsynchronously(BedWars.plugin, () -> BedWars.getRemoteDatabase().saveStats(playerStats), 10L);
}
@EventHandler(priority = EventPriority.MONITOR)
- public void onQuit(PlayerQuitEvent event) {
+ public void onQuit(@NotNull PlayerQuitEvent event) {
BedWars.getStatsManager().remove(event.getPlayer().getUniqueId());
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/paper/PaperSupport.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/paper/TeleportManager.java
similarity index 64%
rename from bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/paper/PaperSupport.java
rename to bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/paper/TeleportManager.java
index 6f3a0e0b0..d4f9c50dc 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/paper/PaperSupport.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/paper/TeleportManager.java
@@ -9,26 +9,18 @@
import static com.andrei1058.bedwars.BedWars.config;
import static com.andrei1058.bedwars.BedWars.isPaper;
-public final class PaperSupport {
+public final class TeleportManager {
- public static void teleport(Entity entity, Location location){
- if (isPaper && config.getBoolean(ConfigPath.GENERAL_CONFIGURATION_PERFORMANCE_PAPER_FEATURES)){
- PaperLib.teleportAsync(entity, location);
- }
- else
- {
- entity.teleport(location);
- }
+ public static void teleport(Entity entity, Location location) {
+ teleportC(entity, location, PlayerTeleportEvent.TeleportCause.PLUGIN);
}
- public static void teleportC(Entity entity, Location location, PlayerTeleportEvent.TeleportCause cause){
- if (isPaper){
+ public static void teleportC(Entity entity, Location location, PlayerTeleportEvent.TeleportCause cause) {
+ if (isPaper && config.getBoolean(ConfigPath.GENERAL_CONFIGURATION_PERFORMANCE_PAPER_FEATURES)) {
PaperLib.teleportAsync(entity, location, cause);
+ return;
}
- else
- {
- entity.teleport(location, cause);
- }
+ entity.teleport(location, cause);
}
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAF.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAF.java
index 0cb8765fd..d4f14a042 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAF.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAF.java
@@ -14,6 +14,7 @@
public class PAF implements Party {
//Party and Friends for Spigot Support by JT122406
private PlayerParty getPAFParty(Player p) {
+ if (PAFPlayerManager.getInstance() == null) return null;
return PartyManager.getInstance().getParty(PAFPlayerManager.getInstance().getPlayer(p));
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAFBungeecordRedisApi.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAFBungeecordRedisApi.java
index b6fd5ed77..fb1c93468 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAFBungeecordRedisApi.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PAFBungeecordRedisApi.java
@@ -16,6 +16,7 @@ public class PAFBungeecordRedisApi implements Party {
//Party and Friends Extended for BungeeCord Support by JT122406
private PlayerParty getPAFParty(Player p) {
+ if (PAFPlayerManager.getInstance() == null) return null;
return PartyManager.getInstance().getParty(PAFPlayerManager.getInstance().getPlayer(p.getUniqueId()));
}
diff --git a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PartiesAdapter.java b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PartiesAdapter.java
index db3b3579b..feb978347 100644
--- a/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PartiesAdapter.java
+++ b/bedwars-plugin/src/main/java/com/andrei1058/bedwars/support/party/PartiesAdapter.java
@@ -91,14 +91,17 @@ public List getMembers(Player p) {
public void createParty(Player owner, Player... members) {
//party creation handled on bungee side
if (!api.isBungeeCordEnabled()) {
- boolean created = api.createParty(null, api.getPartyPlayer(owner.getUniqueId()));
- if (created) {
- com.alessiodp.parties.api.interfaces.Party party = api.getParty(owner.getUniqueId());
- if (null != party) {
- for (Player player1 : members) {
- PartyPlayer partyPlayer = api.getPartyPlayer(player1.getUniqueId());
- if (null != partyPlayer) {
- party.addMember(partyPlayer);
+ PartyPlayer partyOwner = api.getPartyPlayer(owner.getUniqueId());
+ if (null != partyOwner && !partyOwner.isInParty()) {
+ boolean created = api.createParty(null, partyOwner);
+ if (created && null != partyOwner.getPartyId()) {
+ com.alessiodp.parties.api.interfaces.Party party = api.getParty(partyOwner.getPartyId());
+ if (null != party) {
+ for (Player player1 : members) {
+ PartyPlayer partyPlayer = api.getPartyPlayer(player1.getUniqueId());
+ if (null != partyPlayer && !partyPlayer.isInParty()) {
+ party.addMember(partyPlayer);
+ }
}
}
}
@@ -178,7 +181,8 @@ public void removePlayer(Player owner, Player target) {
@Override
public Player getOwner(Player member) {
- return Bukkit.getPlayer(Objects.requireNonNull(api.getParty(member.getUniqueId())).getLeader());
+ PartyPlayer partyPlayer = api.getPartyPlayer(member.getUniqueId());
+ return Bukkit.getPlayer(Objects.requireNonNull(api.getParty(Objects.requireNonNull(partyPlayer).getPartyId())).getLeader());
}
@Override
diff --git a/bedwars-plugin/src/main/resources/plugin.yml b/bedwars-plugin/src/main/resources/plugin.yml
index 1818b4e3c..407b439c2 100644
--- a/bedwars-plugin/src/main/resources/plugin.yml
+++ b/bedwars-plugin/src/main/resources/plugin.yml
@@ -5,4 +5,4 @@ author: andrei1058
description: BedWars minigame by andrei1058
main: com.andrei1058.bedwars.BedWars
softdepend: [Vault,PlaceholderAPI,Citizens,Parties,SlimeWorldManager,VipFeatures,Enhanced-SlimeWorldManager,PartyAndFriends,Spigot-Party-API-PAF]
-load: STARTUP
+#load: STARTUP
diff --git a/pom.xml b/pom.xml
index 58991cba1..f60d95297 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
com.andrei1058.bedwarsBedWars1058pom
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOTUTF-8
@@ -21,14 +21,14 @@
bungeecord-repohttps://oss.sonatype.org/content/repositories/snapshots
-
- gitlab-maven
- https://gitlab.com/api/v4/groups/4800570/-/packages/maven
-
-
- vipfeatures-maven
- https://gitlab.com/api/v4/projects/6491858/packages/maven
-
+
+
+
+
+
+
+
+
codemc-nmshttps://repo.codemc.io/repository/nms/
@@ -46,7 +46,7 @@
commons-iocommons-io
- 2.11.0
+ 2.13.0provided
@@ -100,7 +100,9 @@
bedwars-pluginbedwars-api
+ resetadapter_aswmresetadapter_slime
+ resetadapter_slimepaperversionsupport_1_8_R3versionsupport_1_12_R1versionsupport_common
@@ -108,6 +110,9 @@
versionsupport_v1_17_R1versionsupport_v1_18_R2versionsupport_v1_19_R2
+ versionsupport_v1_19_R3
+ versionsupport_v1_20_R1
+ versionsupport_v1_20_R2
diff --git a/resetadapter_aswm/pom.xml b/resetadapter_aswm/pom.xml
new file mode 100644
index 000000000..6725d96a6
--- /dev/null
+++ b/resetadapter_aswm/pom.xml
@@ -0,0 +1,68 @@
+
+
+ 4.0.0
+
+
+ BedWars1058
+ com.andrei1058.bedwars
+ 23.10.1-SNAPSHOT
+
+
+ resetadapter-aswm
+ ${project.parent.version}
+
+
+
+ spigotmc-repo
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
+ flow-nbt
+ https://repo.glaremasters.me/repository/concuncan/
+
+
+ legacy-aswm
+ https://repo.rapture.pw/repository/maven-snapshots/
+
+
+
+
+
+ com.andrei1058.bedwars
+ bedwars-api
+ ${project.version}
+ provided
+
+
+ org.spigotmc
+ spigot-api
+ 1.8.8-R0.1-SNAPSHOT
+ provided
+
+
+ com.grinderwolf
+ slimeworldmanager-api
+ 2.2.1
+ provided
+
+
+ com.flowpowered
+ flow-nbt
+ 2.0.0
+ compile
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/resetadapter_aswm/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/AdvancedSlimeAdapter.java b/resetadapter_aswm/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/AdvancedSlimeAdapter.java
new file mode 100644
index 000000000..4c0e07bdd
--- /dev/null
+++ b/resetadapter_aswm/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/AdvancedSlimeAdapter.java
@@ -0,0 +1,484 @@
+/*
+ * BedWars1058 - A bed wars mini-game.
+ * Copyright (C) 2021 Andrei Dascălu
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Contact e-mail: andrew.dascalu@gmail.com
+ */
+
+package com.andrei1058.bedwars.arena.mapreset.slime;
+
+import com.andrei1058.bedwars.api.BedWars;
+import com.andrei1058.bedwars.api.arena.GameState;
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.configuration.ConfigPath;
+import com.andrei1058.bedwars.api.server.ISetupSession;
+import com.andrei1058.bedwars.api.server.RestoreAdapter;
+import com.andrei1058.bedwars.api.server.ServerType;
+import com.andrei1058.bedwars.api.util.FileUtil;
+import com.andrei1058.bedwars.api.util.ZipFileUtil;
+import com.flowpowered.nbt.CompoundMap;
+import com.flowpowered.nbt.CompoundTag;
+import com.flowpowered.nbt.IntTag;
+import com.flowpowered.nbt.stream.NBTInputStream;
+import com.flowpowered.nbt.stream.NBTOutputStream;
+import com.grinderwolf.swm.api.SlimePlugin;
+import com.grinderwolf.swm.api.exceptions.*;
+import com.grinderwolf.swm.api.loaders.SlimeLoader;
+import com.grinderwolf.swm.api.world.SlimeWorld;
+import com.grinderwolf.swm.api.world.properties.SlimeProperties;
+import com.grinderwolf.swm.api.world.properties.SlimePropertyMap;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.*;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.Player;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Level;
+
+@SuppressWarnings("unused")
+public class AdvancedSlimeAdapter extends RestoreAdapter {
+
+ private final SlimePlugin slime;
+ private final BedWars api;
+
+ public AdvancedSlimeAdapter(Plugin plugin) {
+ super(plugin);
+ slime = (SlimePlugin) Bukkit.getPluginManager().getPlugin("SlimeWorldManager");
+ api = Objects.requireNonNull(Bukkit.getServer().getServicesManager().getRegistration(BedWars.class)).getProvider();
+ }
+
+ @Override
+ public void onEnable(IArena a) {
+ if (api.getVersionSupport().getMainLevel().equalsIgnoreCase(a.getWorldName())) {
+ if (!(api.getServerType() == ServerType.BUNGEE && api.getArenaUtil().getGamesBeforeRestart() == 1)) {
+ FileUtil.setMainLevel("ignore_main_level", api.getVersionSupport());
+ getOwner().getLogger().log(Level.SEVERE, "Cannot use level-name as arenas. Automatically creating a new void map for level-name.");
+ getOwner().getLogger().log(Level.SEVERE, "The server is restarting...");
+ Bukkit.getServer().spigot().restart();
+ return;
+ }
+ }
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ if (Bukkit.getWorld(a.getWorldName()) != null) {
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ World w = Bukkit.getWorld(a.getWorldName());
+ a.init(w);
+ });
+ return;
+ }
+
+ SlimeLoader flat = slime.getLoader("file");
+ String[] spawn = a.getConfig().getString("waiting.Loc").split(",");
+
+ try {
+ // Note that this method should be called asynchronously
+ SlimeWorld world = slime.loadWorld(
+ flat,
+ a.getArenaName(),
+ true,
+ getCreateProperties(
+ (int) Double.parseDouble(spawn[0]),
+ (int) Double.parseDouble(spawn[1]),
+ (int) Double.parseDouble(spawn[2])
+ )
+ );
+
+ if (api.getServerType() == ServerType.BUNGEE && api.isAutoScale()) {
+ world = world.clone(a.getWorldName());
+ }
+
+ // This method must be called synchronously
+ SlimeWorld finalWorld = world;
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ slime.generateWorld(finalWorld);
+
+ World w = Bukkit.getWorld(a.getArenaName());
+ if (w == null) {
+ api.getArenaUtil().removeFromEnableQueue(a);
+ getOwner().getLogger().severe("Something wrong... removing arena " + a.getArenaName() + " from queue.");
+ return;
+ }
+ Bukkit.getPluginManager().callEvent(new WorldInitEvent(w));
+ Bukkit.getScheduler().runTask(
+ getOwner(), () -> Bukkit.getPluginManager().callEvent(new WorldLoadEvent(w))
+ );
+ });
+ } catch (UnknownWorldException | IOException | CorruptedWorldException | NewerFormatException |
+ WorldInUseException ex) {
+ api.getArenaUtil().removeFromEnableQueue(a);
+ ex.printStackTrace();
+ } catch (ConcurrentModificationException thisShouldNotHappenSWM) {
+ // this should not happen since they say to use #load async
+ // https://github.com/Grinderwolf/Slime-World-Manager/blob/develop/.docs/api/load-world.md
+ thisShouldNotHappenSWM.printStackTrace();
+ api.getArenaUtil().removeFromEnableQueue(a);
+ getOwner().getLogger().severe("This is a SlimeWorldManager issue!");
+ getOwner().getLogger().severe("I've submitted a bug report: https://github.com/Grinderwolf/Slime-World-Manager/issues/174");
+ getOwner().getLogger().severe("Trying again to load arena: " + a.getArenaName());
+
+ // hope not to get an overflow
+ onEnable(a);
+ }
+ });
+ }
+
+ @Override
+ public void onRestart(IArena a) {
+ if (api.getServerType() == ServerType.BUNGEE) {
+ if (api.getArenaUtil().getGamesBeforeRestart() == 0) {
+ if (api.getArenaUtil().getArenas().size() == 1 && api.getArenaUtil().getArenas().get(0).getStatus() == GameState.restarting) {
+ getOwner().getLogger().info("Dispatching command: " + api.getConfigs().getMainConfig().getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_RESTART_CMD));
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), api.getConfigs().getMainConfig().getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_RESTART_CMD));
+ }
+ } else {
+ if (api.getArenaUtil().getGamesBeforeRestart() != -1) {
+ api.getArenaUtil().setGamesBeforeRestart(api.getArenaUtil().getGamesBeforeRestart() - 1);
+ }
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ Bukkit.unloadWorld(a.getWorldName(), false);
+ if (api.getArenaUtil().canAutoScale(a.getArenaName())) {
+ Bukkit.getScheduler().runTaskLater(getOwner(), () -> api.getArenaUtil().loadArena(a.getArenaName(), null), 80L);
+ }
+ });
+ }
+ } else {
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ Bukkit.unloadWorld(a.getWorldName(), false);
+ Bukkit.getScheduler().runTaskLater(getOwner(), () -> api.getArenaUtil().loadArena(a.getArenaName(), null), 80L);
+ });
+ }
+ }
+
+ @Override
+ public void onDisable(IArena a) {
+ if (api.isShuttingDown()) {
+ Bukkit.unloadWorld(a.getWorldName(), false);
+ return;
+ }
+ Bukkit.getScheduler().runTask(getOwner(), () -> Bukkit.unloadWorld(a.getWorldName(), false));
+ }
+
+ @Override
+ public void onSetupSessionStart(ISetupSession s) {
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ SlimeLoader sLoader = slime.getLoader("file");
+ String[] spawn = new String[]{"0", "50", "0"};
+ if (s.getConfig().getYml().getString("waiting.Loc") != null) {
+ spawn = s.getConfig().getString("waiting.Loc").split(",");
+ }
+ SlimePropertyMap spm = getCreateProperties(
+ (int) Double.parseDouble(spawn[0]),
+ (int) Double.parseDouble(spawn[1]),
+ (int) Double.parseDouble(spawn[2])
+ );
+
+ try {
+
+ if (Bukkit.getWorld(s.getWorldName()) != null) {
+ Bukkit.getScheduler().runTask(getOwner(), () -> Bukkit.unloadWorld(s.getWorldName(), false));
+ }
+
+ SlimeWorld world;
+ if (sLoader.worldExists(s.getWorldName())) {
+ world = slime.loadWorld(sLoader, s.getWorldName(), false, spm);
+ Bukkit.getScheduler().runTask(getOwner(), () -> s.getPlayer().sendMessage(ChatColor.GREEN + "Loading world from SlimeWorldManager container."));
+ } else {
+ if (new File(Bukkit.getWorldContainer(), s.getWorldName() + "/level.dat").exists()) {
+ Bukkit.getScheduler().runTask(getOwner(), () -> s.getPlayer().sendMessage(ChatColor.GREEN + "Importing world to the SlimeWorldManager container."));
+ slime.importWorld(new File(Bukkit.getWorldContainer(), s.getWorldName()), s.getWorldName().toLowerCase(), sLoader);
+ world = slime.loadWorld(sLoader, s.getWorldName(), false, spm);
+ } else {
+ Bukkit.getScheduler().runTask(getOwner(), () -> s.getPlayer().sendMessage(ChatColor.GREEN + "Creating anew void map."));
+ world = slime.createEmptyWorld(sLoader, s.getWorldName(), false, spm);
+ }
+ }
+
+ SlimeWorld sw = world;
+ // This method must be called synchronously
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ slime.generateWorld(sw);
+
+ World w = Bukkit.getWorld(s.getWorldName());
+ if (w == null) {
+ return;
+ }
+ Bukkit.getPluginManager().callEvent(new WorldInitEvent(w));
+ Bukkit.getScheduler().runTask(
+ getOwner(), () -> Bukkit.getPluginManager().callEvent(new WorldLoadEvent(w))
+ );
+ s.teleportPlayer();
+ });
+ } catch (UnknownWorldException | IOException | CorruptedWorldException | NewerFormatException |
+ WorldInUseException | WorldAlreadyExistsException | InvalidWorldException | WorldTooBigException |
+ WorldLoadedException ex) {
+ s.getPlayer().sendMessage(ChatColor.RED + "An error occurred! Please check console.");
+ ex.printStackTrace();
+ s.close();
+ }
+ });
+ }
+
+ @Override
+ public void onSetupSessionClose(@NotNull ISetupSession s) {
+ Objects.requireNonNull(Bukkit.getWorld(s.getWorldName())).save();
+ Bukkit.getScheduler().runTask(getOwner(), () -> Bukkit.unloadWorld(s.getWorldName(), true));
+ }
+
+ @Override
+ public void onLobbyRemoval(IArena a) {
+ Location loc1 = a.getConfig().getArenaLoc(ConfigPath.ARENA_WAITING_POS1),
+ loc2 = a.getConfig().getArenaLoc(ConfigPath.ARENA_WAITING_POS2);
+ if (loc1 == null || loc2 == null) return;
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ int minX, minY, minZ;
+ int maxX, maxY, maxZ;
+ minX = Math.min(loc1.getBlockX(), loc2.getBlockX());
+ maxX = Math.max(loc1.getBlockX(), loc2.getBlockX());
+ minY = Math.min(loc1.getBlockY(), loc2.getBlockY());
+ maxY = Math.max(loc1.getBlockY(), loc2.getBlockY());
+ minZ = Math.min(loc1.getBlockZ(), loc2.getBlockZ());
+ maxZ = Math.max(loc1.getBlockZ(), loc2.getBlockZ());
+
+ for (int x = minX; x < maxX; x++) {
+ for (int y = minY; y < maxY; y++) {
+ for (int z = minZ; z < maxZ; z++) {
+ Objects.requireNonNull(loc1.getWorld()).getBlockAt(x, y, z).setType(Material.AIR);
+ }
+ }
+ }
+
+ Bukkit.getScheduler().runTaskLater(getOwner(), () ->
+ Objects.requireNonNull(loc1.getWorld()).getEntities().forEach(e -> {
+ if (e instanceof Item) e.remove();
+ }), 15L);
+ });
+ }
+
+ @Override
+ public boolean isWorld(String name) {
+ try {
+ return slime.getLoader("file").worldExists(name);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ @Override
+ public void deleteWorld(String name) {
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ try {
+ slime.getLoader("file").deleteWorld(name);
+ } catch (UnknownWorldException | IOException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ @Override
+ public void cloneArena(String name1, String name2) {
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+
+ try {
+ // Note that this method should be called asynchronously
+ SlimeWorld world = slime.loadWorld(
+ slime.getLoader("file"),
+ name1,
+ true,
+ getCreateProperties(0, 118, 0)
+ );
+ world.clone(name2, slime.getLoader("file"));
+
+ } catch (
+ UnknownWorldException | IOException | CorruptedWorldException | NewerFormatException |
+ WorldInUseException | WorldAlreadyExistsException ex
+ ) {
+ ex.printStackTrace();
+ }
+
+ });
+ }
+
+ @Override
+ public List getWorldsList() {
+ try {
+ return slime.getLoader("file").listWorlds();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return new ArrayList<>();
+ }
+
+ /**
+ * Convert vanilla worlds to the slime format.
+ */
+ public void convertWorlds() {
+ File dir = new File(getOwner().getDataFolder(), "/Arenas");
+ File ff;
+ SlimeLoader sl = slime.getLoader("file");
+ if (dir.exists()) {
+ File[] fls = dir.listFiles();
+ if (fls != null) {
+ for (File fl : fls) {
+ if (fl.isFile()) {
+ if (fl.getName().endsWith(".yml")) {
+ final String name = fl.getName().replace(".yml", "").toLowerCase();
+ ff = new File(Bukkit.getWorldContainer(), fl.getName().replace(".yml", ""));
+ try {
+ if (!sl.worldExists(name)) {
+ if (!fl.getName().equals(name)) {
+ if (!fl.renameTo(new File(dir, name + ".yml"))) {
+ getOwner().getLogger().log(Level.WARNING, "Could not rename " + fl.getName() + ".yml to " + name + ".yml");
+ }
+ }
+ File bc = new File(getOwner().getDataFolder() + "/Cache", ff.getName() + ".zip");
+ if (ff.exists() && bc.exists()) {
+ FileUtil.delete(ff);
+ ZipFileUtil.unzipFileIntoDirectory(bc, new File(Bukkit.getWorldContainer(), name));
+ }
+ deleteWorldTrash(name);
+ handleLevelDat(name);
+
+ convertWorld(name, null);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ }
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ File[] files = Bukkit.getWorldContainer().listFiles();
+ if (files != null) {
+ for (File f : files) {
+ if (f != null && f.isDirectory()) {
+ if (f.getName().contains("bw_temp_")) {
+ try {
+ FileUtils.deleteDirectory(f);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public String getDisplayName() {
+ return "Advanced Slime World Manager by Paul19988";
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private void convertWorld(String name, @Nullable Player player) {
+ SlimeLoader sl = slime.getLoader("file");
+ try {
+ getOwner().getLogger().log(Level.INFO, "Converting " + name + " to the Slime format.");
+ slime.importWorld(new File(Bukkit.getWorldContainer(), name), name, sl);
+ } catch (WorldAlreadyExistsException | InvalidWorldException | WorldLoadedException | WorldTooBigException |
+ IOException e) {
+ if (null != player) {
+ player.sendMessage(ChatColor.RED + "Could not convert " + name + " to the Slime format.");
+ player.sendMessage(ChatColor.RED + "Check the console for details.");
+ ISetupSession s = api.getSetupSession(player.getUniqueId());
+ if (s != null) {
+ s.close();
+ }
+ }
+ getOwner().getLogger().log(Level.WARNING, "Could not convert " + name + " to the Slime format.");
+ e.printStackTrace();
+ }
+ }
+
+ private void deleteWorldTrash(String world) {
+ for (File f : new File[]{/*new File(Bukkit.getWorldContainer(), world+"/level.dat"),*/
+ new File(Bukkit.getWorldContainer(), world + "/level.dat_mcr"),
+ new File(Bukkit.getWorldContainer(), world + "/level.dat_old"),
+ new File(Bukkit.getWorldContainer(), world + "/session.lock"),
+ new File(Bukkit.getWorldContainer(), world + "/uid.dat")}) {
+ if (f.exists()) {
+ if (!f.delete()) {
+ getOwner().getLogger().warning("Could not delete: " + f.getPath());
+ getOwner().getLogger().warning("This may cause issues!");
+ }
+ }
+ }
+ }
+
+ private void handleLevelDat(String world) throws IOException {
+
+ File level = new File(Bukkit.getWorldContainer(), world + "/level.dat");
+
+ if (!level.exists()) {
+ if (level.createNewFile()) {
+ File regions = new File(Bukkit.getWorldContainer(), "world/region");
+ if (regions.exists() && Objects.requireNonNull(regions.list()).length > 0) {
+ if (Arrays.stream(Objects.requireNonNull(regions.list())).filter(p -> p.endsWith(".mca")).toArray().length > 0) {
+ File region = new File(Bukkit.getWorldContainer(), world + "/" + Arrays.stream(Objects.requireNonNull(regions.list())).filter(p -> p.endsWith(".mca")).toArray()[0]);
+ NBTInputStream inputStream = new NBTInputStream(new FileInputStream(region));
+ Optional tag = inputStream.readTag().getAsCompoundTag();
+ inputStream.close();
+ if (tag.isPresent()) {
+ Optional dataTag = tag.get().getAsCompoundTag("Chunk");
+ if (dataTag.isPresent()) {
+ int dataVersion = dataTag.get().getIntValue("DataVersion").orElse(-1);
+
+ NBTOutputStream outputStream = new NBTOutputStream(new FileOutputStream(level));
+
+ CompoundMap cm = new CompoundMap();
+ cm.put(new IntTag("SpawnX", 0));
+ cm.put(new IntTag("SpawnY", 255));
+ cm.put(new IntTag("SpawnZ", 0));
+ if (dataVersion != -1) {
+ cm.put(new IntTag("DataVersion", dataVersion));
+ }
+ CompoundTag root = new CompoundTag("Data", cm);
+ outputStream.writeTag(root);
+ outputStream.flush();
+ outputStream.close();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private @NotNull SlimePropertyMap getCreateProperties(int spawnX, int spawnY, int spawnZ) {
+ SlimePropertyMap spm = new SlimePropertyMap();
+ spm.setString(SlimeProperties.WORLD_TYPE, "flat");
+ spm.setInt(SlimeProperties.SPAWN_X, spawnX);
+ spm.setInt(SlimeProperties.SPAWN_Y, spawnY);
+ spm.setInt(SlimeProperties.SPAWN_Z, spawnZ);
+ spm.setBoolean(SlimeProperties.ALLOW_ANIMALS, false);
+ spm.setBoolean(SlimeProperties.ALLOW_MONSTERS, false);
+ spm.setString(SlimeProperties.DIFFICULTY, "easy");
+ spm.setBoolean(SlimeProperties.PVP, true);
+ return spm;
+ }
+}
diff --git a/resetadapter_slime/pom.xml b/resetadapter_slime/pom.xml
index 5f318fa21..f551ca914 100644
--- a/resetadapter_slime/pom.xml
+++ b/resetadapter_slime/pom.xml
@@ -7,7 +7,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOTresetadapter-slime
@@ -40,7 +40,7 @@
com.grinderwolfslimeworldmanager-api
- [2.2.1,)
+ 2.2.1provided
diff --git a/resetadapter_slime/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimeAdapter.java b/resetadapter_slime/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimeAdapter.java
index a5539718b..b137082a9 100644
--- a/resetadapter_slime/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimeAdapter.java
+++ b/resetadapter_slime/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimeAdapter.java
@@ -362,6 +362,11 @@ public void convertWorlds() {
});
}
+ @Override
+ public String getDisplayName() {
+ return "Slime World Manager by Grinderwolf";
+ }
+
private void convertWorld(String name, Player player) {
SlimeLoader sl = slime.getLoader("file");
try {
diff --git a/resetadapter_slimepaper/pom.xml b/resetadapter_slimepaper/pom.xml
new file mode 100644
index 000000000..5a7422179
--- /dev/null
+++ b/resetadapter_slimepaper/pom.xml
@@ -0,0 +1,76 @@
+
+
+ 4.0.0
+
+
+ BedWars1058
+ com.andrei1058.bedwars
+ 23.10.1-SNAPSHOT
+
+
+ resetadapter-slimepaper
+ ${project.parent.version}
+
+
+
+ 11
+ 11
+
+
+
+
+
+ spigotmc-repo
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
+
+ is-snapshots
+ https://repo.infernalsuite.com/repository/maven-snapshots/
+
+
+ flow-nbt
+ https://repo.glaremasters.me/repository/concuncan/
+
+
+
+
+
+ com.andrei1058.bedwars
+ bedwars-api
+ ${project.version}
+ provided
+
+
+ org.spigotmc
+ spigot-api
+ 1.8.8-R0.1-SNAPSHOT
+ provided
+
+
+ com.infernalsuite.aswm
+ api
+ 1.20-R0.1-SNAPSHOT
+ provided
+
+
+ com.flowpowered
+ flow-nbt
+ 2.0.0
+ compile
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/resetadapter_slimepaper/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimePaperAdapter.java b/resetadapter_slimepaper/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimePaperAdapter.java
new file mode 100644
index 000000000..78ca5eef7
--- /dev/null
+++ b/resetadapter_slimepaper/src/main/java/com/andrei1058/bedwars/arena/mapreset/slime/SlimePaperAdapter.java
@@ -0,0 +1,478 @@
+/*
+ * BedWars1058 - A bed wars mini-game.
+ * Copyright (C) 2023 Andrei Dascălu
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * Contact e-mail: andrew.dascalu@gmail.com
+ */
+
+package com.andrei1058.bedwars.arena.mapreset.slime;
+
+import com.andrei1058.bedwars.api.BedWars;
+import com.andrei1058.bedwars.api.arena.GameState;
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.configuration.ConfigPath;
+import com.andrei1058.bedwars.api.server.ISetupSession;
+import com.andrei1058.bedwars.api.server.RestoreAdapter;
+import com.andrei1058.bedwars.api.server.ServerType;
+import com.andrei1058.bedwars.api.util.FileUtil;
+import com.andrei1058.bedwars.api.util.ZipFileUtil;
+import com.flowpowered.nbt.CompoundMap;
+import com.flowpowered.nbt.CompoundTag;
+import com.flowpowered.nbt.IntTag;
+import com.flowpowered.nbt.stream.NBTInputStream;
+import com.flowpowered.nbt.stream.NBTOutputStream;
+import com.infernalsuite.aswm.api.SlimePlugin;
+import com.infernalsuite.aswm.api.exceptions.*;
+import com.infernalsuite.aswm.api.loaders.SlimeLoader;
+import com.infernalsuite.aswm.api.world.SlimeWorld;
+import com.infernalsuite.aswm.api.world.properties.SlimeProperties;
+import com.infernalsuite.aswm.api.world.properties.SlimePropertyMap;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.*;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.Player;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Level;
+
+public class SlimePaperAdapter extends RestoreAdapter {
+
+ private final SlimePlugin slime;
+ private final BedWars api;
+
+ public SlimePaperAdapter(Plugin plugin) {
+ super(plugin);
+ slime = (SlimePlugin) Bukkit.getPluginManager().getPlugin("SlimeWorldManager");
+ api = Objects.requireNonNull(Bukkit.getServer().getServicesManager().getRegistration(BedWars.class)).getProvider();
+ }
+
+ @Override
+ public void onEnable(@NotNull IArena a) {
+ if (api.getVersionSupport().getMainLevel().equalsIgnoreCase(a.getWorldName())) {
+ if (!(api.getServerType() == ServerType.BUNGEE && api.getArenaUtil().getGamesBeforeRestart() == 1)) {
+ FileUtil.setMainLevel("ignore_main_level", api.getVersionSupport());
+ getOwner().getLogger().log(Level.SEVERE, "Cannot use level-name as arenas. Automatically creating a new void map for level-name.");
+ getOwner().getLogger().log(Level.SEVERE, "The server is restarting...");
+ Bukkit.getServer().spigot().restart();
+ return;
+ }
+ }
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ if (Bukkit.getWorld(a.getWorldName()) != null) {
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ World w = Bukkit.getWorld(a.getWorldName());
+ a.init(w);
+ });
+ return;
+ }
+
+ SlimeLoader flat = slime.getLoader("file");
+ String[] spawn = a.getConfig().getString("waiting.Loc").split(",");
+
+ SlimePropertyMap spm = getCreateProperties(
+ (int) Double.parseDouble(spawn[0]),
+ (int) Double.parseDouble(spawn[1]),
+ (int) Double.parseDouble(spawn[2])
+ );
+
+ try {
+ // Note that this method should be called asynchronously
+ SlimeWorld world = slime.loadWorld(flat, a.getArenaName(), true, spm);
+ if (api.getServerType() == ServerType.BUNGEE && api.isAutoScale()) {
+ world = world.clone(a.getWorldName());
+ }
+
+ // This method must be called synchronously
+ SlimeWorld finalWorld = world;
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ SlimeWorld loaded = slime.loadWorld(finalWorld);
+ if (null == loaded) {
+ api.getArenaUtil().removeFromEnableQueue(a);
+ getOwner().getLogger().severe("Something wrong... removing arena " + a.getArenaName() + " from queue.");
+ return;
+ }
+ World w = Bukkit.getWorld(loaded.getName());
+ if (w == null) {
+ api.getArenaUtil().removeFromEnableQueue(a);
+ getOwner().getLogger().severe("Something wrong... removing arena " + a.getArenaName() + " from queue.");
+ return;
+ }
+ Bukkit.getPluginManager().callEvent(new WorldInitEvent(w));
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ Bukkit.getPluginManager().callEvent(new WorldLoadEvent(w));
+ });
+ });
+ } catch (UnknownWorldException | IOException | CorruptedWorldException | NewerFormatException |
+ WorldLockedException ex) {
+ api.getArenaUtil().removeFromEnableQueue(a);
+ ex.printStackTrace();
+ } catch (ConcurrentModificationException thisShouldNotHappenSWM) {
+ // this should not happen since they say to use #load async
+ // https://github.com/Grinderwolf/Slime-World-Manager/blob/develop/.docs/api/load-world.md
+ thisShouldNotHappenSWM.printStackTrace();
+ api.getArenaUtil().removeFromEnableQueue(a);
+ getOwner().getLogger().severe("This is a AdvancedSlimePaper issue!");
+ getOwner().getLogger().severe("I've submitted a bug report: https://github.com/Grinderwolf/Slime-World-Manager/issues/174");
+ getOwner().getLogger().severe("Trying again to load arena: " + a.getArenaName());
+
+ // hope not to get an overflow
+ onEnable(a);
+ }
+ });
+ }
+
+ @Override
+ public void onRestart(IArena a) {
+ if (api.getServerType() == ServerType.BUNGEE) {
+ if (api.getArenaUtil().getGamesBeforeRestart() == 0) {
+ if (api.getArenaUtil().getArenas().size() == 1 && api.getArenaUtil().getArenas().get(0).getStatus() == GameState.restarting) {
+ getOwner().getLogger().info("Dispatching command: " + api.getConfigs().getMainConfig().getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_RESTART_CMD));
+ Bukkit.dispatchCommand(Bukkit.getConsoleSender(), api.getConfigs().getMainConfig().getString(ConfigPath.GENERAL_CONFIGURATION_BUNGEE_OPTION_RESTART_CMD));
+ }
+ } else {
+ if (api.getArenaUtil().getGamesBeforeRestart() != -1) {
+ api.getArenaUtil().setGamesBeforeRestart(api.getArenaUtil().getGamesBeforeRestart() - 1);
+ }
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ Bukkit.unloadWorld(a.getWorldName(), false);
+ if (api.getArenaUtil().canAutoScale(a.getArenaName())) {
+ Bukkit.getScheduler().runTaskLater(getOwner(), () -> api.getArenaUtil().loadArena(a.getArenaName(), null), 80L);
+ }
+ });
+ }
+ } else {
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ Bukkit.unloadWorld(a.getWorldName(), false);
+ Bukkit.getScheduler().runTaskLater(getOwner(), () -> api.getArenaUtil().loadArena(a.getArenaName(), null), 80L);
+ });
+ }
+ }
+
+ @Override
+ public void onDisable(IArena a) {
+ if (api.isShuttingDown()) {
+ Bukkit.unloadWorld(a.getWorldName(), false);
+ return;
+ }
+ Bukkit.getScheduler().runTask(getOwner(), () -> Bukkit.unloadWorld(a.getWorldName(), false));
+ }
+
+ @Override
+ public void onSetupSessionStart(ISetupSession s) {
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ SlimeLoader sLoader = slime.getLoader("file");
+ String[] spawn = new String[]{"0", "50", "0"};
+ if (s.getConfig().getYml().getString("waiting.Loc") != null) {
+ spawn = s.getConfig().getString("waiting.Loc").split(",");
+ }
+ SlimePropertyMap spm = getCreateProperties(
+ (int) Double.parseDouble(spawn[0]),
+ (int) Double.parseDouble(spawn[1]),
+ (int) Double.parseDouble(spawn[2])
+ );
+
+ try {
+
+ if (Bukkit.getWorld(s.getWorldName()) != null) {
+ Bukkit.getScheduler().runTask(getOwner(), () -> Bukkit.unloadWorld(s.getWorldName(), false));
+ }
+
+ SlimeWorld world;
+ if (sLoader.worldExists(s.getWorldName())) {
+ world = slime.loadWorld(sLoader, s.getWorldName(), false, spm);
+ Bukkit.getScheduler().runTask(getOwner(), () -> s.getPlayer().sendMessage(ChatColor.GREEN + "Loading world from SlimeWorldManager container."));
+ } else {
+ if (new File(Bukkit.getWorldContainer(), s.getWorldName() + "/level.dat").exists()) {
+ Bukkit.getScheduler().runTask(getOwner(), () -> s.getPlayer().sendMessage(ChatColor.GREEN + "Importing world to the SlimeWorldManager container."));
+ slime.importWorld(new File(Bukkit.getWorldContainer(), s.getWorldName()), s.getWorldName().toLowerCase(), sLoader);
+ world = slime.loadWorld(sLoader, s.getWorldName(), false, spm);
+ } else {
+ Bukkit.getScheduler().runTask(getOwner(), () -> s.getPlayer().sendMessage(ChatColor.GREEN + "Creating anew void map."));
+ world = slime.createEmptyWorld(sLoader, s.getWorldName(), false, spm);
+ }
+ }
+
+ SlimeWorld sw = world;
+ // This method must be called synchronously
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ if (null == sw) {
+ return;
+ }
+ World w = Bukkit.getWorld(sw.getName());
+ if (w == null) {
+ return;
+ }
+ Bukkit.getPluginManager().callEvent(new WorldInitEvent(w));
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ Bukkit.getPluginManager().callEvent(new WorldLoadEvent(w));
+ });
+ s.teleportPlayer();
+ });
+ } catch (UnknownWorldException | IOException | CorruptedWorldException | NewerFormatException |
+ WorldAlreadyExistsException | InvalidWorldException | WorldTooBigException | WorldLoadedException |
+ WorldLockedException ex) {
+ s.getPlayer().sendMessage(ChatColor.RED + "An error occurred! Please check console.");
+ ex.printStackTrace();
+ s.close();
+ }
+ });
+ }
+
+ @Override
+ public void onSetupSessionClose(ISetupSession s) {
+ Objects.requireNonNull(Bukkit.getWorld(s.getWorldName())).save();
+ Bukkit.getScheduler().runTask(getOwner(), () -> Bukkit.unloadWorld(s.getWorldName(), true));
+ }
+
+ @Override
+ public void onLobbyRemoval(IArena a) {
+ Location loc1 = a.getConfig().getArenaLoc(ConfigPath.ARENA_WAITING_POS1),
+ loc2 = a.getConfig().getArenaLoc(ConfigPath.ARENA_WAITING_POS2);
+ if (loc1 == null || loc2 == null) return;
+ Bukkit.getScheduler().runTask(getOwner(), () -> {
+ int minX, minY, minZ;
+ int maxX, maxY, maxZ;
+ minX = Math.min(loc1.getBlockX(), loc2.getBlockX());
+ maxX = Math.max(loc1.getBlockX(), loc2.getBlockX());
+ minY = Math.min(loc1.getBlockY(), loc2.getBlockY());
+ maxY = Math.max(loc1.getBlockY(), loc2.getBlockY());
+ minZ = Math.min(loc1.getBlockZ(), loc2.getBlockZ());
+ maxZ = Math.max(loc1.getBlockZ(), loc2.getBlockZ());
+
+ for (int x = minX; x < maxX; x++) {
+ for (int y = minY; y < maxY; y++) {
+ for (int z = minZ; z < maxZ; z++) {
+ Objects.requireNonNull(loc1.getWorld()).getBlockAt(x, y, z).setType(Material.AIR);
+ }
+ }
+ }
+
+ Bukkit.getScheduler().runTaskLater(getOwner(), () ->
+ Objects.requireNonNull(loc1.getWorld()).getEntities().forEach(e -> {
+ if (e instanceof Item) e.remove();
+ }), 15L);
+ });
+ }
+
+ @Override
+ public boolean isWorld(String name) {
+ try {
+ return slime.getLoader("file").worldExists(name);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ @Override
+ public void deleteWorld(String name) {
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ try {
+ slime.getLoader("file").deleteWorld(name);
+ } catch (UnknownWorldException | IOException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+
+ @Override
+ public void cloneArena(String name1, String name2) {
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ try {
+ // Note that this method should be called asynchronously
+ SlimeWorld world = slime.loadWorld(
+ slime.getLoader("file"),
+ name1,
+ true,
+ getCreateProperties(0, 118, 0)
+ );
+ world.clone(name2, slime.getLoader("file"));
+ } catch (UnknownWorldException | IOException | CorruptedWorldException | NewerFormatException |
+ WorldLockedException | WorldAlreadyExistsException ex) {
+ ex.printStackTrace();
+ }
+ });
+ }
+
+ @Override
+ public List getWorldsList() {
+ try {
+ return slime.getLoader("file").listWorlds();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return new ArrayList<>();
+ }
+
+ /**
+ * Convert vanilla worlds to the slime format.
+ */
+ public void convertWorlds() {
+ File dir = new File(getOwner().getDataFolder(), "/Arenas");
+ File ff;
+ SlimeLoader sl = slime.getLoader("file");
+ if (dir.exists()) {
+ File[] fls = dir.listFiles();
+ if (fls != null) {
+ for (File fl : fls) {
+ if (fl.isFile()) {
+ if (fl.getName().endsWith(".yml")) {
+ final String name = fl.getName().replace(".yml", "").toLowerCase();
+ ff = new File(Bukkit.getWorldContainer(), fl.getName().replace(".yml", ""));
+ try {
+ if (!sl.worldExists(name)) {
+ if (!fl.getName().equals(name)) {
+ if (!fl.renameTo(new File(dir, name + ".yml"))) {
+ getOwner().getLogger().log(Level.WARNING, "Could not rename " + fl.getName() + ".yml to " + name + ".yml");
+ }
+ }
+ File bc = new File(getOwner().getDataFolder() + "/Cache", ff.getName() + ".zip");
+ if (ff.exists() && bc.exists()) {
+ FileUtil.delete(ff);
+ ZipFileUtil.unzipFileIntoDirectory(bc, new File(Bukkit.getWorldContainer(), name));
+ }
+ deleteWorldTrash(name);
+ handleLevelDat(name);
+
+ convertWorld(name, null);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ }
+ Bukkit.getScheduler().runTaskAsynchronously(getOwner(), () -> {
+ File[] files = Bukkit.getWorldContainer().listFiles();
+ if (files != null) {
+ for (File f : files) {
+ if (f != null && f.isDirectory()) {
+ if (f.getName().contains("bw_temp_")) {
+ try {
+ FileUtils.deleteDirectory(f);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public String getDisplayName() {
+ return "Advanced Slime Paper by InfernalSuite";
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private void convertWorld(String name, Player player) {
+ SlimeLoader sl = slime.getLoader("file");
+ try {
+ getOwner().getLogger().log(Level.INFO, "Converting " + name + " to the Slime format.");
+ slime.importWorld(new File(Bukkit.getWorldContainer(), name), name, sl);
+ } catch (WorldAlreadyExistsException | InvalidWorldException | WorldLoadedException | WorldTooBigException |
+ IOException e) {
+ if (player != null) {
+ player.sendMessage(ChatColor.RED + "Could not convert " + name + " to the Slime format.");
+ player.sendMessage(ChatColor.RED + "Check the console for details.");
+ ISetupSession s = api.getSetupSession(player.getUniqueId());
+ if (s != null) {
+ s.close();
+ }
+ }
+ getOwner().getLogger().log(Level.WARNING, "Could not convert " + name + " to the Slime format.");
+ e.printStackTrace();
+ }
+ }
+
+ private void deleteWorldTrash(String world) {
+ for (File f : new File[]{/*new File(Bukkit.getWorldContainer(), world+"/level.dat"),*/
+ new File(Bukkit.getWorldContainer(), world + "/level.dat_mcr"),
+ new File(Bukkit.getWorldContainer(), world + "/level.dat_old"),
+ new File(Bukkit.getWorldContainer(), world + "/session.lock"),
+ new File(Bukkit.getWorldContainer(), world + "/uid.dat")}) {
+ if (f.exists()) {
+ if (!f.delete()) {
+ getOwner().getLogger().warning("Could not delete: " + f.getPath());
+ getOwner().getLogger().warning("This may cause issues!");
+ }
+ }
+ }
+ }
+
+ private void handleLevelDat(String world) throws IOException {
+
+ File level = new File(Bukkit.getWorldContainer(), world + "/level.dat");
+
+ if (!level.exists()) {
+ if (level.createNewFile()) {
+ File regions = new File(Bukkit.getWorldContainer(), "world/region");
+ if (regions.exists() && Objects.requireNonNull(regions.list()).length > 0) {
+ if (Arrays.stream(Objects.requireNonNull(regions.list())).filter(p -> p.endsWith(".mca")).toArray().length > 0) {
+ File region = new File(Bukkit.getWorldContainer(), world + "/" + Arrays.stream(Objects.requireNonNull(regions.list())).filter(p -> p.endsWith(".mca")).toArray()[0]);
+ NBTInputStream inputStream = new NBTInputStream(new FileInputStream(region));
+ Optional tag = inputStream.readTag().getAsCompoundTag();
+ inputStream.close();
+ if (tag.isPresent()) {
+ Optional dataTag = tag.get().getAsCompoundTag("Chunk");
+ if (dataTag.isPresent()) {
+ int dataVersion = dataTag.get().getIntValue("DataVersion").orElse(-1);
+
+ NBTOutputStream outputStream = new NBTOutputStream(new FileOutputStream(level));
+
+ CompoundMap cm = new CompoundMap();
+ cm.put(new IntTag("SpawnX", 0));
+ cm.put(new IntTag("SpawnY", 255));
+ cm.put(new IntTag("SpawnZ", 0));
+ if (dataVersion != -1) {
+ cm.put(new IntTag("DataVersion", dataVersion));
+ }
+ CompoundTag root = new CompoundTag("Data", cm);
+ outputStream.writeTag(root);
+ outputStream.flush();
+ outputStream.close();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private @NotNull SlimePropertyMap getCreateProperties(int spawnX, int spawnY, int spawnZ) {
+ SlimePropertyMap spm = new SlimePropertyMap();
+ spm.setValue(SlimeProperties.WORLD_TYPE, "flat");
+ spm.setValue(SlimeProperties.SPAWN_X, spawnX);
+ spm.setValue(SlimeProperties.SPAWN_Y, spawnY);
+ spm.setValue(SlimeProperties.SPAWN_Z, spawnZ);
+ spm.setValue(SlimeProperties.ALLOW_ANIMALS, false);
+ spm.setValue(SlimeProperties.ALLOW_MONSTERS, false);
+ spm.setValue(SlimeProperties.DIFFICULTY, "easy");
+ spm.setValue(SlimeProperties.PVP, true);
+ return spm;
+ }
+}
diff --git a/versionsupport_1_12_R1/pom.xml b/versionsupport_1_12_R1/pom.xml
index a6174c3ec..d0bf8ca1f 100644
--- a/versionsupport_1_12_R1/pom.xml
+++ b/versionsupport_1_12_R1/pom.xml
@@ -10,7 +10,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT
diff --git a/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/Silverfish.java b/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/Silverfish.java
index 16fb7265b..c9e1c5f11 100644
--- a/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/Silverfish.java
+++ b/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/Silverfish.java
@@ -143,7 +143,7 @@ public static LivingEntity spawn(Location loc, ITeam team, double speed, double
customEnt.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
customEnt.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(damage);
((CraftLivingEntity)customEnt.getBukkitEntity()).setRemoveWhenFarAway(false);
- customEnt.setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME)
+ customEnt.setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME)
.replace("{despawn}", String.valueOf(despawn)
.replace("{health}", StringUtils.repeat(Language.getDefaultLanguage().m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH)+" ", 10))
.replace("{TeamColor}", team.getColor().chat().toString())));
diff --git a/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/v1_12_R1.java b/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/v1_12_R1.java
index 6536622dc..86bec8d55 100644
--- a/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/v1_12_R1.java
+++ b/versionsupport_1_12_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_12_R1/v1_12_R1.java
@@ -346,13 +346,13 @@ public void colorBed(ITeam bwt) {
}
@Override
- public void registerTntWhitelist() {
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
try {
Field field = Block.class.getDeclaredField("durability");
field.setAccessible(true);
- field.set(Block.getByName("glass"), 300f);
- field.set(Block.getByName("stained_glass"), 300f);
- field.set(Block.getByName("end_stone"), 69f);
+ field.set(Block.getByName("glass"), glassBlast);
+ field.set(Block.getByName("stained_glass"), glassBlast);
+ field.set(Block.getByName("end_stone"), endStoneBlast);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -440,12 +440,6 @@ public org.bukkit.inventory.ItemStack createItemStack(String material, int amoun
return i;
}
- @Override
- public void teamCollideRule(Team team) {
- team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
- team.setCanSeeFriendlyInvisibles(true);
- }
-
@Override
public boolean isPlayerHead(String material, int data) {
return material.equals("SKULL_ITEM") && data == 3;
@@ -726,6 +720,7 @@ public void placeTowerBlocks(org.bukkit.block.Block b, IArena a, TeamColor color
@Override
public void placeLadder(org.bukkit.block.Block b, int x, int y, int z, IArena a, int ladderdata){
b.getRelative(x, y, z).setType(Material.LADDER);
+ //noinspection deprecation
b.getRelative(x, y, z).setData((byte)ladderdata);
a.addPlacedBlock(b.getRelative(x, y, z));
}
@@ -734,4 +729,5 @@ public void placeLadder(org.bukkit.block.Block b, int x, int y, int z, IArena a,
public void playVillagerEffect(Player player, Location location){
player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
}
+
}
diff --git a/versionsupport_1_8_R3/pom.xml b/versionsupport_1_8_R3/pom.xml
index e1d9d05d4..d2800299b 100644
--- a/versionsupport_1_8_R3/pom.xml
+++ b/versionsupport_1_8_R3/pom.xml
@@ -7,7 +7,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOTversionsupport_1_8_R3
diff --git a/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/Silverfish.java b/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/Silverfish.java
index 19ff5ddb4..e9e79bb22 100644
--- a/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/Silverfish.java
+++ b/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/Silverfish.java
@@ -87,7 +87,7 @@ public static LivingEntity spawn(Location loc, ITeam team, double speed, double
customEnt.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
customEnt.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(damage);
((CraftLivingEntity)customEnt.getBukkitEntity()).setRemoveWhenFarAway(false);
- customEnt.setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME)
+ customEnt.setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME)
.replace("{despawn}", String.valueOf(despawn)
.replace("{health}", StringUtils.repeat(Language.getDefaultLanguage().m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH)+" ", 10))
.replace("{TeamColor}", team.getColor().chat().toString())));
diff --git a/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/v1_8_R3.java b/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/v1_8_R3.java
index dcde4de8d..7a3335db6 100644
--- a/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/v1_8_R3.java
+++ b/versionsupport_1_8_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_8_R3/v1_8_R3.java
@@ -49,7 +49,6 @@
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffectType;
-import org.bukkit.scoreboard.Team;
import org.bukkit.util.Vector;
import java.lang.reflect.Field;
@@ -190,6 +189,12 @@ public boolean isInvisibilityPotion(org.bukkit.inventory.ItemStack itemStack) {
return type.getEffectType().equals(org.bukkit.potion.PotionEffectType.INVISIBILITY);
}
+ @Override
+ public boolean isGlass(Material type) {
+ // Avoids string search
+ return type == Material.GLASS || type == Material.STAINED_GLASS;
+ }
+
@Override
public void registerEntities() {
registerEntity("Silverfish2", 60, Silverfish.class);
@@ -388,13 +393,13 @@ public void colorBed(ITeam bwt) {
}
@Override
- public void registerTntWhitelist() {
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
try {
Field field = Block.class.getDeclaredField("durability");
field.setAccessible(true);
- field.set(Block.getByName("glass"), 300f);
- field.set(Block.getByName("stained_glass"), 300f);
- field.set(Block.getByName("end_stone"), 69f);
+ field.set(Block.getByName("glass"), glassBlast);
+ field.set(Block.getByName("stained_glass"), glassBlast);
+ field.set(Block.getByName("end_stone"), endStoneBlast);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -483,11 +488,6 @@ public org.bukkit.inventory.ItemStack createItemStack(String material, int amoun
return i;
}
- @Override
- public void teamCollideRule(Team team) {
-
- }
-
@Override
public boolean isPlayerHead(String material, int data) {
return material.equals("SKULL_ITEM") && data == 3;
@@ -761,6 +761,7 @@ public void placeTowerBlocks(org.bukkit.block.Block b, IArena a, TeamColor color
@Override
public void placeLadder(org.bukkit.block.Block b, int x, int y, int z, IArena a, int ladderdata){
b.getRelative(x, y, z).setType(Material.LADDER);
+ //noinspection deprecation
b.getRelative(x, y, z).setData((byte)ladderdata);
a.addPlacedBlock(b.getRelative(x, y, z));
}
@@ -770,4 +771,5 @@ public void playVillagerEffect(Player player, Location location){
PacketPlayOutWorldParticles pwp = new PacketPlayOutWorldParticles(EnumParticle.VILLAGER_HAPPY, true, (float) location.getX(), (float) location.getY(), (float) location.getZ(), (float) 0, (float) 0, (float) 0, (float) 0, 1);
((CraftPlayer) player).getHandle().playerConnection.sendPacket(pwp);
}
+
}
diff --git a/versionsupport_common/pom.xml b/versionsupport_common/pom.xml
index 185f49df8..a5b5a4003 100644
--- a/versionsupport_common/pom.xml
+++ b/versionsupport_common/pom.xml
@@ -5,7 +5,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT4.0.0
diff --git a/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/ItemDropPickListener.java b/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/ItemDropPickListener.java
index 441c7a001..4873d27c1 100644
--- a/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/ItemDropPickListener.java
+++ b/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/ItemDropPickListener.java
@@ -92,7 +92,7 @@ public void onArrowPick(PlayerPickupArrowEvent e){
*/
private static boolean managePickup(Item item, LivingEntity player) {
if (!(player instanceof Player)) return false;
- if (api.getServerType() != ServerType.BUNGEE) {
+ if (api.getServerType() == ServerType.MULTIARENA) {
//noinspection ConstantConditions
if (player.getLocation().getWorld().getName().equalsIgnoreCase(api.getLobbyWorld())) {
return true;
@@ -145,7 +145,7 @@ private static boolean managePickup(Item item, LivingEntity player) {
*/
private static boolean manageDrop(Entity player, Item item) {
if (!(player instanceof Player)) return false;
- if (api.getServerType() != ServerType.BUNGEE) {
+ if (api.getServerType() == ServerType.MULTIARENA) {
//noinspection ConstantConditions
if (player.getLocation().getWorld().getName().equalsIgnoreCase(api.getLobbyWorld())) {
return true;
diff --git a/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/PlayerDropPick_1_11Minus.java b/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/PlayerDropPick_1_11Minus.java
index eb32d70a3..fa1fd5749 100644
--- a/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/PlayerDropPick_1_11Minus.java
+++ b/versionsupport_common/src/main/java/com/andrei1058/bedwars/listeners/PlayerDropPick_1_11Minus.java
@@ -49,7 +49,7 @@ public PlayerDropPick_1_11Minus(BedWars bedWars){
@SuppressWarnings("deprecation")
@EventHandler
public void onPickup(PlayerPickupItemEvent e) {
- if (api.getServerType() != ServerType.BUNGEE) {
+ if (api.getServerType() == ServerType.MULTIARENA) {
//noinspection ConstantConditions
if (e.getPlayer().getLocation().getWorld().getName().equalsIgnoreCase(api.getLobbyWorld())) {
e.setCancelled(true);
@@ -111,7 +111,7 @@ public void onPickup(PlayerPickupItemEvent e) {
@EventHandler
public void onDrop(PlayerDropItemEvent e) {
- if (api.getServerType() != ServerType.BUNGEE) {
+ if (api.getServerType() == ServerType.MULTIARENA) {
//noinspection ConstantConditions
if (e.getPlayer().getLocation().getWorld().getName().equalsIgnoreCase(api.getLobbyWorld())) {
e.setCancelled(true);
diff --git a/versionsupport_v1_16_R3/pom.xml b/versionsupport_v1_16_R3/pom.xml
index 26c2b0971..9e1d04258 100644
--- a/versionsupport_v1_16_R3/pom.xml
+++ b/versionsupport_v1_16_R3/pom.xml
@@ -5,7 +5,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT4.0.0
diff --git a/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/Silverfish.java b/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/Silverfish.java
index 883c1a880..4b5b7dce9 100644
--- a/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/Silverfish.java
+++ b/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/Silverfish.java
@@ -79,7 +79,7 @@ public static LivingEntity spawn(Location loc, ITeam team, double speed, double
((CraftLivingEntity)customEnt.getBukkitEntity()).setRemoveWhenFarAway(false);
customEnt.setCustomNameVisible(true);
mcWorld.addEntity(customEnt, CreatureSpawnEvent.SpawnReason.CUSTOM);
- customEnt.getBukkitEntity().setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME)
+ customEnt.getBukkitEntity().setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME)
.replace("{despawn}", String.valueOf(despawn)
.replace("{health}", StringUtils.repeat(Language.getDefaultLanguage().m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH)+" ", 10))
.replace("{TeamColor}", team.getColor().chat().toString())));
diff --git a/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/v1_16_R3.java b/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/v1_16_R3.java
index 54294f25c..cbf392e89 100644
--- a/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/v1_16_R3.java
+++ b/versionsupport_v1_16_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_16_R3/v1_16_R3.java
@@ -57,7 +57,6 @@
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffectType;
-import org.bukkit.scoreboard.Team;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
@@ -327,12 +326,32 @@ public void colorBed(ITeam bwt) {
}
@Override
- public void registerTntWhitelist() {
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
try {
Field field = net.minecraft.server.v1_16_R3.BlockBase.class.getDeclaredField("durability");
field.setAccessible(true);
- field.set(Blocks.END_STONE, 12f);
- field.set(Blocks.GLASS, 300f);
+ for (net.minecraft.server.v1_16_R3.Block glass : new net.minecraft.server.v1_16_R3.Block[]{
+ Blocks.WHITE_STAINED_GLASS,
+ Blocks.ORANGE_STAINED_GLASS,
+ Blocks.MAGENTA_STAINED_GLASS,
+ Blocks.LIGHT_BLUE_STAINED_GLASS,
+ Blocks.YELLOW_STAINED_GLASS,
+ Blocks.LIME_STAINED_GLASS,
+ Blocks.PINK_STAINED_GLASS,
+ Blocks.GRAY_STAINED_GLASS,
+ Blocks.LIGHT_GRAY_STAINED_GLASS,
+ Blocks.CYAN_STAINED_GLASS,
+ Blocks.PURPLE_STAINED_GLASS,
+ Blocks.BLUE_STAINED_GLASS,
+ Blocks.BROWN_STAINED_GLASS,
+ Blocks.GREEN_STAINED_GLASS,
+ Blocks.RED_STAINED_GLASS,
+ Blocks.BLACK_STAINED_GLASS,
+ Blocks.GLASS,
+ }) {
+ field.set(glass, glassBlast);
+ }
+ field.set(Blocks.END_STONE, endStoneBlast);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -428,12 +447,6 @@ public org.bukkit.inventory.ItemStack createItemStack(String material, int amoun
return i;
}
- @Override
- public void teamCollideRule(Team team) {
- team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
- team.setCanSeeFriendlyInvisibles(true);
- }
-
@Override
public org.bukkit.Material materialFireball() {
return org.bukkit.Material.FIRE_CHARGE;
@@ -720,4 +733,5 @@ public void placeLadder(Block b, int x, int y,int z, IArena a, int ladderdata){
public void playVillagerEffect(@NotNull Player player, Location location){
player.spawnParticle(org.bukkit.Particle.VILLAGER_HAPPY, location, 1);
}
+
}
diff --git a/versionsupport_v1_17_R1/pom.xml b/versionsupport_v1_17_R1/pom.xml
index 9d758b14b..7ca5af14c 100644
--- a/versionsupport_v1_17_R1/pom.xml
+++ b/versionsupport_v1_17_R1/pom.xml
@@ -5,7 +5,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT4.0.0
diff --git a/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/Silverfish.java b/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/Silverfish.java
index f11cf0ee6..615fd31f6 100644
--- a/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/Silverfish.java
+++ b/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/Silverfish.java
@@ -90,7 +90,7 @@ public static LivingEntity spawn(Location loc, ITeam team, double speed, double
((CraftLivingEntity)customEnt.getBukkitEntity()).setRemoveWhenFarAway(false);
customEnt.setCustomNameVisible(true);
mcWorld.addEntity(customEnt, CreatureSpawnEvent.SpawnReason.CUSTOM);
- customEnt.getBukkitEntity().setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME)
+ customEnt.getBukkitEntity().setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME)
.replace("{despawn}", String.valueOf(despawn)
.replace("{health}", StringUtils.repeat(Language.getDefaultLanguage().m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH)+" ", 10))
.replace("{TeamColor}", team.getColor().chat().toString())));
diff --git a/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/v1_17_R1.java b/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/v1_17_R1.java
index 26df79a8b..654a9f238 100644
--- a/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/v1_17_R1.java
+++ b/versionsupport_v1_17_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_17_R1/v1_17_R1.java
@@ -179,7 +179,6 @@ public void setSource(TNTPrimed tnt, Player owner) {
EntityLiving nmsEntityLiving = (((CraftLivingEntity) owner).getHandle());
EntityTNTPrimed nmsTNT = (((CraftTNTPrimed) tnt).getHandle());
try {
- //noinspection JavaReflectionMemberAccess
Field sourceField = EntityTNTPrimed.class.getDeclaredField("d");
sourceField.setAccessible(true);
sourceField.set(nmsTNT, nmsEntityLiving);
@@ -354,12 +353,34 @@ public void colorBed(ITeam bwt) {
}
@Override
- public void registerTntWhitelist() {
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
try {
Field field = BlockBase.class.getDeclaredField("aI");
field.setAccessible(true);
- field.set(Blocks.eq, 12f);
- field.set(Blocks.au, 300f);
+
+ for (net.minecraft.world.level.block.Block glass : new net.minecraft.world.level.block.Block[]{
+ Blocks.au,
+ Blocks.dg,
+ Blocks.dh,
+ Blocks.di,
+ Blocks.dj,
+ Blocks.dk,
+ Blocks.dl,
+ Blocks.dm,
+ Blocks.dn,
+ Blocks.do_,
+ Blocks.dp,
+ Blocks.dq,
+ Blocks.dr,
+ Blocks.ds,
+ Blocks.dt,
+ Blocks.du,
+ Blocks.dv,
+ }) {
+ field.set(glass, glassBlast);
+ }
+ field.set(Blocks.eq, endStoneBlast);
+
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -455,12 +476,6 @@ public org.bukkit.inventory.ItemStack createItemStack(String material, int amoun
return i;
}
- @Override
- public void teamCollideRule(Team team) {
- team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
- team.setCanSeeFriendlyInvisibles(true);
- }
-
@Override
public org.bukkit.Material materialFireball() {
return org.bukkit.Material.FIRE_CHARGE;
@@ -752,4 +767,5 @@ public void placeLadder(Block b, int x, int y,int z, IArena a, int ladderdata){
public void playVillagerEffect(Player player, Location location){
player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
}
+
}
diff --git a/versionsupport_v1_18_R2/pom.xml b/versionsupport_v1_18_R2/pom.xml
index df95ac88e..def00468f 100644
--- a/versionsupport_v1_18_R2/pom.xml
+++ b/versionsupport_v1_18_R2/pom.xml
@@ -5,7 +5,7 @@
BedWars1058com.andrei1058.bedwars
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOT4.0.0
diff --git a/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/Silverfish.java b/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/Silverfish.java
index 4a28f6aae..465502faf 100644
--- a/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/Silverfish.java
+++ b/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/Silverfish.java
@@ -98,7 +98,7 @@ public static LivingEntity spawn(Location loc, ITeam team, double speed, double
((CraftLivingEntity) customEnt.getBukkitEntity()).setRemoveWhenFarAway(true);
((CraftLivingEntity) customEnt.getBukkitEntity()).setPersistent(true);
- customEnt.getBukkitEntity().setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME)
+ customEnt.getBukkitEntity().setCustomName(Language.getDefaultLanguage().m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME)
.replace("{despawn}", String.valueOf(despawn)
.replace("{health}", StringUtils.repeat(Language.getDefaultLanguage().m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
.replace("{TeamColor}", team.getColor().chat().toString())));
diff --git a/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/v1_18_R2.java b/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/v1_18_R2.java
index b66f00516..b0b29c190 100644
--- a/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/v1_18_R2.java
+++ b/versionsupport_v1_18_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_18_R2/v1_18_R2.java
@@ -334,12 +334,34 @@ public void colorBed(ITeam bwt) {
}
@Override
- public void registerTntWhitelist() {
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
try {
Field field = BlockBase.class.getDeclaredField("aH");
field.setAccessible(true);
- field.set(Blocks.eq, 300f);
- field.set(Blocks.bQ, 300f);
+
+ for (net.minecraft.world.level.block.Block glass : new net.minecraft.world.level.block.Block[]{
+ Blocks.bQ,
+ Blocks.dg,
+ Blocks.dh,
+ Blocks.di,
+ Blocks.dj,
+ Blocks.dk,
+ Blocks.dl,
+ Blocks.dm,
+ Blocks.dn,
+// Blocks.do,
+ Blocks.dp,
+ Blocks.dq,
+ Blocks.dr,
+ Blocks.ds,
+ Blocks.dt,
+ Blocks.du,
+ Blocks.dv,
+ }) {
+ field.set(glass, glassBlast);
+ }
+ field.set(Blocks.eq, endStoneBlast);
+
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
@@ -435,12 +457,6 @@ public org.bukkit.inventory.ItemStack createItemStack(String material, int amoun
return i;
}
- @Override
- public void teamCollideRule(Team team) {
- team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
- team.setCanSeeFriendlyInvisibles(true);
- }
-
@Override
public org.bukkit.Material materialFireball() {
return org.bukkit.Material.FIRE_CHARGE;
@@ -720,4 +736,5 @@ public void placeLadder(@NotNull Block b, int x, int y, int z, @NotNull IArena a
public void playVillagerEffect(@NotNull Player player, Location location){
player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
}
+
}
diff --git a/versionsupport_v1_19_R2/pom.xml b/versionsupport_v1_19_R2/pom.xml
index 6e91e2e5d..354b6ea9d 100644
--- a/versionsupport_v1_19_R2/pom.xml
+++ b/versionsupport_v1_19_R2/pom.xml
@@ -6,7 +6,7 @@
com.andrei1058.bedwarsBedWars1058
- 22.9-SNAPSHOT
+ 23.10.1-SNAPSHOTversionsupport_v1_19_R2
diff --git a/versionsupport_v1_19_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R2/v1_19_R2.java b/versionsupport_v1_19_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R2/v1_19_R2.java
index 575b0a06c..04f57d23a 100644
--- a/versionsupport_v1_19_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R2/v1_19_R2.java
+++ b/versionsupport_v1_19_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R2/v1_19_R2.java
@@ -334,18 +334,17 @@ public void colorBed(ITeam bwt) {
}
@Override
- public void registerTntWhitelist() {
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
try {
- var protection = 300f;
// blast resistance
Field field = BlockBase.class.getDeclaredField("aH");
field.setAccessible(true);
// end stone
- field.set(Blocks.fj, protection);
+ field.set(Blocks.fj, endStoneBlast);
// obsidian
- field.set(Blocks.ce, protection);
+ field.set(Blocks.ce, glassBlast);
// standard glass
- field.set(Blocks.aH, protection);
+ field.set(Blocks.aH, glassBlast);
var coloredGlass = new net.minecraft.world.level.block.Block[]{
Blocks.dU, Blocks.dV, Blocks.dW, Blocks.dX,
@@ -358,7 +357,7 @@ public void registerTntWhitelist() {
Arrays.stream(coloredGlass).forEach(
glass -> {
try {
- field.set(glass, protection);
+ field.set(glass, glassBlast);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
@@ -441,12 +440,6 @@ public org.bukkit.inventory.ItemStack createItemStack(String material, int amoun
return i;
}
- @Override
- public void teamCollideRule(@NotNull Team team) {
- team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
- team.setCanSeeFriendlyInvisibles(true);
- }
-
@Override
public org.bukkit.Material materialFireball() {
return org.bukkit.Material.FIRE_CHARGE;
@@ -831,4 +824,5 @@ public void placeLadder(@NotNull Block b, int x, int y, int z, @NotNull IArena a
public void playVillagerEffect(@NotNull Player player, Location location){
player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
}
+
}
\ No newline at end of file
diff --git a/versionsupport_v1_19_R3/pom.xml b/versionsupport_v1_19_R3/pom.xml
new file mode 100644
index 000000000..f0bcac348
--- /dev/null
+++ b/versionsupport_v1_19_R3/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ com.andrei1058.bedwars
+ BedWars1058
+ 23.10.1-SNAPSHOT
+
+
+ versionsupport_v1_19_R3
+
+
+ 1.19
+ 1.19
+ UTF-8
+
+
+
+
+ com.andrei1058.bedwars
+ bedwars-api
+ ${project.version}
+ jar
+ provided
+
+
+ com.andrei1058.bedwars
+ versionsupport-common
+ ${project.version}
+ jar
+ provided
+
+
+ org.spigotmc
+ spigot
+ 1.19.4-R0.1-SNAPSHOT
+ jar
+ provided
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+
+ 17
+
+
+
+
+
+
\ No newline at end of file
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableAttributes.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableAttributes.java
new file mode 100644
index 000000000..cbabe1d59
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableAttributes.java
@@ -0,0 +1,5 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3.despawnable;
+
+public record DespawnableAttributes(DespawnableType type, double speed, double health, double damage, int despawnSeconds) {
+
+}
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableFactory.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableFactory.java
new file mode 100644
index 000000000..60cd226ff
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableFactory.java
@@ -0,0 +1,27 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import org.bukkit.Location;
+import org.bukkit.entity.LivingEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DespawnableFactory {
+
+ private final VersionSupport versionSupport;
+ private final List> providers = new ArrayList<>();
+
+ public DespawnableFactory(VersionSupport versionSupport) {
+ this.versionSupport = versionSupport;
+ providers.add(new TeamIronGolem());
+ providers.add(new TeamSilverfish());
+ }
+
+ public LivingEntity spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team){
+ return providers.stream().filter(provider -> provider.getType() == attr.type())
+ .findFirst().orElseThrow().spawn(attr, location,team, versionSupport);
+ }
+}
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableProvider.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableProvider.java
new file mode 100644
index 000000000..fd63ab2a4
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableProvider.java
@@ -0,0 +1,71 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityCreature;
+import net.minecraft.world.entity.EntityInsentient;
+import net.minecraft.world.entity.EntityLiving;
+import net.minecraft.world.entity.ai.attributes.GenericAttributes;
+import net.minecraft.world.entity.ai.goal.PathfinderGoal;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalSelector;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalNearestAttackableTarget;
+import net.minecraft.world.entity.player.EntityHuman;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public abstract class DespawnableProvider {
+
+ abstract DespawnableType getType();
+
+ abstract String getDisplayName(DespawnableAttributes attr, ITeam team);
+
+ abstract T spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api);
+
+ protected boolean notSameTeam(@NotNull Entity entity, ITeam team, @NotNull VersionSupport api) {
+ var despawnable = api.getDespawnablesList().getOrDefault(entity.getBukkitEntity().getUniqueId(), null);
+ return null == despawnable || despawnable.getTeam() != team;
+ }
+
+ protected PathfinderGoalSelector getTargetSelector(@NotNull EntityCreature entityLiving) {
+ return entityLiving.bO;
+ }
+
+ protected PathfinderGoalSelector getGoalSelector(@NotNull EntityCreature entityLiving) {
+ return entityLiving.bN;
+ }
+
+ protected void clearSelectors(@NotNull EntityCreature entityLiving) {
+ entityLiving.bO.b().clear();
+ entityLiving.bN.b().clear();
+ }
+
+ protected PathfinderGoal getTargetGoal(EntityInsentient entity, ITeam team, VersionSupport api) {
+ return new PathfinderGoalNearestAttackableTarget<>(entity, EntityLiving.class, 20, true, false,
+ entityLiving -> {
+ if (entityLiving instanceof EntityHuman) {
+ return !((EntityHuman) entityLiving).getBukkitEntity().isDead() &&
+ !team.wasMember(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId()) &&
+ !team.getArena().isReSpawning(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId())
+ && !team.getArena().isSpectator(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId());
+ }
+ return notSameTeam(entityLiving, team, api);
+ });
+ }
+
+ protected void applyDefaultSettings(org.bukkit.entity.@NotNull LivingEntity bukkitEntity, DespawnableAttributes attr,
+ ITeam team) {
+ bukkitEntity.setRemoveWhenFarAway(false);
+ bukkitEntity.setPersistent(true);
+ bukkitEntity.setCustomNameVisible(true);
+ bukkitEntity.setCustomName(getDisplayName(attr, team));
+
+ var entity = ((EntityInsentient)((CraftEntity)bukkitEntity).getHandle());
+ Objects.requireNonNull(entity.a(GenericAttributes.a)).a(attr.health());
+ Objects.requireNonNull(entity.a(GenericAttributes.d)).a(attr.speed());
+ Objects.requireNonNull(entity.a(GenericAttributes.f)).a(attr.damage());
+ }
+}
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableType.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableType.java
new file mode 100644
index 000000000..f72749991
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/DespawnableType.java
@@ -0,0 +1,6 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3.despawnable;
+
+public enum DespawnableType {
+ IRON_GOLEM,
+ SILVERFISH
+}
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/TeamIronGolem.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/TeamIronGolem.java
new file mode 100644
index 000000000..5e13b72b0
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/TeamIronGolem.java
@@ -0,0 +1,58 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
+import net.minecraft.world.entity.animal.EntityIronGolem;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.IronGolem;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class TeamIronGolem extends DespawnableProvider {
+
+ @Override
+ public DespawnableType getType() {
+ return DespawnableType.IRON_GOLEM;
+ }
+
+ @Override
+ String getDisplayName(@NotNull DespawnableAttributes attr, @NotNull ITeam team) {
+ Language lang = Language.getDefaultLanguage();
+ return lang.m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME).replace("{despawn}", String.valueOf(attr.despawnSeconds())
+ .replace("{health}", StringUtils.repeat(lang.m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
+ .replace("{TeamColor}", team.getColor().chat().toString())
+ );
+ }
+
+ public @NotNull IronGolem spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api) {
+
+ var bukkitEntity = (IronGolem) Objects.requireNonNull(location.getWorld()).spawnEntity(location, EntityType.IRON_GOLEM);
+ applyDefaultSettings(bukkitEntity, attr, team);
+
+ var entity = (EntityIronGolem) ((CraftEntity) bukkitEntity).getHandle();
+
+ clearSelectors(entity);
+ var goalSelector = getGoalSelector(entity);
+ var targetSelector = getTargetSelector(entity);
+
+ goalSelector.a(1, new PathfinderGoalFloat(entity));
+ goalSelector.a(2, new PathfinderGoalMeleeAttack(entity, 1.5D, false));
+ goalSelector.a(3, new PathfinderGoalRandomStroll(entity, 1D));
+ goalSelector.a(4, new PathfinderGoalRandomLookaround(entity));
+ targetSelector.a(1, new PathfinderGoalHurtByTarget(entity));
+ targetSelector.a(2, getTargetGoal(entity, team, api));
+
+ return bukkitEntity;
+ }
+}
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/TeamSilverfish.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/TeamSilverfish.java
new file mode 100644
index 000000000..9db8307d9
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/despawnable/TeamSilverfish.java
@@ -0,0 +1,56 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
+import net.minecraft.world.entity.monster.EntitySilverfish;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Silverfish;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class TeamSilverfish extends DespawnableProvider {
+ @Override
+ public DespawnableType getType() {
+ return DespawnableType.SILVERFISH;
+ }
+
+ @Override
+ String getDisplayName(@NotNull DespawnableAttributes attr, @NotNull ITeam team) {
+ Language lang = Language.getDefaultLanguage();
+ return lang.m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME).replace("{despawn}", String.valueOf(attr.despawnSeconds())
+ .replace("{health}", StringUtils.repeat(lang.m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
+ .replace("{TeamColor}", team.getColor().chat().toString())
+ );
+ }
+
+ @Override
+ public Silverfish spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api) {
+ var bukkitEntity = (Silverfish) Objects.requireNonNull(location.getWorld()).spawnEntity(location, EntityType.SILVERFISH);
+ applyDefaultSettings(bukkitEntity, attr, team);
+
+ var entity = (EntitySilverfish) ((CraftEntity) bukkitEntity).getHandle();
+ clearSelectors(entity);
+
+ var goalSelector = getGoalSelector(entity);
+ var targetSelector = getTargetSelector(entity);
+ goalSelector.a(1, new PathfinderGoalFloat(entity));
+ goalSelector.a(2, new PathfinderGoalMeleeAttack(entity, 1.9D, false));
+ goalSelector.a(3, new PathfinderGoalRandomStroll(entity, 2D));
+ goalSelector.a(4, new PathfinderGoalRandomLookaround(entity));
+ targetSelector.a(1, new PathfinderGoalHurtByTarget(entity));
+ targetSelector.a(2, getTargetGoal(entity, team, api));
+
+ return bukkitEntity;
+ }
+}
diff --git a/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/v1_19_R3.java b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/v1_19_R3.java
new file mode 100644
index 000000000..62d570bce
--- /dev/null
+++ b/versionsupport_v1_19_R3/src/main/java/com/andrei1058/bedwars/support/version/v1_19_R3/v1_19_R3.java
@@ -0,0 +1,824 @@
+package com.andrei1058.bedwars.support.version.v1_19_R3;
+
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.shop.ShopHolo;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.arena.team.TeamColor;
+import com.andrei1058.bedwars.api.entity.Despawnable;
+import com.andrei1058.bedwars.api.events.player.PlayerKillEvent;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import com.andrei1058.bedwars.support.version.common.VersionCommon;
+import com.andrei1058.bedwars.support.version.v1_19_R3.despawnable.DespawnableAttributes;
+import com.andrei1058.bedwars.support.version.v1_19_R3.despawnable.DespawnableFactory;
+import com.andrei1058.bedwars.support.version.v1_19_R3.despawnable.DespawnableType;
+import com.mojang.datafixers.util.Pair;
+import net.md_5.bungee.api.ChatMessageType;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.minecraft.core.particles.ParticleParamRedstone;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.protocol.game.*;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.dedicated.DedicatedServer;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.world.entity.EntityLiving;
+import net.minecraft.world.entity.EnumItemSlot;
+import net.minecraft.world.entity.item.EntityTNTPrimed;
+import net.minecraft.world.entity.projectile.EntityFireball;
+import net.minecraft.world.entity.projectile.IProjectile;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.*;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBase;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.data.type.Bed;
+import org.bukkit.block.data.type.Ladder;
+import org.bukkit.block.data.type.WallSign;
+import org.bukkit.command.Command;
+import org.bukkit.craftbukkit.v1_19_R3.CraftServer;
+import org.bukkit.craftbukkit.v1_19_R3.entity.*;
+import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
+import org.bukkit.entity.*;
+import org.bukkit.event.inventory.InventoryEvent;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.SkullMeta;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.scoreboard.Team;
+import org.bukkit.util.Vector;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Vector3f;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.logging.Level;
+
+@SuppressWarnings("unused")
+public class v1_19_R3 extends VersionSupport {
+
+ private final DespawnableFactory despawnableFactory;
+
+ public v1_19_R3(Plugin plugin, String name) {
+ super(plugin, name);
+ loadDefaultEffects();
+ this.despawnableFactory = new DespawnableFactory(this);
+ }
+
+ @Override
+ public void registerVersionListeners() {
+ new VersionCommon(this);
+ }
+
+ @Override
+ public void registerCommand(String name, Command cmd) {
+ ((CraftServer) getPlugin().getServer()).getCommandMap().register(name, cmd);
+ }
+
+ @Override
+ public String getTag(org.bukkit.inventory.ItemStack itemStack, String key) {
+ var tag = getTag(itemStack);
+ return tag == null ? null : tag.e(key) ? tag.l(key) : null;
+ }
+
+ @Override
+ public void sendTitle(@NotNull Player p, String title, String subtitle, int fadeIn, int stay, int fadeOut) {
+ p.sendTitle(title == null ? " " : title, subtitle == null ? " " : subtitle, fadeIn, stay, fadeOut);
+ }
+
+ public void spawnSilverfish(Location loc, ITeam bedWarsTeam, double speed, double health, int despawn, double damage) {
+ var attr = new DespawnableAttributes(DespawnableType.SILVERFISH, speed, health, damage, despawn);
+ var entity = despawnableFactory.spawn(attr, loc, bedWarsTeam);
+
+ new Despawnable(
+ entity,
+ bedWarsTeam, despawn,
+ Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME,
+ PlayerKillEvent.PlayerKillCause.SILVERFISH_FINAL_KILL,
+ PlayerKillEvent.PlayerKillCause.SILVERFISH
+ );
+ }
+
+ @Override
+ public void spawnIronGolem(Location loc, ITeam bedWarsTeam, double speed, double health, int despawn) {
+ var attr = new DespawnableAttributes(DespawnableType.IRON_GOLEM, speed, health, 4, despawn);
+ var entity = despawnableFactory.spawn(attr, loc, bedWarsTeam);
+ new Despawnable(
+ entity,
+ bedWarsTeam, despawn,
+ Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME,
+ PlayerKillEvent.PlayerKillCause.IRON_GOLEM_FINAL_KILL,
+ PlayerKillEvent.PlayerKillCause.IRON_GOLEM
+ );
+ }
+
+ @Override
+ public void playAction(@NotNull Player p, String text) {
+ p.spigot().sendMessage(
+ ChatMessageType.ACTION_BAR,
+ new TextComponent(ChatColor.translateAlternateColorCodes('&', text)
+ )
+ );
+ }
+
+ @Override
+ public boolean isBukkitCommandRegistered(String name) {
+ return ((CraftServer) getPlugin().getServer()).getCommandMap().getCommand(name) != null;
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getItemInHand(@NotNull Player p) {
+ return p.getInventory().getItemInMainHand();
+ }
+
+ @Override
+ public void hideEntity(@NotNull Entity e, Player p) {
+ PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(e.getEntityId());
+ ((CraftPlayer) p).getHandle().b.a(packet);
+
+ }
+
+ @Override
+ public void minusAmount(Player p, org.bukkit.inventory.@NotNull ItemStack i, int amount) {
+ if (i.getAmount() - amount <= 0) {
+ if (p.getInventory().getItemInOffHand().equals(i)) {
+ p.getInventory().setItemInOffHand(null);
+ } else {
+ p.getInventory().removeItem(i);
+ }
+ return;
+ }
+ i.setAmount(i.getAmount() - amount);
+ p.updateInventory();
+ }
+
+ @Override
+ public void setSource(TNTPrimed tnt, Player owner) {
+ EntityLiving nmsEntityLiving = (((CraftLivingEntity) owner).getHandle());
+ EntityTNTPrimed nmsTNT = (((CraftTNTPrimed) tnt).getHandle());
+ try {
+ Field sourceField = EntityTNTPrimed.class.getDeclaredField("d");
+ sourceField.setAccessible(true);
+ sourceField.set(nmsTNT, nmsEntityLiving);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean isArmor(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemArmor || i instanceof ItemElytra;
+
+ }
+
+ @Override
+ public boolean isTool(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemTool;
+ }
+
+ @Override
+ public boolean isSword(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemSword;
+ }
+
+ @Override
+ public boolean isAxe(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemAxe;
+ }
+
+ @Override
+ public boolean isBow(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemBow;
+ }
+
+ @Override
+ public boolean isProjectile(org.bukkit.inventory.ItemStack itemStack) {
+ var entity = getEntity(itemStack);
+ if (null == entity) return false;
+ return entity instanceof IProjectile;
+ }
+
+ @Override
+ public boolean isInvisibilityPotion(org.bukkit.inventory.@NotNull ItemStack itemStack) {
+ if (!itemStack.getType().equals(org.bukkit.Material.POTION)) return false;
+
+ org.bukkit.inventory.meta.PotionMeta pm = (org.bukkit.inventory.meta.PotionMeta) itemStack.getItemMeta();
+
+ return pm != null && pm.hasCustomEffects() && pm.hasCustomEffect(org.bukkit.potion.PotionEffectType.INVISIBILITY);
+ }
+
+ @Override
+ public void registerEntities() {
+ }
+
+ @Override
+ public void spawnShop(@NotNull Location loc, String name1, List players, IArena arena) {
+ Location l = loc.clone();
+
+ if (l.getWorld() == null) return;
+ Villager vlg = (Villager) l.getWorld().spawnEntity(loc, EntityType.VILLAGER);
+ vlg.setAI(false);
+ vlg.setRemoveWhenFarAway(false);
+ vlg.setCollidable(false);
+ vlg.setInvulnerable(true);
+ vlg.setSilent(true);
+
+ for (Player p : players) {
+ String[] name = Language.getMsg(p, name1).split(",");
+ if (name.length == 1) {
+ ArmorStand a = createArmorStand(name[0], l.clone().add(0, 1.85, 0));
+ new ShopHolo(Language.getPlayerLanguage(p).getIso(), a, null, l, arena);
+ } else {
+ ArmorStand a = createArmorStand(name[0], l.clone().add(0, 2.1, 0));
+ ArmorStand b = createArmorStand(name[1], l.clone().add(0, 1.85, 0));
+ new ShopHolo(Language.getPlayerLanguage(p).getIso(), a, b, l, arena);
+ }
+ }
+ for (ShopHolo sh : ShopHolo.getShopHolo()) {
+ if (sh.getA() == arena) {
+ sh.update();
+ }
+ }
+ }
+
+ @Override
+ public double getDamage(org.bukkit.inventory.ItemStack i) {
+ var tag = getTag(i);
+ if (null == tag) {
+ throw new RuntimeException("Provided item has no Tag");
+ }
+ return tag.k("generic.attackDamage");
+ }
+
+ private static ArmorStand createArmorStand(String name, Location loc) {
+ if (loc == null) return null;
+ if (loc.getWorld() == null) return null;
+ ArmorStand a = loc.getWorld().spawn(loc, ArmorStand.class);
+ a.setGravity(false);
+ a.setVisible(false);
+ a.setCustomNameVisible(true);
+ a.setCustomName(name);
+ return a;
+ }
+
+ @Override
+ public void voidKill(Player p) {
+ EntityPlayer player = getPlayer(p);
+ player.a(player.dG().l(), 1000);
+ }
+
+ @Override
+ public void hideArmor(@NotNull Player victim, Player receiver) {
+ List> items = new ArrayList<>();
+ items.add(new Pair<>(EnumItemSlot.f, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.e, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.d, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.c, new ItemStack(Item.b(0))));
+ PacketPlayOutEntityEquipment packet1 = new PacketPlayOutEntityEquipment(victim.getEntityId(), items);
+ EntityPlayer pc = getPlayer(receiver);
+ pc.b.a(packet1);
+ }
+
+ @Override
+ public void showArmor(@NotNull Player victim, Player receiver) {
+ List> items = new ArrayList<>();
+ items.add(new Pair<>(EnumItemSlot.f, CraftItemStack.asNMSCopy(victim.getInventory().getHelmet())));
+ items.add(new Pair<>(EnumItemSlot.e, CraftItemStack.asNMSCopy(victim.getInventory().getChestplate())));
+ items.add(new Pair<>(EnumItemSlot.d, CraftItemStack.asNMSCopy(victim.getInventory().getLeggings())));
+ items.add(new Pair<>(EnumItemSlot.c, CraftItemStack.asNMSCopy(victim.getInventory().getBoots())));
+ PacketPlayOutEntityEquipment packet1 = new PacketPlayOutEntityEquipment(victim.getEntityId(), items);
+ EntityPlayer pc = getPlayer(receiver);
+ pc.b.a(packet1);
+ }
+
+ @Override
+ public void spawnDragon(Location l, ITeam bwt) {
+ if (l == null || l.getWorld() == null) {
+ getPlugin().getLogger().log(Level.WARNING, "Could not spawn Dragon. Location is null");
+ return;
+ }
+ EnderDragon ed = (EnderDragon) l.getWorld().spawnEntity(l, EntityType.ENDER_DRAGON);
+ ed.setPhase(EnderDragon.Phase.CIRCLING);
+ }
+
+ @Override
+ public void colorBed(ITeam bwt) {
+ for (int x = -1; x <= 1; x++) {
+ for (int z = -1; z <= 1; z++) {
+ BlockState bed = bwt.getBed().clone().add(x, 0, z).getBlock().getState();
+ if (bed instanceof Bed) {
+ bed.setType(bwt.getColor().bedMaterial());
+ bed.update();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
+ try {
+ var protection = 300f;
+ // blast resistance
+ Field field = BlockBase.class.getDeclaredField("aH");
+ field.setAccessible(true);
+ // end stone
+ field.set(Blocks.fj, endStoneBlast);
+ // obsidian
+ field.set(Blocks.ce, glassBlast);
+ // standard glass
+ field.set(Blocks.aH, glassBlast);
+
+ var coloredGlass = new net.minecraft.world.level.block.Block[]{
+ Blocks.dU, Blocks.dV, Blocks.dW, Blocks.dX,
+ Blocks.dY, Blocks.dZ, Blocks.dZ, Blocks.ea,
+ Blocks.eb, Blocks.ec, Blocks.ed, Blocks.ee,
+ Blocks.ef, Blocks.eg, Blocks.eh, Blocks.ei,
+ Blocks.ej,
+ };
+
+ Arrays.stream(coloredGlass).forEach(
+ glass -> {
+ try {
+ field.set(glass, protection);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ );
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void setBlockTeamColor(@NotNull Block block, TeamColor teamColor) {
+ if (block.getType().toString().contains("STAINED_GLASS") || block.getType().toString().equals("GLASS")) {
+ block.setType(teamColor.glassMaterial());
+ } else if (block.getType().toString().contains("_TERRACOTTA")) {
+ block.setType(teamColor.glazedTerracottaMaterial());
+ } else if (block.getType().toString().contains("_WOOL")) {
+ block.setType(teamColor.woolMaterial());
+ }
+ }
+
+ @Override
+ public void setCollide(@NotNull Player p, IArena a, boolean value) {
+ p.setCollidable(value);
+ if (a == null) return;
+ a.updateSpectatorCollideRule(p, value);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack addCustomData(org.bukkit.inventory.ItemStack i, String data) {
+ var tag = getCreateTag(i);
+ tag.a(VersionSupport.PLUGIN_TAG_GENERIC_KEY, data);
+ return applyTag(i, tag);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack setTag(org.bukkit.inventory.ItemStack itemStack, String key, String value) {
+ var tag = getCreateTag(itemStack);
+ tag.a(key, value);
+ return applyTag(itemStack, tag);
+ }
+
+ @Override
+ public boolean isCustomBedWarsItem(org.bukkit.inventory.ItemStack i) {
+ return getCreateTag(i).e(VersionSupport.PLUGIN_TAG_GENERIC_KEY);
+ }
+
+ @Override
+ public String getCustomData(org.bukkit.inventory.ItemStack i) {
+ return getCreateTag(i).l(VersionSupport.PLUGIN_TAG_GENERIC_KEY);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack colourItem(org.bukkit.inventory.ItemStack itemStack, ITeam bedWarsTeam) {
+ if (itemStack == null) return null;
+ String type = itemStack.getType().toString();
+ if (isBed(itemStack.getType())) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().bedMaterial(), itemStack.getAmount());
+ } else if (type.contains("_STAINED_GLASS_PANE")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glassPaneMaterial(), itemStack.getAmount());
+ } else if (type.contains("STAINED_GLASS") || type.equals("GLASS")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glassMaterial(), itemStack.getAmount());
+ } else if (type.contains("_TERRACOTTA")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glazedTerracottaMaterial(), itemStack.getAmount());
+ } else if (type.contains("_WOOL")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().woolMaterial(), itemStack.getAmount());
+ }
+ return itemStack;
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack createItemStack(String material, int amount, short data) {
+ org.bukkit.inventory.ItemStack i;
+ try {
+ i = new org.bukkit.inventory.ItemStack(org.bukkit.Material.valueOf(material), amount);
+ } catch (Exception ex) {
+ getPlugin().getLogger().log(Level.WARNING, material + " is not a valid " + getName() + " material!");
+ i = new org.bukkit.inventory.ItemStack(org.bukkit.Material.BEDROCK);
+ }
+ return i;
+ }
+
+ @Override
+ public org.bukkit.Material materialFireball() {
+ return org.bukkit.Material.FIRE_CHARGE;
+ }
+
+ @Override
+ public org.bukkit.Material materialPlayerHead() {
+ return org.bukkit.Material.PLAYER_HEAD;
+ }
+
+ @Override
+ public org.bukkit.Material materialSnowball() {
+ return org.bukkit.Material.SNOWBALL;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenHelmet() {
+ return org.bukkit.Material.GOLDEN_HELMET;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenChestPlate() {
+ return org.bukkit.Material.GOLDEN_CHESTPLATE;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenLeggings() {
+ return org.bukkit.Material.GOLDEN_LEGGINGS;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteHelmet() {
+ return Material.NETHERITE_HELMET;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteChestPlate() {
+ return Material.NETHERITE_CHESTPLATE;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteLeggings() {
+ return Material.NETHERITE_LEGGINGS;
+ }
+
+ @Override
+ public org.bukkit.Material materialElytra() {
+ return Material.ELYTRA;
+ }
+
+ @Override
+ public org.bukkit.Material materialCake() {
+ return org.bukkit.Material.CAKE;
+ }
+
+ @Override
+ public org.bukkit.Material materialCraftingTable() {
+ return org.bukkit.Material.CRAFTING_TABLE;
+ }
+
+ @Override
+ public org.bukkit.Material materialEnchantingTable() {
+ return org.bukkit.Material.ENCHANTING_TABLE;
+ }
+
+ @Override
+ public org.bukkit.Material woolMaterial() {
+ return org.bukkit.Material.WHITE_WOOL;
+ }
+
+ @Override
+ public String getShopUpgradeIdentifier(org.bukkit.inventory.ItemStack itemStack) {
+ var tag = getCreateTag(itemStack);
+ return tag.e(VersionSupport.PLUGIN_TAG_TIER_KEY) ? tag.l(VersionSupport.PLUGIN_TAG_TIER_KEY) : "null";
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack setShopUpgradeIdentifier(org.bukkit.inventory.ItemStack itemStack, String identifier) {
+ var tag = getCreateTag(itemStack);
+ tag.a(VersionSupport.PLUGIN_TAG_TIER_KEY, identifier);
+ return applyTag(itemStack, tag);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getPlayerHead(Player player, org.bukkit.inventory.ItemStack copyTagFrom) {
+ org.bukkit.inventory.ItemStack head = new org.bukkit.inventory.ItemStack(materialPlayerHead());
+
+ if (copyTagFrom != null) {
+ var tag = getTag(copyTagFrom);
+ head = applyTag(head, tag);
+ }
+
+ var meta = head.getItemMeta();
+ if (meta instanceof SkullMeta) {
+ ((SkullMeta) meta).setOwnerProfile(player.getPlayerProfile());
+ }
+ head.setItemMeta(meta);
+ return head;
+ }
+
+ @Override
+ public void sendPlayerSpawnPackets(Player respawned, IArena arena) {
+ if (respawned == null) return;
+ if (arena == null) return;
+ if (!arena.isPlayer(respawned)) return;
+
+ // if method was used when the player was still in re-spawning screen
+ if (arena.getRespawnSessions().containsKey(respawned)) return;
+
+ EntityPlayer entityPlayer = getPlayer(respawned);
+ PacketPlayOutNamedEntitySpawn show = new PacketPlayOutNamedEntitySpawn(entityPlayer);
+ PacketPlayOutEntityVelocity playerVelocity = new PacketPlayOutEntityVelocity(entityPlayer);
+ // we send head rotation packet because sometimes on respawn others see him with bad rotation
+ PacketPlayOutEntityHeadRotation head = new PacketPlayOutEntityHeadRotation(entityPlayer, getCompressedAngle(entityPlayer.getBukkitYaw()));
+
+ // retrieve current armor and in-hand items
+ // we send a packet later for timing issues where other players do not see them
+ List> list = getPlayerEquipment(entityPlayer);
+
+
+ for (Player p : arena.getPlayers()) {
+ if (p == null) continue;
+ if (p.equals(respawned)) continue;
+ // if p is in re-spawning screen continue
+ if (arena.getRespawnSessions().containsKey(p)) continue;
+
+ EntityPlayer boundTo = getPlayer(p);
+ if (p.getWorld().equals(respawned.getWorld())) {
+ if (respawned.getLocation().distance(p.getLocation()) <= arena.getRenderDistance()) {
+
+ // send respawned player to regular players
+ boundTo.b.a(show);
+ boundTo.b.a(head);
+ boundTo.b.a(playerVelocity);
+ boundTo.b.a(new PacketPlayOutEntityEquipment(respawned.getEntityId(), list));
+
+ // send nearby players to respawned player
+ // if the player has invisibility hide armor
+ if (p.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
+ hideArmor(p, respawned);
+ } else {
+ PacketPlayOutNamedEntitySpawn show2 = new PacketPlayOutNamedEntitySpawn(boundTo);
+ PacketPlayOutEntityVelocity playerVelocity2 = new PacketPlayOutEntityVelocity(boundTo);
+ PacketPlayOutEntityHeadRotation head2 = new PacketPlayOutEntityHeadRotation(boundTo, getCompressedAngle(boundTo.getBukkitYaw()));
+ entityPlayer.b.a(show2);
+ entityPlayer.b.a(playerVelocity2);
+ entityPlayer.b.a(head2);
+ showArmor(p, respawned);
+ }
+ }
+ }
+ }
+
+ for (Player spectator : arena.getSpectators()) {
+ if (spectator == null) continue;
+ if (spectator.equals(respawned)) continue;
+ EntityPlayer boundTo = ((CraftPlayer) spectator).getHandle();
+ respawned.hidePlayer(getPlugin(), spectator);
+ if (spectator.getWorld().equals(respawned.getWorld())) {
+ if (respawned.getLocation().distance(spectator.getLocation()) <= arena.getRenderDistance()) {
+
+ // send respawned player to spectator
+ boundTo.b.a(show);
+ boundTo.b.a(playerVelocity);
+ boundTo.b.a(new PacketPlayOutEntityEquipment(respawned.getEntityId(), list));
+ boundTo.b.a(new PacketPlayOutEntityHeadRotation(entityPlayer, getCompressedAngle(entityPlayer.getBukkitYaw())));
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getInventoryName(@NotNull InventoryEvent e) {
+ return e.getView().getTitle();
+ }
+
+ @Override
+ public void setUnbreakable(@NotNull ItemMeta itemMeta) {
+ itemMeta.setUnbreakable(true);
+ }
+
+ @Override
+ public String getMainLevel() {
+ //noinspection deprecation
+ return ((DedicatedServer) MinecraftServer.getServer()).a().m;
+ }
+
+ @Override
+ public int getVersion() {
+ return 9;
+ }
+
+ @Override
+ public void setJoinSignBackground(@NotNull BlockState b, org.bukkit.Material material) {
+ if (b.getBlockData() instanceof WallSign) {
+ b.getBlock().getRelative(((WallSign) b.getBlockData()).getFacing().getOppositeFace()).setType(material);
+ }
+ }
+
+ @Override
+ public void spigotShowPlayer(Player victim, @NotNull Player receiver) {
+ receiver.showPlayer(getPlugin(), victim);
+ }
+
+ @Override
+ public void spigotHidePlayer(Player victim, @NotNull Player receiver) {
+ receiver.hidePlayer(getPlugin(), victim);
+ }
+
+ @Override
+ public Fireball setFireballDirection(Fireball fireball, @NotNull Vector vector) {
+ EntityFireball fb = ((CraftFireball) fireball).getHandle();
+ fb.b = vector.getX() * 0.1D;
+ fb.c = vector.getY() * 0.1D;
+ fb.d = vector.getZ() * 0.1D;
+ return (Fireball) fb.getBukkitEntity();
+ }
+
+ @Override
+ public void playRedStoneDot(@NotNull Player player) {
+ Color color = Color.RED;
+ PacketPlayOutWorldParticles particlePacket = new PacketPlayOutWorldParticles(
+ new ParticleParamRedstone(
+ new Vector3f((float) color.getRed(),
+ (float) color.getGreen(),
+ (float) color.getBlue()), (float) 1
+ ),
+ true,
+ player.getLocation().getX(),
+ player.getLocation().getY() + 2.6,
+ player.getLocation().getZ(),
+ 0, 0, 0, 0, 0
+ );
+ for (Player inWorld : player.getWorld().getPlayers()) {
+ if (inWorld.equals(player)) continue;
+ getPlayer(inWorld).b.a(particlePacket);
+ }
+ }
+
+ @Override
+ public void clearArrowsFromPlayerBody(Player player) {
+ // minecraft clears them on death on newer version
+ }
+
+ /**
+ * Gets the NMS Item from ItemStack
+ */
+ private @Nullable Item getItem(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.c();
+ }
+
+ /**
+ * Gets the NMS Entity from ItemStack
+ */
+ private @Nullable net.minecraft.world.entity.Entity getEntity(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.G();
+ }
+
+ private @Nullable NBTTagCompound getTag(@NotNull org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.u();
+ }
+
+ private @Nullable NBTTagCompound getTag(@NotNull ItemStack itemStack) {
+ return itemStack.u();
+ }
+
+ private @NotNull NBTTagCompound initializeTag(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return initializeTag(i);
+ }
+
+ private @NotNull NBTTagCompound initializeTag(ItemStack itemStack) {
+
+ var tag = getTag(itemStack);
+ if (null != tag) {
+ throw new RuntimeException("Provided item already has a Tag");
+ }
+ tag = new NBTTagCompound();
+ itemStack.c(tag);
+
+ return tag;
+ }
+
+ public NBTTagCompound getCreateTag(ItemStack itemStack) {
+ var tag = getTag(itemStack);
+ return null == tag ? initializeTag(itemStack) : tag;
+ }
+
+ public NBTTagCompound getCreateTag(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return getCreateTag(i);
+ }
+
+ public org.bukkit.inventory.ItemStack applyTag(org.bukkit.inventory.ItemStack itemStack, NBTTagCompound tag) {
+ return CraftItemStack.asBukkitCopy(applyTag(getNmsItemCopy(itemStack), tag));
+ }
+
+ public ItemStack applyTag(@NotNull ItemStack itemStack, NBTTagCompound tag) {
+ itemStack.c(tag);
+ return itemStack;
+ }
+
+ public ItemStack getNmsItemCopy(org.bukkit.inventory.ItemStack itemStack) {
+ ItemStack i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return i;
+ }
+
+ public EntityPlayer getPlayer(Player player) {
+ return ((CraftPlayer) player).getHandle();
+ }
+
+ public List> getPlayerEquipment(@NotNull Player player) {
+ return getPlayerEquipment(getPlayer(player));
+ }
+
+ public List> getPlayerEquipment(@NotNull EntityPlayer entityPlayer) {
+ List> list = new ArrayList<>();
+ list.add(new Pair<>(EnumItemSlot.a, entityPlayer.c(EnumItemSlot.a)));
+ list.add(new Pair<>(EnumItemSlot.b, entityPlayer.c(EnumItemSlot.b)));
+ list.add(new Pair<>(EnumItemSlot.f, entityPlayer.c(EnumItemSlot.f)));
+ list.add(new Pair<>(EnumItemSlot.e, entityPlayer.c(EnumItemSlot.e)));
+ list.add(new Pair<>(EnumItemSlot.d, entityPlayer.c(EnumItemSlot.d)));
+ list.add(new Pair<>(EnumItemSlot.c, entityPlayer.c(EnumItemSlot.c)));
+
+ return list;
+ }
+
+ @Override
+ public void placeTowerBlocks(@NotNull Block b, @NotNull IArena a, @NotNull TeamColor color, int x, int y, int z) {
+ b.getRelative(x, y, z).setType(color.woolMaterial());
+ a.addPlacedBlock(b.getRelative(x, y, z));
+ }
+
+ @Override
+ public void placeLadder(@NotNull Block b, int x, int y, int z, @NotNull IArena a, int ladderData) {
+ Block block = b.getRelative(x, y, z); //ladder block
+ block.setType(Material.LADDER);
+ Ladder ladder = (Ladder) block.getBlockData();
+ a.addPlacedBlock(block);
+ switch (ladderData) {
+ case 2 -> {
+ ladder.setFacing(BlockFace.NORTH);
+ block.setBlockData(ladder);
+ }
+ case 3 -> {
+ ladder.setFacing(BlockFace.SOUTH);
+ block.setBlockData(ladder);
+ }
+ case 4 -> {
+ ladder.setFacing(BlockFace.WEST);
+ block.setBlockData(ladder);
+ }
+ case 5 -> {
+ ladder.setFacing(BlockFace.EAST);
+ block.setBlockData(ladder);
+ }
+ }
+ }
+
+ @Override
+ public void playVillagerEffect(@NotNull Player player, Location location) {
+ player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
+ }
+
+}
\ No newline at end of file
diff --git a/versionsupport_v1_20_R1/pom.xml b/versionsupport_v1_20_R1/pom.xml
new file mode 100644
index 000000000..e8fdf7c71
--- /dev/null
+++ b/versionsupport_v1_20_R1/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ com.andrei1058.bedwars
+ BedWars1058
+ 23.10.1-SNAPSHOT
+
+
+ versionsupport_v1_20_R1
+
+
+ 1.19
+ 1.19
+ UTF-8
+
+
+
+
+ com.andrei1058.bedwars
+ bedwars-api
+ ${project.version}
+ jar
+ provided
+
+
+ com.andrei1058.bedwars
+ versionsupport-common
+ ${project.version}
+ jar
+ provided
+
+
+ org.spigotmc
+ spigot
+ 1.20.1-R0.1-SNAPSHOT
+ jar
+ provided
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+
+ 19
+
+
+
+
+
+
\ No newline at end of file
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableAttributes.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableAttributes.java
new file mode 100644
index 000000000..01be791d0
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableAttributes.java
@@ -0,0 +1,5 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1.despawnable;
+
+public record DespawnableAttributes(DespawnableType type, double speed, double health, double damage, int despawnSeconds) {
+
+}
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableFactory.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableFactory.java
new file mode 100644
index 000000000..e72b00e0f
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableFactory.java
@@ -0,0 +1,27 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import org.bukkit.Location;
+import org.bukkit.entity.LivingEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DespawnableFactory {
+
+ private final VersionSupport versionSupport;
+ private final List> providers = new ArrayList<>();
+
+ public DespawnableFactory(VersionSupport versionSupport) {
+ this.versionSupport = versionSupport;
+ providers.add(new TeamIronGolem());
+ providers.add(new TeamSilverfish());
+ }
+
+ public LivingEntity spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team){
+ return providers.stream().filter(provider -> provider.getType() == attr.type())
+ .findFirst().orElseThrow().spawn(attr, location,team, versionSupport);
+ }
+}
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableProvider.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableProvider.java
new file mode 100644
index 000000000..3b363d791
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableProvider.java
@@ -0,0 +1,71 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityCreature;
+import net.minecraft.world.entity.EntityInsentient;
+import net.minecraft.world.entity.EntityLiving;
+import net.minecraft.world.entity.ai.attributes.GenericAttributes;
+import net.minecraft.world.entity.ai.goal.PathfinderGoal;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalSelector;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalNearestAttackableTarget;
+import net.minecraft.world.entity.player.EntityHuman;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public abstract class DespawnableProvider {
+
+ abstract DespawnableType getType();
+
+ abstract String getDisplayName(DespawnableAttributes attr, ITeam team);
+
+ abstract T spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api);
+
+ protected boolean notSameTeam(@NotNull Entity entity, ITeam team, @NotNull VersionSupport api) {
+ var despawnable = api.getDespawnablesList().getOrDefault(entity.getBukkitEntity().getUniqueId(), null);
+ return null == despawnable || despawnable.getTeam() != team;
+ }
+
+ protected PathfinderGoalSelector getTargetSelector(@NotNull EntityCreature entityLiving) {
+ return entityLiving.bP;
+ }
+
+ protected PathfinderGoalSelector getGoalSelector(@NotNull EntityCreature entityLiving) {
+ return entityLiving.bO;
+ }
+
+ protected void clearSelectors(@NotNull EntityCreature entityLiving) {
+ entityLiving.bO.b().clear();
+ entityLiving.bP.b().clear();
+ }
+
+ protected PathfinderGoal getTargetGoal(EntityInsentient entity, ITeam team, VersionSupport api) {
+ return new PathfinderGoalNearestAttackableTarget<>(entity, EntityLiving.class, 20, true, false,
+ entityLiving -> {
+ if (entityLiving instanceof EntityHuman) {
+ return !((EntityHuman) entityLiving).getBukkitEntity().isDead() &&
+ !team.wasMember(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId()) &&
+ !team.getArena().isReSpawning(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId())
+ && !team.getArena().isSpectator(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId());
+ }
+ return notSameTeam(entityLiving, team, api);
+ });
+ }
+
+ protected void applyDefaultSettings(org.bukkit.entity.@NotNull LivingEntity bukkitEntity, DespawnableAttributes attr,
+ ITeam team) {
+ bukkitEntity.setRemoveWhenFarAway(false);
+ bukkitEntity.setPersistent(true);
+ bukkitEntity.setCustomNameVisible(true);
+ bukkitEntity.setCustomName(getDisplayName(attr, team));
+
+ var entity = ((EntityInsentient)((CraftEntity)bukkitEntity).getHandle());
+ Objects.requireNonNull(entity.a(GenericAttributes.a)).a(attr.health());
+ Objects.requireNonNull(entity.a(GenericAttributes.d)).a(attr.speed());
+ Objects.requireNonNull(entity.a(GenericAttributes.f)).a(attr.damage());
+ }
+}
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableType.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableType.java
new file mode 100644
index 000000000..3c3097ed9
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/DespawnableType.java
@@ -0,0 +1,6 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1.despawnable;
+
+public enum DespawnableType {
+ IRON_GOLEM,
+ SILVERFISH
+}
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/TeamIronGolem.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/TeamIronGolem.java
new file mode 100644
index 000000000..060e90ccc
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/TeamIronGolem.java
@@ -0,0 +1,58 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
+import net.minecraft.world.entity.animal.EntityIronGolem;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.IronGolem;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class TeamIronGolem extends DespawnableProvider {
+
+ @Override
+ public DespawnableType getType() {
+ return DespawnableType.IRON_GOLEM;
+ }
+
+ @Override
+ String getDisplayName(@NotNull DespawnableAttributes attr, @NotNull ITeam team) {
+ Language lang = Language.getDefaultLanguage();
+ return lang.m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME).replace("{despawn}", String.valueOf(attr.despawnSeconds())
+ .replace("{health}", StringUtils.repeat(lang.m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
+ .replace("{TeamColor}", team.getColor().chat().toString())
+ );
+ }
+
+ public @NotNull IronGolem spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api) {
+
+ var bukkitEntity = (IronGolem) Objects.requireNonNull(location.getWorld()).spawnEntity(location, EntityType.IRON_GOLEM);
+ applyDefaultSettings(bukkitEntity, attr, team);
+
+ var entity = (EntityIronGolem) ((CraftEntity) bukkitEntity).getHandle();
+
+ clearSelectors(entity);
+ var goalSelector = getGoalSelector(entity);
+ var targetSelector = getTargetSelector(entity);
+
+ goalSelector.a(1, new PathfinderGoalFloat(entity));
+ goalSelector.a(2, new PathfinderGoalMeleeAttack(entity, 1.5D, false));
+ goalSelector.a(3, new PathfinderGoalRandomStroll(entity, 1D));
+ goalSelector.a(4, new PathfinderGoalRandomLookaround(entity));
+ targetSelector.a(1, new PathfinderGoalHurtByTarget(entity));
+ targetSelector.a(2, getTargetGoal(entity, team, api));
+
+ return bukkitEntity;
+ }
+}
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/TeamSilverfish.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/TeamSilverfish.java
new file mode 100644
index 000000000..f749de1ed
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/despawnable/TeamSilverfish.java
@@ -0,0 +1,56 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
+import net.minecraft.world.entity.monster.EntitySilverfish;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Silverfish;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class TeamSilverfish extends DespawnableProvider {
+ @Override
+ public DespawnableType getType() {
+ return DespawnableType.SILVERFISH;
+ }
+
+ @Override
+ String getDisplayName(@NotNull DespawnableAttributes attr, @NotNull ITeam team) {
+ Language lang = Language.getDefaultLanguage();
+ return lang.m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME).replace("{despawn}", String.valueOf(attr.despawnSeconds())
+ .replace("{health}", StringUtils.repeat(lang.m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
+ .replace("{TeamColor}", team.getColor().chat().toString())
+ );
+ }
+
+ @Override
+ public Silverfish spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api) {
+ var bukkitEntity = (Silverfish) Objects.requireNonNull(location.getWorld()).spawnEntity(location, EntityType.SILVERFISH);
+ applyDefaultSettings(bukkitEntity, attr, team);
+
+ var entity = (EntitySilverfish) ((CraftEntity) bukkitEntity).getHandle();
+ clearSelectors(entity);
+
+ var goalSelector = getGoalSelector(entity);
+ var targetSelector = getTargetSelector(entity);
+ goalSelector.a(1, new PathfinderGoalFloat(entity));
+ goalSelector.a(2, new PathfinderGoalMeleeAttack(entity, 1.9D, false));
+ goalSelector.a(3, new PathfinderGoalRandomStroll(entity, 2D));
+ goalSelector.a(4, new PathfinderGoalRandomLookaround(entity));
+ targetSelector.a(1, new PathfinderGoalHurtByTarget(entity));
+ targetSelector.a(2, getTargetGoal(entity, team, api));
+
+ return bukkitEntity;
+ }
+}
diff --git a/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/v1_20_R1.java b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/v1_20_R1.java
new file mode 100644
index 000000000..4d36c66f2
--- /dev/null
+++ b/versionsupport_v1_20_R1/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R1/v1_20_R1.java
@@ -0,0 +1,837 @@
+package com.andrei1058.bedwars.support.version.v1_20_R1;
+
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.shop.ShopHolo;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.arena.team.TeamColor;
+import com.andrei1058.bedwars.api.entity.Despawnable;
+import com.andrei1058.bedwars.api.events.player.PlayerKillEvent;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import com.andrei1058.bedwars.support.version.common.VersionCommon;
+import com.andrei1058.bedwars.support.version.v1_20_R1.despawnable.DespawnableAttributes;
+import com.andrei1058.bedwars.support.version.v1_20_R1.despawnable.DespawnableFactory;
+import com.andrei1058.bedwars.support.version.v1_20_R1.despawnable.DespawnableType;
+import com.mojang.datafixers.util.Pair;
+import net.md_5.bungee.api.ChatMessageType;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.minecraft.core.particles.ParticleParamRedstone;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.protocol.Packet;
+import net.minecraft.network.protocol.game.*;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.dedicated.DedicatedServer;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.server.network.PlayerConnection;
+import net.minecraft.world.entity.EntityLiving;
+import net.minecraft.world.entity.EnumItemSlot;
+import net.minecraft.world.entity.item.EntityTNTPrimed;
+import net.minecraft.world.entity.projectile.EntityFireball;
+import net.minecraft.world.entity.projectile.IProjectile;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.*;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBase;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.data.type.Bed;
+import org.bukkit.block.data.type.Ladder;
+import org.bukkit.block.data.type.WallSign;
+import org.bukkit.command.Command;
+import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R1.entity.*;
+import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
+import org.bukkit.entity.*;
+import org.bukkit.event.inventory.InventoryEvent;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.SkullMeta;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.scoreboard.Team;
+import org.bukkit.util.Vector;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Vector3f;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.logging.Level;
+
+@SuppressWarnings("unused")
+public class v1_20_R1 extends VersionSupport {
+
+ private final DespawnableFactory despawnableFactory;
+
+ public v1_20_R1(Plugin plugin, String name) {
+ super(plugin, name);
+ loadDefaultEffects();
+ this.despawnableFactory = new DespawnableFactory(this);
+ }
+
+ @Override
+ public void registerVersionListeners() {
+ new VersionCommon(this);
+ }
+
+ @Override
+ public void registerCommand(String name, Command cmd) {
+ ((CraftServer) getPlugin().getServer()).getCommandMap().register(name, cmd);
+ }
+
+ @Override
+ public String getTag(org.bukkit.inventory.ItemStack itemStack, String key) {
+ var tag = getTag(itemStack);
+ return tag == null ? null : tag.e(key) ? tag.l(key) : null;
+ }
+
+ @Override
+ public void sendTitle(@NotNull Player p, String title, String subtitle, int fadeIn, int stay, int fadeOut) {
+ p.sendTitle(title == null ? " " : title, subtitle == null ? " " : subtitle, fadeIn, stay, fadeOut);
+ }
+
+ public void spawnSilverfish(Location loc, ITeam bedWarsTeam, double speed, double health, int despawn, double damage) {
+ var attr = new DespawnableAttributes(DespawnableType.SILVERFISH, speed, health, damage, despawn);
+ var entity = despawnableFactory.spawn(attr, loc, bedWarsTeam);
+
+ new Despawnable(
+ entity,
+ bedWarsTeam, despawn,
+ Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME,
+ PlayerKillEvent.PlayerKillCause.SILVERFISH_FINAL_KILL,
+ PlayerKillEvent.PlayerKillCause.SILVERFISH
+ );
+ }
+
+ @Override
+ public void spawnIronGolem(Location loc, ITeam bedWarsTeam, double speed, double health, int despawn) {
+ var attr = new DespawnableAttributes(DespawnableType.IRON_GOLEM, speed, health, 4, despawn);
+ var entity = despawnableFactory.spawn(attr, loc, bedWarsTeam);
+ new Despawnable(
+ entity,
+ bedWarsTeam, despawn,
+ Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME,
+ PlayerKillEvent.PlayerKillCause.IRON_GOLEM_FINAL_KILL,
+ PlayerKillEvent.PlayerKillCause.IRON_GOLEM
+ );
+ }
+
+ @Override
+ public void playAction(@NotNull Player p, String text) {
+ p.spigot().sendMessage(
+ ChatMessageType.ACTION_BAR,
+ new TextComponent(ChatColor.translateAlternateColorCodes('&', text)
+ )
+ );
+ }
+
+ @Override
+ public boolean isBukkitCommandRegistered(String name) {
+ return ((CraftServer) getPlugin().getServer()).getCommandMap().getCommand(name) != null;
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getItemInHand(@NotNull Player p) {
+ return p.getInventory().getItemInMainHand();
+ }
+
+ @Override
+ public void hideEntity(@NotNull Entity e, Player p) {
+ PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(e.getEntityId());
+ this.sendPacket(p, packet);
+ }
+
+ @Override
+ public void minusAmount(Player p, org.bukkit.inventory.@NotNull ItemStack i, int amount) {
+ if (i.getAmount() - amount <= 0) {
+ if (p.getInventory().getItemInOffHand().equals(i)) {
+ p.getInventory().setItemInOffHand(null);
+ } else {
+ p.getInventory().removeItem(i);
+ }
+ return;
+ }
+ i.setAmount(i.getAmount() - amount);
+
+ // todo this is marked as unstable on 1.20 for some reason
+ p.updateInventory();
+ }
+
+ @Override
+ public void setSource(TNTPrimed tnt, Player owner) {
+ EntityLiving nmsEntityLiving = (((CraftLivingEntity) owner).getHandle());
+ EntityTNTPrimed nmsTNT = (((CraftTNTPrimed) tnt).getHandle());
+ try {
+ Field sourceField = EntityTNTPrimed.class.getDeclaredField("d");
+ sourceField.setAccessible(true);
+ sourceField.set(nmsTNT, nmsEntityLiving);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean isArmor(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemArmor || i instanceof ItemElytra;
+
+ }
+
+ @Override
+ public boolean isTool(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemTool;
+ }
+
+ @Override
+ public boolean isSword(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemSword;
+ }
+
+ @Override
+ public boolean isAxe(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemAxe;
+ }
+
+ @Override
+ public boolean isBow(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemBow;
+ }
+
+ @Override
+ public boolean isProjectile(org.bukkit.inventory.ItemStack itemStack) {
+ var entity = getEntity(itemStack);
+ if (null == entity) return false;
+ return entity instanceof IProjectile;
+ }
+
+ @Override
+ public boolean isInvisibilityPotion(org.bukkit.inventory.@NotNull ItemStack itemStack) {
+ if (!itemStack.getType().equals(org.bukkit.Material.POTION)) return false;
+
+ org.bukkit.inventory.meta.PotionMeta pm = (org.bukkit.inventory.meta.PotionMeta) itemStack.getItemMeta();
+
+ return pm != null && pm.hasCustomEffects() && pm.hasCustomEffect(org.bukkit.potion.PotionEffectType.INVISIBILITY);
+ }
+
+ @Override
+ public void registerEntities() {
+ }
+
+ @Override
+ public void spawnShop(@NotNull Location loc, String name1, List players, IArena arena) {
+ Location l = loc.clone();
+
+ if (l.getWorld() == null) return;
+ Villager vlg = (Villager) l.getWorld().spawnEntity(loc, EntityType.VILLAGER);
+ vlg.setAI(false);
+ vlg.setRemoveWhenFarAway(false);
+ vlg.setCollidable(false);
+ vlg.setInvulnerable(true);
+ vlg.setSilent(true);
+
+ for (Player p : players) {
+ String[] name = Language.getMsg(p, name1).split(",");
+ if (name.length == 1) {
+ ArmorStand a = createArmorStand(name[0], l.clone().add(0, 1.85, 0));
+ new ShopHolo(Language.getPlayerLanguage(p).getIso(), a, null, l, arena);
+ } else {
+ ArmorStand a = createArmorStand(name[0], l.clone().add(0, 2.1, 0));
+ ArmorStand b = createArmorStand(name[1], l.clone().add(0, 1.85, 0));
+ new ShopHolo(Language.getPlayerLanguage(p).getIso(), a, b, l, arena);
+ }
+ }
+ for (ShopHolo sh : ShopHolo.getShopHolo()) {
+ if (sh.getA() == arena) {
+ sh.update();
+ }
+ }
+ }
+
+ @Override
+ public double getDamage(org.bukkit.inventory.ItemStack i) {
+ var tag = getTag(i);
+ if (null == tag) {
+ throw new RuntimeException("Provided item has no Tag");
+ }
+ return tag.k("generic.attackDamage");
+ }
+
+ private static ArmorStand createArmorStand(String name, Location loc) {
+ if (loc == null) return null;
+ if (loc.getWorld() == null) return null;
+ ArmorStand a = loc.getWorld().spawn(loc, ArmorStand.class);
+ a.setGravity(false);
+ a.setVisible(false);
+ a.setCustomNameVisible(true);
+ a.setCustomName(name);
+ return a;
+ }
+
+ @Override
+ public void voidKill(Player p) {
+ EntityPlayer player = getPlayer(p);
+ player.a(player.dJ().l(), 1000);
+ }
+
+ @Override
+ public void hideArmor(@NotNull Player victim, Player receiver) {
+ List> items = new ArrayList<>();
+ items.add(new Pair<>(EnumItemSlot.f, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.e, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.d, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.c, new ItemStack(Item.b(0))));
+ PacketPlayOutEntityEquipment packet1 = new PacketPlayOutEntityEquipment(victim.getEntityId(), items);
+ sendPacket(receiver, packet1);
+ }
+
+ @Override
+ public void showArmor(@NotNull Player victim, Player receiver) {
+ List> items = new ArrayList<>();
+ items.add(new Pair<>(EnumItemSlot.f, CraftItemStack.asNMSCopy(victim.getInventory().getHelmet())));
+ items.add(new Pair<>(EnumItemSlot.e, CraftItemStack.asNMSCopy(victim.getInventory().getChestplate())));
+ items.add(new Pair<>(EnumItemSlot.d, CraftItemStack.asNMSCopy(victim.getInventory().getLeggings())));
+ items.add(new Pair<>(EnumItemSlot.c, CraftItemStack.asNMSCopy(victim.getInventory().getBoots())));
+ PacketPlayOutEntityEquipment packet1 = new PacketPlayOutEntityEquipment(victim.getEntityId(), items);
+ sendPacket(receiver, packet1);
+ }
+
+ @Override
+ public void spawnDragon(Location l, ITeam bwt) {
+ if (l == null || l.getWorld() == null) {
+ getPlugin().getLogger().log(Level.WARNING, "Could not spawn Dragon. Location is null");
+ return;
+ }
+ EnderDragon ed = (EnderDragon) l.getWorld().spawnEntity(l, EntityType.ENDER_DRAGON);
+ ed.setPhase(EnderDragon.Phase.CIRCLING);
+ }
+
+ @Override
+ public void colorBed(ITeam bwt) {
+ for (int x = -1; x <= 1; x++) {
+ for (int z = -1; z <= 1; z++) {
+ BlockState bed = bwt.getBed().clone().add(x, 0, z).getBlock().getState();
+ if (bed instanceof Bed) {
+ bed.setType(bwt.getColor().bedMaterial());
+ bed.update();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
+ try {
+ // blast resistance
+ Field field = BlockBase.class.getDeclaredField("aF");
+ field.setAccessible(true);
+ // end stone
+ field.set(Blocks.fz, endStoneBlast);
+ // obsidian
+// field.set(Blocks.co, glassBlast);
+ // standard glass
+ field.set(Blocks.aQ, glassBlast);
+
+ var coloredGlass = new net.minecraft.world.level.block.Block[]{
+ Blocks.ej, Blocks.ek, Blocks.el, Blocks.em,
+ Blocks.en, Blocks.eo, Blocks.ep, Blocks.eq,
+ Blocks.er, Blocks.es, Blocks.et, Blocks.eu,
+ Blocks.ev, Blocks.ew, Blocks.ex, Blocks.ey,
+
+ // tinted glass
+ Blocks.qB,
+ };
+
+ Arrays.stream(coloredGlass).forEach(
+ glass -> {
+ try {
+ field.set(glass, glassBlast);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ );
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void setBlockTeamColor(@NotNull Block block, TeamColor teamColor) {
+ if (block.getType().toString().contains("STAINED_GLASS") || block.getType().toString().equals("GLASS")) {
+ block.setType(teamColor.glassMaterial());
+ } else if (block.getType().toString().contains("_TERRACOTTA")) {
+ block.setType(teamColor.glazedTerracottaMaterial());
+ } else if (block.getType().toString().contains("_WOOL")) {
+ block.setType(teamColor.woolMaterial());
+ }
+ }
+
+ @Override
+ public void setCollide(@NotNull Player p, IArena a, boolean value) {
+ p.setCollidable(value);
+ if (a == null) return;
+ a.updateSpectatorCollideRule(p, value);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack addCustomData(org.bukkit.inventory.ItemStack i, String data) {
+ var tag = getCreateTag(i);
+ tag.a(VersionSupport.PLUGIN_TAG_GENERIC_KEY, data);
+ return applyTag(i, tag);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack setTag(org.bukkit.inventory.ItemStack itemStack, String key, String value) {
+ var tag = getCreateTag(itemStack);
+ tag.a(key, value);
+ return applyTag(itemStack, tag);
+ }
+
+ @Override
+ public boolean isCustomBedWarsItem(org.bukkit.inventory.ItemStack i) {
+ return getCreateTag(i).e(VersionSupport.PLUGIN_TAG_GENERIC_KEY);
+ }
+
+ @Override
+ public String getCustomData(org.bukkit.inventory.ItemStack i) {
+ return getCreateTag(i).l(VersionSupport.PLUGIN_TAG_GENERIC_KEY);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack colourItem(org.bukkit.inventory.ItemStack itemStack, ITeam bedWarsTeam) {
+ if (itemStack == null) return null;
+ String type = itemStack.getType().toString();
+ if (isBed(itemStack.getType())) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().bedMaterial(), itemStack.getAmount());
+ } else if (type.contains("_STAINED_GLASS_PANE")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glassPaneMaterial(), itemStack.getAmount());
+ } else if (type.contains("STAINED_GLASS") || type.equals("GLASS")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glassMaterial(), itemStack.getAmount());
+ } else if (type.contains("_TERRACOTTA")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glazedTerracottaMaterial(), itemStack.getAmount());
+ } else if (type.contains("_WOOL")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().woolMaterial(), itemStack.getAmount());
+ }
+ return itemStack;
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack createItemStack(String material, int amount, short data) {
+ org.bukkit.inventory.ItemStack i;
+ try {
+ i = new org.bukkit.inventory.ItemStack(org.bukkit.Material.valueOf(material), amount);
+ } catch (Exception ex) {
+ getPlugin().getLogger().log(Level.WARNING, material + " is not a valid " + getName() + " material!");
+ i = new org.bukkit.inventory.ItemStack(org.bukkit.Material.BEDROCK);
+ }
+ return i;
+ }
+
+ @Override
+ public org.bukkit.Material materialFireball() {
+ return org.bukkit.Material.FIRE_CHARGE;
+ }
+
+ @Override
+ public org.bukkit.Material materialPlayerHead() {
+ return org.bukkit.Material.PLAYER_HEAD;
+ }
+
+ @Override
+ public org.bukkit.Material materialSnowball() {
+ return org.bukkit.Material.SNOWBALL;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenHelmet() {
+ return org.bukkit.Material.GOLDEN_HELMET;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenChestPlate() {
+ return org.bukkit.Material.GOLDEN_CHESTPLATE;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenLeggings() {
+ return org.bukkit.Material.GOLDEN_LEGGINGS;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteHelmet() {
+ return Material.NETHERITE_HELMET;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteChestPlate() {
+ return Material.NETHERITE_CHESTPLATE;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteLeggings() {
+ return Material.NETHERITE_LEGGINGS;
+ }
+
+ @Override
+ public org.bukkit.Material materialElytra() {
+ return Material.ELYTRA;
+ }
+
+ @Override
+ public org.bukkit.Material materialCake() {
+ return org.bukkit.Material.CAKE;
+ }
+
+ @Override
+ public org.bukkit.Material materialCraftingTable() {
+ return org.bukkit.Material.CRAFTING_TABLE;
+ }
+
+ @Override
+ public org.bukkit.Material materialEnchantingTable() {
+ return org.bukkit.Material.ENCHANTING_TABLE;
+ }
+
+ @Override
+ public org.bukkit.Material woolMaterial() {
+ return org.bukkit.Material.WHITE_WOOL;
+ }
+
+ @Override
+ public String getShopUpgradeIdentifier(org.bukkit.inventory.ItemStack itemStack) {
+ var tag = getCreateTag(itemStack);
+ return tag.e(VersionSupport.PLUGIN_TAG_TIER_KEY) ? tag.l(VersionSupport.PLUGIN_TAG_TIER_KEY) : "null";
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack setShopUpgradeIdentifier(org.bukkit.inventory.ItemStack itemStack, String identifier) {
+ var tag = getCreateTag(itemStack);
+ tag.a(VersionSupport.PLUGIN_TAG_TIER_KEY, identifier);
+ return applyTag(itemStack, tag);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getPlayerHead(Player player, org.bukkit.inventory.ItemStack copyTagFrom) {
+ org.bukkit.inventory.ItemStack head = new org.bukkit.inventory.ItemStack(materialPlayerHead());
+
+ if (copyTagFrom != null) {
+ var tag = getTag(copyTagFrom);
+ head = applyTag(head, tag);
+ }
+
+ var meta = head.getItemMeta();
+ if (meta instanceof SkullMeta) {
+ ((SkullMeta) meta).setOwnerProfile(player.getPlayerProfile());
+ }
+ head.setItemMeta(meta);
+ return head;
+ }
+
+ @Override
+ public void sendPlayerSpawnPackets(Player respawned, IArena arena) {
+ if (respawned == null) return;
+ if (arena == null) return;
+ if (!arena.isPlayer(respawned)) return;
+
+ // if method was used when the player was still in re-spawning screen
+ if (arena.getRespawnSessions().containsKey(respawned)) return;
+
+ EntityPlayer entityPlayer = getPlayer(respawned);
+ PacketPlayOutNamedEntitySpawn show = new PacketPlayOutNamedEntitySpawn(entityPlayer);
+ PacketPlayOutEntityVelocity playerVelocity = new PacketPlayOutEntityVelocity(entityPlayer);
+ // we send head rotation packet because sometimes on respawn others see him with bad rotation
+ PacketPlayOutEntityHeadRotation head = new PacketPlayOutEntityHeadRotation(entityPlayer, getCompressedAngle(entityPlayer.getBukkitYaw()));
+
+ // retrieve current armor and in-hand items
+ // we send a packet later for timing issues where other players do not see them
+ List> list = getPlayerEquipment(entityPlayer);
+
+
+ for (Player p : arena.getPlayers()) {
+ if (p == null) continue;
+ if (p.equals(respawned)) continue;
+ // if p is in re-spawning screen continue
+ if (arena.getRespawnSessions().containsKey(p)) continue;
+
+ EntityPlayer boundTo = getPlayer(p);
+ if (p.getWorld().equals(respawned.getWorld())) {
+ if (respawned.getLocation().distance(p.getLocation()) <= arena.getRenderDistance()) {
+
+ // send respawned player to regular players
+ this.sendPackets(
+ p, show, head, playerVelocity,
+ new PacketPlayOutEntityEquipment(respawned.getEntityId(), list)
+ );
+
+ // send nearby players to respawned player
+ // if the player has invisibility hide armor
+ if (p.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
+ hideArmor(p, respawned);
+ } else {
+
+ PacketPlayOutNamedEntitySpawn show2 = new PacketPlayOutNamedEntitySpawn(boundTo);
+ PacketPlayOutEntityVelocity playerVelocity2 = new PacketPlayOutEntityVelocity(boundTo);
+ PacketPlayOutEntityHeadRotation head2 = new PacketPlayOutEntityHeadRotation(boundTo, getCompressedAngle(boundTo.getBukkitYaw()));
+ this.sendPackets(respawned, show2, playerVelocity2, head2);
+
+ showArmor(p, respawned);
+ }
+ }
+ }
+ }
+
+ for (Player spectator : arena.getSpectators()) {
+ if (spectator == null) continue;
+ if (spectator.equals(respawned)) continue;
+ EntityPlayer boundTo = ((CraftPlayer) spectator).getHandle();
+ respawned.hidePlayer(getPlugin(), spectator);
+ if (spectator.getWorld().equals(respawned.getWorld())) {
+ if (respawned.getLocation().distance(spectator.getLocation()) <= arena.getRenderDistance()) {
+
+ // send respawned player to spectator
+ this.sendPackets(
+ spectator, show, playerVelocity,
+ new PacketPlayOutEntityEquipment(respawned.getEntityId(), list),
+ new PacketPlayOutEntityHeadRotation(entityPlayer, getCompressedAngle(entityPlayer.getBukkitYaw()))
+ );
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getInventoryName(@NotNull InventoryEvent e) {
+ return e.getView().getTitle();
+ }
+
+ @Override
+ public void setUnbreakable(@NotNull ItemMeta itemMeta) {
+ itemMeta.setUnbreakable(true);
+ }
+
+ @Override
+ public String getMainLevel() {
+ //noinspection deprecation
+ return ((DedicatedServer) MinecraftServer.getServer()).a().m;
+ }
+
+ @Override
+ public int getVersion() {
+ return 9;
+ }
+
+ @Override
+ public void setJoinSignBackground(@NotNull BlockState b, org.bukkit.Material material) {
+ if (b.getBlockData() instanceof WallSign) {
+ b.getBlock().getRelative(((WallSign) b.getBlockData()).getFacing().getOppositeFace()).setType(material);
+ }
+ }
+
+ @Override
+ public void spigotShowPlayer(Player victim, @NotNull Player receiver) {
+ receiver.showPlayer(getPlugin(), victim);
+ }
+
+ @Override
+ public void spigotHidePlayer(Player victim, @NotNull Player receiver) {
+ receiver.hidePlayer(getPlugin(), victim);
+ }
+
+ @Override
+ public Fireball setFireballDirection(Fireball fireball, @NotNull Vector vector) {
+ EntityFireball fb = ((CraftFireball) fireball).getHandle();
+ fb.b = vector.getX() * 0.1D;
+ fb.c = vector.getY() * 0.1D;
+ fb.d = vector.getZ() * 0.1D;
+ return (Fireball) fb.getBukkitEntity();
+ }
+
+ @Override
+ public void playRedStoneDot(@NotNull Player player) {
+ Color color = Color.RED;
+ PacketPlayOutWorldParticles particlePacket = new PacketPlayOutWorldParticles(
+ new ParticleParamRedstone(
+ new Vector3f((float) color.getRed(),
+ (float) color.getGreen(),
+ (float) color.getBlue()), (float) 1
+ ),
+ true,
+ player.getLocation().getX(),
+ player.getLocation().getY() + 2.6,
+ player.getLocation().getZ(),
+ 0, 0, 0, 0, 0
+ );
+ for (Player inWorld : player.getWorld().getPlayers()) {
+ if (inWorld.equals(player)) continue;
+ this.sendPacket(inWorld, particlePacket);
+ }
+ }
+
+ @Override
+ public void clearArrowsFromPlayerBody(Player player) {
+ // minecraft clears them on death on newer version
+ }
+
+ /**
+ * Gets the NMS Item from ItemStack
+ */
+ private @Nullable Item getItem(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.d();
+ }
+
+ /**
+ * Gets the NMS Entity from ItemStack
+ */
+ private @Nullable net.minecraft.world.entity.Entity getEntity(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.H();
+ }
+
+ private @Nullable NBTTagCompound getTag(@NotNull org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.v();
+ }
+
+ private @Nullable NBTTagCompound getTag(@NotNull ItemStack itemStack) {
+ return itemStack.v();
+ }
+
+ private @NotNull NBTTagCompound initializeTag(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return initializeTag(i);
+ }
+
+ private @NotNull NBTTagCompound initializeTag(ItemStack itemStack) {
+
+ var tag = getTag(itemStack);
+ if (null != tag) {
+ throw new RuntimeException("Provided item already has a Tag");
+ }
+ tag = new NBTTagCompound();
+ itemStack.c(tag);
+
+ return tag;
+ }
+
+ public NBTTagCompound getCreateTag(ItemStack itemStack) {
+ var tag = getTag(itemStack);
+ return null == tag ? initializeTag(itemStack) : tag;
+ }
+
+ public NBTTagCompound getCreateTag(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return getCreateTag(i);
+ }
+
+ public org.bukkit.inventory.ItemStack applyTag(org.bukkit.inventory.ItemStack itemStack, NBTTagCompound tag) {
+ return CraftItemStack.asBukkitCopy(applyTag(getNmsItemCopy(itemStack), tag));
+ }
+
+ public ItemStack applyTag(@NotNull ItemStack itemStack, NBTTagCompound tag) {
+ itemStack.c(tag);
+ return itemStack;
+ }
+
+ public ItemStack getNmsItemCopy(org.bukkit.inventory.ItemStack itemStack) {
+ ItemStack i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return i;
+ }
+
+ public EntityPlayer getPlayer(Player player) {
+ return ((CraftPlayer) player).getHandle();
+ }
+
+ public List> getPlayerEquipment(@NotNull Player player) {
+ return getPlayerEquipment(getPlayer(player));
+ }
+
+ public List> getPlayerEquipment(@NotNull EntityPlayer entityPlayer) {
+ List> list = new ArrayList<>();
+ list.add(new Pair<>(EnumItemSlot.a, entityPlayer.c(EnumItemSlot.a)));
+ list.add(new Pair<>(EnumItemSlot.b, entityPlayer.c(EnumItemSlot.b)));
+ list.add(new Pair<>(EnumItemSlot.f, entityPlayer.c(EnumItemSlot.f)));
+ list.add(new Pair<>(EnumItemSlot.e, entityPlayer.c(EnumItemSlot.e)));
+ list.add(new Pair<>(EnumItemSlot.d, entityPlayer.c(EnumItemSlot.d)));
+ list.add(new Pair<>(EnumItemSlot.c, entityPlayer.c(EnumItemSlot.c)));
+
+ return list;
+ }
+
+ @Override
+ public void placeTowerBlocks(@NotNull Block b, @NotNull IArena a, @NotNull TeamColor color, int x, int y, int z) {
+ b.getRelative(x, y, z).setType(color.woolMaterial());
+ a.addPlacedBlock(b.getRelative(x, y, z));
+ }
+
+ @Override
+ public void placeLadder(@NotNull Block b, int x, int y, int z, @NotNull IArena a, int ladderData) {
+ Block block = b.getRelative(x, y, z); //ladder block
+ block.setType(Material.LADDER);
+ Ladder ladder = (Ladder) block.getBlockData();
+ a.addPlacedBlock(block);
+ switch (ladderData) {
+ case 2 -> {
+ ladder.setFacing(BlockFace.NORTH);
+ block.setBlockData(ladder);
+ }
+ case 3 -> {
+ ladder.setFacing(BlockFace.SOUTH);
+ block.setBlockData(ladder);
+ }
+ case 4 -> {
+ ladder.setFacing(BlockFace.WEST);
+ block.setBlockData(ladder);
+ }
+ case 5 -> {
+ ladder.setFacing(BlockFace.EAST);
+ block.setBlockData(ladder);
+ }
+ }
+ }
+
+ @Override
+ public void playVillagerEffect(@NotNull Player player, Location location) {
+ player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
+ }
+
+ private void sendPacket(Player player, Packet> packet) {
+ ((CraftPlayer) player).getHandle().c.a(packet);
+ }
+
+ private void sendPackets(Player player, Packet> @NotNull ... packets) {
+ PlayerConnection connection = ((CraftPlayer) player).getHandle().c;
+ for (Packet> p : packets) {
+ connection.a(p);
+ }
+ }
+}
\ No newline at end of file
diff --git a/versionsupport_v1_20_R2/pom.xml b/versionsupport_v1_20_R2/pom.xml
new file mode 100644
index 000000000..881cb95ad
--- /dev/null
+++ b/versionsupport_v1_20_R2/pom.xml
@@ -0,0 +1,64 @@
+
+
+ 4.0.0
+
+ com.andrei1058.bedwars
+ BedWars1058
+ 23.10.1-SNAPSHOT
+
+
+ versionsupport_v1_20_R2
+
+
+ 1.19
+ 1.19
+ UTF-8
+
+
+
+
+ com.andrei1058.bedwars
+ bedwars-api
+ ${project.version}
+ jar
+ provided
+
+
+ com.andrei1058.bedwars
+ versionsupport-common
+ ${project.version}
+ jar
+ provided
+
+
+ org.spigotmc
+ spigot
+ 1.20.2-R0.1-SNAPSHOT
+ jar
+ provided
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+
+ 19
+
+
+
+
+
+
\ No newline at end of file
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableAttributes.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableAttributes.java
new file mode 100644
index 000000000..2ca63287f
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableAttributes.java
@@ -0,0 +1,5 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2.despawnable;
+
+public record DespawnableAttributes(DespawnableType type, double speed, double health, double damage, int despawnSeconds) {
+
+}
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableFactory.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableFactory.java
new file mode 100644
index 000000000..34124d3f4
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableFactory.java
@@ -0,0 +1,27 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import org.bukkit.Location;
+import org.bukkit.entity.LivingEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DespawnableFactory {
+
+ private final VersionSupport versionSupport;
+ private final List> providers = new ArrayList<>();
+
+ public DespawnableFactory(VersionSupport versionSupport) {
+ this.versionSupport = versionSupport;
+ providers.add(new TeamIronGolem());
+ providers.add(new TeamSilverfish());
+ }
+
+ public LivingEntity spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team){
+ return providers.stream().filter(provider -> provider.getType() == attr.type())
+ .findFirst().orElseThrow().spawn(attr, location,team, versionSupport);
+ }
+}
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableProvider.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableProvider.java
new file mode 100644
index 000000000..a8dffa4a4
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableProvider.java
@@ -0,0 +1,71 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityCreature;
+import net.minecraft.world.entity.EntityInsentient;
+import net.minecraft.world.entity.EntityLiving;
+import net.minecraft.world.entity.ai.attributes.GenericAttributes;
+import net.minecraft.world.entity.ai.goal.PathfinderGoal;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalSelector;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalNearestAttackableTarget;
+import net.minecraft.world.entity.player.EntityHuman;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public abstract class DespawnableProvider {
+
+ abstract DespawnableType getType();
+
+ abstract String getDisplayName(DespawnableAttributes attr, ITeam team);
+
+ abstract T spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api);
+
+ protected boolean notSameTeam(@NotNull Entity entity, ITeam team, @NotNull VersionSupport api) {
+ var despawnable = api.getDespawnablesList().getOrDefault(entity.getBukkitEntity().getUniqueId(), null);
+ return null == despawnable || despawnable.getTeam() != team;
+ }
+
+ protected PathfinderGoalSelector getTargetSelector(@NotNull EntityCreature entityLiving) {
+ return entityLiving.bP;
+ }
+
+ protected PathfinderGoalSelector getGoalSelector(@NotNull EntityCreature entityLiving) {
+ return entityLiving.bO;
+ }
+
+ protected void clearSelectors(@NotNull EntityCreature entityLiving) {
+ entityLiving.bO.b().clear();
+ entityLiving.bP.b().clear();
+ }
+
+ protected PathfinderGoal getTargetGoal(EntityInsentient entity, ITeam team, VersionSupport api) {
+ return new PathfinderGoalNearestAttackableTarget<>(entity, EntityLiving.class, 20, true, false,
+ entityLiving -> {
+ if (entityLiving instanceof EntityHuman) {
+ return !((EntityHuman) entityLiving).getBukkitEntity().isDead() &&
+ !team.wasMember(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId()) &&
+ !team.getArena().isReSpawning(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId())
+ && !team.getArena().isSpectator(((EntityHuman) entityLiving).getBukkitEntity().getUniqueId());
+ }
+ return notSameTeam(entityLiving, team, api);
+ });
+ }
+
+ protected void applyDefaultSettings(org.bukkit.entity.@NotNull LivingEntity bukkitEntity, DespawnableAttributes attr,
+ ITeam team) {
+ bukkitEntity.setRemoveWhenFarAway(false);
+ bukkitEntity.setPersistent(true);
+ bukkitEntity.setCustomNameVisible(true);
+ bukkitEntity.setCustomName(getDisplayName(attr, team));
+
+ var entity = ((EntityInsentient)((CraftEntity)bukkitEntity).getHandle());
+ Objects.requireNonNull(entity.a(GenericAttributes.a)).a(attr.health());
+ Objects.requireNonNull(entity.a(GenericAttributes.d)).a(attr.speed());
+ Objects.requireNonNull(entity.a(GenericAttributes.f)).a(attr.damage());
+ }
+}
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableType.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableType.java
new file mode 100644
index 000000000..fe6f773df
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/DespawnableType.java
@@ -0,0 +1,6 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2.despawnable;
+
+public enum DespawnableType {
+ IRON_GOLEM,
+ SILVERFISH
+}
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/TeamIronGolem.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/TeamIronGolem.java
new file mode 100644
index 000000000..f4e732d67
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/TeamIronGolem.java
@@ -0,0 +1,58 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
+import net.minecraft.world.entity.animal.EntityIronGolem;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.IronGolem;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class TeamIronGolem extends DespawnableProvider {
+
+ @Override
+ public DespawnableType getType() {
+ return DespawnableType.IRON_GOLEM;
+ }
+
+ @Override
+ String getDisplayName(@NotNull DespawnableAttributes attr, @NotNull ITeam team) {
+ Language lang = Language.getDefaultLanguage();
+ return lang.m(Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME).replace("{despawn}", String.valueOf(attr.despawnSeconds())
+ .replace("{health}", StringUtils.repeat(lang.m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
+ .replace("{TeamColor}", team.getColor().chat().toString())
+ );
+ }
+
+ public @NotNull IronGolem spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api) {
+
+ var bukkitEntity = (IronGolem) Objects.requireNonNull(location.getWorld()).spawnEntity(location, EntityType.IRON_GOLEM);
+ applyDefaultSettings(bukkitEntity, attr, team);
+
+ var entity = (EntityIronGolem) ((CraftEntity) bukkitEntity).getHandle();
+
+ clearSelectors(entity);
+ var goalSelector = getGoalSelector(entity);
+ var targetSelector = getTargetSelector(entity);
+
+ goalSelector.a(1, new PathfinderGoalFloat(entity));
+ goalSelector.a(2, new PathfinderGoalMeleeAttack(entity, 1.5D, false));
+ goalSelector.a(3, new PathfinderGoalRandomStroll(entity, 1D));
+ goalSelector.a(4, new PathfinderGoalRandomLookaround(entity));
+ targetSelector.a(1, new PathfinderGoalHurtByTarget(entity));
+ targetSelector.a(2, getTargetGoal(entity, team, api));
+
+ return bukkitEntity;
+ }
+}
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/TeamSilverfish.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/TeamSilverfish.java
new file mode 100644
index 000000000..45477e35b
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/despawnable/TeamSilverfish.java
@@ -0,0 +1,56 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2.despawnable;
+
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalMeleeAttack;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomLookaround;
+import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomStroll;
+import net.minecraft.world.entity.ai.goal.target.PathfinderGoalHurtByTarget;
+import net.minecraft.world.entity.monster.EntitySilverfish;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Silverfish;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class TeamSilverfish extends DespawnableProvider {
+ @Override
+ public DespawnableType getType() {
+ return DespawnableType.SILVERFISH;
+ }
+
+ @Override
+ String getDisplayName(@NotNull DespawnableAttributes attr, @NotNull ITeam team) {
+ Language lang = Language.getDefaultLanguage();
+ return lang.m(Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME).replace("{despawn}", String.valueOf(attr.despawnSeconds())
+ .replace("{health}", StringUtils.repeat(lang.m(Messages.FORMATTING_DESPAWNABLE_UTILITY_NPC_HEALTH) + " ", 10))
+ .replace("{TeamColor}", team.getColor().chat().toString())
+ );
+ }
+
+ @Override
+ public Silverfish spawn(@NotNull DespawnableAttributes attr, @NotNull Location location, @NotNull ITeam team, VersionSupport api) {
+ var bukkitEntity = (Silverfish) Objects.requireNonNull(location.getWorld()).spawnEntity(location, EntityType.SILVERFISH);
+ applyDefaultSettings(bukkitEntity, attr, team);
+
+ var entity = (EntitySilverfish) ((CraftEntity) bukkitEntity).getHandle();
+ clearSelectors(entity);
+
+ var goalSelector = getGoalSelector(entity);
+ var targetSelector = getTargetSelector(entity);
+ goalSelector.a(1, new PathfinderGoalFloat(entity));
+ goalSelector.a(2, new PathfinderGoalMeleeAttack(entity, 1.9D, false));
+ goalSelector.a(3, new PathfinderGoalRandomStroll(entity, 2D));
+ goalSelector.a(4, new PathfinderGoalRandomLookaround(entity));
+ targetSelector.a(1, new PathfinderGoalHurtByTarget(entity));
+ targetSelector.a(2, getTargetGoal(entity, team, api));
+
+ return bukkitEntity;
+ }
+}
diff --git a/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/v1_20_R2.java b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/v1_20_R2.java
new file mode 100644
index 000000000..31ce34f5f
--- /dev/null
+++ b/versionsupport_v1_20_R2/src/main/java/com/andrei1058/bedwars/support/version/v1_20_R2/v1_20_R2.java
@@ -0,0 +1,836 @@
+package com.andrei1058.bedwars.support.version.v1_20_R2;
+
+import com.andrei1058.bedwars.api.arena.IArena;
+import com.andrei1058.bedwars.api.arena.shop.ShopHolo;
+import com.andrei1058.bedwars.api.arena.team.ITeam;
+import com.andrei1058.bedwars.api.arena.team.TeamColor;
+import com.andrei1058.bedwars.api.entity.Despawnable;
+import com.andrei1058.bedwars.api.events.player.PlayerKillEvent;
+import com.andrei1058.bedwars.api.language.Language;
+import com.andrei1058.bedwars.api.language.Messages;
+import com.andrei1058.bedwars.api.server.VersionSupport;
+import com.andrei1058.bedwars.support.version.common.VersionCommon;
+import com.andrei1058.bedwars.support.version.v1_20_R2.despawnable.DespawnableAttributes;
+import com.andrei1058.bedwars.support.version.v1_20_R2.despawnable.DespawnableFactory;
+import com.andrei1058.bedwars.support.version.v1_20_R2.despawnable.DespawnableType;
+import com.mojang.datafixers.util.Pair;
+import net.md_5.bungee.api.ChatMessageType;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.minecraft.core.particles.ParticleParamRedstone;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.protocol.Packet;
+import net.minecraft.network.protocol.game.*;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.dedicated.DedicatedServer;
+import net.minecraft.server.level.EntityPlayer;
+import net.minecraft.server.network.PlayerConnection;
+import net.minecraft.world.entity.EntityLiving;
+import net.minecraft.world.entity.EnumItemSlot;
+import net.minecraft.world.entity.item.EntityTNTPrimed;
+import net.minecraft.world.entity.projectile.EntityFireball;
+import net.minecraft.world.entity.projectile.IProjectile;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.*;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.state.BlockBase;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.data.type.Bed;
+import org.bukkit.block.data.type.Ladder;
+import org.bukkit.block.data.type.WallSign;
+import org.bukkit.command.Command;
+import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R2.entity.*;
+import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack;
+import org.bukkit.entity.*;
+import org.bukkit.event.inventory.InventoryEvent;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.SkullMeta;
+import org.bukkit.plugin.Plugin;
+import org.bukkit.potion.PotionEffectType;
+import org.bukkit.util.Vector;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Vector3f;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.logging.Level;
+
+@SuppressWarnings("unused")
+public class v1_20_R2 extends VersionSupport {
+
+ private final DespawnableFactory despawnableFactory;
+
+ public v1_20_R2(Plugin plugin, String name) {
+ super(plugin, name);
+ loadDefaultEffects();
+ this.despawnableFactory = new DespawnableFactory(this);
+ }
+
+ @Override
+ public void registerVersionListeners() {
+ new VersionCommon(this);
+ }
+
+ @Override
+ public void registerCommand(String name, Command cmd) {
+ ((CraftServer) getPlugin().getServer()).getCommandMap().register(name, cmd);
+ }
+
+ @Override
+ public String getTag(org.bukkit.inventory.ItemStack itemStack, String key) {
+ var tag = getTag(itemStack);
+ return tag == null ? null : tag.e(key) ? tag.l(key) : null;
+ }
+
+ @Override
+ public void sendTitle(@NotNull Player p, String title, String subtitle, int fadeIn, int stay, int fadeOut) {
+ p.sendTitle(title == null ? " " : title, subtitle == null ? " " : subtitle, fadeIn, stay, fadeOut);
+ }
+
+ public void spawnSilverfish(Location loc, ITeam bedWarsTeam, double speed, double health, int despawn, double damage) {
+ var attr = new DespawnableAttributes(DespawnableType.SILVERFISH, speed, health, damage, despawn);
+ var entity = despawnableFactory.spawn(attr, loc, bedWarsTeam);
+
+ new Despawnable(
+ entity,
+ bedWarsTeam, despawn,
+ Messages.SHOP_UTILITY_NPC_SILVERFISH_NAME,
+ PlayerKillEvent.PlayerKillCause.SILVERFISH_FINAL_KILL,
+ PlayerKillEvent.PlayerKillCause.SILVERFISH
+ );
+ }
+
+ @Override
+ public void spawnIronGolem(Location loc, ITeam bedWarsTeam, double speed, double health, int despawn) {
+ var attr = new DespawnableAttributes(DespawnableType.IRON_GOLEM, speed, health, 4, despawn);
+ var entity = despawnableFactory.spawn(attr, loc, bedWarsTeam);
+ new Despawnable(
+ entity,
+ bedWarsTeam, despawn,
+ Messages.SHOP_UTILITY_NPC_IRON_GOLEM_NAME,
+ PlayerKillEvent.PlayerKillCause.IRON_GOLEM_FINAL_KILL,
+ PlayerKillEvent.PlayerKillCause.IRON_GOLEM
+ );
+ }
+
+ @Override
+ public void playAction(@NotNull Player p, String text) {
+ p.spigot().sendMessage(
+ ChatMessageType.ACTION_BAR,
+ new TextComponent(ChatColor.translateAlternateColorCodes('&', text)
+ )
+ );
+ }
+
+ @Override
+ public boolean isBukkitCommandRegistered(String name) {
+ return ((CraftServer) getPlugin().getServer()).getCommandMap().getCommand(name) != null;
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getItemInHand(@NotNull Player p) {
+ return p.getInventory().getItemInMainHand();
+ }
+
+ @Override
+ public void hideEntity(@NotNull Entity e, Player p) {
+ PacketPlayOutEntityDestroy packet = new PacketPlayOutEntityDestroy(e.getEntityId());
+ this.sendPacket(p, packet);
+ }
+
+ @Override
+ public void minusAmount(Player p, org.bukkit.inventory.@NotNull ItemStack i, int amount) {
+ if (i.getAmount() - amount <= 0) {
+ if (p.getInventory().getItemInOffHand().equals(i)) {
+ p.getInventory().setItemInOffHand(null);
+ } else {
+ p.getInventory().removeItem(i);
+ }
+ return;
+ }
+ i.setAmount(i.getAmount() - amount);
+
+ // todo this is marked as unstable on 1.20 for some reason
+ p.updateInventory();
+ }
+
+ @Override
+ public void setSource(TNTPrimed tnt, Player owner) {
+ EntityLiving nmsEntityLiving = (((CraftLivingEntity) owner).getHandle());
+ EntityTNTPrimed nmsTNT = (((CraftTNTPrimed) tnt).getHandle());
+ try {
+ Field sourceField = EntityTNTPrimed.class.getDeclaredField("d");
+ sourceField.setAccessible(true);
+ sourceField.set(nmsTNT, nmsEntityLiving);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean isArmor(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemArmor || i instanceof ItemElytra;
+
+ }
+
+ @Override
+ public boolean isTool(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemTool;
+ }
+
+ @Override
+ public boolean isSword(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemSword;
+ }
+
+ @Override
+ public boolean isAxe(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemAxe;
+ }
+
+ @Override
+ public boolean isBow(org.bukkit.inventory.ItemStack itemStack) {
+ var i = getItem(itemStack);
+ if (null == i) return false;
+ return i instanceof ItemBow;
+ }
+
+ @Override
+ public boolean isProjectile(org.bukkit.inventory.ItemStack itemStack) {
+ var entity = getEntity(itemStack);
+ if (null == entity) return false;
+ return entity instanceof IProjectile;
+ }
+
+ @Override
+ public boolean isInvisibilityPotion(org.bukkit.inventory.@NotNull ItemStack itemStack) {
+ if (!itemStack.getType().equals(org.bukkit.Material.POTION)) return false;
+
+ org.bukkit.inventory.meta.PotionMeta pm = (org.bukkit.inventory.meta.PotionMeta) itemStack.getItemMeta();
+
+ return pm != null && pm.hasCustomEffects() && pm.hasCustomEffect(org.bukkit.potion.PotionEffectType.INVISIBILITY);
+ }
+
+ @Override
+ public void registerEntities() {
+ }
+
+ @Override
+ public void spawnShop(@NotNull Location loc, String name1, List players, IArena arena) {
+ Location l = loc.clone();
+
+ if (l.getWorld() == null) return;
+ Villager vlg = (Villager) l.getWorld().spawnEntity(loc, EntityType.VILLAGER);
+ vlg.setAI(false);
+ vlg.setRemoveWhenFarAway(false);
+ vlg.setCollidable(false);
+ vlg.setInvulnerable(true);
+ vlg.setSilent(true);
+
+ for (Player p : players) {
+ String[] name = Language.getMsg(p, name1).split(",");
+ if (name.length == 1) {
+ ArmorStand a = createArmorStand(name[0], l.clone().add(0, 1.85, 0));
+ new ShopHolo(Language.getPlayerLanguage(p).getIso(), a, null, l, arena);
+ } else {
+ ArmorStand a = createArmorStand(name[0], l.clone().add(0, 2.1, 0));
+ ArmorStand b = createArmorStand(name[1], l.clone().add(0, 1.85, 0));
+ new ShopHolo(Language.getPlayerLanguage(p).getIso(), a, b, l, arena);
+ }
+ }
+ for (ShopHolo sh : ShopHolo.getShopHolo()) {
+ if (sh.getA() == arena) {
+ sh.update();
+ }
+ }
+ }
+
+ @Override
+ public double getDamage(org.bukkit.inventory.ItemStack i) {
+ var tag = getTag(i);
+ if (null == tag) {
+ throw new RuntimeException("Provided item has no Tag");
+ }
+ return tag.k("generic.attackDamage");
+ }
+
+ private static ArmorStand createArmorStand(String name, Location loc) {
+ if (loc == null) return null;
+ if (loc.getWorld() == null) return null;
+ ArmorStand a = loc.getWorld().spawn(loc, ArmorStand.class);
+ a.setGravity(false);
+ a.setVisible(false);
+ a.setCustomNameVisible(true);
+ a.setCustomName(name);
+ return a;
+ }
+
+ @Override
+ public void voidKill(Player p) {
+ EntityPlayer player = getPlayer(p);
+ player.a(player.dM().m(), 1000);
+ }
+
+ @Override
+ public void hideArmor(@NotNull Player victim, Player receiver) {
+ List> items = new ArrayList<>();
+ items.add(new Pair<>(EnumItemSlot.f, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.e, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.d, new ItemStack(Item.b(0))));
+ items.add(new Pair<>(EnumItemSlot.c, new ItemStack(Item.b(0))));
+ PacketPlayOutEntityEquipment packet1 = new PacketPlayOutEntityEquipment(victim.getEntityId(), items);
+ sendPacket(receiver, packet1);
+ }
+
+ @Override
+ public void showArmor(@NotNull Player victim, Player receiver) {
+ List> items = new ArrayList<>();
+ items.add(new Pair<>(EnumItemSlot.f, CraftItemStack.asNMSCopy(victim.getInventory().getHelmet())));
+ items.add(new Pair<>(EnumItemSlot.e, CraftItemStack.asNMSCopy(victim.getInventory().getChestplate())));
+ items.add(new Pair<>(EnumItemSlot.d, CraftItemStack.asNMSCopy(victim.getInventory().getLeggings())));
+ items.add(new Pair<>(EnumItemSlot.c, CraftItemStack.asNMSCopy(victim.getInventory().getBoots())));
+ PacketPlayOutEntityEquipment packet1 = new PacketPlayOutEntityEquipment(victim.getEntityId(), items);
+ sendPacket(receiver, packet1);
+ }
+
+ @Override
+ public void spawnDragon(Location l, ITeam bwt) {
+ if (l == null || l.getWorld() == null) {
+ getPlugin().getLogger().log(Level.WARNING, "Could not spawn Dragon. Location is null");
+ return;
+ }
+ EnderDragon ed = (EnderDragon) l.getWorld().spawnEntity(l, EntityType.ENDER_DRAGON);
+ ed.setPhase(EnderDragon.Phase.CIRCLING);
+ }
+
+ @Override
+ public void colorBed(ITeam bwt) {
+ for (int x = -1; x <= 1; x++) {
+ for (int z = -1; z <= 1; z++) {
+ BlockState bed = bwt.getBed().clone().add(x, 0, z).getBlock().getState();
+ if (bed instanceof Bed) {
+ bed.setType(bwt.getColor().bedMaterial());
+ bed.update();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void registerTntWhitelist(float endStoneBlast, float glassBlast) {
+ try {
+ // blast resistance
+ Field field = BlockBase.class.getDeclaredField("aF");
+ field.setAccessible(true);
+ // end stone
+ field.set(Blocks.fz, endStoneBlast);
+ // obsidian
+// field.set(Blocks.co, glassBlast);
+ // standard glass
+ field.set(Blocks.aQ, glassBlast);
+
+ var coloredGlass = new net.minecraft.world.level.block.Block[]{
+ Blocks.ej, Blocks.ek, Blocks.el, Blocks.em,
+ Blocks.en, Blocks.eo, Blocks.ep, Blocks.eq,
+ Blocks.er, Blocks.es, Blocks.et, Blocks.eu,
+ Blocks.ev, Blocks.ew, Blocks.ex, Blocks.ey,
+
+ // tinted glass
+ Blocks.qB,
+ };
+
+ Arrays.stream(coloredGlass).forEach(
+ glass -> {
+ try {
+ field.set(glass, glassBlast);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ );
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void setBlockTeamColor(@NotNull Block block, TeamColor teamColor) {
+ if (block.getType().toString().contains("STAINED_GLASS") || block.getType().toString().equals("GLASS")) {
+ block.setType(teamColor.glassMaterial());
+ } else if (block.getType().toString().contains("_TERRACOTTA")) {
+ block.setType(teamColor.glazedTerracottaMaterial());
+ } else if (block.getType().toString().contains("_WOOL")) {
+ block.setType(teamColor.woolMaterial());
+ }
+ }
+
+ @Override
+ public void setCollide(@NotNull Player p, IArena a, boolean value) {
+ p.setCollidable(value);
+ if (a == null) return;
+ a.updateSpectatorCollideRule(p, value);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack addCustomData(org.bukkit.inventory.ItemStack i, String data) {
+ var tag = getCreateTag(i);
+ tag.a(VersionSupport.PLUGIN_TAG_GENERIC_KEY, data);
+ return applyTag(i, tag);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack setTag(org.bukkit.inventory.ItemStack itemStack, String key, String value) {
+ var tag = getCreateTag(itemStack);
+ tag.a(key, value);
+ return applyTag(itemStack, tag);
+ }
+
+ @Override
+ public boolean isCustomBedWarsItem(org.bukkit.inventory.ItemStack i) {
+ return getCreateTag(i).e(VersionSupport.PLUGIN_TAG_GENERIC_KEY);
+ }
+
+ @Override
+ public String getCustomData(org.bukkit.inventory.ItemStack i) {
+ return getCreateTag(i).l(VersionSupport.PLUGIN_TAG_GENERIC_KEY);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack colourItem(org.bukkit.inventory.ItemStack itemStack, ITeam bedWarsTeam) {
+ if (itemStack == null) return null;
+ String type = itemStack.getType().toString();
+ if (isBed(itemStack.getType())) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().bedMaterial(), itemStack.getAmount());
+ } else if (type.contains("_STAINED_GLASS_PANE")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glassPaneMaterial(), itemStack.getAmount());
+ } else if (type.contains("STAINED_GLASS") || type.equals("GLASS")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glassMaterial(), itemStack.getAmount());
+ } else if (type.contains("_TERRACOTTA")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().glazedTerracottaMaterial(), itemStack.getAmount());
+ } else if (type.contains("_WOOL")) {
+ return new org.bukkit.inventory.ItemStack(bedWarsTeam.getColor().woolMaterial(), itemStack.getAmount());
+ }
+ return itemStack;
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack createItemStack(String material, int amount, short data) {
+ org.bukkit.inventory.ItemStack i;
+ try {
+ i = new org.bukkit.inventory.ItemStack(org.bukkit.Material.valueOf(material), amount);
+ } catch (Exception ex) {
+ getPlugin().getLogger().log(Level.WARNING, material + " is not a valid " + getName() + " material!");
+ i = new org.bukkit.inventory.ItemStack(org.bukkit.Material.BEDROCK);
+ }
+ return i;
+ }
+
+ @Override
+ public org.bukkit.Material materialFireball() {
+ return org.bukkit.Material.FIRE_CHARGE;
+ }
+
+ @Override
+ public org.bukkit.Material materialPlayerHead() {
+ return org.bukkit.Material.PLAYER_HEAD;
+ }
+
+ @Override
+ public org.bukkit.Material materialSnowball() {
+ return org.bukkit.Material.SNOWBALL;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenHelmet() {
+ return org.bukkit.Material.GOLDEN_HELMET;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenChestPlate() {
+ return org.bukkit.Material.GOLDEN_CHESTPLATE;
+ }
+
+ @Override
+ public org.bukkit.Material materialGoldenLeggings() {
+ return org.bukkit.Material.GOLDEN_LEGGINGS;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteHelmet() {
+ return Material.NETHERITE_HELMET;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteChestPlate() {
+ return Material.NETHERITE_CHESTPLATE;
+ }
+
+ @Override
+ public org.bukkit.Material materialNetheriteLeggings() {
+ return Material.NETHERITE_LEGGINGS;
+ }
+
+ @Override
+ public org.bukkit.Material materialElytra() {
+ return Material.ELYTRA;
+ }
+
+ @Override
+ public org.bukkit.Material materialCake() {
+ return org.bukkit.Material.CAKE;
+ }
+
+ @Override
+ public org.bukkit.Material materialCraftingTable() {
+ return org.bukkit.Material.CRAFTING_TABLE;
+ }
+
+ @Override
+ public org.bukkit.Material materialEnchantingTable() {
+ return org.bukkit.Material.ENCHANTING_TABLE;
+ }
+
+ @Override
+ public org.bukkit.Material woolMaterial() {
+ return org.bukkit.Material.WHITE_WOOL;
+ }
+
+ @Override
+ public String getShopUpgradeIdentifier(org.bukkit.inventory.ItemStack itemStack) {
+ var tag = getCreateTag(itemStack);
+ return tag.e(VersionSupport.PLUGIN_TAG_TIER_KEY) ? tag.l(VersionSupport.PLUGIN_TAG_TIER_KEY) : "null";
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack setShopUpgradeIdentifier(org.bukkit.inventory.ItemStack itemStack, String identifier) {
+ var tag = getCreateTag(itemStack);
+ tag.a(VersionSupport.PLUGIN_TAG_TIER_KEY, identifier);
+ return applyTag(itemStack, tag);
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getPlayerHead(Player player, org.bukkit.inventory.ItemStack copyTagFrom) {
+ org.bukkit.inventory.ItemStack head = new org.bukkit.inventory.ItemStack(materialPlayerHead());
+
+ if (copyTagFrom != null) {
+ var tag = getTag(copyTagFrom);
+ head = applyTag(head, tag);
+ }
+
+ var meta = head.getItemMeta();
+ if (meta instanceof SkullMeta) {
+ ((SkullMeta) meta).setOwnerProfile(player.getPlayerProfile());
+ }
+ head.setItemMeta(meta);
+ return head;
+ }
+
+ @Override
+ public void sendPlayerSpawnPackets(Player respawned, IArena arena) {
+ if (respawned == null) return;
+ if (arena == null) return;
+ if (!arena.isPlayer(respawned)) return;
+
+ // if method was used when the player was still in re-spawning screen
+ if (arena.getRespawnSessions().containsKey(respawned)) return;
+
+ EntityPlayer entityPlayer = getPlayer(respawned);
+ PacketPlayOutSpawnEntity show = new PacketPlayOutSpawnEntity(entityPlayer);
+ PacketPlayOutEntityVelocity playerVelocity = new PacketPlayOutEntityVelocity(entityPlayer);
+ // we send head rotation packet because sometimes on respawn others see him with bad rotation
+ PacketPlayOutEntityHeadRotation head = new PacketPlayOutEntityHeadRotation(entityPlayer, getCompressedAngle(entityPlayer.getBukkitYaw()));
+
+ // retrieve current armor and in-hand items
+ // we send a packet later for timing issues where other players do not see them
+ List> list = getPlayerEquipment(entityPlayer);
+
+
+ for (Player p : arena.getPlayers()) {
+ if (p == null) continue;
+ if (p.equals(respawned)) continue;
+ // if p is in re-spawning screen continue
+ if (arena.getRespawnSessions().containsKey(p)) continue;
+
+ EntityPlayer boundTo = getPlayer(p);
+ if (p.getWorld().equals(respawned.getWorld())) {
+ if (respawned.getLocation().distance(p.getLocation()) <= arena.getRenderDistance()) {
+
+ // send respawned player to regular players
+ this.sendPackets(
+ p, show, head, playerVelocity,
+ new PacketPlayOutEntityEquipment(respawned.getEntityId(), list)
+ );
+
+ // send nearby players to respawned player
+ // if the player has invisibility hide armor
+ if (p.hasPotionEffect(PotionEffectType.INVISIBILITY)) {
+ hideArmor(p, respawned);
+ } else {
+
+ PacketPlayOutSpawnEntity show2 = new PacketPlayOutSpawnEntity(boundTo);
+ PacketPlayOutEntityVelocity playerVelocity2 = new PacketPlayOutEntityVelocity(boundTo);
+ PacketPlayOutEntityHeadRotation head2 = new PacketPlayOutEntityHeadRotation(boundTo, getCompressedAngle(boundTo.getBukkitYaw()));
+ this.sendPackets(respawned, show2, playerVelocity2, head2);
+
+ showArmor(p, respawned);
+ }
+ }
+ }
+ }
+
+ for (Player spectator : arena.getSpectators()) {
+ if (spectator == null) continue;
+ if (spectator.equals(respawned)) continue;
+ EntityPlayer boundTo = ((CraftPlayer) spectator).getHandle();
+ respawned.hidePlayer(getPlugin(), spectator);
+ if (spectator.getWorld().equals(respawned.getWorld())) {
+ if (respawned.getLocation().distance(spectator.getLocation()) <= arena.getRenderDistance()) {
+
+ // send respawned player to spectator
+ this.sendPackets(
+ spectator, show, playerVelocity,
+ new PacketPlayOutEntityEquipment(respawned.getEntityId(), list),
+ new PacketPlayOutEntityHeadRotation(entityPlayer, getCompressedAngle(entityPlayer.getBukkitYaw()))
+ );
+ }
+ }
+ }
+ }
+
+ @Override
+ public String getInventoryName(@NotNull InventoryEvent e) {
+ return e.getView().getTitle();
+ }
+
+ @Override
+ public void setUnbreakable(@NotNull ItemMeta itemMeta) {
+ itemMeta.setUnbreakable(true);
+ }
+
+ @Override
+ public String getMainLevel() {
+ //noinspection deprecation
+ return ((DedicatedServer) MinecraftServer.getServer()).a().m;
+ }
+
+ @Override
+ public int getVersion() {
+ return 9;
+ }
+
+ @Override
+ public void setJoinSignBackground(@NotNull BlockState b, org.bukkit.Material material) {
+ if (b.getBlockData() instanceof WallSign) {
+ b.getBlock().getRelative(((WallSign) b.getBlockData()).getFacing().getOppositeFace()).setType(material);
+ }
+ }
+
+ @Override
+ public void spigotShowPlayer(Player victim, @NotNull Player receiver) {
+ receiver.showPlayer(getPlugin(), victim);
+ }
+
+ @Override
+ public void spigotHidePlayer(Player victim, @NotNull Player receiver) {
+ receiver.hidePlayer(getPlugin(), victim);
+ }
+
+ @Override
+ public Fireball setFireballDirection(Fireball fireball, @NotNull Vector vector) {
+ EntityFireball fb = ((CraftFireball) fireball).getHandle();
+ fb.b = vector.getX() * 0.1D;
+ fb.c = vector.getY() * 0.1D;
+ fb.d = vector.getZ() * 0.1D;
+ return (Fireball) fb.getBukkitEntity();
+ }
+
+ @Override
+ public void playRedStoneDot(@NotNull Player player) {
+ Color color = Color.RED;
+ PacketPlayOutWorldParticles particlePacket = new PacketPlayOutWorldParticles(
+ new ParticleParamRedstone(
+ new Vector3f((float) color.getRed(),
+ (float) color.getGreen(),
+ (float) color.getBlue()), (float) 1
+ ),
+ true,
+ player.getLocation().getX(),
+ player.getLocation().getY() + 2.6,
+ player.getLocation().getZ(),
+ 0, 0, 0, 0, 0
+ );
+ for (Player inWorld : player.getWorld().getPlayers()) {
+ if (inWorld.equals(player)) continue;
+ this.sendPacket(inWorld, particlePacket);
+ }
+ }
+
+ @Override
+ public void clearArrowsFromPlayerBody(Player player) {
+ // minecraft clears them on death on newer version
+ }
+
+ /**
+ * Gets the NMS Item from ItemStack
+ */
+ private @Nullable Item getItem(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.d();
+ }
+
+ /**
+ * Gets the NMS Entity from ItemStack
+ */
+ private @Nullable net.minecraft.world.entity.Entity getEntity(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.H();
+ }
+
+ private @Nullable NBTTagCompound getTag(@NotNull org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ return null;
+ }
+ return i.v();
+ }
+
+ private @Nullable NBTTagCompound getTag(@NotNull ItemStack itemStack) {
+ return itemStack.v();
+ }
+
+ private @NotNull NBTTagCompound initializeTag(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return initializeTag(i);
+ }
+
+ private @NotNull NBTTagCompound initializeTag(ItemStack itemStack) {
+
+ var tag = getTag(itemStack);
+ if (null != tag) {
+ throw new RuntimeException("Provided item already has a Tag");
+ }
+ tag = new NBTTagCompound();
+ itemStack.c(tag);
+
+ return tag;
+ }
+
+ public NBTTagCompound getCreateTag(ItemStack itemStack) {
+ var tag = getTag(itemStack);
+ return null == tag ? initializeTag(itemStack) : tag;
+ }
+
+ public NBTTagCompound getCreateTag(org.bukkit.inventory.ItemStack itemStack) {
+ var i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return getCreateTag(i);
+ }
+
+ public org.bukkit.inventory.ItemStack applyTag(org.bukkit.inventory.ItemStack itemStack, NBTTagCompound tag) {
+ return CraftItemStack.asBukkitCopy(applyTag(getNmsItemCopy(itemStack), tag));
+ }
+
+ public ItemStack applyTag(@NotNull ItemStack itemStack, NBTTagCompound tag) {
+ itemStack.c(tag);
+ return itemStack;
+ }
+
+ public ItemStack getNmsItemCopy(org.bukkit.inventory.ItemStack itemStack) {
+ ItemStack i = CraftItemStack.asNMSCopy(itemStack);
+ if (null == i) {
+ throw new RuntimeException("Cannot convert given item to a NMS item");
+ }
+ return i;
+ }
+
+ public EntityPlayer getPlayer(Player player) {
+ return ((CraftPlayer) player).getHandle();
+ }
+
+ public List> getPlayerEquipment(@NotNull Player player) {
+ return getPlayerEquipment(getPlayer(player));
+ }
+
+ public List> getPlayerEquipment(@NotNull EntityPlayer entityPlayer) {
+ List> list = new ArrayList<>();
+ list.add(new Pair<>(EnumItemSlot.a, entityPlayer.c(EnumItemSlot.a)));
+ list.add(new Pair<>(EnumItemSlot.b, entityPlayer.c(EnumItemSlot.b)));
+ list.add(new Pair<>(EnumItemSlot.f, entityPlayer.c(EnumItemSlot.f)));
+ list.add(new Pair<>(EnumItemSlot.e, entityPlayer.c(EnumItemSlot.e)));
+ list.add(new Pair<>(EnumItemSlot.d, entityPlayer.c(EnumItemSlot.d)));
+ list.add(new Pair<>(EnumItemSlot.c, entityPlayer.c(EnumItemSlot.c)));
+
+ return list;
+ }
+
+ @Override
+ public void placeTowerBlocks(@NotNull Block b, @NotNull IArena a, @NotNull TeamColor color, int x, int y, int z) {
+ b.getRelative(x, y, z).setType(color.woolMaterial());
+ a.addPlacedBlock(b.getRelative(x, y, z));
+ }
+
+ @Override
+ public void placeLadder(@NotNull Block b, int x, int y, int z, @NotNull IArena a, int ladderData) {
+ Block block = b.getRelative(x, y, z); //ladder block
+ block.setType(Material.LADDER);
+ Ladder ladder = (Ladder) block.getBlockData();
+ a.addPlacedBlock(block);
+ switch (ladderData) {
+ case 2 -> {
+ ladder.setFacing(BlockFace.NORTH);
+ block.setBlockData(ladder);
+ }
+ case 3 -> {
+ ladder.setFacing(BlockFace.SOUTH);
+ block.setBlockData(ladder);
+ }
+ case 4 -> {
+ ladder.setFacing(BlockFace.WEST);
+ block.setBlockData(ladder);
+ }
+ case 5 -> {
+ ladder.setFacing(BlockFace.EAST);
+ block.setBlockData(ladder);
+ }
+ }
+ }
+
+ @Override
+ public void playVillagerEffect(@NotNull Player player, Location location) {
+ player.spawnParticle(Particle.VILLAGER_HAPPY, location, 1);
+ }
+
+ private void sendPacket(Player player, Packet> packet) {
+ ((CraftPlayer) player).getHandle().c.a(packet);
+ }
+
+ private void sendPackets(Player player, Packet> @NotNull ... packets) {
+ PlayerConnection connection = ((CraftPlayer) player).getHandle().c;
+ for (Packet> p : packets) {
+ connection.a(p);
+ }
+ }
+}
\ No newline at end of file