some improvments, bugs and bugfixed )

This commit is contained in:
hdvt
2025-07-03 02:40:14 +03:00
parent 611ac6c213
commit 9f36ac3e4b
33 changed files with 526 additions and 456 deletions

18
.classpath Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="bin/main" path="src/main/java">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/main" path="src/main/resources">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

Binary file not shown.

View File

@@ -1,2 +0,0 @@
#Sat Jun 21 03:09:22 MSK 2025
gradle.version=8.14.1

6
.idea/hotswap_agent.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="HotSwapAgentPluginSettingsProvider">
<option name="agentPath" value="$APPLICATION_PLUGINS_DIR$/hotswap-agent-intellij-plugin/lib/agent/hotswap-agent-2.0.0 (2024-09-03).jar" />
</component>
</project>

8
.idea/modules/BlockAndSeek.iml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="AdditionalModuleElements">
<content url="file://$MODULE_DIR$/../.." dumb="true">
<excludeFolder url="file://$MODULE_DIR$/../../bin" />
</content>
</component>
</module>

34
.project Normal file
View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>BlockAndSeek</name>
<comment>Project BlockAndSeek created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>1750464766576</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

View File

@@ -1,5 +1,6 @@
package hdvtdev.blockAndSeek; package hdvtdev.blockAndSeek;
import hdvtdev.blockAndSeek.eventListeners.DefaultEventListener;
import hdvtdev.blockAndSeek.eventListeners.EventListener; import hdvtdev.blockAndSeek.eventListeners.EventListener;
import hdvtdev.blockAndSeek.eventListeners.ForceControlEventListener; import hdvtdev.blockAndSeek.eventListeners.ForceControlEventListener;
import hdvtdev.blockAndSeek.managers.ConfigManager; import hdvtdev.blockAndSeek.managers.ConfigManager;
@@ -66,15 +67,12 @@ public class BlockAndSeek extends JavaPlugin {
getLogger().severe("Failed to save some .yml configs!"); getLogger().severe("Failed to save some .yml configs!");
} }
getLogger().warning(ConfigManager.getConfig().toString());
PluginCommand command = Objects.requireNonNull(getCommand("blockandseek")); PluginCommand command = Objects.requireNonNull(getCommand("blockandseek"));
command.setExecutor(new CommandListener()); command.setExecutor(new CommandListener());
PluginManager manager = getServer().getPluginManager(); PluginManager manager = getServer().getPluginManager();
if (ConfigManager.getConfig().forceControl()) manager.registerEvents(new ForceControlEventListener(), this); manager.registerEvents(ConfigManager.getConfig().forceControl() ? new ForceControlEventListener() : new EventListener(), this);
manager.registerEvents(new EventListener(), this); manager.registerEvents(new DefaultEventListener(), this);
} }

View File

@@ -14,10 +14,7 @@ import org.bukkit.persistence.PersistentDataType;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@@ -113,6 +110,10 @@ public class BlockAndSeekGame {
return players.values().stream().filter(type -> type == PlayerType.HIDER).count(); return players.values().stream().filter(type -> type == PlayerType.HIDER).count();
} }
private long getSeekersCount() {
return players.values().stream().filter(type -> type == PlayerType.SEEKER).count();
}
private List<Player> getSeekers() { private List<Player> getSeekers() {
return players.entrySet().stream().filter(entry -> entry.getValue() == PlayerType.SEEKER).map(Map.Entry::getKey).toList(); return players.entrySet().stream().filter(entry -> entry.getValue() == PlayerType.SEEKER).map(Map.Entry::getKey).toList();
} }
@@ -136,7 +137,7 @@ public class BlockAndSeekGame {
PlayerInventory inventory = hider.getInventory(); PlayerInventory inventory = hider.getInventory();
inventory.clear(); inventory.clear();
inventory.addItem(Localization.translateItem(hider, ItemManager.getFreezeItem())); inventory.addItem(Localization.translateItem(hider, ItemManager.getFreezeItem()));
RouletteCreator.createRoulette(hider, null, true, map.getBlocks()); new RouletteCreator(hider, map.getBlocks());
} }
} }
@@ -154,6 +155,7 @@ public class BlockAndSeekGame {
if (defaultInventory) ItemManager.defaultInventory(player); if (defaultInventory) ItemManager.defaultInventory(player);
player.setGlowing(false); player.setGlowing(false);
player.setInvulnerable(false); player.setInvulnerable(false);
Utils.setLevelWithBar(player, 0);
player.setVisibleByDefault(true); player.setVisibleByDefault(true);
player.setGameMode(GameMode.SURVIVAL); player.setGameMode(GameMode.SURVIVAL);
player.teleport(serverLobby); player.teleport(serverLobby);
@@ -163,23 +165,31 @@ public class BlockAndSeekGame {
} }
private void preEnd() { private void preEnd() {
for (Player player : players.keySet()) {
player.setInvulnerable(true);
}
for (Player hider : getHiders()) { for (Player hider : getHiders()) {
hider.getInventory().clear(); hider.getInventory().clear();
FreezeManager.unfreezeIfFrozen(hider); FreezeManager.unfreezeIfFrozen(hider);
hider.setGlowing(true); hider.setGlowing(true);
hider.setInvulnerable(true);
} }
} }
public void selectRandomSeekers(int count) { public void selectRandomSeekers(int count) {
ArrayList<Player> playerList = new ArrayList<>(players.keySet()); ArrayList<Player> rawSeekers = new ArrayList<>();
Collections.shuffle(playerList); Set<Player> playerSet = players.keySet();
List<Player> seekers = playerList.subList(0, Math.min(count, playerList.size())); for (Player player : playerSet) {
for (Player seeker : seekers) { if (!GamesManager.triggerSeekerImmune(player)) rawSeekers.add(player);
}
Collections.shuffle(rawSeekers);
for (Player seeker : rawSeekers.subList(0, Math.min(count, playerSet.size()))) {
players.put(seeker, PlayerType.SEEKER); players.put(seeker, PlayerType.SEEKER);
ItemManager.setSeekerSet(seeker); ItemManager.setSeekerSet(seeker);
Utils.setLevelWithBar(seeker, 100);
seeker.setInvulnerable(false); seeker.setInvulnerable(false);
seeker.getPersistentDataContainer().set(Keys.SEEKER, PersistentDataType.BOOLEAN, true); seeker.getPersistentDataContainer().set(Keys.SEEKER, PersistentDataType.BOOLEAN, true);
GamesManager.addSeekerImmune(seeker);
} }
} }
@@ -235,7 +245,10 @@ public class BlockAndSeekGame {
} }
} }
if (getSeekersCount() == 0) duration = 0;
if (duration == 0) { if (duration == 0) {
preEnd(); preEnd();
if (getHidersCount() == 1) { if (getHidersCount() == 1) {
Localization.sendTitle( Localization.sendTitle(

View File

@@ -77,9 +77,21 @@ public class CommandListener implements TabExecutor {
} }
} }
case "damage" -> {
if (sender instanceof Player player && args.length == 2) {
player.damage(Double.parseDouble(args[1]));
}
}
case "health" -> {
if (sender instanceof Player player && args.length == 2) {
player.setHealth(Double.parseDouble(args[1]));
}
}
case "new" -> { case "new" -> {
if (sender instanceof Player player) { if (sender instanceof Player player) {
RouletteCreator.newCreateRoulette(player, List.of( new RouletteCreator(player, List.of(
new BlockAndSeekMap.Block(new ItemStack(Material.STONE), 10), new BlockAndSeekMap.Block(new ItemStack(Material.STONE), 10),
new BlockAndSeekMap.Block(new ItemStack(Material.DIRT), 10), new BlockAndSeekMap.Block(new ItemStack(Material.DIRT), 10),
new BlockAndSeekMap.Block(new ItemStack(Material.LANTERN), 10), new BlockAndSeekMap.Block(new ItemStack(Material.LANTERN), 10),

View File

@@ -0,0 +1,35 @@
package hdvtdev.blockAndSeek;
import hdvtdev.blockAndSeek.managers.FreezeManager;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public final class Utils {
private Utils() {
}
public static void setLevelWithBar(Player p, int level) {
p.setLevel(level);
p.setExp(0.9998f * ((float) level / 100));
}
public static boolean isInOneTeam(Player p1, Player p2) {
var c1 = p1.getPersistentDataContainer();
var c2 = p2.getPersistentDataContainer();
return (c1.has(Keys.HIDER) && c2.has(Keys.HIDER)) || (c1.has(Keys.SEEKER) && c2.has(Keys.SEEKER));
}
public static boolean playerInGame(Player player) {
return player.getPersistentDataContainer().has(Keys.GAME);
}
public static void firstDisguise(Player player, ItemStack prop) {
DisguiseAPI.disguiseToAll(player, new MiscDisguise(DisguiseType.FALLING_BLOCK, prop));
FreezeManager.addPlayerDisguise(player, prop.getType().createBlockData());
}
}

View File

@@ -0,0 +1,269 @@
package hdvtdev.blockAndSeek.eventListeners;
import hdvtdev.blockAndSeek.BlockAndSeek;
import hdvtdev.blockAndSeek.Keys;
import hdvtdev.blockAndSeek.Utils;
import hdvtdev.blockAndSeek.managers.FreezeManager;
import hdvtdev.blockAndSeek.managers.GamesManager;
import hdvtdev.blockAndSeek.managers.GuiManager;
import hdvtdev.blockAndSeek.roulette.RouletteCreator;
import org.bukkit.Bukkit;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import static hdvtdev.blockAndSeek.Utils.isInOneTeam;
import static hdvtdev.blockAndSeek.Utils.playerInGame;
public class DefaultEventListener implements Listener {
private static final BukkitScheduler scheduler = Bukkit.getScheduler();
private static final Set<Player> coolDown = ConcurrentHashMap.newKeySet();
@Deprecated(forRemoval = true)
private static final ConcurrentHashMap<Player, BukkitTask> tasks = new ConcurrentHashMap<>();
@Deprecated(forRemoval = true)
public static void createTask(Player player, BukkitTask bukkitTask) {
tasks.put(player, bukkitTask);
}
@Deprecated(forRemoval = true)
public static void stopTask(Player player) {
BukkitTask task = tasks.remove(player);
task.cancel();
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if (player.getVehicle() instanceof ArmorStand armorStand) {
PersistentDataContainer armorStandContainer = armorStand.getPersistentDataContainer();
if (armorStandContainer.has(Keys.FROZEN_PLAYER)) {
armorStandContainer.remove(Keys.FROZEN_PLAYER);
armorStand.remove();
}
}
}
@EventHandler
public void onBlockDamage(BlockDamageEvent event) {
Player player = event.getPlayer();
if (player.getPersistentDataContainer().has(Keys.SEEKER)) {
if (FreezeManager.unfreeze(event.getBlock().getBlockData())) {
event.setCancelled(true);
} else {
player.damage(2);
Utils.setLevelWithBar(player, (int) Math.round(player.getHealth() * 5));
}
}
}
@EventHandler
public void onRightClick(PlayerInteractEvent event) {
if (event.getHand() != EquipmentSlot.HAND) return;
Action action = event.getAction();
Player player = event.getPlayer();
if (action.isRightClick() && !coolDown.contains(player)) {
ItemStack itemInHand = player.getInventory().getItemInMainHand();
ItemMeta meta = itemInHand.getItemMeta();
if (meta != null) {
PersistentDataContainer itemData = meta.getPersistentDataContainer();
if (itemData.has(Keys.FREEZE_ITEM) && playerInGame(player)) {
coolDown.add(player);
scheduler.runTaskLater(BlockAndSeek.getInstance(), () -> coolDown.remove(player), 3L);
FreezeManager.freeze(player);
event.setCancelled(true);
} else if (itemData.has(Keys.MENU_ITEM)) {
GuiManager.Menu.open(player);
event.setCancelled(true);
} else if (itemData.has(Keys.LEAVE_ITEM)) {
String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING);
GamesManager.get(game).removePlayer(player);
event.setCancelled(true);
}
}
}
}
@EventHandler
public void onEntityDismount(EntityDismountEvent event) {
Player player = (Player) event.getEntity();
if (event.getDismounted() instanceof ArmorStand armorStand && armorStand.getPersistentDataContainer().has(Keys.FROZEN_PLAYER)) {
FreezeManager.freeze(player);
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
PersistentDataContainer container = player.getPersistentDataContainer();
String arena = container.get(Keys.GAME, PersistentDataType.STRING);
if (arena != null) {
GamesManager.get(arena).removePlayer(player);
FreezeManager.removePlayerDisguise(player);
}
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
Player player = event.getPlayer();
String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING);
if (game != null) {
event.deathMessage(null);
event.setDroppedExp(0);
event.getDrops().clear();
scheduler.runTask(BlockAndSeek.getInstance(), () -> GamesManager.get(game).setSpectator(player, player.getKiller()));
//without scheduler strange things are happening idk
}
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
InventoryHolder holder = event.getInventory().getHolder();
if (holder instanceof RouletteCreator rouletteCreator) {
if (rouletteCreator.isClosedByPlayer()) {
RouletteCreator.Task task = rouletteCreator.getTask();
if (!task.rouletteTask().isCancelled()) {
task.cancelBoth();
Utils.firstDisguise(player, rouletteCreator.randomPropItem());
} else Utils.firstDisguise(player, rouletteCreator.randomMidPropItem()); //FIXME THIS FUCKING LINE AAAA
} else Utils.firstDisguise(player, rouletteCreator.randomMidPropItem());
}
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
Inventory inventory = event.getClickedInventory();
if (inventory != null) {
InventoryHolder holder = inventory.getHolder();
int slot = event.getSlot();
ItemStack item = inventory.getItem(slot);
if (holder instanceof RouletteCreator rouletteCreator) {
RouletteCreator.Task task = rouletteCreator.getTask();
if (task.rouletteTask().isCancelled()) {
if (slot == 21 || slot == 23 || slot == 25) {
task.autoCloseTask().cancel();
Utils.firstDisguise(player, inventory.getItem(slot));
rouletteCreator.closeInventoryByPlayer();
}
event.setCancelled(true);
return;
} else {
if (slot == 36) {
task.rouletteTask().cancel();
Utils.firstDisguise(player, rouletteCreator.randomPropItem());
rouletteCreator.closeInventory();
event.setCancelled(true);
return;
}
}
}
if (item != null) {
ItemMeta meta = item.getItemMeta();
if (meta != null) {
PersistentDataContainer itemData = meta.getPersistentDataContainer();
if (itemData.has(Keys.GAME_PAGE)) {
GuiManager.Menu.Games.open(player);
event.setCancelled(true);
} else if (itemData.has(Keys.GAME)) {
String game = itemData.get(Keys.GAME, PersistentDataType.STRING);
if (game != null) {
GamesManager.get(game).addPlayer(player);
event.setCancelled(true);
}
}
}
}
}
//TODO MOVE TO EVENT LISTENER
if (player.getPersistentDataContainer().has(Keys.GAME)) {
event.setCancelled(true);
}
}
@EventHandler
public void onRegainHealth(EntityRegainHealthEvent event) {
if (event.getEntity() instanceof Player player) {
if (player.getPersistentDataContainer().has(Keys.SEEKER)) {
event.setCancelled(true);
}
}
}
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player damager && event.getEntity() instanceof Player victim) {
if (isInOneTeam(damager, victim)) {
event.setCancelled(true);
} else if (victim.getPersistentDataContainer().has(Keys.SEEKER)) {
event.setDamage(0);
} else if (damager.getPersistentDataContainer().has(Keys.SEEKER)) {
double maxHealth = 20.0;
double currentHealth = damager.getHealth();
if (currentHealth < maxHealth) {
double newHealth = Math.min(currentHealth + event.getDamage(), maxHealth);
damager.setHealth(newHealth);
Utils.setLevelWithBar(damager, (int) Math.round(damager.getHealth() * 5));
}
}
}
}
}

View File

@@ -1,176 +1,30 @@
package hdvtdev.blockAndSeek.eventListeners; package hdvtdev.blockAndSeek.eventListeners;
import hdvtdev.blockAndSeek.BlockAndSeek;
import hdvtdev.blockAndSeek.Keys; import hdvtdev.blockAndSeek.Keys;
import hdvtdev.blockAndSeek.managers.FreezeManager; import hdvtdev.blockAndSeek.Utils;
import hdvtdev.blockAndSeek.managers.GamesManager;
import hdvtdev.blockAndSeek.managers.GuiManager;
import hdvtdev.blockAndSeek.managers.ItemManager;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import org.bukkit.Bukkit;
import org.bukkit.entity.ArmorStand;
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.block.Action;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.FoodLevelChangeEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class EventListener implements Listener { public class EventListener implements Listener {
private static final BukkitScheduler scheduler = Bukkit.getScheduler();
private static final Set<Player> coolDown = ConcurrentHashMap.newKeySet();
private static final ConcurrentHashMap<Player, BukkitTask> tasks = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<Player, Long> soundCoolDown = new ConcurrentHashMap<>();
private static final ItemStack menuItem = ItemManager.getMenuItem();
public static void createTask(Player player, BukkitTask bukkitTask) {
tasks.put(player, bukkitTask);
}
public static void stopTask(Player player) {
BukkitTask task = tasks.remove(player);
task.cancel();
}
private static boolean playerInGame(Player player) {
return player.getPersistentDataContainer().has(Keys.GAME);
}
private static boolean isInOneTeam(Player p1, Player p2) {
var c1 = p1.getPersistentDataContainer();
var c2 = p2.getPersistentDataContainer();
return (c1.has(Keys.HIDER) && c2.has(Keys.HIDER)) || (c1.has(Keys.SEEKER) && c2.has(Keys.SEEKER));
}
@EventHandler @EventHandler
public void onDrop(PlayerDropItemEvent event) { public void onDrop(PlayerDropItemEvent event) {
if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true); if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true);
} }
@EventHandler
public void onBlockDamage(BlockDamageEvent event) {
if (event.getPlayer().getPersistentDataContainer().has(Keys.SEEKER)) {
if (FreezeManager.unfreeze(event.getBlock().getBlockData())) event.setCancelled(true);
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if (player.getVehicle() instanceof ArmorStand armorStand) {
PersistentDataContainer armorStandContainer = armorStand.getPersistentDataContainer();
if (armorStandContainer.has(Keys.FROZEN_PLAYER)) {
armorStandContainer.remove(Keys.FROZEN_PLAYER);
armorStand.remove();
}
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
PersistentDataContainer container = player.getPersistentDataContainer();
String arena = container.get(Keys.GAME, PersistentDataType.STRING);
if (arena != null) {
GamesManager.get(arena).removePlayer(player);
FreezeManager.removePlayerDisguise(player);
}
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
Player player = event.getPlayer();
String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING);
if (game != null) {
event.deathMessage(null);
event.setDroppedExp(0);
event.getDrops().clear();
scheduler.runTask(BlockAndSeek.getInstance(), () -> GamesManager.get(game).setSpectator(player, player.getKiller()));
//without scheduler strange things are happening idk
}
}
@EventHandler
public void onEntityDismount(EntityDismountEvent event) {
Player player = (Player) event.getEntity();
if (event.getDismounted() instanceof ArmorStand armorStand && armorStand.getPersistentDataContainer().has(Keys.FROZEN_PLAYER)) {
FreezeManager.freeze(player);
}
}
@EventHandler @EventHandler
public void onFoodLevelChange(FoodLevelChangeEvent event) { public void onFoodLevelChange(FoodLevelChangeEvent event) {
if (event.getEntity() instanceof Player player && playerInGame(player)) { if (event.getEntity() instanceof Player player && Utils.playerInGame(player)) {
event.setCancelled(true); event.setCancelled(true);
event.getEntity().setFoodLevel(20); event.getEntity().setFoodLevel(20);
} }
} }
@EventHandler
public void onRightClick(PlayerInteractEvent event) {
if (event.getHand() != EquipmentSlot.HAND) return;
Action action = event.getAction();
Player player = event.getPlayer();
if (action.isRightClick() && !coolDown.contains(player)) {
ItemStack itemInHand = player.getInventory().getItemInMainHand();
ItemMeta meta = itemInHand.getItemMeta();
if (meta != null) {
PersistentDataContainer itemData = meta.getPersistentDataContainer();
if (itemData.has(Keys.FREEZE_ITEM) && playerInGame(player)) {
coolDown.add(player);
scheduler.runTaskLater(BlockAndSeek.getInstance(), () -> coolDown.remove(player), 3L);
FreezeManager.freeze(player);
event.setCancelled(true);
} else if (itemData.has(Keys.MENU_ITEM)) {
GuiManager.Menu.open(player);
event.setCancelled(true);
} else if (itemData.has(Keys.LEAVE_ITEM)) {
String game = player.getPersistentDataContainer().get(Keys.GAME, PersistentDataType.STRING);
GamesManager.get(game).removePlayer(player);
event.setCancelled(true);
}
}
}
}
@EventHandler @EventHandler
public void onBlockPlacement(BlockPlaceEvent event) { public void onBlockPlacement(BlockPlaceEvent event) {
if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true); if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true);
@@ -181,85 +35,5 @@ public class EventListener implements Listener {
if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true); if (event.getPlayer().getPersistentDataContainer().has(Keys.GAME)) event.setCancelled(true);
} }
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player damager && event.getEntity() instanceof Player victim) {
if (isInOneTeam(damager, victim)) {
event.setCancelled(true);
}
}
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
Inventory inventory = event.getClickedInventory();
if (inventory != null) {
ItemStack item = inventory.getItem(event.getSlot());
if (item != null) {
ItemMeta meta = item.getItemMeta();
if (meta != null) {
PersistentDataContainer itemData = meta.getPersistentDataContainer();
if (itemData.has(Keys.GAME_PAGE)) {
GuiManager.Menu.Games.open(player);
event.setCancelled(true);
} else if (itemData.has(Keys.GAME)) {
String game = itemData.get(Keys.GAME, PersistentDataType.STRING);
if (game != null) {
GamesManager.get(game).addPlayer(player);
event.setCancelled(true);
}
}
}
}
}
if (player.getPersistentDataContainer().has(Keys.GAME)) {
event.setCancelled(true);
}
if (player.hasMetadata("RollingMenu")) {
event.setCancelled(true);
int slot = event.getSlot();
if (slot == 21 || slot == 23 || slot == 25) {
if (!tasks.containsKey(player)) {
ItemStack prop = event.getInventory().getItem(slot);
FreezeManager.addPlayerDisguise(player, prop.getType().createBlockData());
MiscDisguise miscDisguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, prop);
DisguiseAPI.disguiseToAll(player, miscDisguise);
player.closeInventory(InventoryCloseEvent.Reason.UNKNOWN);
}
}
}
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
if (player.hasMetadata("RollingMenu")) {
if (!tasks.containsKey(player)) {
player.removeMetadata("RollingMenu", BlockAndSeek.getInstance());
if (!event.getReason().equals(InventoryCloseEvent.Reason.UNKNOWN)) {
ItemStack prop = event.getInventory().getItem(21);
FreezeManager.addPlayerDisguise(player, prop.getType().createBlockData());
MiscDisguise miscDisguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, prop);
DisguiseAPI.disguiseToAll(player, miscDisguise);
}
} else {
Bukkit.getScheduler().runTaskLater(BlockAndSeek.getInstance(), () -> player.openInventory(event.getInventory()), 0L);
}
}
}
} }

View File

@@ -56,7 +56,7 @@ public class FreezeManager {
location.getWorld().setBlockData(blockLocation, data.blockData); location.getWorld().setBlockData(blockLocation, data.blockData);
player.getPersistentDataContainer().remove(Keys.FROZEN_PLAYER); player.getPersistentDataContainer().remove(Keys.FROZEN_PLAYER);
player.setFreezeTicks(0);
data.armorStand.remove(); data.armorStand.remove();
player.setInvulnerable(false); player.setInvulnerable(false);
@@ -110,6 +110,8 @@ public class FreezeManager {
DisguiseAPI.disguiseToAll(player, hideDisguise); DisguiseAPI.disguiseToAll(player, hideDisguise);
player.setFreezeTicks(40);
frozenPlayers.put(player, new FreezeData(armorStand, blockData, disguise)); frozenPlayers.put(player, new FreezeData(armorStand, blockData, disguise));
} else return false; } else return false;

View File

@@ -3,13 +3,9 @@ package hdvtdev.blockAndSeek.managers;
import hdvtdev.blockAndSeek.BlockAndSeek; import hdvtdev.blockAndSeek.BlockAndSeek;
import hdvtdev.blockAndSeek.BlockAndSeekGame; import hdvtdev.blockAndSeek.BlockAndSeekGame;
import hdvtdev.blockAndSeek.BlockAndSeekMap; import hdvtdev.blockAndSeek.BlockAndSeekMap;
import hdvtdev.blockAndSeek.Localization;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.WorldCreator; import org.bukkit.WorldCreator;
import org.bukkit.scoreboard.Criteria; import org.bukkit.entity.Player;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Scoreboard;
import java.io.File; import java.io.File;
import java.util.Set; import java.util.Set;
@@ -18,9 +14,14 @@ import java.util.concurrent.ConcurrentHashMap;
public class GamesManager { public class GamesManager {
private static final ConcurrentHashMap<String, BlockAndSeekGame> games = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<String, BlockAndSeekGame> games = new ConcurrentHashMap<>();
private static final Set<Player> seekerImmune = ConcurrentHashMap.newKeySet();
public static boolean isExist(String name) { public static boolean triggerSeekerImmune(Player player) {
return games.containsKey(name); return seekerImmune.remove(player);
}
public static void addSeekerImmune(Player player) {
seekerImmune.add(player);
} }
public static Set<String> getAvailableGames() { public static Set<String> getAvailableGames() {
@@ -51,33 +52,4 @@ public class GamesManager {
return games.get(name); return games.get(name);
} }
private static Scoreboard updateScoreboard(Scoreboard scoreboard, int players, int maxPlayers) {
Objective objective = scoreboard.getObjective(DisplaySlot.SIDEBAR);
for (String o : scoreboard.getEntries()) {
scoreboard.resetScores(o);
}
objective.getScore(" ").setScore(3);
objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2);
objective.getScore(" ").setScore(1);
objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0);
return scoreboard;
}
private static Scoreboard newLobbyScoreboard(String name, int players, int maxPlayers) {
Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
Objective objective = scoreboard.registerNewObjective(name, Criteria.DUMMY, Localization.getComponent(" game-title", "{title}", name));
objective.setDisplaySlot(DisplaySlot.SIDEBAR);
objective.getScore(" ").setScore(3);
objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2);
objective.getScore(" ").setScore(1);
objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0);
return scoreboard;
}
} }

View File

@@ -94,6 +94,7 @@ public class ItemManager {
meta.setColor(Color.RED); meta.setColor(Color.RED);
meta.setUnbreakable(true); meta.setUnbreakable(true);
meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 10, true); meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 10, true);
meta.addEnchant(Enchantment.THORNS, 3, true);
meta.displayName(Component.text("seeker-armor")); meta.displayName(Component.text("seeker-armor"));
return meta; return meta;

View File

@@ -2,241 +2,169 @@ package hdvtdev.blockAndSeek.roulette;
import hdvtdev.blockAndSeek.BlockAndSeek; import hdvtdev.blockAndSeek.BlockAndSeek;
import hdvtdev.blockAndSeek.BlockAndSeekMap; import hdvtdev.blockAndSeek.BlockAndSeekMap;
import hdvtdev.blockAndSeek.eventListeners.EventListener; import hdvtdev.blockAndSeek.Localization;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random;
public class RouletteCreator implements InventoryHolder { public final class RouletteCreator implements InventoryHolder {
public static void newCreateRoulette(Player player, List<BlockAndSeekMap.Block> blocks) { private static final int[] slots = {3, 5, 7, 12, 14, 16, 21, 23, 25, 30, 32, 34, 39, 41, 43};
final Inventory gui = Bukkit.createInventory(null, 45); private static final int[] midSlots = {21, 23, 25};
new BukkitRunnable() { private static final Random random = new Random();
private final Inventory roulette;
private Task task;
private volatile boolean closedByPlayer = true;
int i = 0; public RouletteCreator(@NotNull Player player, List<BlockAndSeekMap.Block> blocks) {
final RouletteGenerator rouletteGenerator = new RouletteGenerator(blocks); roulette = Bukkit.createInventory(this, 45, Localization.getComponent(player, "roulette-title"));
this.createUnoptimizedRoulette(roulette, player, blocks);
final List<RouletteList<ItemStack>> rows = List.of(
new RouletteList<>(rouletteGenerator.getRandomRow(15)),
new RouletteList<>(rouletteGenerator.getRandomRow(15)),
new RouletteList<>(rouletteGenerator.getRandomRow(15))
);
final List<ItemStack[]> items = List.of(
new ItemStack[]{
rows.getFirst().next(),
rows.getFirst().next(),
rows.getFirst().next(),
rows.getFirst().next(),
rows.getFirst().next()
},
new ItemStack[]{
rows.get(1).next(),
rows.get(1).next(),
rows.get(1).next(),
rows.get(1).next(),
rows.get(1).next()
},
new ItemStack[]{
rows.get(2).next(),
rows.get(2).next(),
rows.get(2).next(),
rows.get(2).next(),
rows.get(2).next()
}
);
private volatile boolean finished = false;
private long startTime = System.currentTimeMillis();
private long lastActionTime = startTime;
private long nextDelay = 0;
private final long baseDelay = 30;
private final long maxDelay = 450;
private final double k = 0.2;
@Override
public void run() {
if (finished) this.cancel();
long now = System.currentTimeMillis();
long elapsedSeconds = (now - startTime) / 1000;
if (elapsedSeconds >= 10) {
finished = true;
return;
} }
public @NotNull Task getTask() {
nextDelay = (long) (baseDelay + (maxDelay - baseDelay) * (1 - Math.exp(-k * elapsedSeconds))); return task;
if (now - lastActionTime >= nextDelay) {
i++;
for (int j = 0; j < 5; j++) {
gui.setItem(3 + j * 9, items.getFirst()[j]);
gui.setItem(5 + j * 9, items.get(1)[j]);
gui.setItem(7 + j * 9, items.get(2)[j]);
} }
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 0.5f, 2f); public boolean isClosedByPlayer() {
return closedByPlayer;
for (int j = 4; j >= 1; j--) {
items.getFirst()[j] = items.getFirst()[j - 1];
items.get(1)[j] = items.get(1)[j - 1];
items.get(2)[j] = items.get(2)[j - 1];
} }
items.getFirst()[0] = rows.getFirst().next();
items.get(1)[0] = rows.get(1).next();
items.get(2)[0] = rows.get(2).next();
lastActionTime = now;
}
i++;
}
}.runTaskTimer(BlockAndSeek.getInstance(), 0, 4);
player.openInventory(gui);
}
@Deprecated
public static void createRoulette(Player player, Inventory inventory, boolean openInventory, List<BlockAndSeekMap.Block> blocks) {
Inventory gui = inventory == null ? new RouletteCreator().getInventory() : inventory;
EventListener.createTask(player, new BukkitRunnable() {
int i = 0;
final RouletteGenerator rouletteGenerator = new RouletteGenerator(blocks);
final List<RouletteList<ItemStack>> rows = List.of(
new RouletteList<>(rouletteGenerator.getRandomRow(15)),
new RouletteList<>(rouletteGenerator.getRandomRow(15)),
new RouletteList<>(rouletteGenerator.getRandomRow(15))
);
final List<ItemStack[]> items = List.of(
new ItemStack[]{
rows.getFirst().next(),
rows.getFirst().next(),
rows.getFirst().next(),
rows.getFirst().next(),
rows.getFirst().next()
},
new ItemStack[]{
rows.get(1).next(),
rows.get(1).next(),
rows.get(1).next(),
rows.get(1).next(),
rows.get(1).next()
},
new ItemStack[]{
rows.get(2).next(),
rows.get(2).next(),
rows.get(2).next(),
rows.get(2).next(),
rows.get(2).next()
}
);
@Override
public void run() {
for (int j = 0; j < 5; j++) {
gui.setItem(3 + j * 9, items.getFirst()[j]);
gui.setItem(5 + j * 9, items.get(1)[j]);
gui.setItem(7 + j * 9, items.get(2)[j]);
}
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 0.5f, 2f);
if (i == 30) {
player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 0.5f, 0.5f);
EventListener.stopTask(player);
}
for (int j = 4; j >= 1; j--) {
items.getFirst()[j] = items.getFirst()[j - 1];
items.get(1)[j] = items.get(1)[j - 1];
items.get(2)[j] = items.get(2)[j - 1];
}
items.getFirst()[0] = rows.getFirst().next();
items.get(1)[0] = rows.get(1).next();
items.get(2)[0] = rows.get(2).next();
i++;
}
}.runTaskTimer(BlockAndSeek.getInstance(), 0, 3L));
new BukkitRunnable() {
@Override
public void run() {
Inventory inventory = player.getOpenInventory().getTopInventory();
if (inventory.getHolder() instanceof RouletteCreator) {
inventory.close();
MiscDisguise miscDisguise = new MiscDisguise(DisguiseType.FALLING_BLOCK, inventory.getItem(21));
DisguiseAPI.disguiseToAll(player, miscDisguise);
}
}
}.runTaskLater(BlockAndSeek.getInstance(), 300L);
if (openInventory) {
player.openInventory(gui);
player.setMetadata("RollingMenu", new FixedMetadataValue(BlockAndSeek.getInstance(), "RollingMenu"));
}
}
@Override @Override
public @NotNull Inventory getInventory() { public @NotNull Inventory getInventory() {
return roulette;
Inventory gui = Bukkit.createInventory(this, 45, Component.text("РулетОЧКА"));
ItemStack filler = new ItemStack(Material.BLUE_STAINED_GLASS_PANE);
ItemMeta fillerMeta = filler.getItemMeta();
fillerMeta.displayName(Component.text(""));
fillerMeta.lore(null);
fillerMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
filler.setItemMeta(fillerMeta);
for (int i = 0; i < 45; i++) {
gui.setItem(i, filler);
} }
return gui;
public void closeInventory() {
closedByPlayer = false;
roulette.close();
} }
public void closeInventoryByPlayer() {
closedByPlayer = true;
roulette.close();
}
public ItemStack randomPropItem() {
return roulette.getItem(slots[random.nextInt(0, 15)]);
}
public ItemStack randomMidPropItem() {
return roulette.getItem(midSlots[random.nextInt(0, 3)]);
}
@ApiStatus.Experimental
private void createUnoptimizedRoulette(Inventory gui, Player player, List<BlockAndSeekMap.Block> blocks) {
BukkitTask rouletteTask = new BukkitRunnable() {
final RouletteGenerator rouletteGenerator = new RouletteGenerator(blocks);
final List<RouletteList<ItemStack>> rows = List.of(
new RouletteList<>(rouletteGenerator.getRandomRow(15)),
new RouletteList<>(rouletteGenerator.getRandomRow(15)),
new RouletteList<>(rouletteGenerator.getRandomRow(15))
);
final List<ItemStack[]> items;
{
List<ItemStack[]> rawItems = new ArrayList<>();
for (int j = 0; j < 3; j++) {
ItemStack[] itemStacks = new ItemStack[5];
for (int l = 0; l < 5; l++) {
itemStacks[l] = rows.get(j).next();
}
rawItems.add(j, itemStacks);
}
items = rawItems;
}
final long startTime = System.currentTimeMillis();
double currentSpeed = 0;
int i = 0;
@Override
public void run() {
long now = System.currentTimeMillis();
double elapsed = (now - startTime) / 1000.0;
if (elapsed >= 9.5) {
this.cancel();
}
double speed;
if (elapsed < 3.0) speed = 1.0;
else if (elapsed < 3.5) speed = 0.8;
else if (elapsed < 4.0) speed = 0.6;
else if (elapsed < 4.5) speed = 0.5;
else if (elapsed < 5.0) speed = 0.4;
else if (elapsed < 5.5) speed = 0.33;
else if (elapsed < 6.0) speed = 0.28;
else if (elapsed < 6.5) speed = 0.25;
else if (elapsed < 7.0) speed = 0.22;
else if (elapsed < 7.5) speed = 0.2;
else if (elapsed < 8.0) speed = 0.12;
else speed = 0.05;
task(speed);
i++;
}
private void task(double speed) {
if (currentSpeed >= 1) {
currentSpeed = 0;
for (int j = 0; j < 5; j++) {
gui.setItem(3 + j * 9, items.getFirst()[j]);
gui.setItem(5 + j * 9, items.get(1)[j]);
gui.setItem(7 + j * 9, items.get(2)[j]);
}
player.playSound(player.getLocation(), Sound.UI_BUTTON_CLICK, 0.5f, 2f);
for (int j = 4; j >= 1; j--) {
items.getFirst()[j] = items.getFirst()[j - 1];
items.get(1)[j] = items.get(1)[j - 1];
items.get(2)[j] = items.get(2)[j - 1];
}
items.getFirst()[0] = rows.getFirst().next();
items.get(1)[0] = rows.get(1).next();
items.get(2)[0] = rows.get(2).next();
} else currentSpeed += speed;
}
}.runTaskTimer(BlockAndSeek.getInstance(), 0, 1);
task = new Task(rouletteTask, Bukkit.getScheduler().runTaskLater(BlockAndSeek.getInstance(), this::closeInventory, 300));
player.openInventory(gui);
}
public record Task(BukkitTask rouletteTask, BukkitTask autoCloseTask) {
public void cancelBoth() {
rouletteTask.cancel();
autoCloseTask.cancel();
}
}
} }

View File

@@ -36,3 +36,5 @@ en-US:
game-player-count: "<yellow>{players}<gold> of <yellow>{max-players}<gold> players" game-player-count: "<yellow>{players}<gold> of <yellow>{max-players}<gold> players"
leave-item: "<red>Leave game" leave-item: "<red>Leave game"
roulette-title: "<bold><gold>Props Roulette"