diff --git a/.idea/modules/1.18/HMCCosmetics.1.18.main.iml b/.idea/modules/1.18/HMCCosmetics.1.18.main.iml
index 8e70a189..d35a0362 100644
--- a/.idea/modules/1.18/HMCCosmetics.1.18.main.iml
+++ b/.idea/modules/1.18/HMCCosmetics.1.18.main.iml
@@ -4,8 +4,8 @@
- MCP
SPIGOT
+ MCP
diff --git a/common/build.gradle.kts b/common/build.gradle.kts
index b20c34b6..9b644906 100644
--- a/common/build.gradle.kts
+++ b/common/build.gradle.kts
@@ -106,6 +106,10 @@ bukkit {
default = BukkitPluginDescription.Permission.Default.OP
description = "Permission to set other users' cosmetics."
}
+ register("hmccosmetics.cmd.wardrobe.portable") {
+ default = BukkitPluginDescription.Permission.Default.OP
+ description = "Permission to use a portable wardrobe"
+ }
register("hmccosmetics.cmd.wardrobe") {
default = BukkitPluginDescription.Permission.Default.OP
description = "Permission to view the wardrobe"
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java
index 0df40574..6075e0a4 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java
@@ -141,14 +141,14 @@ public class HMCCosmetics extends JavaPlugin {
}
public void load() {
- Bukkit.getScheduler().runTaskAsynchronously(this,
+ Bukkit.getScheduler().runTaskLaterAsynchronously(this,
() -> {
this.settings.load();
this.messageHandler.load();
this.cosmeticsMenu.load();
Translation.getInstance().load();
this.database.load();
- });
+ }, 1);
}
public void reload() {
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java
index 21556da6..6766f533 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java
@@ -1,6 +1,8 @@
package io.github.fisher2911.hmccosmetics.command;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
+import io.github.fisher2911.hmccosmetics.config.Settings;
+import io.github.fisher2911.hmccosmetics.config.WardrobeSettings;
import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
import io.github.fisher2911.hmccosmetics.gui.CosmeticsMenu;
import io.github.fisher2911.hmccosmetics.message.Message;
@@ -33,17 +35,35 @@ public class CosmeticsCommand extends CommandBase {
private final UserManager userManager;
private final MessageHandler messageHandler;
private final CosmeticsMenu cosmeticsMenu;
+ private final Settings settings;
public CosmeticsCommand(final HMCCosmetics plugin) {
this.plugin = plugin;
this.userManager = this.plugin.getUserManager();
this.messageHandler = this.plugin.getMessageHandler();
this.cosmeticsMenu = this.plugin.getCosmeticsMenu();
+ this.settings = this.plugin.getSettings();
}
@Default
@Permission(io.github.fisher2911.hmccosmetics.message.Permission.DEFAULT_COMMAND)
public void defaultCommand(final Player player) {
+ final Optional optionalUser = this.userManager.get(player.getUniqueId());
+ if (optionalUser.isEmpty()) {
+ this.cosmeticsMenu.openDefault(player);
+ return;
+ }
+ final User user = optionalUser.get();
+ final Wardrobe wardrobe = user.getWardrobe();
+ if (wardrobe.isActive() &&
+ !this.settings.getWardrobeSettings().inDistanceOfWardrobe(wardrobe.getCurrentLocation(), player.getLocation())) {
+ wardrobe.setActive(false);
+ wardrobe.despawnFakePlayer(player);
+ this.messageHandler.sendMessage(
+ player,
+ Messages.CLOSED_WARDROBE
+ );
+ }
this.cosmeticsMenu.openDefault(player);
}
@@ -193,7 +213,7 @@ public class CosmeticsCommand extends CommandBase {
}
@SubCommand("wardrobe")
- @Permission(io.github.fisher2911.hmccosmetics.message.Permission.VIEW_WARDROBE)
+ @Permission(io.github.fisher2911.hmccosmetics.message.Permission.WARDROBE)
public void openWardrobe(final Player player) {
final Optional optionalUser = this.plugin.getUserManager().get(player.getUniqueId());
if (optionalUser.isEmpty()) return;
@@ -209,11 +229,36 @@ public class CosmeticsCommand extends CommandBase {
return;
}
+ final WardrobeSettings settings = this.settings.getWardrobeSettings();
+
+ final boolean inDistanceOfStatic = settings.inDistanceOfStatic(player.getLocation());
+
+ if (!settings.isPortable() && !inDistanceOfStatic) {
+ this.messageHandler.sendMessage(
+ player,
+ Messages.NOT_NEAR_WARDROBE
+ );
+ return;
+ }
+
+ if (settings.isPortable() && !inDistanceOfStatic) {
+ if (!player.hasPermission(io.github.fisher2911.hmccosmetics.message.Permission.PORTABLE_WARDROBE)) {
+ this.messageHandler.sendMessage(
+ player,
+ Messages.CANNOT_USE_PORTABLE_WARDROBE
+ );
+ return;
+ }
+ wardrobe.setCurrentLocation(null);
+ }
+
wardrobe.setActive(true);
+
Bukkit.getScheduler().runTaskAsynchronously(
this.plugin,
- () -> wardrobe.spawnFakePlayer(player, this.plugin)
+ () -> wardrobe.spawnFakePlayer(player)
);
+
this.cosmeticsMenu.openDefault(player);
this.messageHandler.sendMessage(
player,
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/config/Settings.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/config/Settings.java
index 4aed225e..71760c99 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/config/Settings.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/config/Settings.java
@@ -5,21 +5,27 @@ import io.github.fisher2911.hmccosmetics.HMCCosmetics;
public class Settings {
private final HMCCosmetics plugin;
- private final CosmeticSettings settings;
+ private final CosmeticSettings cosmeticSettings;
+ private final WardrobeSettings wardrobeSettings;
public Settings(final HMCCosmetics plugin) {
this.plugin = plugin;
- this.settings = new CosmeticSettings();
+ this.cosmeticSettings = new CosmeticSettings();
+ this.wardrobeSettings = new WardrobeSettings(this.plugin);
}
public void load() {
this.plugin.saveDefaultConfig();
this.plugin.reloadConfig();
- this.settings.load(this.plugin.getConfig());
+ this.cosmeticSettings.load(this.plugin.getConfig());
+ this.wardrobeSettings.load();
}
public CosmeticSettings getCosmeticSettings() {
- return settings;
+ return cosmeticSettings;
}
+ public WardrobeSettings getWardrobeSettings() {
+ return wardrobeSettings;
+ }
}
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/config/WardrobeSettings.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/config/WardrobeSettings.java
new file mode 100644
index 00000000..cefa0d6b
--- /dev/null
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/config/WardrobeSettings.java
@@ -0,0 +1,104 @@
+package io.github.fisher2911.hmccosmetics.config;
+
+import io.github.fisher2911.hmccosmetics.HMCCosmetics;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.checkerframework.checker.units.qual.A;
+import org.jetbrains.annotations.Nullable;
+
+import org.bukkit.Location;
+
+public class WardrobeSettings {
+
+ private static final String WARDROBE_PATH = "wardrobe";
+ private static final String DISABLE_ON_DAMAGE_PATH = WARDROBE_PATH + ".disable-on-damage";
+ private static final String DISPLAY_RADIUS_PATH = WARDROBE_PATH + ".display-radius";
+ private static final String PORTABLE_PATH = WARDROBE_PATH + ".portable";
+ private static final String ALWAYS_DISPLAY_PATH = WARDROBE_PATH + ".always-display";
+ private static final String STATIC_RADIUS_PATH = WARDROBE_PATH + ".static-radius";
+ private static final String STATIC_LOCATION_PATH = WARDROBE_PATH + ".wardrobe-location";
+ private static final String WORLD_PATH = "world";
+ private static final String X_PATH = "x";
+ private static final String Y_PATH = "y";
+ private static final String Z_PATH = "z";
+ private static final String YAW_PATH = "yaw";
+ private static final String PITCH_PATH = "pitch";
+
+
+ private final HMCCosmetics plugin;
+
+ private boolean disableOnDamage;
+ private int displayRadius;
+ private boolean portable;
+ private boolean alwaysDisplay;
+ private int staticRadius;
+ private Location location;
+
+ public WardrobeSettings(final HMCCosmetics plugin) {
+ this.plugin = plugin;
+ }
+
+ public void load() {
+ final FileConfiguration config = this.plugin.getConfig();
+ this.disableOnDamage = config.getBoolean(DISABLE_ON_DAMAGE_PATH);
+ this.displayRadius = config.getInt(DISPLAY_RADIUS_PATH);
+ this.portable = config.getBoolean(PORTABLE_PATH);
+ this.staticRadius = config.getInt(STATIC_RADIUS_PATH);
+ this.alwaysDisplay = config.getBoolean(ALWAYS_DISPLAY_PATH);
+ final ConfigurationSection locationSection = config.getConfigurationSection(STATIC_LOCATION_PATH);
+ if (locationSection == null) return;
+ this.location = this.loadLocation(locationSection);
+ }
+
+ @Nullable
+ private Location loadLocation(final ConfigurationSection section) {
+ final String worldName = section.getString(WORLD_PATH);
+ final int x = section.getInt(X_PATH);
+ final int y = section.getInt(Y_PATH);
+ final int z = section.getInt(Z_PATH);
+ final float yaw = (float) section.getDouble(YAW_PATH);
+ final float pitch = (float) section.getDouble(PITCH_PATH);
+
+ if (worldName == null || worldName.isBlank()) return null;
+ final World world = Bukkit.getWorld(worldName);
+ if (world == null) return null;
+ return new Location(world, x, y, z, yaw, pitch);
+ }
+
+ public boolean getDisableOnDamage() {
+ return disableOnDamage;
+ }
+
+ public int getDisplayRadius() {
+ return displayRadius;
+ }
+
+ public boolean isPortable() {
+ return portable;
+ }
+
+ public boolean isAlwaysDisplay() {
+ return alwaysDisplay;
+ }
+
+ public int getStaticRadius() {
+ return staticRadius;
+ }
+
+ public Location getLocation() {
+ return location.clone();
+ }
+
+ public boolean inDistanceOfWardrobe(final Location wardrobeLocation, final Location playerLocation) {
+ if (this.displayRadius == -1) return true;
+ return playerLocation.distanceSquared(wardrobeLocation) <= this.displayRadius * this.displayRadius;
+ }
+
+ public boolean inDistanceOfStatic(final Location location) {
+ if (this.location == null) return false;
+ if (this.staticRadius == -1) return false;
+ return this.location.distanceSquared(location) <= this.staticRadius * this.staticRadius;
+ }
+}
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java
index d1fd3835..affd3b8a 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java
@@ -106,7 +106,6 @@ public class Database {
final User user = new User(uuid, PlayerArmor.empty(), wardrobe, armorStandId);
this.plugin.getUserManager().add(user);
onComplete.accept(user);
-
}
public void saveUser(final User user) {
@@ -158,6 +157,7 @@ public class Database {
public Wardrobe createNewWardrobe(final UUID ownerUUID) {
return new Wardrobe(
+ this.plugin,
UUID.randomUUID(),
ownerUUID,
PlayerArmor.empty(),
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java
index 76637f07..60ebc92a 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java
@@ -107,12 +107,10 @@ public class CosmeticGui {
this.gui.updateItem(slot, guiItem);
}
- public void open(final User user) {
- final Player player = user.getPlayer();
- if (player == null) return;
+ public void open(final User user, final Player player) {
this.gui = Gui.gui().
title(Adventure.MINI_MESSAGE.deserialize(
- Placeholder.applyPapiPlaceholders(user.getPlayer(), this.title))).
+ Placeholder.applyPapiPlaceholders(player, this.title))).
rows(this.rows).
create();
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java
index 216ca5f3..ccf911ae 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java
@@ -43,6 +43,7 @@ public class CosmeticsMenu {
}
public void openMenu(final String id, final HumanEntity humanEntity) {
+ if (!(humanEntity instanceof final Player player)) return;
final CosmeticGui cosmeticGui = this.getGui(id);
final Optional optionalUser = this.plugin.getUserManager().get(humanEntity.getUniqueId());
@@ -59,9 +60,7 @@ public class CosmeticsMenu {
return;
}
- if (cosmeticGui != null) {
- cosmeticGui.open(user);
- }
+ if (cosmeticGui != null) cosmeticGui.open(user, player);
}
public void openDefault(final HumanEntity humanEntity) {
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java
index 84b79d1f..b6bf2ca6 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java
@@ -176,9 +176,7 @@ public class DyeSelectorGui extends CosmeticGui {
}
@Override
- public void open(final User user) {
- final Player player = user.getPlayer();
- if (player == null) return;
+ public void open(final User user, final Player player) {
this.getGui(user, user.getLastSetItem().getType()).open(player);
}
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/PAPIExpansion.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/PAPIExpansion.java
index feaccd4b..8dd863d0 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/PAPIExpansion.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/PAPIExpansion.java
@@ -61,21 +61,21 @@ public class PAPIExpansion extends PlaceholderExpansion {
if (parts.length < 2) return null;
final String id = this.getId(parts, 1);
for (final ArmorItem item : user.getPlayerArmor().getArmorItems()) {
- if (item.getId().equals(id)) return Translation.translate("true");
+ if (item.getId().equals(id)) return Translation.translate(Translation.TRUE);
}
- return Translation.translate("false");
+ return Translation.translate(Translation.FALSE);
}
// %hmccosmetics_current_type%
if (parts[0].equals("current")) {
- if (parts.length < 2) {
- final String typeStr = parts[1];
+ if (parts.length >= 2) {
+ final String typeStr = getId(parts, 1);
try {
- final ArmorItem.Type type = ArmorItem.Type.valueOf(typeStr);
+ final ArmorItem.Type type = ArmorItem.Type.valueOf(typeStr.toUpperCase());
for (final ArmorItem item : user.getPlayerArmor().getArmorItems()) {
if (item.getType().equals(type)) return item.getId();
}
- return null;
+ return Translation.translate(Translation.NONE);
} catch (final IllegalArgumentException exception) {
return null;
}
@@ -86,9 +86,10 @@ public class PAPIExpansion extends PlaceholderExpansion {
}
private String getId(final String[] parts, final int fromIndex) {
- final StringBuilder builder = new StringBuilder(parts[fromIndex]);
- for (int i = fromIndex + 1; i < parts.length; i++) {
+ final StringBuilder builder = new StringBuilder();
+ for (int i = fromIndex; i < parts.length; i++) {
builder.append(parts[i]);
+ if (i < parts.length - 1) builder.append("_");
}
return builder.toString();
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/inventory/PlayerArmor.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/inventory/PlayerArmor.java
index 7303993e..ba760352 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/inventory/PlayerArmor.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/inventory/PlayerArmor.java
@@ -62,4 +62,10 @@ public class PlayerArmor {
return new PlayerArmor(new HashMap<>(this.armorItems));
}
+ public void clear() {
+ for (final ArmorItem.Type type : ArmorItem.Type.values()) {
+ this.setItem(ArmorItem.empty(type));
+ }
+ }
+
}
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java
index f9ef259b..432ebc25 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java
@@ -44,8 +44,7 @@ public class CosmeticFixListener implements Listener {
@EventHandler
public void onRightClick(final PlayerInteractEvent event) {
- if (event.getAction() != Action.RIGHT_CLICK_BLOCK
- && event.getHand() != EquipmentSlot.OFF_HAND) {
+ if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
final Player player = event.getPlayer();
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java
index a2c0c169..1e0fab9f 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java
@@ -1,6 +1,7 @@
package io.github.fisher2911.hmccosmetics.listener;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
+import io.github.fisher2911.hmccosmetics.config.WardrobeSettings;
import io.github.fisher2911.hmccosmetics.database.Database;
import io.github.fisher2911.hmccosmetics.user.User;
import io.github.fisher2911.hmccosmetics.user.UserManager;
@@ -31,7 +32,15 @@ public class JoinListener implements Listener {
final Player player = event.getPlayer();
this.database.loadUser(player.getUniqueId(),
user -> Bukkit.getScheduler().runTaskAsynchronously(this.plugin,
- () -> this.userManager.resendCosmetics(player)));
+ () -> {
+ this.userManager.resendCosmetics(player);
+ final WardrobeSettings settings = this.plugin.getSettings().getWardrobeSettings();
+ if (settings.isAlwaysDisplay() && settings.getLocation() != null) {
+ final Wardrobe wardrobe = user.getWardrobe();
+ wardrobe.setCurrentLocation(settings.getLocation());
+ wardrobe.spawnFakePlayer(player);
+ }
+ }));
}
@EventHandler
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java
index ff54bebd..ef6d488d 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java
@@ -56,6 +56,10 @@ public class Messages {
new Message("closed-wardrobe", ChatColor.GREEN + "Closing wardrobe!");
public static final Message WARDROBE_ALREADY_OPEN =
new Message("wardrobe-already-open", ChatColor.RED + "The wardrobe is already open!");
+ public static final Message NOT_NEAR_WARDROBE =
+ new Message("not-near-wardrobe", ChatColor.RED + "You are not near the wardrobe!");
+ public static final Message CANNOT_USE_PORTABLE_WARDROBE =
+ new Message("cannot-use-portable-wardrobe", ChatColor.RED + "You cannot use the portable wardrobe!");
public static final Message SET_OTHER_BACKPACK = new Message(
"set-other-backpack", ChatColor.GREEN + "You have set the backpack of " +
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java
index fcde6639..aaa2ddcc 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java
@@ -7,6 +7,7 @@ public class Permission {
public static final String RELOAD_COMMAND = "hmccosmetics.cmd.reload";
public static final String HELP_COMMAND = "hmccosmetics.cmd.help";
public static final String SET_COSMETIC_COMMAND = "hmccosmetics.cmd.set";
- public static final String VIEW_WARDROBE = "hmccosmetics.cmd.wardrobe";
+ public static final String PORTABLE_WARDROBE = "hmccosmetics.cmd.wardrobe.portable";
+ public static final String WARDROBE = "hmccosmetics.cmd.wardrobe";
}
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Translation.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Translation.java
index 8f833c1f..2ae635be 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Translation.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/message/Translation.java
@@ -10,6 +10,10 @@ import org.bukkit.configuration.file.YamlConfiguration;
public class Translation {
+ public static final String TRUE = "true";
+ public static final String FALSE = "false";
+ public static final String NONE = "none";
+
private static final Translation INSTANCE;
private static final String FILE_NAME = "translations.yml";
private static final String TRANSLATION_PATH = "translations";
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java
index ad02c2fb..a4d34ef7 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java
@@ -14,6 +14,7 @@ import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor;
import io.github.fisher2911.hmccosmetics.message.Message;
import io.github.fisher2911.hmccosmetics.message.MessageHandler;
import io.github.fisher2911.hmccosmetics.message.Placeholder;
+import io.github.fisher2911.hmccosmetics.message.Translation;
import io.github.fisher2911.hmccosmetics.packet.PacketManager;
import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder;
import org.bukkit.Bukkit;
@@ -167,8 +168,8 @@ public class UserManager {
if (hidden) return new ItemStack(Material.AIR);
final CosmeticSettings cosmeticSettings = this.settings.getCosmeticSettings();
- final Map placeholders = Map.of(Placeholder.ALLOWED, "true",
- Placeholder.ENABLED, "true");
+ final Map placeholders = Map.of(Placeholder.ALLOWED, Translation.TRUE,
+ Placeholder.ENABLED, Translation.TRUE);
ItemStack itemStack = ItemBuilder.from(armorItem.getColored()).
namePlaceholders(placeholders).
diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/Wardrobe.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/Wardrobe.java
index 5ecb6be7..6ccac535 100644
--- a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/Wardrobe.java
+++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/Wardrobe.java
@@ -3,6 +3,7 @@ package io.github.fisher2911.hmccosmetics.user;
import com.comphenix.protocol.events.PacketContainer;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
import io.github.fisher2911.hmccosmetics.config.Settings;
+import io.github.fisher2911.hmccosmetics.config.WardrobeSettings;
import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor;
import io.github.fisher2911.hmccosmetics.packet.PacketManager;
@@ -11,17 +12,22 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
+import java.io.BufferedReader;
import java.util.UUID;
public class Wardrobe extends User {
+ private final HMCCosmetics plugin;
private final UUID ownerUUID;
private final int entityId;
private boolean active;
+ private boolean spawned;
+
private Location currentLocation;
public Wardrobe(
+ final HMCCosmetics plugin,
final UUID uuid,
final UUID ownerUUID,
final PlayerArmor playerArmor,
@@ -29,16 +35,25 @@ public class Wardrobe extends User {
final int entityId,
final boolean active) {
super(uuid, playerArmor, armorStandId);
+ this.plugin = plugin;
this.ownerUUID = ownerUUID;
this.entityId = entityId;
this.active = active;
this.wardrobe = this;
}
- public void spawnFakePlayer(final Player viewer, final HMCCosmetics plugin) {
- this.currentLocation = viewer.getLocation().clone();
- this.currentLocation.setPitch(0);
- this.currentLocation.setYaw(0);
+ public void spawnFakePlayer(final Player viewer) {
+ final WardrobeSettings settings = this.plugin.getSettings().getWardrobeSettings();
+ if (settings.inDistanceOfStatic(viewer.getLocation())) {
+ this.currentLocation = settings.getLocation();
+ } else if (this.currentLocation == null) {
+ this.currentLocation = viewer.getLocation().clone();
+ this.currentLocation.setPitch(0);
+ this.currentLocation.setYaw(0);
+ } else if (this.spawned) {
+ return;
+ }
+
final PacketContainer playerSpawnPacket = PacketManager.getFakePlayerSpawnPacket(
this.currentLocation,
this.getUuid(),
@@ -51,6 +66,7 @@ public class Wardrobe extends User {
PacketManager.sendPacket(viewer, playerInfoPacket, playerSpawnPacket);
this.spawnArmorStand(viewer);
this.updateArmorStand(viewer, plugin.getSettings(), this.currentLocation);
+ this.spawned = true;
}
@Override
@@ -59,9 +75,19 @@ public class Wardrobe extends User {
}
public void despawnFakePlayer(final Player viewer) {
+ final WardrobeSettings settings = this.plugin.getSettings().getWardrobeSettings();
PacketManager.sendPacket(viewer, PacketManager.getEntityDestroyPacket(this.getEntityId()));
this.despawnAttached();
this.active = false;
+ this.spawned = false;
+ this.currentLocation = null;
+ this.getPlayerArmor().clear();
+
+ if (settings.isAlwaysDisplay()) {
+ this.currentLocation = settings.getLocation();
+ if (this.currentLocation == null) return;
+ this.spawnFakePlayer(viewer);
+ }
}
@Override
@@ -82,10 +108,19 @@ public class Wardrobe extends User {
this.active = active;
}
+ public void setCurrentLocation(final Location currentLocation) {
+ this.currentLocation = currentLocation;
+ }
+
+ @Nullable
+ public Location getCurrentLocation() {
+ return currentLocation;
+ }
+
@Override
@Nullable
public Player getPlayer() {
- return null;
+ return Bukkit.getPlayer(this.ownerUUID);
}
}
diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml
index dfedb3fd..c98884b8 100644
--- a/common/src/main/resources/config.yml
+++ b/common/src/main/resources/config.yml
@@ -3,4 +3,23 @@ cosmetic-settings:
require-empty-off-hand: true
# The pitch the player must look down for the backpack to be removed
# Set to -1 for no removal
- look-down-backpack-remove: 70
\ No newline at end of file
+ look-down-backpack-remove: 70
+wardrobe:
+ # if true, the wardrobe will be removed when the player is damaged
+ disable-on-damage: true
+ # removed if player leaves this radius, set to -1 for infinite radius
+ display-radius: -1
+ # if the player can use the wardrobe in other locations
+ portable: false
+ # if the wardrobe should always be displayed in the location below
+ always-display: false
+ # spawn static wardrobe if in this radius of wardrobe-location
+ static-radius: 10
+ # location of static wardrobe, remove for none
+ wardrobe-location:
+ world: "World"
+ x: 0
+ y: 0
+ z: 0
+ yaw: 0
+ pitch: 0
\ No newline at end of file
diff --git a/common/src/main/resources/messages.yml b/common/src/main/resources/messages.yml
index 6a148c6c..4f6738b8 100644
--- a/common/src/main/resources/messages.yml
+++ b/common/src/main/resources/messages.yml
@@ -17,6 +17,8 @@ set-other-off-hand: "%prefix% You have set the off han
opened-wardrobe: "%prefix% Viewing wardrobe!"
closed-wardrobe: "%prefix% Closed wardrobe!"
wardrobe-already-open: "%prefix% The wardrobe is already open!"
+not-near-wardrobe: "%prefix% You are not near the wardrobe!"
+cannot-use-portable-wardrobe: "%prefix% You cannot use the portable wardrobe!"
help-command: "<#6D9DC5> %prefix% HMCCosmetics - Help %prefix% <#6D9DC5>