some fixes

This commit is contained in:
2025-12-09 22:52:23 +03:00
parent 7ad7b94976
commit 0d859cec54
9 changed files with 95 additions and 86 deletions

13
.idea/workspace.xml generated
View File

@@ -5,21 +5,14 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="46146984-f46a-4efa-a29f-c0632c66dbea" name="Changes" comment=""> <list default="true" id="46146984-f46a-4efa-a29f-c0632c66dbea" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.gradle/buildOutputCleanup/buildOutputCleanup.lock" beforeDir="false" afterPath="$PROJECT_DIR$/.gradle/buildOutputCleanup/buildOutputCleanup.lock" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/deploy.sh" beforeDir="false" afterPath="$PROJECT_DIR$/deploy.sh" afterDir="false" /> <change beforePath="$PROJECT_DIR$/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/BlockAndSeek.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/BlockAndSeek.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/items/FreezeItem.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/items/FreezeItem.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/BlocksGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/BlocksGenerator.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/Config.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/Config.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/CommandManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/CommandManager.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/CommandManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/CommandManager.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/MapsManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/MapsManager.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/PropManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/PropManager.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/TranslationManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/TranslationManager.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/TranslationManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/managers/TranslationManager.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/menus/GamesMenu.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/menus/GamesMenu.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/menus/MapsMenu.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/menus/MapsMenu.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/BlockAndSeekGame.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/BlockAndSeekGame.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/BlockAndSeekGame.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/BlockAndSeekGame.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/LazyLocation.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/LazyLocation.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/LazyLocation.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/LazyLocation.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/PropBlock.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/PropBlock.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/Rarity.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/Rarity.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/TranslationKey.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/TranslationKey.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/TranslationKey.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/hdvtdev/blockandseek/objects/TranslationKey.java" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />

View File

@@ -41,6 +41,7 @@ dependencies {
implementation "eu.okaeri:okaeri-configs-serdes-commons:$okaeriConfigsVersion" implementation "eu.okaeri:okaeri-configs-serdes-commons:$okaeriConfigsVersion"
implementation "org.incendo:cloud-paper:2.0.0-beta.13" implementation "org.incendo:cloud-paper:2.0.0-beta.13"
implementation "org.incendo:cloud-annotations:2.0.0"
} }

View File

@@ -23,7 +23,7 @@ public class FreezeItem extends BlockAndSeekItem {
@Override @Override
protected void onInteract(@NotNull PlayerInteractEvent event) { protected void onInteract(@NotNull PlayerInteractEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
player.sendActionBar(Component.text(PropManager.freezeOrUnfreeze(player).toString())); player.sendMessage(TranslationKey.valueOf(PropManager.freezeOrUnfreeze(player).name()).translate(player));
} }
@Override @Override

View File

@@ -5,11 +5,13 @@ import hdvtdev.blockandseek.BlocksGenerator;
import hdvtdev.blockandseek.Config; import hdvtdev.blockandseek.Config;
import hdvtdev.blockandseek.GlowUtil; import hdvtdev.blockandseek.GlowUtil;
import hdvtdev.blockandseek.objects.BlockAndSeekGame; import hdvtdev.blockandseek.objects.BlockAndSeekGame;
import hdvtdev.blockandseek.objects.BlockAndSeekMap;
import hdvtdev.blockandseek.objects.Items; import hdvtdev.blockandseek.objects.Items;
import hdvtdev.blockandseek.objects.TranslationKey; import hdvtdev.blockandseek.objects.TranslationKey;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.MiscDisguise; import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@@ -21,7 +23,11 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.util.RayTraceResult; import org.bukkit.util.RayTraceResult;
import org.incendo.cloud.Command;
import org.incendo.cloud.annotations.AnnotationParser;
import org.incendo.cloud.annotations.Argument;
import org.incendo.cloud.annotations.Command;
import org.incendo.cloud.annotations.Permission;
import org.incendo.cloud.bukkit.CloudBukkitCapabilities; import org.incendo.cloud.bukkit.CloudBukkitCapabilities;
import org.incendo.cloud.bukkit.parser.location.LocationParser; import org.incendo.cloud.bukkit.parser.location.LocationParser;
import org.incendo.cloud.execution.ExecutionCoordinator; import org.incendo.cloud.execution.ExecutionCoordinator;
@@ -33,10 +39,15 @@ import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Stream; import java.util.stream.Stream;
import static java.util.Map.entry;
public final class CommandManager { public final class CommandManager {
private static final LegacyPaperCommandManager<CommandSender> commandManager; private static final LegacyPaperCommandManager<CommandSender> commandManager;
private static final String perm = "blockandseek.manage"; private static final AnnotationParser<CommandSender> annotationParser;
private static final String PERM = "blockandseek.manage";
private static final String CMD = "blockandseek|bs";
static { static {
commandManager = LegacyPaperCommandManager.createNative( commandManager = LegacyPaperCommandManager.createNative(
@@ -54,62 +65,54 @@ public final class CommandManager {
} catch (IllegalStateException ignored) { } catch (IllegalStateException ignored) {
} }
} }
annotationParser = new AnnotationParser<>(
commandManager,
CommandSender.class
);
} }
@Command(CMD + " create map <name>")
@Permission(PERM)
public void createMap(CommandSender sender, @Argument("name") String mapName) {
if (MapsManager.hasMap(mapName)) {
sender.sendMessage(TranslationKey.MAP_EXIST.translate(sender, entry("%map%", mapName)));
} else {
MapsManager.addMap(mapName);
sender.sendMessage(TranslationKey.MAP_CREATED.translate(sender, entry("%map%", mapName)));
}
}
public enum ToReload {
CONFIG,
MAPS,
LANGUAGES
}
@Command(CMD + " reload [toReload]")
public void reload(CommandSender commandSender, @Argument("toReload") ToReload toReload) {
Component msg = switch (toReload) {
case CONFIG -> null;
case MAPS -> null;
case LANGUAGES -> null;
case null -> null;
};
}
@Deprecated(forRemoval = true)
public static void registerCommands() { public static void registerCommands() {
var root = commandManager.commandBuilder("blockandseek", "bs"); var root = commandManager.commandBuilder("blockandseek", "bs");
if (Config.debugEnabled()) testCommands(root); if (Config.debugEnabled()) testCommands(root);
commandManager.command(
root
.literal("generateBlocks")
.required("worldName", StringParser.stringParser(), MapsManager.mapSuggestions)
.handler(ctx -> {
BlocksGenerator.applyBlocks(ctx.get("worldName"));
})
);
commandManager.command(
root
.literal("newMap")
.required("worldName", StringParser.stringParser(), MapsManager.worldSuggestions)
.handler(ctx -> {
MapsManager.addMap(ctx.get("worldName"));
})
);
commandManager.command(
root
.literal("newwwwGame")
.required("worldName", StringParser.stringParser(), MapsManager.mapSuggestions)
.handler(ctx -> {
GamesManager.createGame(ctx.get("worldName"));
})
);
var partyBase = root.literal("party");
var reloadBase = root.literal("reload").permission(perm); //all, config, langs, maps
var createBase = root.literal("create"); //party, map, game
var mapBase = root.literal("map").permission(perm); //name <set action> <val>
var editMapBase = mapBase.literal("set");
commandManager.command(
createBase
.literal("map")
.required("worldName", StringParser.stringParser(), MapsManager.worldSuggestions)
.handler(ctx -> {
MapsManager.addMap(ctx.get("worldName"));
})
);

View File

@@ -21,7 +21,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class PropManager { public class PropManager {
@@ -89,7 +88,7 @@ public class PropManager {
Location blockLocation = block.getLocation(); Location blockLocation = block.getLocation();
if (props.containsKey(blockLocation)) { if (props.containsKey(blockLocation)) {
return PropState.FAILED; return PropState.FREEZE_FAILED;
} }
Location centerLocation = blockLocation.toCenterLocation(); Location centerLocation = blockLocation.toCenterLocation();
@@ -125,7 +124,7 @@ public class PropManager {
return PropState.FROZEN; return PropState.FROZEN;
} }
} }
return PropState.FAILED; return PropState.FREEZE_FAILED;
} }
private static final BlockFace[] rotationOrder = { private static final BlockFace[] rotationOrder = {
@@ -185,7 +184,7 @@ public class PropManager {
public enum PropState { public enum PropState {
FROZEN, UNFROZEN, FAILED FROZEN, UNFROZEN, FREEZE_FAILED
} }
private record PropData(ArmorStand armorStand, BlockData blockData, Location propLocation) { private record PropData(ArmorStand armorStand, BlockData blockData, Location propLocation) {

View File

@@ -25,12 +25,12 @@ public final class TranslationManager {
private TranslationManager() { private TranslationManager() {
} }
private static final String defaultLanguage = "en_US"; public static final String defaultLanguage = "en_US";
public static final MiniMessage mm = MiniMessage.miniMessage(); public static final MiniMessage mm = MiniMessage.miniMessage();
public static final PlainTextComponentSerializer plaintText = PlainTextComponentSerializer.plainText(); public static final PlainTextComponentSerializer plaintText = PlainTextComponentSerializer.plainText();
public static final Component prefix = mm.deserialize("<gradient:#FFAA00:#FFD700><bold>BlockAndSeek</bold></gradient> <dark_gray>»</dark_gray>"); private static final Component prefix = mm.deserialize("<gradient:#FFAA00:#FFD700><bold>BlockAndSeek</bold></gradient> ");
public static final Component bracedPrefix = mm.deserialize("<gradient:#FFAA00:#FFD700><bold>[BlockAndSeek]</bold></gradient>"); private static final Component bracedPrefix = mm.deserialize("<gradient:#FFAA00:#FFD700><bold>[BlockAndSeek]</bold></gradient> ");
private static final Map<String, EnumMap<TranslationKey, String>> translations = new HashMap<>(); private static final Map<String, EnumMap<TranslationKey, String>> translations = new HashMap<>();
@@ -39,6 +39,18 @@ public final class TranslationManager {
return get(player.locale().toString(), key, placeholders); return get(player.locale().toString(), key, placeholders);
} }
@SafeVarargs
public static Component get(Player player, TranslationKey key, boolean useBracedPrefix, @NotNull Map.Entry<String, String>... placeholders) {
Component pref = useBracedPrefix ? bracedPrefix : prefix;
return pref.append(get(player.locale().toString(), key, placeholders));
}
@SafeVarargs
public static Component get(TranslationKey key, boolean useBracedPrefix, @NotNull Map.Entry<String, String>... placeholders) {
Component pref = useBracedPrefix ? bracedPrefix : prefix;
return pref.append(get(defaultLanguage, key, placeholders));
}
@SafeVarargs @SafeVarargs
public static Component get(TranslationKey key, @NotNull Map.Entry<String, String>... placeholders) { public static Component get(TranslationKey key, @NotNull Map.Entry<String, String>... placeholders) {
return get(defaultLanguage, key, placeholders); return get(defaultLanguage, key, placeholders);
@@ -102,11 +114,10 @@ public final class TranslationManager {
break; break;
} }
// Обработка экранирования \%
if (start > cursor && text.charAt(start - 1) == '\\') { if (start > cursor && text.charAt(start - 1) == '\\') {
sb.append(text, cursor, start - 1); // Добавляем всё до слэша sb.append(text, cursor, start - 1);
sb.append('%'); // Добавляем сам процент sb.append('%');
cursor = start + 1; // Сдвигаем курсор за процент cursor = start + 1;
continue; continue;
} }

View File

@@ -109,26 +109,13 @@ public class BlockAndSeekGame {
this.cancel(); this.cancel();
} }
// Проходим по всем игрокам на сервере
for (UUID uuid : stateManager.getPlayersInState(PlayerType.PROP)) { for (UUID uuid : stateManager.getPlayersInState(PlayerType.PROP)) {
// 2. Проверяем, находится ли игрок в воде
// Метод .isInWater() доступен в новых версиях (1.13+).
// Для старых версий используйте проверку блока (см. ниже).
Player player = Bukkit.getPlayer(uuid); Player player = Bukkit.getPlayer(uuid);
if (player == null) continue; if (player == null) continue;
if (player.isInWater()) { if (player.isInWater()) {
// 3. Наносим урон
// 1.0 = половина сердца. 2.0 = полное сердце.
player.damage(0.5); player.damage(0.5);
// Опционально: можно проиграть звук или эффект
player.playSound(player.getLocation(), Sound.BLOCK_SCULK_SHRIEKER_SHRIEK, 1f, 1f); player.playSound(player.getLocation(), Sound.BLOCK_SCULK_SHRIEKER_SHRIEK, 1f, 1f);
} }
} }
@@ -245,6 +232,7 @@ public class BlockAndSeekGame {
for (UUID uuid : stateManager.getPlayersInState(PlayerType.PROP)) { for (UUID uuid : stateManager.getPlayersInState(PlayerType.PROP)) {
Player player = Bukkit.getPlayer(uuid); Player player = Bukkit.getPlayer(uuid);
if (player != null) { if (player != null) {
PropManager.forceUnfreeze(uuid);
new RouletteCreator(player, map.getBlocks()); new RouletteCreator(player, map.getBlocks());
} }
} }
@@ -267,6 +255,7 @@ public class BlockAndSeekGame {
@Override @Override
public void onEnable() { public void onEnable() {
sendToAll(TranslationKey.GAME_STARTED);
Plugin instance = BlockAndSeek.getInstance(); Plugin instance = BlockAndSeek.getInstance();
instance.getServer().getPluginManager().registerEvents(this, instance); instance.getServer().getPluginManager().registerEvents(this, instance);
selectSeekers(1 + (stateManager.playerCount() / 7)); selectSeekers(1 + (stateManager.playerCount() / 7));

View File

@@ -14,6 +14,8 @@ import lombok.Setter;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.concurrent.ThreadLocalRandom;
@Setter @Setter
public class LazyLocation extends OkaeriConfig { public class LazyLocation extends OkaeriConfig {
@@ -58,8 +60,9 @@ public class LazyLocation extends OkaeriConfig {
if (loc.getWorld() != null) { if (loc.getWorld() != null) {
ll.worldName = loc.getWorld().getName(); ll.worldName = loc.getWorld().getName();
} else { } else {
BlockAndSeek.getPluginLogger().severe("World in location is null! Using default placeholder BlockAndSeekWorld!"); String id = "BlockAndSeekWorld" + ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE);
ll.worldName = "BlockAndSeekWorld"; BlockAndSeek.getPluginLogger().severe("World in location is null! Using default placeholder " + id);
ll.worldName = id;
} }
ll.x = loc.getX(); ll.x = loc.getX();
ll.y = loc.getY(); ll.y = loc.getY();

View File

@@ -2,6 +2,7 @@ package hdvtdev.blockandseek.objects;
import hdvtdev.blockandseek.managers.TranslationManager; import hdvtdev.blockandseek.managers.TranslationManager;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.Map; import java.util.Map;
@@ -58,6 +59,9 @@ public enum TranslationKey {
SUPER_ITEM_SPAWNED, SUPER_ITEM_SPAWNED,
BLOCK_SWAP, BLOCK_SWAP,
BLOCK_SWAPPING, BLOCK_SWAPPING,
FROZEN,
UNFROZEN,
FREEZE_FAILED,
// Items // Items
FREEZE_ITEM, FREEZE_ITEM,
@@ -67,7 +71,8 @@ public enum TranslationKey {
GAME_START_ITEM, GAME_START_ITEM,
DASH_ITEM, DASH_ITEM,
MORPH_ITEM, MORPH_ITEM,
PISTOL, GRENADE, PISTOL,
GRENADE,
DECOY, DECOY,
DEATH_BELT, DEATH_BELT,
ANTI_GRAVITY; ANTI_GRAVITY;
@@ -77,5 +82,10 @@ public enum TranslationKey {
return TranslationManager.get(player, this, placeholders); return TranslationManager.get(player, this, placeholders);
} }
@SafeVarargs
public final Component translate(CommandSender sender, Map.Entry<String, String>... placeholders) {
return TranslationManager.get(sender instanceof Player player ? player.locale().toString() : TranslationManager.defaultLanguage, this, placeholders);
}
} }