9
0
mirror of https://github.com/HibiscusMC/HMCCosmetics.git synced 2025-12-24 17:39:18 +00:00

Compare commits

...

8 Commits

Author SHA1 Message Date
LoJoSho
0120720cc3 version bump (2.4.8) 2023-06-27 10:27:43 -05:00
LoJoSho
d1bfa5abbc feat: add force-show-join to show regardless of hidden in database 2023-06-27 10:16:30 -05:00
LoJoSho
71a080a3d5 feat: Option to open menu on wardrobe enter 2023-06-27 09:54:35 -05:00
LoJoSho
78f48703db fix: prevent kicking when message is null/empty 2023-06-27 09:44:11 -05:00
LoJoSho
b9e5096d33 feat: actionbar when player has hidden cosmetics 2023-06-27 09:43:56 -05:00
LoJoSho
d7603b5108 version bump (2.4.8-DEV) 2023-06-27 09:28:03 -05:00
LoJoSho
756e3390a1 clean: remove old code commented out 2023-06-24 20:45:59 -05:00
LoJoSho
8054a35f43 feat: add recursive file lookup 2023-06-23 14:45:27 -05:00
12 changed files with 98 additions and 52 deletions

View File

@@ -8,7 +8,7 @@ plugins {
}
group = "com.hibiscusmc"
version = "2.4.7"
version = "2.4.8"
allprojects {
apply(plugin = "java")

View File

@@ -34,6 +34,7 @@ public class Settings {
private static final String TICK_PERIOD_PATH = "tick-period";
private static final String UNAPPLY_DEATH_PATH = "unapply-on-death";
private static final String FORCE_PERMISSION_JOIN_PATH = "force-permission-join";
private static final String FORCE_SHOW_COSMETICS_PATH = "force-show-join";
private static final String EMOTE_DISTANCE_PATH = "emote-distance";
private static final String HOOK_SETTING_PATH = "hook-settings";
private static final String HOOK_ITEMADDER_PATH = "itemsadder";
@@ -64,6 +65,7 @@ public class Settings {
private static boolean debugMode;
private static boolean unapplyOnDeath;
private static boolean forcePermissionJoin;
private static boolean forceShowOnJoin;
private static boolean itemsAdderChangeReload;
private static boolean worldGuardMoveCheck;
private static boolean cosmeticEmoteBlockCheck;
@@ -105,6 +107,7 @@ public class Settings {
requireEmptyBoots = cosmeticSettings.node(REQUIRE_EMPTY_BOOTS_PATH).getBoolean();
unapplyOnDeath = cosmeticSettings.node(UNAPPLY_DEATH_PATH).getBoolean(false);
forcePermissionJoin = cosmeticSettings.node(FORCE_PERMISSION_JOIN_PATH).getBoolean(false);
forceShowOnJoin = cosmeticSettings.node(FORCE_SHOW_COSMETICS_PATH).getBoolean(false);
emoteDistance = cosmeticSettings.node(EMOTE_DISTANCE_PATH).getDouble(-3);
cosmeticEmoteBlockCheck = cosmeticSettings.node(COSMETIC_EMOTE_CHECK_PATH).getBoolean(true);
emoteAirCheck = cosmeticSettings.node(COSMETIC_EMOTE_AIR_CHECK_PATH).getBoolean(true);
@@ -254,6 +257,10 @@ public class Settings {
return forcePermissionJoin;
}
public static boolean isForceShowOnJoin() {
return forceShowOnJoin;
}
public static boolean getDebugMode() {
return debugMode;
}

View File

@@ -33,6 +33,10 @@ public class WardrobeSettings {
private static final String EQUIP_PUMPKIN_WARDROBE = "equip-pumpkin";
private static final String TRY_COSMETICS_WARDROBE = "unchecked-wardrobe-cosmetics";
private static final String RETURN_LAST_LOCATION = "return-last-location";
private static final String WARDROBE_MENU_OPTIONS = "menu-options";
private static final String WARDROBE_ENTER_OPEN_MENU_PATH = "enter-open-menu";
private static final String GAMEMODE_OPTIONS_PATH = "gamemode-options";
private static final String FORCE_EXIT_GAMEMODE_PATH = "exit-gamemode-enabled";
private static final String EXIT_GAMEMODE_PATH = "exit-gamemode";
@@ -68,6 +72,7 @@ public class WardrobeSettings {
private static boolean equipPumpkin;
private static boolean returnLastLocation;
private static boolean enabledBossbar;
private static boolean enterOpenMenu;
private static boolean forceExitGamemode;
private static GameMode exitGamemode;
private static HashMap<String, Wardrobe> wardrobes;
@@ -97,6 +102,9 @@ public class WardrobeSettings {
returnLastLocation = source.node(RETURN_LAST_LOCATION).getBoolean(false);
tryCosmeticsInWardrobe = source.node(TRY_COSMETICS_WARDROBE).getBoolean(false);
ConfigurationNode menuOptionsNode = source.node(WARDROBE_MENU_OPTIONS);
enterOpenMenu = menuOptionsNode.node(WARDROBE_ENTER_OPEN_MENU_PATH).getBoolean(false);
ConfigurationNode gamemodeNode = source.node(GAMEMODE_OPTIONS_PATH);
forceExitGamemode = gamemodeNode.node(FORCE_EXIT_GAMEMODE_PATH).getBoolean(false);
exitGamemode = GameMode.valueOf(gamemodeNode.node(EXIT_GAMEMODE_PATH).getString("SURVIVAL"));
@@ -274,6 +282,10 @@ public class WardrobeSettings {
return transitionFadeOut;
}
public static boolean isEnterOpenMenu() {
return enterOpenMenu;
}
public static boolean isForceExitGamemode() {
return forceExitGamemode;
}

View File

@@ -15,8 +15,11 @@ import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Set;
import java.util.logging.Level;
import java.util.stream.Stream;
public class Cosmetics {
@@ -68,19 +71,23 @@ public class Cosmetics {
File[] directoryListing = cosmeticFolder.listFiles();
if (directoryListing == null) return;
for (File child : directoryListing) {
if (child.toString().contains(".yml") || child.toString().contains(".yaml")) {
MessagesUtil.sendDebugMessages("Scanning " + child);
// Loads file
YamlConfigurationLoader loader = YamlConfigurationLoader.builder().path(child.toPath()).build();
CommentedConfigurationNode root;
try {
root = loader.load();
} catch (ConfigurateException e) {
throw new RuntimeException(e);
try (Stream<Path> walkStream = Files.walk(cosmeticFolder.toPath())) {
walkStream.filter(p -> p.toFile().isFile()).forEach(child -> {
if (child.toString().contains(".yml") || child.toString().contains(".yaml")) {
MessagesUtil.sendDebugMessages("Scanning " + child);
// Loads file
YamlConfigurationLoader loader = YamlConfigurationLoader.builder().path(child).build();
CommentedConfigurationNode root;
try {
root = loader.load();
} catch (ConfigurateException e) {
throw new RuntimeException(e);
}
setupCosmetics(root);
}
setupCosmetics(root);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}

View File

@@ -55,7 +55,7 @@ public abstract class Data {
}
@NotNull
public final Map<CosmeticSlot, Map<Cosmetic, Color>> deserializeData(CosmeticUser user, @NotNull String raw, boolean checkpermissions) {
public final Map<CosmeticSlot, Map<Cosmetic, Color>> deserializeData(CosmeticUser user, @NotNull String raw, boolean permissionCheck) {
Map<CosmeticSlot, Map<Cosmetic, Color>> cosmetics = new HashMap<>();
String[] rawData = raw.split(",");
@@ -67,6 +67,7 @@ public abstract class Data {
MessagesUtil.sendDebugMessages("First split (suppose slot) " + splitData[0]);
if (splitData[0].equalsIgnoreCase("HIDDEN")) {
if (EnumUtils.isValidEnum(CosmeticUser.HiddenReason.class, splitData[1])) {
if (Settings.isForceShowOnJoin()) continue;
Bukkit.getScheduler().runTask(HMCCosmeticsPlugin.getInstance(), () -> {
user.hideCosmetics(CosmeticUser.HiddenReason.valueOf(splitData[1]));
});
@@ -78,7 +79,7 @@ public abstract class Data {
String[] colorSplitData = splitData[1].split("&");
if (Cosmetics.hasCosmetic(colorSplitData[0])) cosmetic = Cosmetics.getCosmetic(colorSplitData[0]);
if (slot == null || cosmetic == null) continue;
if (checkpermissions && cosmetic.requiresPermission()) {
if (permissionCheck && cosmetic.requiresPermission()) {
if (user.getPlayer() != null && !user.getPlayer().hasPermission(cosmetic.getPermission())) {
continue;
}
@@ -87,7 +88,7 @@ public abstract class Data {
} else {
if (Cosmetics.hasCosmetic(splitData[1])) cosmetic = Cosmetics.getCosmetic(splitData[1]);
if (slot == null || cosmetic == null) continue;
if (checkpermissions && cosmetic.requiresPermission()) {
if (permissionCheck && cosmetic.requiresPermission()) {
if (user.getPlayer() != null && !user.getPlayer().hasPermission(cosmetic.getPermission())) {
continue;
}

View File

@@ -11,11 +11,15 @@ import org.spongepowered.configurate.ConfigurateException;
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
import java.util.stream.Stream;
public class Menus {
@@ -66,27 +70,29 @@ public class Menus {
File cosmeticFolder = new File(HMCCosmeticsPlugin.getInstance().getDataFolder() + "/menus");
if (!cosmeticFolder.exists()) cosmeticFolder.mkdir();
File[] directoryListing = cosmeticFolder.listFiles();
if (directoryListing == null) return;
for (File child : directoryListing) {
if (child.toString().contains(".yml") || child.toString().contains(".yaml")) {
MessagesUtil.sendDebugMessages("Scanning " + child);
// Loads file
YamlConfigurationLoader loader = YamlConfigurationLoader.builder().path(child.toPath()).build();
CommentedConfigurationNode root;
try {
root = loader.load();
} catch (ConfigurateException e) {
throw new RuntimeException(e);
// Recursive file lookup
try (Stream<Path> walkStream = Files.walk(cosmeticFolder.toPath())) {
walkStream.filter(p -> p.toFile().isFile()).forEach(child -> {
if (child.toString().endsWith("yml") || child.toString().endsWith("yaml")) {
MessagesUtil.sendDebugMessages("Scanning " + child);
// Loads file
YamlConfigurationLoader loader = YamlConfigurationLoader.builder().path(child).build();
CommentedConfigurationNode root;
try {
root = loader.load();
} catch (ConfigurateException e) {
throw new RuntimeException(e);
}
try {
new Menu(FilenameUtils.removeExtension(child.getFileName().toString()), root);
} catch (Exception e) {
MessagesUtil.sendDebugMessages("Unable to create menu in " + child.getFileName().toString(), Level.WARNING);
if (Settings.isDebugEnabled()) e.printStackTrace();
}
}
try {
new Menu(FilenameUtils.removeExtension(child.getName()), root);
} catch (Exception e) {
MessagesUtil.sendDebugMessages("Unable to create menu in " + child, Level.WARNING);
if (Settings.isDebugEnabled()) e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -59,6 +59,7 @@ public class CosmeticUser {
Runnable run = () -> {
MessagesUtil.sendDebugMessages("Tick[uuid=" + uniqueId + "]", Level.INFO);
updateCosmetic();
if (getHidden()) MessagesUtil.sendActionBar(getPlayer(), "hidden-cosmetics");
};
int tickPeriod = Settings.getTickPeriod();

View File

@@ -7,6 +7,8 @@ import com.hibiscusmc.hmccosmetics.config.WardrobeLocation;
import com.hibiscusmc.hmccosmetics.config.WardrobeSettings;
import com.hibiscusmc.hmccosmetics.cosmetic.Cosmetic;
import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot;
import com.hibiscusmc.hmccosmetics.gui.Menu;
import com.hibiscusmc.hmccosmetics.gui.Menus;
import com.hibiscusmc.hmccosmetics.nms.NMSHandlers;
import com.hibiscusmc.hmccosmetics.user.CosmeticUser;
import com.hibiscusmc.hmccosmetics.util.MessagesUtil;
@@ -135,6 +137,11 @@ public class UserWardrobeManager {
target.showBossBar(bossBar);
}
if (WardrobeSettings.isEnterOpenMenu()) {
Menu menu = Menus.getDefaultMenu();
if (menu != null) menu.openMenu(user);
}
this.active = true;
update();
setWardrobeStatus(WardrobeStatus.RUNNING);

View File

@@ -4,7 +4,6 @@ import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin;
import com.hibiscusmc.hmccosmetics.config.Settings;
import com.hibiscusmc.hmccosmetics.config.WardrobeSettings;
import com.hibiscusmc.hmccosmetics.hooks.Hooks;
import com.hibiscusmc.hmccosmetics.hooks.placeholders.HMCPlaceholderExpansion;
import com.hibiscusmc.hmccosmetics.user.CosmeticUser;
import com.hibiscusmc.hmccosmetics.util.misc.Adventure;
import me.clip.placeholderapi.PlaceholderAPI;
@@ -26,14 +25,16 @@ import java.util.logging.Level;
public class MessagesUtil {
private static String prefix;
private static final HashMap<String, String> messages = new HashMap<>();
private static final HashMap<String, String> MESSAGES = new HashMap<>();
public static void setup(@NotNull ConfigurationNode config) {
MESSAGES.clear();
prefix = config.node("prefix").getString("");
for (ConfigurationNode node : config.childrenMap().values()) {
if (node.virtual()) continue;
if (node.empty()) continue;
messages.put(node.key().toString(), node.getString());
MESSAGES.put(node.key().toString(), node.getString());
}
}
@@ -43,6 +44,7 @@ public class MessagesUtil {
public static void sendMessage(Player player, String key) {
Component finalMessage = processString(player, key);
if (finalMessage == null) return;
Audience target = BukkitAudiences.create(HMCCosmeticsPlugin.getInstance()).player(player);
target.sendMessage(finalMessage);
@@ -58,6 +60,7 @@ public class MessagesUtil {
public static void sendMessage(Player player, String key, TagResolver placeholder) {
Component finalMessage = processString(player, key, placeholder);
if (finalMessage == null) return;
Audience target = BukkitAudiences.create(HMCCosmeticsPlugin.getInstance()).player(player);
target.sendMessage(finalMessage);
@@ -65,6 +68,7 @@ public class MessagesUtil {
public static void sendMessageNoKey(Player player, String message) {
Component finalMessage = processStringNoKey(player, message);
if (finalMessage == null) return;
Audience target = BukkitAudiences.create(HMCCosmeticsPlugin.getInstance()).player(player);
target.sendMessage(finalMessage);
@@ -72,6 +76,7 @@ public class MessagesUtil {
public static void sendActionBar(Player player, String key) {
Component finalMessage = processString(player, key);
if (finalMessage == null) return;
Audience target = BukkitAudiences.create(HMCCosmeticsPlugin.getInstance()).player(player);
target.sendActionBar(finalMessage);
@@ -96,9 +101,9 @@ public class MessagesUtil {
@Nullable
public static Component processString(Player player, String key, TagResolver placeholders) {
if (!messages.containsKey(key)) return null;
if (messages.get(key) == null) return null;
String message = messages.get(key);
if (!MESSAGES.containsKey(key)) return null;
if (MESSAGES.get(key) == null) return null;
String message = MESSAGES.get(key);
if (Hooks.isActiveHook("PlaceholderAPI") && player != null) message = PlaceholderAPI.setPlaceholders(player, message);
message = message.replaceAll("%prefix%", prefix);
if (placeholders != null ) {

View File

@@ -46,16 +46,6 @@ public class ServerUtils {
}
return Color.WHITE;
/* Old method
try {
return Color.fromRGB(
Integer.valueOf(colorStr.substring(1, 3), 16),
Integer.valueOf(colorStr.substring(3, 5), 16),
Integer.valueOf(colorStr.substring(5, 7), 16));
} catch (StringIndexOutOfBoundsException e) {
return null;
}
*/
}
// particle amount offsetxyz

View File

@@ -22,6 +22,7 @@ cosmetic-settings:
unapply-on-death: false # If when a player dies, their cosmetics should be unapplied. If this is true, use hmccosmetics.unapplydeath.bypass to bypass
force-permission-join: true # Checks a player permission if they can have a cosmetic when they join the server.
force-show-join: false # If the plugin should force show a player's cosmetics when they join the server.
emote-distance: -3 # This shows how far away the camera should be while a player is doing an emote. Negative is behind player.
emote-block-check: true # If the server should check if the block is open where the camera is placed (prevents players viewing through blocks)
@@ -74,6 +75,9 @@ wardrobe:
# If players in wardrobes should be able to equip any cosmetic, regardless of permission (Cosmetics they do not have access to will be removed when they leave the wardrobe)
unchecked-wardrobe-cosmetics: false
menu-options:
enter-open-menu: false # If the menu should open when a player enters a wardrobe
gamemode-options:
exit-gamemode-enabled: false # Setting this to false will set the gamemode the player came in as. True sets to exit-gamemode gamemode
exit-gamemode: "SURVIVAL" # Only activates if exit-gamemode-enabled is true, find gamemodes here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/GameMode.html

View File

@@ -1,3 +1,8 @@
#
# Messages.yml File
# If you don't wish for a message to be sent, simply make it blank.
#
prefix: "<gradient:#f368ec:#f39cef>HMCCosmetics <GRAY>»<WHITE>"
reloaded: "%prefix% <gradient:#6D9DC5:#45CDE9>Config files reloaded!"
not-enough-args: "%prefix% <red>Improper amount of arguments"
@@ -20,6 +25,7 @@ equip-cosmetic: "%prefix% <gradient:#6D9DC5:#45CDE9>You have equipped <cosmetic>
unequip-cosmetic: "%prefix% <gradient:#6D9DC5:#45CDE9>You have unequipped <cosmetic>!"
hide-cosmetic: "%prefix% <gradient:#6D9DC5:#45CDE9>Hidden cosmetics"
show-cosmetic: "%prefix% <gradient:#6D9DC5:#45CDE9>Revealed cosmetics!"
hidden-cosmetics: "%prefix% <red>Your cosmetics are hidden!"
emote-blocked: "%prefix% <red>You can not use your emote here!"
emote-none: "%prefix% <red>You have no emote equipped!"