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