|
|
@@ -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;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|