some fixes
This commit is contained in:
Binary file not shown.
17
.idea/workspace.xml
generated
17
.idea/workspace.xml
generated
@@ -5,8 +5,22 @@
|
|||||||
</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$/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/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/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/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/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" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -50,6 +64,9 @@
|
|||||||
<component name="Git.Settings">
|
<component name="Git.Settings">
|
||||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
</component>
|
</component>
|
||||||
|
<component name="ProblemsViewState">
|
||||||
|
<option name="selectedTabId" value="CurrentFile" />
|
||||||
|
</component>
|
||||||
<component name="ProjectColorInfo">{
|
<component name="ProjectColorInfo">{
|
||||||
"customColor": "",
|
"customColor": "",
|
||||||
"associatedIndex": 0
|
"associatedIndex": 0
|
||||||
|
|||||||
2
deploy.sh
Normal file → Executable file
2
deploy.sh
Normal file → Executable file
@@ -1,3 +1,3 @@
|
|||||||
#!/usr/bin/bash
|
#!/usr/bin/bash
|
||||||
gradle deploy
|
gradle deploy
|
||||||
scp -P 8841 Documents/minecraft/Pufferfish/1.21.8/plugins/BlockAndSeek-0.0.1-a.jar hdvt@sasha.hdvtdev.tech:~/pryatki/1.21.8/plugins
|
scp -P 8841 ~/Documents/minecraft/Pufferfish/1.21.8/plugins/BlockAndSeek-0.0.1-a.jar hdvt@sasha.hdvtdev.tech:~/pryatki/1.21.8/plugins
|
||||||
@@ -135,11 +135,7 @@ public class BlockAndSeek extends JavaPlugin {
|
|||||||
|
|
||||||
TranslationManager.loadLanguages();
|
TranslationManager.loadLanguages();
|
||||||
MapsManager.loadMaps();
|
MapsManager.loadMaps();
|
||||||
|
CommandManager.registerCommands();
|
||||||
|
|
||||||
|
|
||||||
CommandManager.registerCommands("blockandseek");
|
|
||||||
CommandManager.registerCommands("bs");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
getLogger().severe("Cloud err: " + e.getMessage());
|
getLogger().severe("Cloud err: " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package hdvtdev.blockandseek;
|
package hdvtdev.blockandseek;
|
||||||
|
|
||||||
|
import hdvtdev.blockandseek.managers.MapsManager;
|
||||||
import hdvtdev.blockandseek.objects.PropBlock;
|
import hdvtdev.blockandseek.objects.PropBlock;
|
||||||
|
import hdvtdev.blockandseek.objects.Rarity;
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.block.Banner;
|
import org.bukkit.block.Banner;
|
||||||
import org.bukkit.block.Comparator;
|
import org.bukkit.block.Comparator;
|
||||||
@@ -8,6 +10,7 @@ import org.bukkit.block.data.*;
|
|||||||
import org.bukkit.block.data.type.Observer;
|
import org.bukkit.block.data.type.Observer;
|
||||||
import org.bukkit.block.data.type.Piston;
|
import org.bukkit.block.data.type.Piston;
|
||||||
import org.bukkit.block.data.type.RedstoneWire;
|
import org.bukkit.block.data.type.RedstoneWire;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
@@ -177,6 +180,50 @@ public class BlocksGenerator {
|
|||||||
return type.isSolid();
|
return type.isSolid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void applyBlocks(String mapName) {
|
||||||
|
var map = MapsManager.getMap(mapName);
|
||||||
|
getSortedBlockStats(map.getSpawn().getLocation(), 16, list -> {
|
||||||
|
|
||||||
|
|
||||||
|
// 1. Находим экстремумы (минимум и максимум кол-ва предметов)
|
||||||
|
long minCount = list.stream().mapToLong(Map.Entry::getValue).min().orElse(0);
|
||||||
|
long maxCount = list.stream().mapToLong(Map.Entry::getValue).max().orElse(0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 2. Находим "Центр" (Median Point)
|
||||||
|
// Все, что близко к этому числу -> COMMON. Все, что далеко -> LEGENDARY.
|
||||||
|
double midPoint = (minCount + maxCount) / 2.0;
|
||||||
|
|
||||||
|
// Максимально возможное расстояние от центра до края
|
||||||
|
double maxDistance = Math.max(maxCount - midPoint, midPoint - minCount);
|
||||||
|
|
||||||
|
List<Map.Entry<Material, Rarity>> result = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<Material, Long> entry : list) {
|
||||||
|
long count = entry.getValue();
|
||||||
|
|
||||||
|
// 3. Считаем дистанцию от центра (по модулю, чтобы и мало, и много давали плюс)
|
||||||
|
double distance = Math.abs(count - midPoint);
|
||||||
|
|
||||||
|
// 4. Нормализуем в значение от 0.0 до 1.0
|
||||||
|
// 0.0 = ровно середина
|
||||||
|
// 1.0 = это либо minCount, либо maxCount
|
||||||
|
double deviationPercent = distance / maxDistance;
|
||||||
|
|
||||||
|
// 5. Определяем редкость
|
||||||
|
Rarity rarity = Rarity.getByDeviation(deviationPercent);
|
||||||
|
|
||||||
|
result.add(Map.entry(entry.getKey(), rarity));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
map.setBlocks(result.stream().map(e -> new PropBlock(new ItemStack(e.getKey()), e.getValue())).toList());
|
||||||
|
map.save();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@ApiStatus.Experimental
|
@ApiStatus.Experimental
|
||||||
public static void getSortedBlockStats(Location center, int chunkRadius, Consumer<List<Map.Entry<Material, Long>>> callback) {
|
public static void getSortedBlockStats(Location center, int chunkRadius, Consumer<List<Map.Entry<Material, Long>>> callback) {
|
||||||
World world = center.getWorld();
|
World world = center.getWorld();
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class Config extends OkaeriConfig {
|
|||||||
@Comment("Server options.")
|
@Comment("Server options.")
|
||||||
private ServerSettings serverSettings = new ServerSettings();
|
private ServerSettings serverSettings = new ServerSettings();
|
||||||
@Comment("Spawn location. Useless if the Server.forceControl is false.")
|
@Comment("Spawn location. Useless if the Server.forceControl is false.")
|
||||||
private LazyLocation spawn = new LazyLocation("world");
|
private LazyLocation spawn;
|
||||||
@Comment("Show hidden BlockAndSeek commands.")
|
@Comment("Show hidden BlockAndSeek commands.")
|
||||||
private boolean enableDebugCommands = false;
|
private boolean enableDebugCommands = false;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package hdvtdev.blockandseek.managers;
|
package hdvtdev.blockandseek.managers;
|
||||||
|
|
||||||
import hdvtdev.blockandseek.BlockAndSeek;
|
import hdvtdev.blockandseek.BlockAndSeek;
|
||||||
|
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;
|
||||||
@@ -60,6 +61,40 @@ public final class CommandManager {
|
|||||||
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 partyBase = root.literal("party");
|
||||||
var reloadBase = root.literal("reload").permission(perm); //all, config, langs, maps
|
var reloadBase = root.literal("reload").permission(perm); //all, config, langs, maps
|
||||||
var createBase = root.literal("create"); //party, map, game
|
var createBase = root.literal("create"); //party, map, game
|
||||||
|
|||||||
@@ -13,12 +13,10 @@ import org.bukkit.command.CommandSender;
|
|||||||
|
|
||||||
import org.incendo.cloud.suggestion.Suggestion;
|
import org.incendo.cloud.suggestion.Suggestion;
|
||||||
import org.incendo.cloud.suggestion.SuggestionProvider;
|
import org.incendo.cloud.suggestion.SuggestionProvider;
|
||||||
import org.intellij.lang.annotations.Flow;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public final class MapsManager {
|
public final class MapsManager {
|
||||||
|
|
||||||
@@ -64,15 +62,14 @@ public final class MapsManager {
|
|||||||
it.saveDefaults();
|
it.saveDefaults();
|
||||||
it.load(true);
|
it.load(true);
|
||||||
});
|
});
|
||||||
|
blockAndSeekMap.getSpawn().setWorldName(name);
|
||||||
|
blockAndSeekMap.getLobby().setWorldName(name);
|
||||||
|
blockAndSeekMap.save();
|
||||||
maps.put(name, blockAndSeekMap);
|
maps.put(name, blockAndSeekMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Suggestions ---
|
|
||||||
|
|
||||||
public static final SuggestionProvider<CommandSender> worldSuggestions = (context, input) ->
|
public static final SuggestionProvider<CommandSender> worldSuggestions = (context, input) ->
|
||||||
CompletableFuture.supplyAsync(() -> {
|
CompletableFuture.supplyAsync(() -> {
|
||||||
// Лучше брать загруженные миры Bukkit, если карта должна быть в активном мире
|
|
||||||
// Если нужны папки миров:
|
|
||||||
File container = Bukkit.getWorldContainer();
|
File container = Bukkit.getWorldContainer();
|
||||||
File[] files = container.listFiles((dir, name) -> new File(dir, name + "/level.dat").exists());
|
File[] files = container.listFiles((dir, name) -> new File(dir, name + "/level.dat").exists());
|
||||||
|
|
||||||
@@ -81,11 +78,11 @@ public final class MapsManager {
|
|||||||
return Arrays.stream(files)
|
return Arrays.stream(files)
|
||||||
.map(File::getName)
|
.map(File::getName)
|
||||||
.map(Suggestion::suggestion)
|
.map(Suggestion::suggestion)
|
||||||
.collect(Collectors.toList());
|
.toList();
|
||||||
});
|
});
|
||||||
|
|
||||||
public static final SuggestionProvider<CommandSender> mapSuggestions = (context, input) ->
|
public static final SuggestionProvider<CommandSender> mapSuggestions = (context, input) ->
|
||||||
CompletableFuture.supplyAsync(() -> maps.keySet().stream()
|
CompletableFuture.supplyAsync(() -> maps.keySet().stream()
|
||||||
.map(Suggestion::suggestion)
|
.map(Suggestion::suggestion)
|
||||||
.collect(Collectors.toList()));
|
.toList());
|
||||||
}
|
}
|
||||||
@@ -102,10 +102,11 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,15 +119,11 @@ public final class TranslationManager {
|
|||||||
|
|
||||||
sb.append(text, cursor, start);
|
sb.append(text, cursor, start);
|
||||||
|
|
||||||
String key = text.substring(start + 1, end);
|
String key = text.substring(start, end + 1);
|
||||||
|
|
||||||
String replacement = params.get(key);
|
String replacement = params.get(key);
|
||||||
|
|
||||||
if (replacement != null) {
|
sb.append(Objects.requireNonNullElse(replacement, key));
|
||||||
sb.append(replacement);
|
|
||||||
} else {
|
|
||||||
sb.append('%').append(key).append('%');
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor = end + 1;
|
cursor = end + 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,8 +21,11 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static java.util.Map.entry;
|
||||||
|
|
||||||
public class GamesMenu implements GuiHolder {
|
public class GamesMenu implements GuiHolder {
|
||||||
|
|
||||||
|
|
||||||
@@ -40,7 +43,7 @@ public class GamesMenu implements GuiHolder {
|
|||||||
for (String gameName : GamesManager.getAvailableGames()) {
|
for (String gameName : GamesManager.getAvailableGames()) {
|
||||||
ItemStack gameItem = new ItemStack(Material.AMETHYST_BLOCK);
|
ItemStack gameItem = new ItemStack(Material.AMETHYST_BLOCK);
|
||||||
ItemMeta itemMeta = gameItem.getItemMeta();
|
ItemMeta itemMeta = gameItem.getItemMeta();
|
||||||
itemMeta.displayName(TranslationManager.get(TranslationManager.defaultLanguage, TranslationKey.GAME, "%name%", gameName));
|
itemMeta.displayName(TranslationManager.get(TranslationKey.GAME, entry("%name%", gameName)));
|
||||||
var game = GamesManager.get(gameName);
|
var game = GamesManager.get(gameName);
|
||||||
itemMeta.lore(List.of(Component.text(game.players())));
|
itemMeta.lore(List.of(Component.text(game.players())));
|
||||||
gameItem.setItemMeta(itemMeta);
|
gameItem.setItemMeta(itemMeta);
|
||||||
@@ -69,13 +72,13 @@ public class GamesMenu implements GuiHolder {
|
|||||||
Player p = Bukkit.getPlayer(member);
|
Player p = Bukkit.getPlayer(member);
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
if (!game.addPlayer(p)) {
|
if (!game.addPlayer(p)) {
|
||||||
p.sendMessage(TranslationManager.get(p, TranslationKey.GAME_IS_FULL, "%game%", gameName));
|
p.sendMessage(TranslationManager.get(p, TranslationKey.GAME_IS_FULL, entry( "%game%", gameName)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!game.addPlayer(player)) {
|
if (!game.addPlayer(player)) {
|
||||||
player.sendMessage(TranslationManager.get(player, TranslationKey.GAME_IS_FULL, "%game%", gameName));
|
player.sendMessage(TranslationManager.get(player, TranslationKey.GAME_IS_FULL, entry("%game%", gameName)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import java.util.UUID;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static hdvtdev.blockandseek.objects.TranslationKey.UNKNOWN_MAP;
|
import static hdvtdev.blockandseek.objects.TranslationKey.UNKNOWN_MAP;
|
||||||
|
import static java.util.Map.entry;
|
||||||
|
|
||||||
public class MapsMenu implements GuiHolder {
|
public class MapsMenu implements GuiHolder {
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ public class MapsMenu implements GuiHolder {
|
|||||||
for (String name : MapsManager.getAllMaps()) {
|
for (String name : MapsManager.getAllMaps()) {
|
||||||
ItemStack gameItem = new ItemStack(Material.MAP);
|
ItemStack gameItem = new ItemStack(Material.MAP);
|
||||||
gameItem.editMeta(itemMeta ->
|
gameItem.editMeta(itemMeta ->
|
||||||
itemMeta.displayName(TranslationManager.get(TranslationManager.defaultLanguage, TranslationKey.MAP, "%name%", name)));
|
itemMeta.displayName(TranslationManager.get(TranslationKey.MAP, entry("%name%", name))));
|
||||||
inventory.addItem(gameItem);
|
inventory.addItem(gameItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,7 @@ public class MapsMenu implements GuiHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
player.sendMessage(UNKNOWN_MAP.translate(player, "%map%", mapName, "%maps%", String.join(", ", MapsManager.getAllMaps())));
|
player.sendMessage(UNKNOWN_MAP.translate(player, entry("%map%", mapName), entry("%maps%", String.join(", ", MapsManager.getAllMaps()))));
|
||||||
}
|
}
|
||||||
player.closeInventory();
|
player.closeInventory();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import static java.util.Map.entry;
|
||||||
|
|
||||||
public class BlockAndSeekGame {
|
public class BlockAndSeekGame {
|
||||||
|
|
||||||
private final BlockAndSeekMap map;
|
private final BlockAndSeekMap map;
|
||||||
@@ -96,6 +98,45 @@ public class BlockAndSeekGame {
|
|||||||
} else this.cancel();
|
} else this.cancel();
|
||||||
}
|
}
|
||||||
}.runTaskTimer(BlockAndSeek.getInstance(), 0, 20);
|
}.runTaskTimer(BlockAndSeek.getInstance(), 0, 20);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
if (phase == null) {
|
||||||
|
this.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проходим по всем игрокам на сервере
|
||||||
|
for (UUID uuid : stateManager.getPlayersInState(PlayerType.PROP)) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 2. Проверяем, находится ли игрок в воде
|
||||||
|
// Метод .isInWater() доступен в новых версиях (1.13+).
|
||||||
|
// Для старых версий используйте проверку блока (см. ниже).
|
||||||
|
|
||||||
|
Player player = Bukkit.getPlayer(uuid);
|
||||||
|
if (player == null) continue;
|
||||||
|
|
||||||
|
if (player.isInWater()) {
|
||||||
|
|
||||||
|
// 3. Наносим урон
|
||||||
|
// 1.0 = половина сердца. 2.0 = полное сердце.
|
||||||
|
player.damage(0.5);
|
||||||
|
|
||||||
|
// Опционально: можно проиграть звук или эффект
|
||||||
|
player.playSound(player.getLocation(), Sound.BLOCK_SCULK_SHRIEKER_SHRIEK, 1f, 1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskTimer(BlockAndSeek.getInstance(), 0L, 20L);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void endGame() {
|
private void endGame() {
|
||||||
@@ -103,7 +144,8 @@ public class BlockAndSeekGame {
|
|||||||
GamesManager.remove(name);
|
GamesManager.remove(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendToAll(TranslationKey key, String... placeholders) {
|
@SafeVarargs
|
||||||
|
private void sendToAll(TranslationKey key, Map.Entry<String, String>... placeholders) {
|
||||||
for (UUID uuid : stateManager.getPlayers()) {
|
for (UUID uuid : stateManager.getPlayers()) {
|
||||||
Player player = Bukkit.getPlayer(uuid);
|
Player player = Bukkit.getPlayer(uuid);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
@@ -112,7 +154,8 @@ public class BlockAndSeekGame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void broadcastToAll(TranslationKey key, String... placeholders) {
|
@SafeVarargs
|
||||||
|
private void broadcastToAll(TranslationKey key, Map.Entry<String, String>... placeholders) {
|
||||||
for (UUID uuid : stateManager.getPlayers()) {
|
for (UUID uuid : stateManager.getPlayers()) {
|
||||||
Player player = Bukkit.getPlayer(uuid);
|
Player player = Bukkit.getPlayer(uuid);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
@@ -121,7 +164,8 @@ public class BlockAndSeekGame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void actionBarToAll(TranslationKey key, String... placeholders) {
|
@SafeVarargs
|
||||||
|
private void actionBarToAll(TranslationKey key, Map.Entry<String, String>... placeholders) {
|
||||||
for (UUID uuid : stateManager.getPlayers()) {
|
for (UUID uuid : stateManager.getPlayers()) {
|
||||||
Player player = Bukkit.getPlayer(uuid);
|
Player player = Bukkit.getPlayer(uuid);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
@@ -155,7 +199,7 @@ public class BlockAndSeekGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (timeLeft == 30 || timeLeft == 15 || timeLeft == 10 || timeLeft <= 5) {
|
if (timeLeft == 30 || timeLeft == 15 || timeLeft == 10 || timeLeft <= 5) {
|
||||||
sendToAll(TranslationKey.TIME_TO_START, "%time%", String.valueOf(timeLeft));
|
sendToAll(TranslationKey.TIME_TO_START, entry("%time%", String.valueOf(timeLeft)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,7 +233,7 @@ public class BlockAndSeekGame {
|
|||||||
if (props.size() == 1) {
|
if (props.size() == 1) {
|
||||||
Player player = Bukkit.getPlayer(props.iterator().next());
|
Player player = Bukkit.getPlayer(props.iterator().next());
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
broadcastToAll(TranslationKey.HIDER_SOLO_WIN, "%player%", player.getName());
|
broadcastToAll(TranslationKey.HIDER_SOLO_WIN, entry("%player%", player.getName()));
|
||||||
} else broadcastToAll(TranslationKey.HIDERS_WIN);
|
} else broadcastToAll(TranslationKey.HIDERS_WIN);
|
||||||
} else broadcastToAll(TranslationKey.HIDERS_WIN);
|
} else broadcastToAll(TranslationKey.HIDERS_WIN);
|
||||||
this.onDisable();
|
this.onDisable();
|
||||||
@@ -216,7 +260,7 @@ public class BlockAndSeekGame {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
actionBarToAll(TranslationKey.TIME_LEFT, "%time%", String.valueOf(gameDuration));
|
actionBarToAll(TranslationKey.TIME_LEFT, entry("%time%", String.valueOf(gameDuration)));
|
||||||
}
|
}
|
||||||
gameDuration--;
|
gameDuration--;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,26 +8,23 @@ import eu.okaeri.configs.annotation.Exclude;
|
|||||||
import hdvtdev.blockandseek.BlockAndSeek;
|
import hdvtdev.blockandseek.BlockAndSeek;
|
||||||
|
|
||||||
import hdvtdev.blockandseek.Utils;
|
import hdvtdev.blockandseek.Utils;
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@NoArgsConstructor
|
@Setter
|
||||||
public class LazyLocation extends OkaeriConfig {
|
public class LazyLocation extends OkaeriConfig {
|
||||||
|
|
||||||
public LazyLocation(String worldName) {
|
|
||||||
this.worldName = worldName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Comment("Name of the world. World will be automatically loaded.")
|
@Comment("Name of the world. World will be automatically loaded.")
|
||||||
@CustomKey("world-name")
|
@CustomKey("world-name")
|
||||||
private String worldName;
|
private String worldName;
|
||||||
private double x;
|
private double x = 0.0;
|
||||||
private double y;
|
private double y = 70.0;
|
||||||
private double z;
|
private double z = 0.0;
|
||||||
private float yaw;
|
private float yaw = 0.0f;
|
||||||
private float pitch;
|
private float pitch = 0.0f;
|
||||||
|
|
||||||
@Exclude
|
@Exclude
|
||||||
private Location location;
|
private Location location;
|
||||||
|
|||||||
@@ -2,21 +2,24 @@ package hdvtdev.blockandseek.objects;
|
|||||||
|
|
||||||
import eu.okaeri.configs.OkaeriConfig;
|
import eu.okaeri.configs.OkaeriConfig;
|
||||||
import eu.okaeri.configs.annotation.Comment;
|
import eu.okaeri.configs.annotation.Comment;
|
||||||
|
import lombok.Getter;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Getter
|
||||||
public class PropBlock extends OkaeriConfig {
|
public class PropBlock extends OkaeriConfig {
|
||||||
|
|
||||||
|
@Comment("Minecraft solid block. ")
|
||||||
|
@Comment("WARNING: BLOCKS AFFECTED BY GRAVITY, BLOCKS REQUIRING SUPPORT")
|
||||||
|
@Comment("OR SPECIFIC CONDITIONS (E.G. ADJACENT WATER), AND REDSTONE EMITTERS ARE NOT SUPPORTED.")
|
||||||
|
@Comment("USING THEM MAY CAUSE MAP CORRUPTION.")
|
||||||
private ItemStack block;
|
private ItemStack block;
|
||||||
|
@Comment("Rarity of block. Available rarities:")
|
||||||
|
@Comment("COMMON, UNCOMMON, RARE, EPIC, MYTHIC, LEGENDARY")
|
||||||
private Rarity rarity = Rarity.COMMON;
|
private Rarity rarity = Rarity.COMMON;
|
||||||
|
|
||||||
public ItemStack getBlock() {
|
|
||||||
return block;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rarity getRarity() {
|
|
||||||
return rarity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PropBlock(ItemStack itemStack, Rarity rarity) {
|
public PropBlock(ItemStack itemStack, Rarity rarity) {
|
||||||
this.block = itemStack;
|
this.block = itemStack;
|
||||||
this.rarity = rarity;
|
this.rarity = rarity;
|
||||||
|
|||||||
@@ -17,4 +17,13 @@ public enum Rarity {
|
|||||||
public int getChance() {
|
public int getChance() {
|
||||||
return weight;
|
return weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Rarity getByDeviation(double percent) {
|
||||||
|
if (percent >= 0.90) return LEGENDARY;
|
||||||
|
if (percent >= 0.75) return MYTHIC;
|
||||||
|
if (percent >= 0.55) return EPIC;
|
||||||
|
if (percent >= 0.35) return RARE;
|
||||||
|
if (percent >= 0.15) return UNCOMMON;
|
||||||
|
return COMMON;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,8 @@ import hdvtdev.blockandseek.managers.TranslationManager;
|
|||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public enum TranslationKey {
|
public enum TranslationKey {
|
||||||
// Misc
|
// Misc
|
||||||
CHORUS,
|
CHORUS,
|
||||||
@@ -70,7 +72,8 @@ public enum TranslationKey {
|
|||||||
DEATH_BELT,
|
DEATH_BELT,
|
||||||
ANTI_GRAVITY;
|
ANTI_GRAVITY;
|
||||||
|
|
||||||
public Component translate(Player player, String... placeholders) {
|
@SafeVarargs
|
||||||
|
public final Component translate(Player player, Map.Entry<String, String>... placeholders) {
|
||||||
return TranslationManager.get(player, this, placeholders);
|
return TranslationManager.get(player, this, placeholders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user