diff --git a/pom.xml b/pom.xml index 1354717..39ca6ee 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ JouTakTemplate - 1.8 + 11 UTF-8 diff --git a/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java b/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java index ec00d71..da2fa8a 100644 --- a/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java +++ b/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java @@ -3,22 +3,34 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.bukkit.plugin.java.JavaPlugin; +import org.joutak.joutaktemplate.commands.PlayerTimeCommand; +import org.joutak.joutaktemplate.events.PlayerJoinListener; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.UUID; @Slf4j +@Getter public final class JouTakTemplate extends JavaPlugin { @Getter private static JouTakTemplate instance; + // Хранение времени входа игроков + private final HashMap playerJoinTimes = new HashMap<>(); + @Override public void onEnable() { - + instance = this; + getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); + getCommand("playertime").setExecutor(new PlayerTimeCommand()); + log.info("JouTakTemplate плагин запущен!"); } @Override public void onDisable() { - // Plugin shutdown logic + log.info("JouTakTemplate плагин отключен."); } } diff --git a/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java b/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java new file mode 100644 index 0000000..02a929c --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java @@ -0,0 +1,50 @@ +package org.joutak.joutaktemplate.commands; + +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; + +import static org.joutak.joutaktemplate.utils.MessageUtils.createTextMessage; +import static org.joutak.joutaktemplate.utils.TimeUtils.getTimeInfo; + +public class PlayerTimeCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + + if (sender instanceof Player) { + if (args.length > 0) { + sender.sendMessage(createTextMessage("Ошибка! Команда используется без аргументов", NamedTextColor.RED)); + sender.sendMessage(createTextMessage("Используйте: /playertime", NamedTextColor.YELLOW)); + return true; + } + + Player player = (Player) sender; + sender.sendMessage(getTimeInfo(player)); + return true; + } + + if (sender instanceof ConsoleCommandSender) { + if (args.length != 1) { + sender.sendMessage(createTextMessage("Использование: /playertime <ник_игрока>", NamedTextColor.RED)); + return true; + } + + Player target = Bukkit.getPlayerExact(args[0]); + if (target == null) { + sender.sendMessage(createTextMessage("Ошибка! Игрок " + args[0] + " не найден или не в сети.", NamedTextColor.RED)); + return true; + } + + sender.sendMessage(getTimeInfo(target)); + return true; + } + + return false; + } + +} \ No newline at end of file diff --git a/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java b/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java new file mode 100644 index 0000000..8200605 --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java @@ -0,0 +1,42 @@ +package org.joutak.joutaktemplate.events; + +import lombok.extern.slf4j.Slf4j; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; +import org.joutak.joutaktemplate.JouTakTemplate; +import org.joutak.joutaktemplate.utils.TimeUtils; + +import java.time.LocalDateTime; +import java.util.UUID; + +import static org.joutak.joutaktemplate.utils.MessageUtils.createTextMessage; + +@Slf4j +public class PlayerJoinListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + UUID playerUUID = event.getPlayer().getUniqueId(); + LocalDateTime joinTime = LocalDateTime.now(); + JouTakTemplate.getInstance().getPlayerJoinTimes().put(playerUUID, joinTime); + + String formattedTime = TimeUtils.formatTime(joinTime); + + log.info("Игрок {} зашел на сервер в {}", event.getPlayer().getName(), formattedTime); + + event.getPlayer().getWorld().spawnParticle(Particle.FIREWORKS_SPARK, event.getPlayer().getLocation(), 30, 0.5, 1, 0.5); + event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1f, 1f); + + ItemStack reward = new ItemStack(Material.GOLDEN_APPLE, 1); + event.getPlayer().getInventory().addItem(reward); + + event.getPlayer().sendMessage(createTextMessage("Вы получили бонус за вход: 1 Золотое яблоко!", NamedTextColor.BLUE)); + event.getPlayer().sendMessage(createTextMessage("Вы зашли на сервер в " + formattedTime, NamedTextColor.GREEN)); + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java b/src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java new file mode 100644 index 0000000..e25f6ed --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java @@ -0,0 +1,10 @@ +package org.joutak.joutaktemplate.utils; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +public class MessageUtils { + public static Component createTextMessage(String message, NamedTextColor color) { + return Component.text(message, color); + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java b/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java new file mode 100644 index 0000000..50a947c --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java @@ -0,0 +1,48 @@ +package org.joutak.joutaktemplate.utils; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.joutak.joutaktemplate.JouTakTemplate; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +import static org.joutak.joutaktemplate.utils.MessageUtils.createTextMessage; + +public class TimeUtils { + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static String formatTime(LocalDateTime time) { + return time.format(FORMATTER); + } + + public static Component getTimeInfo(Player target) { + UUID playerUUID = target.getUniqueId(); + LocalDateTime joinTime = JouTakTemplate.getInstance().getPlayerJoinTimes().get(playerUUID); + + if (joinTime == null) { + return createTextMessage("Нет данных о входе игрока " + target.getName(), NamedTextColor.RED); + } + + LocalDateTime currentTime = LocalDateTime.now(); + Duration duration = Duration.between(joinTime, currentTime); + long minutes = duration.toMinutes(); + long seconds = duration.toSecondsPart(); + + return formatTimeMessage(target.getName(), currentTime, joinTime, minutes, seconds); + } + + private static Component formatTimeMessage(String playerName, LocalDateTime currentTime, LocalDateTime joinTime, long minutes, long seconds) { + return createTextMessage("Текущее серверное время: ", NamedTextColor.GREEN) + .append(createTextMessage(TimeUtils.formatTime(currentTime), NamedTextColor.YELLOW)) + .append(Component.newline()) + .append(createTextMessage("Время входа игрока " + playerName + ": ", NamedTextColor.GREEN)) + .append(createTextMessage(TimeUtils.formatTime(joinTime), NamedTextColor.YELLOW)) + .append(Component.newline()) + .append(createTextMessage("Разница с текущим временем: ", NamedTextColor.GREEN)) + .append(createTextMessage(minutes + " мин " + seconds + " сек", NamedTextColor.YELLOW)); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index bb6c591..6ecfc40 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,4 +3,6 @@ version: '${project.version}' main: org.joutak.joutaktemplate.JouTakTemplate api-version: '1.20' commands: - joutest: {} + playertime: + description: Показывает время входа и разницу + usage: /playertime \ No newline at end of file