Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<name>JouTakTemplate</name>

<properties>
<java.version>1.8</java.version>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Expand Down
16 changes: 14 additions & 2 deletions src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<UUID, LocalDateTime> 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 плагин отключен.");
}

}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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));
}
}
10 changes: 10 additions & 0 deletions src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
48 changes: 48 additions & 0 deletions src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java
Original file line number Diff line number Diff line change
@@ -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));
}
}
4 changes: 3 additions & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ version: '${project.version}'
main: org.joutak.joutaktemplate.JouTakTemplate
api-version: '1.20'
commands:
joutest: {}
playertime:
description: Показывает время входа и разницу
usage: /playertime