some improvments, bugs and bugfixed )
This commit is contained in:
18
.classpath
Normal file
18
.classpath
Normal 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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
6
.idea/hotswap_agent.xml
generated
Normal 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
8
.idea/modules/BlockAndSeek.iml
generated
Normal 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
34
.project
Normal 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>
|
||||
@@ -1,5 +1,6 @@
|
||||
package hdvtdev.blockAndSeek;
|
||||
|
||||
import hdvtdev.blockAndSeek.eventListeners.DefaultEventListener;
|
||||
import hdvtdev.blockAndSeek.eventListeners.EventListener;
|
||||
import hdvtdev.blockAndSeek.eventListeners.ForceControlEventListener;
|
||||
import hdvtdev.blockAndSeek.managers.ConfigManager;
|
||||
@@ -66,15 +67,12 @@ public class BlockAndSeek extends JavaPlugin {
|
||||
getLogger().severe("Failed to save some .yml configs!");
|
||||
}
|
||||
|
||||
|
||||
getLogger().warning(ConfigManager.getConfig().toString());
|
||||
|
||||
PluginCommand command = Objects.requireNonNull(getCommand("blockandseek"));
|
||||
command.setExecutor(new CommandListener());
|
||||
|
||||
PluginManager manager = getServer().getPluginManager();
|
||||
if (ConfigManager.getConfig().forceControl()) manager.registerEvents(new ForceControlEventListener(), this);
|
||||
manager.registerEvents(new EventListener(), this);
|
||||
manager.registerEvents(ConfigManager.getConfig().forceControl() ? new ForceControlEventListener() : new EventListener(), this);
|
||||
manager.registerEvents(new DefaultEventListener(), this);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -14,10 +14,7 @@ import org.bukkit.persistence.PersistentDataType;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@@ -113,6 +110,10 @@ public class BlockAndSeekGame {
|
||||
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() {
|
||||
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();
|
||||
inventory.clear();
|
||||
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);
|
||||
player.setGlowing(false);
|
||||
player.setInvulnerable(false);
|
||||
Utils.setLevelWithBar(player, 0);
|
||||
player.setVisibleByDefault(true);
|
||||
player.setGameMode(GameMode.SURVIVAL);
|
||||
player.teleport(serverLobby);
|
||||
@@ -163,23 +165,31 @@ public class BlockAndSeekGame {
|
||||
}
|
||||
|
||||
private void preEnd() {
|
||||
for (Player player : players.keySet()) {
|
||||
player.setInvulnerable(true);
|
||||
}
|
||||
for (Player hider : getHiders()) {
|
||||
hider.getInventory().clear();
|
||||
FreezeManager.unfreezeIfFrozen(hider);
|
||||
hider.setGlowing(true);
|
||||
hider.setInvulnerable(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void selectRandomSeekers(int count) {
|
||||
ArrayList<Player> playerList = new ArrayList<>(players.keySet());
|
||||
Collections.shuffle(playerList);
|
||||
List<Player> seekers = playerList.subList(0, Math.min(count, playerList.size()));
|
||||
for (Player seeker : seekers) {
|
||||
ArrayList<Player> rawSeekers = new ArrayList<>();
|
||||
Set<Player> playerSet = players.keySet();
|
||||
for (Player player : playerSet) {
|
||||
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);
|
||||
ItemManager.setSeekerSet(seeker);
|
||||
Utils.setLevelWithBar(seeker, 100);
|
||||
seeker.setInvulnerable(false);
|
||||
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) {
|
||||
|
||||
preEnd();
|
||||
if (getHidersCount() == 1) {
|
||||
Localization.sendTitle(
|
||||
|
||||
@@ -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" -> {
|
||||
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.DIRT), 10),
|
||||
new BlockAndSeekMap.Block(new ItemStack(Material.LANTERN), 10),
|
||||
|
||||
35
src/main/java/hdvtdev/blockAndSeek/Utils.java
Normal file
35
src/main/java/hdvtdev/blockAndSeek/Utils.java
Normal 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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,176 +1,30 @@
|
||||
package hdvtdev.blockAndSeek.eventListeners;
|
||||
|
||||
|
||||
import hdvtdev.blockAndSeek.BlockAndSeek;
|
||||
import hdvtdev.blockAndSeek.Keys;
|
||||
import hdvtdev.blockAndSeek.managers.FreezeManager;
|
||||
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 hdvtdev.blockAndSeek.Utils;
|
||||
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.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockDamageEvent;
|
||||
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.PlayerDeathEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
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 {
|
||||
|
||||
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
|
||||
public void onDrop(PlayerDropItemEvent event) {
|
||||
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
|
||||
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.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
|
||||
public void onBlockPlacement(BlockPlaceEvent event) {
|
||||
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);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class FreezeManager {
|
||||
location.getWorld().setBlockData(blockLocation, data.blockData);
|
||||
player.getPersistentDataContainer().remove(Keys.FROZEN_PLAYER);
|
||||
|
||||
|
||||
player.setFreezeTicks(0);
|
||||
data.armorStand.remove();
|
||||
player.setInvulnerable(false);
|
||||
|
||||
@@ -110,6 +110,8 @@ public class FreezeManager {
|
||||
|
||||
DisguiseAPI.disguiseToAll(player, hideDisguise);
|
||||
|
||||
player.setFreezeTicks(40);
|
||||
|
||||
|
||||
frozenPlayers.put(player, new FreezeData(armorStand, blockData, disguise));
|
||||
} else return false;
|
||||
|
||||
@@ -3,13 +3,9 @@ package hdvtdev.blockAndSeek.managers;
|
||||
import hdvtdev.blockAndSeek.BlockAndSeek;
|
||||
import hdvtdev.blockAndSeek.BlockAndSeekGame;
|
||||
import hdvtdev.blockAndSeek.BlockAndSeekMap;
|
||||
import hdvtdev.blockAndSeek.Localization;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.WorldCreator;
|
||||
import org.bukkit.scoreboard.Criteria;
|
||||
import org.bukkit.scoreboard.DisplaySlot;
|
||||
import org.bukkit.scoreboard.Objective;
|
||||
import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Set;
|
||||
@@ -18,9 +14,14 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
public class GamesManager {
|
||||
|
||||
private static final ConcurrentHashMap<String, BlockAndSeekGame> games = new ConcurrentHashMap<>();
|
||||
private static final Set<Player> seekerImmune = ConcurrentHashMap.newKeySet();
|
||||
|
||||
public static boolean isExist(String name) {
|
||||
return games.containsKey(name);
|
||||
public static boolean triggerSeekerImmune(Player player) {
|
||||
return seekerImmune.remove(player);
|
||||
}
|
||||
|
||||
public static void addSeekerImmune(Player player) {
|
||||
seekerImmune.add(player);
|
||||
}
|
||||
|
||||
public static Set<String> getAvailableGames() {
|
||||
@@ -51,33 +52,4 @@ public class GamesManager {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -94,6 +94,7 @@ public class ItemManager {
|
||||
meta.setColor(Color.RED);
|
||||
meta.setUnbreakable(true);
|
||||
meta.addEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 10, true);
|
||||
meta.addEnchant(Enchantment.THORNS, 3, true);
|
||||
meta.displayName(Component.text("seeker-armor"));
|
||||
|
||||
return meta;
|
||||
|
||||
@@ -2,241 +2,169 @@ package hdvtdev.blockAndSeek.roulette;
|
||||
|
||||
import hdvtdev.blockAndSeek.BlockAndSeek;
|
||||
import hdvtdev.blockAndSeek.BlockAndSeekMap;
|
||||
import hdvtdev.blockAndSeek.eventListeners.EventListener;
|
||||
import me.libraryaddict.disguise.DisguiseAPI;
|
||||
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
|
||||
import me.libraryaddict.disguise.disguisetypes.MiscDisguise;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import hdvtdev.blockAndSeek.Localization;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
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.BukkitTask;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
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) {
|
||||
final Inventory gui = Bukkit.createInventory(null, 45);
|
||||
new BukkitRunnable() {
|
||||
private static final int[] slots = {3, 5, 7, 12, 14, 16, 21, 23, 25, 30, 32, 34, 39, 41, 43};
|
||||
private static final int[] midSlots = {21, 23, 25};
|
||||
private static final Random random = new Random();
|
||||
|
||||
private final Inventory roulette;
|
||||
private Task task;
|
||||
private volatile boolean closedByPlayer = true;
|
||||
|
||||
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()
|
||||
}
|
||||
);
|
||||
|
||||
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 RouletteCreator(@NotNull Player player, List<BlockAndSeekMap.Block> blocks) {
|
||||
roulette = Bukkit.createInventory(this, 45, Localization.getComponent(player, "roulette-title"));
|
||||
this.createUnoptimizedRoulette(roulette, player, blocks);
|
||||
}
|
||||
|
||||
|
||||
nextDelay = (long) (baseDelay + (maxDelay - baseDelay) * (1 - Math.exp(-k * elapsedSeconds)));
|
||||
|
||||
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]);
|
||||
public @NotNull Task getTask() {
|
||||
return task;
|
||||
}
|
||||
|
||||
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];
|
||||
public boolean isClosedByPlayer() {
|
||||
return closedByPlayer;
|
||||
}
|
||||
|
||||
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
|
||||
public @NotNull Inventory getInventory() {
|
||||
|
||||
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 roulette;
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -36,3 +36,5 @@ en-US:
|
||||
game-player-count: "<yellow>{players}<gold> of <yellow>{max-players}<gold> players"
|
||||
leave-item: "<red>Leave game"
|
||||
|
||||
roulette-title: "<bold><gold>Props Roulette"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user