Formatting

This commit is contained in:
akastijn 2026-04-04 01:09:18 +02:00
parent 600f93c253
commit 6ff969f051
15 changed files with 177 additions and 87 deletions

View File

@ -5,10 +5,10 @@ import com.alttd.easter.config.Config;
import com.alttd.easter.config.Messages;
import com.alttd.easter.data.DataManager;
import com.alttd.easter.glow.GlowManager;
import com.alttd.easter.gui.TurnInGuiManager;
import com.alttd.easter.listeners.DeathListener;
import com.alttd.easter.listeners.SpawnListener;
import com.alttd.easter.npc.RabbitNpcManager;
import com.alttd.easter.gui.TurnInGuiManager;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
@ -53,7 +53,9 @@ public final class Easter extends JavaPlugin {
public void reloadConfigs() {
Config.reload();
Messages.reload();
if (rabbitNpcManager != null) rabbitNpcManager.reload();
if (rabbitNpcManager != null) {
rabbitNpcManager.reload();
}
}
private void registerSchedulers() {

View File

@ -1,7 +1,8 @@
package com.alttd.easter.commands;
import com.alttd.easter.Easter;
import com.alttd.easter.commands.subcommands.*;
import com.alttd.easter.commands.subcommands.Reload;
import com.alttd.easter.commands.subcommands.SetPrize;
import com.alttd.easter.config.Messages;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@ -18,7 +19,8 @@ import java.util.List;
import java.util.stream.Collectors;
@SuppressWarnings("ClassCanBeRecord")
@Slf4j @Getter
@Slf4j
@Getter
public class Command implements CommandExecutor, TabExecutor {
private final List<SubCommand> subCommands;
@ -36,7 +38,7 @@ public class Command implements CommandExecutor, TabExecutor {
subCommands = List.of(
new Reload(easter),
new SetPrize()
);
);
}
@Override
@ -50,8 +52,9 @@ public class Command implements CommandExecutor, TabExecutor {
}
SubCommand subCommand = getSubCommand(args[0]);
if (subCommand == null)
if (subCommand == null) {
return false;
}
if (!commandSender.hasPermission(subCommand.getPermission())) {
commandSender.sendRichMessage(Messages.GENERIC.NO_PERMISSION, Placeholder.parsed("permission", subCommand.getPermission()));
@ -71,17 +74,18 @@ public class Command implements CommandExecutor, TabExecutor {
if (args.length <= 1) {
res.addAll(subCommands.stream()
.filter(subCommand -> commandSender.hasPermission(subCommand.getPermission()))
.map(SubCommand::getName)
.filter(name -> args.length == 0 || name.startsWith(args[0]))
.toList()
);
.filter(subCommand -> commandSender.hasPermission(subCommand.getPermission()))
.map(SubCommand::getName)
.filter(name -> args.length == 0 || name.startsWith(args[0]))
.toList()
);
} else {
SubCommand subCommand = getSubCommand(args[0]);
if (subCommand != null && commandSender.hasPermission(subCommand.getPermission()))
if (subCommand != null && commandSender.hasPermission(subCommand.getPermission())) {
res.addAll(subCommand.getTabComplete(commandSender, args).stream()
.filter(str -> str.toLowerCase().startsWith(args[args.length - 1].toLowerCase()))
.toList());
.filter(str -> str.toLowerCase().startsWith(args[args.length - 1].toLowerCase()))
.toList());
}
}
return res;
}

View File

@ -6,7 +6,8 @@ import java.util.List;
public abstract class SubCommand {
public SubCommand() {}
public SubCommand() {
}
public abstract boolean onCommand(CommandSender commandSender, String[] args);

View File

@ -19,7 +19,8 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j @SuppressWarnings({"unused", "SameParameterValue"})
@Slf4j
@SuppressWarnings({"unused", "SameParameterValue"})
abstract class AbstractConfig {
File file;
YamlConfiguration yaml;
@ -129,8 +130,7 @@ abstract class AbstractConfig {
final ConfigurationSection section = yaml.getConfigurationSection(path);
if (section != null) {
for (String key : section.getKeys(false)) {
@SuppressWarnings("unchecked")
final T val = (T) section.get(key);
@SuppressWarnings("unchecked") final T val = (T) section.get(key);
if (val != null) {
builder.put(key, val);
}

View File

@ -9,16 +9,17 @@ import java.io.File;
import java.util.ArrayList;
import java.util.List;
@Slf4j public class Config extends AbstractConfig{
@Slf4j
public class Config extends AbstractConfig {
static Config config;
Config() {
super(
new File(File.separator
+ "mnt" + File.separator
+ "configs" + File.separator
+ "Easter"),
+ "mnt" + File.separator
+ "configs" + File.separator
+ "Easter"),
"config.yml");
}
@ -58,7 +59,9 @@ import java.util.List;
public static Location getLocation(org.bukkit.Server server) {
World world = server.getWorld(WORLD);
if (world == null) return null;
if (world == null) {
return null;
}
return new Location(world, X, Y, Z, YAW, PITCH);
}
}
@ -73,7 +76,9 @@ import java.util.List;
LIST = new ArrayList<>();
if (raw != null) {
for (Object o : raw) {
if (o instanceof ItemStack item) LIST.add(item);
if (o instanceof ItemStack item) {
LIST.add(item);
}
}
}
// ensure path exists
@ -86,7 +91,9 @@ import java.util.List;
}
public static ItemStack getRandomPrize() {
if (LIST.isEmpty()) return null;
if (LIST.isEmpty()) {
return null;
}
return LIST.get((int) (Math.random() * LIST.size())).clone();
}
}

View File

@ -8,9 +8,9 @@ public class Messages extends AbstractConfig {
Messages() {
super(
new File(File.separator
+ "mnt" + File.separator
+ "configs" + File.separator
+ "Easter"),
+ "mnt" + File.separator
+ "configs" + File.separator
+ "Easter"),
"messages.yml");
}

View File

@ -18,7 +18,10 @@ public class DataManager {
this.file = new File(plugin.getDataFolder(), "data.yml");
this.yaml = new YamlConfiguration();
if (file.exists()) {
try { yaml.load(file); } catch (Exception ignored) {}
try {
yaml.load(file);
} catch (Exception ignored) {
}
}
load();
}
@ -29,10 +32,15 @@ public class DataManager {
UUID uuid = UUID.fromString(key);
List<String> list = yaml.getStringList(key);
Set<EggType> types = list.stream().map(s -> {
try { return EggType.valueOf(s); } catch (Exception e) { return null; }
try {
return EggType.valueOf(s);
} catch (Exception e) {
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toSet());
playerEggs.put(uuid, types);
} catch (IllegalArgumentException ignored) {}
} catch (IllegalArgumentException ignored) {
}
}
}
@ -41,7 +49,10 @@ public class DataManager {
List<String> list = e.getValue().stream().map(Enum::name).toList();
yaml.set(e.getKey().toString(), list);
}
try { yaml.save(file); } catch (IOException ignored) {}
try {
yaml.save(file);
} catch (IOException ignored) {
}
}
public Set<EggType> getPlayerEggs(UUID uuid) {

View File

@ -40,7 +40,9 @@ public enum EggType {
public static EggType fromEntityType(EntityType entityType) {
for (EggType type : values()) {
if (type.entityType == entityType) return type;
if (type.entityType == entityType) {
return type;
}
}
return null;
}

View File

@ -25,28 +25,47 @@ public class GlowManager {
team.setColor(colorFor(type));
}
String entry = entity.getUniqueId().toString();
if (!team.hasEntry(entry)) team.addEntry(entry);
if (!team.hasEntry(entry)) {
team.addEntry(entry);
}
}
private ChatColor colorFor(EggType type) {
switch (type) {
case BROWN_HUSK: return ChatColor.DARK_RED; // closest
case RED_SPIDER: return ChatColor.RED;
case ORANGE_BLAZE: return ChatColor.GOLD;
case YELLOW_PIGLIN: return ChatColor.YELLOW;
case LIME_CREEPER: return ChatColor.GREEN;
case GREEN_ZOMBIE: return ChatColor.DARK_GREEN;
case LIGHT_BLUE_STRAY: return ChatColor.AQUA;
case CYAN_GUARDIAN: return ChatColor.DARK_AQUA;
case BLUE_WARDEN: return ChatColor.BLUE;
case PURPLE_ENDER_DRAGON: return ChatColor.DARK_PURPLE;
case MAGENTA_ENDERMAN: return ChatColor.LIGHT_PURPLE;
case PINK_HOGLIN: return ChatColor.LIGHT_PURPLE;
case WHITE_SKELETON: return ChatColor.WHITE;
case LIGHT_GRAY_SILVERFISH: return ChatColor.GRAY;
case GRAY_WITHER: return ChatColor.DARK_GRAY;
case BLACK_WITHER_SKELETON: return ChatColor.BLACK;
default: return ChatColor.WHITE;
case BROWN_HUSK:
return ChatColor.DARK_RED; // closest
case RED_SPIDER:
return ChatColor.RED;
case ORANGE_BLAZE:
return ChatColor.GOLD;
case YELLOW_PIGLIN:
return ChatColor.YELLOW;
case LIME_CREEPER:
return ChatColor.GREEN;
case GREEN_ZOMBIE:
return ChatColor.DARK_GREEN;
case LIGHT_BLUE_STRAY:
return ChatColor.AQUA;
case CYAN_GUARDIAN:
return ChatColor.DARK_AQUA;
case BLUE_WARDEN:
return ChatColor.BLUE;
case PURPLE_ENDER_DRAGON:
return ChatColor.DARK_PURPLE;
case MAGENTA_ENDERMAN:
return ChatColor.LIGHT_PURPLE;
case PINK_HOGLIN:
return ChatColor.LIGHT_PURPLE;
case WHITE_SKELETON:
return ChatColor.WHITE;
case LIGHT_GRAY_SILVERFISH:
return ChatColor.GRAY;
case GRAY_WITHER:
return ChatColor.DARK_GRAY;
case BLACK_WITHER_SKELETON:
return ChatColor.BLACK;
default:
return ChatColor.WHITE;
}
}
}

View File

@ -28,7 +28,9 @@ public class TurnInGuiManager implements Listener {
// crude strip of minimessage tags for inventory title
String mm = Messages.RABBIT.GUI_TITLE;
String plain = mm.replaceAll("<[^>]+>", "");
if (plain.isBlank()) plain = "Turn in Eggs";
if (plain.isBlank()) {
plain = "Turn in Eggs";
}
return plain;
}
@ -40,10 +42,16 @@ public class TurnInGuiManager implements Listener {
@EventHandler
public void onClick(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player player)) return;
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
Inventory top = openInventories.get(player.getUniqueId());
if (top == null) return;
if (!event.getView().getTopInventory().equals(top)) return;
if (top == null) {
return;
}
if (!event.getView().getTopInventory().equals(top)) {
return;
}
// If clicking in player inventory with shift-click, prevent moving non-egg items into GUI
if (event.isShiftClick() && event.getClickedInventory() != null && event.getClickedInventory().equals(player.getInventory())) {
@ -68,14 +76,20 @@ public class TurnInGuiManager implements Listener {
public void onClose(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
Inventory top = openInventories.remove(player.getUniqueId());
if (top == null) return;
if (!event.getInventory().equals(top)) return;
if (top == null) {
return;
}
if (!event.getInventory().equals(top)) {
return;
}
// collect egg items and clear them from the GUI so they don't drop
Set<EggType> submitted = new HashSet<>();
for (ItemStack item : top.getContents()) {
if (ItemUtils.isEggItem(item)) {
EggType type = ItemUtils.getEggType(item);
if (type != null) submitted.add(type);
if (type != null) {
submitted.add(type);
}
}
}
top.clear();
@ -90,24 +104,26 @@ public class TurnInGuiManager implements Listener {
List<String> colors = submitted.stream().map(ItemUtils::colorName).toList();
if (colors.size() == 1) {
player.sendRichMessage(Messages.RABBIT.ONE_EGG,
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("player", player.getName()),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg1", colors.getFirst())
);
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("player", player.getName()),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg1", colors.getFirst())
);
} else {
String c1 = !colors.isEmpty() ? colors.get(0) : "";
String c2 = colors.size() > 1 ? colors.get(1) : "";
String c3 = colors.size() > 2 ? colors.get(2) : "";
player.sendRichMessage(Messages.RABBIT.MULTI_EGGS,
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("player", player.getName()),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg1", c1),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg2", c2),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg3", c3)
);
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("player", player.getName()),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg1", c1),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg2", c2),
net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("egg3", c3)
);
}
int total = dataManager.getPlayerEggs(player.getUniqueId()).size();
if (total % 4 == 0) {
var prize = com.alttd.easter.config.Config.PRIZES.getRandomPrize();
if (prize != null) player.getInventory().addItem(prize);
if (prize != null) {
player.getInventory().addItem(prize);
}
player.sendRichMessage(Messages.RABBIT.REWARD);
}
}

View File

@ -26,13 +26,21 @@ public class SpawnListener implements Listener {
@EventHandler
public void onNaturalSpawn(CreatureSpawnEvent event) {
if (event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.NATURAL) return;
if (!(event.getEntity() instanceof Creature creature)) return;
if (event.getSpawnReason() != CreatureSpawnEvent.SpawnReason.NATURAL) {
return;
}
if (!(event.getEntity() instanceof Creature creature)) {
return;
}
EntityType type = event.getEntityType();
EggType eggType = EggType.fromEntityType(type);
if (eggType == null) return;
if (eggType == null) {
return;
}
double chance = Config.EGGS.SPAWN_CHANCE;
if (ThreadLocalRandom.current().nextDouble() >= chance) return;
if (ThreadLocalRandom.current().nextDouble() >= chance) {
return;
}
ItemStack eggItem = ItemUtils.createEggItem(eggType);
EntityEquipment equipment = creature.getEquipment();

View File

@ -16,7 +16,7 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.plugin.Plugin;
import java.util.*;
import java.util.UUID;
@SuppressWarnings("ClassCanBeRecord")
public class RabbitNpcManager implements Listener {
@ -46,17 +46,21 @@ public class RabbitNpcManager implements Listener {
}
}
var loc = Config.RABBIT.getLocation(plugin.getServer());
if (loc == null) return;
if (loc == null) {
return;
}
Rabbit rabbit = (Rabbit) loc.getWorld().spawnEntity(loc, EntityType.RABBIT);
rabbit.setCustomNameVisible(true);
rabbit.customName(net.kyori.adventure.text.Component.text("Easter Bunny"));
rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte)1);
rabbit.getPersistentDataContainer().set(Keys.RABBIT_NPC, PersistentDataType.BYTE, (byte) 1);
rabbitId = rabbit.getUniqueId();
}
@EventHandler
public void onInteract(PlayerInteractAtEntityEvent event) {
if (!(event.getRightClicked() instanceof Rabbit) && !(event.getRightClicked() instanceof org.bukkit.entity.LivingEntity le && le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE))) return;
if (!(event.getRightClicked() instanceof Rabbit) && !(event.getRightClicked() instanceof org.bukkit.entity.LivingEntity le && le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE))) {
return;
}
event.setCancelled(true);
Player player = event.getPlayer();
// Right click -> open GUI
@ -65,13 +69,19 @@ public class RabbitNpcManager implements Listener {
@EventHandler
public void onLeftClick(EntityDamageByEntityEvent event) {
if (!(event.getEntity() instanceof org.bukkit.entity.LivingEntity le)) return;
if (!le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) return;
if (!(event.getDamager() instanceof Player player)) return;
if (!(event.getEntity() instanceof org.bukkit.entity.LivingEntity le)) {
return;
}
if (!le.getPersistentDataContainer().has(Keys.RABBIT_NPC, PersistentDataType.BYTE)) {
return;
}
if (!(event.getDamager() instanceof Player player)) {
return;
}
event.setCancelled(true);
player.sendRichMessage(Messages.RABBIT.LEFT_CLICK_INTRO,
Placeholder.parsed("player", player.getName())
);
Placeholder.parsed("player", player.getName())
);
}
private void openTurnIn(Player player) {

View File

@ -45,14 +45,20 @@ public final class ItemUtils {
}
public static boolean isEggItem(ItemStack item) {
if (item == null) return false;
if (item == null) {
return false;
}
ItemMeta meta = item.getItemMeta();
if (meta == null) return false;
if (meta == null) {
return false;
}
return meta.getPersistentDataContainer().has(Keys.EGG_ITEM, PersistentDataType.STRING);
}
public static EggType getEggType(ItemStack item) {
if (!isEggItem(item)) return null;
if (!isEggItem(item)) {
return null;
}
String name = item.getItemMeta().getPersistentDataContainer().get(Keys.EGG_ITEM, PersistentDataType.STRING);
try {
return name == null ? null : EggType.valueOf(name);
@ -65,11 +71,14 @@ public final class ItemUtils {
String[] parts = name.toLowerCase().split("_");
List<String> out = new ArrayList<>();
for (String p : parts) {
if (p.isEmpty()) continue;
if (p.isEmpty()) {
continue;
}
out.add(Character.toUpperCase(p.charAt(0)) + p.substring(1));
}
return String.join(" ", out);
}
private ItemUtils() {}
private ItemUtils() {
}
}

View File

@ -8,5 +8,6 @@ public final class Keys {
public static final NamespacedKey EGG_ENTITY = new NamespacedKey(Easter.getPlugin(Easter.class), "egg-entity");
public static final NamespacedKey RABBIT_NPC = new NamespacedKey(Easter.getPlugin(Easter.class), "rabbit-npc");
private Keys() {}
private Keys() {
}
}

View File

@ -8,7 +8,7 @@ commands:
easter:
description: Easter main command
usage: /<command>
aliases: [easter]
aliases: [ easter ]
permission: playerutils.use
permissions:
easter.reload: