add config and reload command

This commit is contained in:
2025-02-07 10:36:53 +07:00
parent 0a75b51ea6
commit 6a06d2e07b
4 changed files with 64 additions and 40 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>org.dmitrium12</groupId> <groupId>org.dmitrium12</groupId>
<artifactId>Sunburn</artifactId> <artifactId>Sunburn</artifactId>
<version>1.0</version> <version>1.1</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Sunburn</name> <name>Sunburn</name>
@@ -2,31 +2,44 @@ package org.dmitrium12.sunburn;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
/** /**
* Sunburn plugin main class. * Sunburn plugin main class.
*/ */
public final class Sunburn extends JavaPlugin implements Listener { public final class Sunburn
extends JavaPlugin
implements Listener, CommandExecutor {
private static final int DAYTIME_THRESHOLD = 12000; // Константа для порога дневного времени private int daytimeThreshold;
private static final int BURN_COUNTDOWN_TIME = 5; // Константа для времени ожидания сгорания private int burnCountdownTime;
String template = "Вы находитесь под солнцем! У вас есть %d секунд, чтобы спрятаться."; private int fireTicks;
private boolean sendBurnMessage;
private String burnMessage;
private final HashMap<UUID, BukkitRunnable> activeTimers = new HashMap<>(); private final HashMap<UUID, BukkitRunnable> activeTimers = new HashMap<>();
@Override @Override
public void onEnable() { public void onEnable() {
saveDefaultConfig();
loadConfigValues();
getServer().getConsoleSender().sendMessage("Sunburn plugin enabled"); getServer().getConsoleSender().sendMessage("Sunburn plugin enabled");
getServer().getPluginManager().registerEvents(this, this); getServer().getPluginManager().registerEvents(this, this);
Objects.requireNonNull(getCommand("sunburnreload")).setExecutor(this);
} }
@Override @Override
@@ -38,10 +51,21 @@ public final class Sunburn extends JavaPlugin implements Listener {
getServer().getConsoleSender().sendMessage("Sunburn plugin disabled"); getServer().getConsoleSender().sendMessage("Sunburn plugin disabled");
} }
private void loadConfigValues() {
FileConfiguration config = getConfig();
daytimeThreshold = config.getInt("daytime_threshold", 12000);
burnCountdownTime = config.getInt("burn_countdown_time", 5);
fireTicks = config.getInt("fire_ticks", 100);
sendBurnMessage = config.getBoolean("send_burn_message", true);
burnMessage = config.getString(
"burn_message",
"Вы находитесь под солнцем! У вас есть %d секунд, чтобы спрятаться."
);
}
@EventHandler @EventHandler
public void onPlayerMove(PlayerMoveEvent event) { public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
if (isPlayerExposedToSunlight(player)) { if (isPlayerExposedToSunlight(player)) {
@@ -53,25 +77,12 @@ public final class Sunburn extends JavaPlugin implements Listener {
} }
} }
/**
* Проверяет, находится ли игрок под солнцем.
*
* @param player игрок
* @return true, если игрок под солнцем, false иначе
*/
private boolean isPlayerExposedToSunlight(Player player) { private boolean isPlayerExposedToSunlight(Player player) {
boolean isDaytime = player.getWorld().getTime() % 24000 < DAYTIME_THRESHOLD; boolean isDaytime = player.getWorld().getTime() % 24000 < daytimeThreshold;
boolean isClearSky = isClearSky(player); boolean isClearSky = isClearSky(player);
return isDaytime && isClearSky; return isDaytime && isClearSky;
} }
/**
* Проверяет, есть ли над игроком открытая небесная область.
*
* @param player игрок
* @return true, если над игроком открытая небесная область, false иначе
*/
private boolean isClearSky(Player player) { private boolean isClearSky(Player player) {
for (int y = player.getLocation().getBlockY(); y < player.getWorld().getMaxHeight(); y++) { for (int y = player.getLocation().getBlockY(); y < player.getWorld().getMaxHeight(); y++) {
Block currentBlock = player.getWorld().getBlockAt( Block currentBlock = player.getWorld().getBlockAt(
@@ -89,23 +100,13 @@ public final class Sunburn extends JavaPlugin implements Listener {
return true; return true;
} }
/**
* Начинает отсчет времени сгорания для игрока.
*
* @param player игрок
*/
private void startBurnCountdown(Player player) { private void startBurnCountdown(Player player) {
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
BukkitRunnable task = new BurnCountdownTask(player, BURN_COUNTDOWN_TIME); BukkitRunnable task = new BurnCountdownTask(player, burnCountdownTime);
activeTimers.put(playerId, task); activeTimers.put(playerId, task);
task.runTaskTimer(this, 0, 20); task.runTaskTimer(this, 0, 20);
} }
/**
* Останавливает отсчет времени сгорания для игрока.
*
* @param playerId ID игрока
*/
private void stopBurnCountdown(UUID playerId) { private void stopBurnCountdown(UUID playerId) {
synchronized (activeTimers) { synchronized (activeTimers) {
if (activeTimers.containsKey(playerId)) { if (activeTimers.containsKey(playerId)) {
@@ -115,11 +116,7 @@ public final class Sunburn extends JavaPlugin implements Listener {
} }
} }
/**
* Задача для отсчета времени сгорания.
*/
private class BurnCountdownTask extends BukkitRunnable { private class BurnCountdownTask extends BukkitRunnable {
private final Player player; private final Player player;
private int timeLeft; private int timeLeft;
@@ -136,12 +133,29 @@ public final class Sunburn extends JavaPlugin implements Listener {
} }
if (timeLeft <= 0) { if (timeLeft <= 0) {
player.setFireTicks(100); player.setFireTicks(fireTicks);
} else { } else {
String text = String.format(template, timeLeft); if (sendBurnMessage) {
player.sendMessage(text); player.sendMessage(String.format(burnMessage, timeLeft));
}
timeLeft--; timeLeft--;
} }
} }
} }
@Override
public boolean onCommand(
@NotNull CommandSender sender,
Command command,
@NotNull String label,
String @NotNull [] args
) {
if (command.getName().equalsIgnoreCase("sunburnreload")) {
reloadConfig();
loadConfigValues();
sender.sendMessage("Sunburn configuration reloaded.");
return true;
}
return false;
}
} }
+5
View File
@@ -0,0 +1,5 @@
daytime_threshold: 12000
burn_countdown_time: 5
fire_ticks: 100
send_burn_message: true
burn_message: "Вы находитесь под солнцем! У вас есть %d секунд, чтобы спрятаться."
+6 -1
View File
@@ -1,6 +1,11 @@
name: Sunburn name: Sunburn
version: '1.0' version: '1.1'
main: org.dmitrium12.sunburn.Sunburn main: org.dmitrium12.sunburn.Sunburn
api-version: '1.21' api-version: '1.21'
authors: [ Dmitrium12 ] authors: [ Dmitrium12 ]
description: Поджигает игроков на солнце. description: Поджигает игроков на солнце.
commands:
sunburnreload:
description: Reloads the Sunburn plugin configuration
usage: /sunburnreload
permission: sunburn.reload