diff --git a/pom.xml b/pom.xml index dfec714..96bfe42 100644 --- a/pom.xml +++ b/pom.xml @@ -19,12 +19,16 @@ brokkonaut https://www.iani.de/nexus/content/groups/public + + md5-repo + https://repo.md-5.net/content/groups/public/ + - io.papermc.paper - paper-api - 1.19.3-R0.1-SNAPSHOT + dev.folia + folia-api + 1.19.4-R0.1-SNAPSHOT provided @@ -75,6 +79,12 @@ 2.0.0-SNAPSHOT provided + + LibsDisguises + LibsDisguises + 10.0.32 + provided + diff --git a/src/main/java/de/fanta/challenges/Challenges.java b/src/main/java/de/fanta/challenges/Challenges.java index 98dab75..c846075 100644 --- a/src/main/java/de/fanta/challenges/Challenges.java +++ b/src/main/java/de/fanta/challenges/Challenges.java @@ -12,6 +12,10 @@ import de.fanta.challenges.events.TimerChangedEvent; import de.fanta.challenges.guis.BackpackGui; import de.fanta.challenges.listeners.EventRegistration; +import de.fanta.challenges.schedular.BukkitScheduler; +import de.fanta.challenges.schedular.CancellableTask; +import de.fanta.challenges.schedular.FoliaScheduler; +import de.fanta.challenges.schedular.Scheduler; import de.fanta.challenges.scoreboard.ScoreBoardManager; import de.fanta.challenges.scoreboard.ScoreManager; import de.fanta.challenges.utils.ChatUtil; @@ -24,6 +28,7 @@ import org.apache.commons.io.FileUtils; import org.bukkit.BanList; import org.bukkit.Bukkit; +import org.bukkit.Chunk; import org.bukkit.Difficulty; import org.bukkit.GameRule; import org.bukkit.Material; @@ -60,7 +65,7 @@ public NMSUtils nmsUtils; public PlayerUUIDCache playerUUIDCache; public String texturepacklink = null; - public int resetTaskId = -1; + public CancellableTask resetTaskId; public boolean reset = false; private String PREFIX; private String GUIPREFIX; @@ -100,6 +105,9 @@ public boolean resetwithseed; + private static final String CubesideMod_ModChannel = "cubesidemod:data"; + private Scheduler scheduler; + public static Challenges getPlugin() { return plugin; } @@ -116,13 +124,20 @@ cubesideStatistics = null; } - if (isCubesideStatisticsInstalled()) { statistics = new Statistics(this); } - protocolVersion = Bukkit.getUnsafe().getProtocolVersion(); + try { + Class.forName("io.papermc.paper.threadedregions.scheduler.ScheduledTask"); + getLogger().log(Level.INFO, "Folia found. Use Folia Scheduler"); + scheduler = new FoliaScheduler(this); + } catch (Throwable ignored) { + getLogger().log(Level.INFO, "Bukkit found. Use Bukkit Scheduler"); + scheduler = new BukkitScheduler(this); + } + protocolVersion = Bukkit.getUnsafe().getProtocolVersion(); this.timer = new Timer(this); this.rndDrops = new RandomDropsChallenge(); @@ -153,7 +168,7 @@ this.backpack.loadInventoryFromConfig(); this.sbManager = new ScoreBoardManager(this); - Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> { + getScheduler().runGlobalDelayed(() -> { World world = Bukkit.getWorld("world"); if (plugin.getServerType() != ServerType.ADVENTURE) { world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, false); @@ -265,12 +280,28 @@ startResetTask(); } - Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> { + getServer().getMessenger().registerOutgoingPluginChannel(this, CubesideMod_ModChannel); + + plugin.getScheduler().runGlobalDelayed(() -> { EventRegistration.pM.callEvent(new ServerStatusChangedEvent(true)); EventRegistration.pM.callEvent(new TimerChangedEvent(timer.isRunning())); EventRegistration.pM.callEvent(new PlayerCountChangedEvent(Bukkit.getOnlinePlayers().size() - plugin.getVanish().countVanishPlayers())); }, 200L); getLogger().info("Plugin loaded!"); + + /*World endWorld = Bukkit.getWorld("world_the_end"); + if (endWorld != null) { + for (Chunk chunk : endWorld.getLoadedChunks()) { + Troll.replaceEndChunk(chunk); + } + } + + World netherWorld = Bukkit.getWorld("world_nether"); + if (netherWorld != null) { + for (Chunk chunk : netherWorld.getLoadedChunks()) { + Troll.replaceNetherChunk(chunk); + } + }*/ } @Override @@ -455,14 +486,14 @@ public void startResetTask() { getLogger().info("Start Reset Task"); - resetTaskId = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "reset confirm"), 3 * 60 * 20); + resetTaskId = plugin.getScheduler().runGlobalDelayed(() -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "reset confirm"), 3 * 60 * 20); reset = true; } public void stopResetTask() { getLogger().info("Stop Reset Task"); - Bukkit.getScheduler().cancelTask(resetTaskId); - resetTaskId = -1; + resetTaskId.cancel(); + resetTaskId = null; reset = false; } @@ -634,4 +665,12 @@ public boolean isPlayerBanned(UUID uuid) { return bannedPlayers.contains(uuid); } + + public String getCubesideMod_ModChannel() { + return CubesideMod_ModChannel; + } + + public Scheduler getScheduler() { + return scheduler; + } } diff --git a/src/main/java/de/fanta/challenges/Timer.java b/src/main/java/de/fanta/challenges/Timer.java index 373de4f..fdfb6e9 100644 --- a/src/main/java/de/fanta/challenges/Timer.java +++ b/src/main/java/de/fanta/challenges/Timer.java @@ -1,6 +1,7 @@ package de.fanta.challenges; import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.schedular.CancellableTask; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; import de.iani.cubesideutils.StringUtil; @@ -15,8 +16,8 @@ public class Timer { private final Challenges plugin; - private int actionBarTaskId; - private int idleActionBarTaskId; + private CancellableTask actionBarTaskId; + private CancellableTask idleActionBarTaskId; private long time; // milliseconds private TimerMode mode; private long countingSinceTimestamp; @@ -32,11 +33,11 @@ public void startTimer() { countingSinceTimestamp = System.currentTimeMillis(); - if (idleActionBarTaskId > 0) { - Bukkit.getScheduler().cancelTask(idleActionBarTaskId); - idleActionBarTaskId = -1; + if (idleActionBarTaskId != null) { + idleActionBarTaskId.cancel(); + idleActionBarTaskId = null; } - actionBarTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> { + actionBarTaskId = plugin.getScheduler().runGlobalAtFixedRate(() -> { if (mode == TimerMode.DOWN) { if (time <= 0) { if (Config.getBoolean("event.enabled")) { @@ -71,9 +72,9 @@ } public void stopTimer() { - if (actionBarTaskId > 0) { - Bukkit.getScheduler().cancelTask(actionBarTaskId); - actionBarTaskId = -1; + if (actionBarTaskId != null) { + actionBarTaskId.cancel(); + actionBarTaskId = null; sendIdleActionBar(); } for (Player pp : Bukkit.getOnlinePlayers()) { @@ -89,7 +90,7 @@ } private void sendIdleActionBar() { - idleActionBarTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> { + idleActionBarTaskId = plugin.getScheduler().runGlobalAtFixedRate(() -> { for (Player p : Bukkit.getOnlinePlayers()) { if (!plugin.getVanish().isVanish(p)) { p.sendActionBar(ChatUtil.RED + "" + ChatColor.BOLD + "Der Timer ist pausiert."); @@ -145,7 +146,7 @@ } public boolean isRunning() { - return actionBarTaskId > 0; + return actionBarTaskId != null; } public boolean isReverse() { diff --git a/src/main/java/de/fanta/challenges/Troll.java b/src/main/java/de/fanta/challenges/Troll.java new file mode 100644 index 0000000..8133704 --- /dev/null +++ b/src/main/java/de/fanta/challenges/Troll.java @@ -0,0 +1,323 @@ +package de.fanta.challenges; + +import de.iani.cubesideutils.bukkit.items.ItemGroups; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.MobDisguise; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Chunk; +import org.bukkit.GameRule; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; +import org.bukkit.block.Block; +import org.bukkit.block.Chest; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.DragonBattle; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.Enderman; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.minecart.StorageMinecart; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +public class Troll implements Listener { + + /*private final Challenges plugin; + private static boolean enderDragonChanged = false; + private int taskId = -1; + + public Troll(Challenges plugin) { + this.plugin = plugin; + } + + @EventHandler + public void playerChangedWorld(PlayerChangedWorldEvent e) { + if (enderDragonChanged) { + return; + } + if (taskId == -1) { + startUpdateTask(); + } + } + + @EventHandler + public void onChunkLoad(ChunkLoadEvent e) { + if (e.getWorld().getEnvironment() == World.Environment.THE_END && e.isNewChunk()) { + Chunk chunk = e.getChunk(); + replaceEndChunk(chunk); + } + if (e.getWorld().getEnvironment() == World.Environment.NETHER && e.isNewChunk()) { + Chunk chunk = e.getChunk(); + replaceNetherChunk(chunk); + } + } + + @EventHandler + public void onMobSpawn(EntitySpawnEvent e) { + if (e.getEntity().getWorld().getEnvironment() == World.Environment.THE_END) { + if (e.getEntity() instanceof Enderman) { + Location loc = e.getEntity().getLocation(); + e.getEntity().remove(); + loc.getWorld().spawnEntity(loc, EntityType.SILVERFISH, CreatureSpawnEvent.SpawnReason.NATURAL); + } + } + } + + @EventHandler + public void onPlayerMove(PlayerMoveEvent e) { + if (e.getFrom().getWorld().getEnvironment() == World.Environment.NETHER) { + Player player = e.getPlayer(); + if (player.isSwimming() || player.isUnderWater() || player.isInWater()) { + if (!player.hasPotionEffect(PotionEffectType.FIRE_RESISTANCE) && !player.hasPotionEffect(PotionEffectType.POISON)) { + player.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 120, 1, false, false, true)); + } + } + } + } + + @EventHandler + public void onPlayerUseLootChest(PlayerInteractEvent e) { + Block block = e.getClickedBlock(); + if (block == null) { + return; + } + if (!(block.getState() instanceof Chest chest)) { + return; + } + if (chest.getLootTable() == null) { + return; + } + randomLootChest(chest.getInventory()); + } + + @EventHandler + public void onPlayerUseEntityLootChest(PlayerInteractEntityEvent e) { + Entity entity = e.getRightClicked(); + + if (!(entity instanceof StorageMinecart minecart)) { + return; + } + + if (minecart.getLootTable() == null) { + return; + } + + randomLootChest(minecart.getInventory()); + } + + public void randomLootChest(Inventory chest) { + plugin.getScheduler().runLocalDelayed(chest.getLocation(), () -> { + for (ItemStack stack : chest.getContents()) { + if (stack != null) { + stack.setType(getRandomBlockFromList(new HashSet<>(plugin.getMaterials()))); + } + } + }, 1L); + } + + public static void replaceEndChunk(Chunk chunk) { + int x = chunk.getX() << 4; + int z = chunk.getZ() << 4; + + World world = chunk.getWorld(); + for (int xx = x; xx < x + 16; xx++) { + for (int zz = z; zz < z + 16; zz++) { + for (int yy = world.getMinHeight(); yy < world.getMaxHeight(); yy++) { + Block block = world.getBlockAt(xx, yy, zz); + + if (block.getType() == Material.END_STONE) { + block.setType(Material.HONEYCOMB_BLOCK, false); + continue; + } + if (block.getType() == Material.OBSIDIAN) { + block.setType(Material.BLACK_TERRACOTTA, false); + } + } + } + } + } + + public static void replaceNetherChunk(Chunk chunk) { + int x = chunk.getX() << 4; + int z = chunk.getZ() << 4; + + World world = chunk.getWorld(); + for (int xx = x; xx < x + 16; xx++) { + for (int zz = z; zz < z + 16; zz++) { + for (int yy = 0; yy < 128; yy++) { + Block block = world.getBlockAt(xx, yy, zz); + if (block.getType() == Material.AIR) { + continue; + } + + if (block.getType() == Material.NETHERRACK || block.getType() == Material.CRIMSON_NYLIUM || block.getType() == Material.WARPED_NYLIUM) { + block.setType(getRandomBlockFromList(ItemGroups.CONCRETE), false); + continue; + } + if (block.getType() == Material.LAVA) { + block.setType(Material.WATER, false); + continue; + } + if (block.getType() == Material.SOUL_SOIL || block.getType() == Material.SOUL_SAND) { + block.setType(Material.HAY_BLOCK, false); + continue; + } + if (block.getType() == Material.GLOWSTONE) { + block.setType(getRandomBlockFromList(ItemGroups.FROG_LIGHT), false); + continue; + } + if (block.getType() == Material.GRAVEL) { + block.setType(getRandomBlockFromList(ItemGroups.CONCRETE_POWDER), false); + continue; + } + if (block.getType() == Material.MAGMA_BLOCK) { + block.setType(Material.MUD, false); + continue; + } + if (block.getType() == Material.BONE_BLOCK) { + block.setType(Material.DIAMOND_ORE, false); + continue; + } + if (block.getType() == Material.FIRE) { + block.setType(Material.PINK_PETALS, false); + continue; + } + if (block.getType() == Material.NETHER_QUARTZ_ORE) { + block.setType(Material.COAL_ORE, false); + continue; + } + if (block.getType() == Material.NETHER_GOLD_ORE) { + block.setType(Material.GOLD_ORE, false); + continue; + } + if (block.getType() == Material.BASALT) { + block.setType(Material.RED_SANDSTONE, false); + continue; + } + if (block.getType() == Material.BLACKSTONE) { + block.setType(Material.DEEPSLATE, false); + continue; + } + if (block.getType() == Material.RED_MUSHROOM || block.getType() == Material.BROWN_MUSHROOM) { + block.setType(getRandomBlockFromList(ItemGroups.SINGLE_BLOCK_PLANTS), false); + continue; + } + if (block.getType() == Material.NETHER_WART_BLOCK) { + block.setType(Material.FLOWERING_AZALEA_LEAVES, false); + continue; + } + if (block.getType() == Material.CRIMSON_STEM) { + block.setType(Material.DARK_OAK_LOG, false); + continue; + } + if (block.getType() == Material.WARPED_STEM) { + block.setType(Material.CHERRY_LOG, false); + continue; + } + if (block.getType() == Material.WARPED_WART_BLOCK) { + block.setType(Material.CHERRY_LEAVES, false); + continue; + } + if (block.getType() == Material.CRIMSON_FUNGUS || block.getType() == Material.WARPED_FUNGUS) { + block.setType(getRandomBlockFromList(ItemGroups.CANDLE), false); + continue; + } + if (block.getType() == Material.CRIMSON_ROOTS) { + block.setType(Material.LIGHT_WEIGHTED_PRESSURE_PLATE, false); + continue; + } + if (block.getType() == Material.WARPED_ROOTS) { + block.setType(Material.HEAVY_WEIGHTED_PRESSURE_PLATE, false); + continue; + } + if (block.getType() == Material.SHROOMLIGHT) { + block.setType(Material.JACK_O_LANTERN, false); + continue; + } + if (block.getType() == Material.WEEPING_VINES || block.getType() == Material.WEEPING_VINES_PLANT) { + block.setType(Material.GLOW_LICHEN, false); + continue; + } + if (block.getType() == Material.TWISTING_VINES || block.getType() == Material.TWISTING_VINES_PLANT) { + block.setType(Material.SCAFFOLDING, false); + continue; + } + if (block.getType() == Material.NETHER_SPROUTS) { + block.setType(getRandomBlockFromList(ItemGroups.CARPET), false); + } + } + } + } + } + + private static Material getRandomBlockFromList(Set materials) { + List list = new ArrayList<>(materials); + int size = list.size(); + int randIdx = new Random().nextInt(size); + return list.get(randIdx); + } + + public void replaceDragon() { + World world = Bukkit.getWorld("world_the_end"); + if (world != null) { + DragonBattle dragonBattle = world.getEnderDragonBattle(); + if (dragonBattle != null && dragonBattle.getEnderDragon() != null) { + EnderDragon dragon = dragonBattle.getEnderDragon(); + dragonBattle.getBossBar().setColor(BarColor.YELLOW); + dragon.setCustomName(ChatColor.YELLOW + "Ender Bee"); + dragon.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(2000); + dragon.setHealth(dragon.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + MobDisguise disguiseType = new MobDisguise(DisguiseType.BEE); + DisguiseAPI.disguiseEntity(dragon, disguiseType); + world.setGameRule(GameRule.MOB_GRIEFING, false); + for (Entity entity : world.getEntities()) { + if (entity instanceof Enderman) { + Location loc = entity.getLocation(); + entity.remove(); + world.spawnEntity(loc, EntityType.SILVERFISH, CreatureSpawnEvent.SpawnReason.NATURAL); + } + } + enderDragonChanged = true; + stopUpdateTask(); + } + } + } + + public void startUpdateTask() { + taskId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L); + } + + public void stopUpdateTask() { + plugin.getServer().getScheduler().cancelTask(taskId); + } + + private void tick() { + if (enderDragonChanged) { + return; + } + + replaceDragon(); + }*/ +} diff --git a/src/main/java/de/fanta/challenges/challenges/AllItemsChallenge.java b/src/main/java/de/fanta/challenges/challenges/AllItemsChallenge.java index 7533758..84f794b 100644 --- a/src/main/java/de/fanta/challenges/challenges/AllItemsChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/AllItemsChallenge.java @@ -1,8 +1,10 @@ package de.fanta.challenges.challenges; import de.fanta.challenges.Challenges; +import de.fanta.challenges.schedular.CancellableTask; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.fanta.challenges.utils.CubesideModUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; @@ -20,7 +22,7 @@ public class AllItemsChallenge { - public static int ItemScheduler; + public static CancellableTask ItemScheduler; public static BossBar bossBar; public static Material item; public static List foundItems = new ArrayList<>(); @@ -67,7 +69,7 @@ } public static void update() { - ItemScheduler = Bukkit.getScheduler().scheduleSyncRepeatingTask(Challenges.getPlugin(), () -> { + ItemScheduler = plugin.getScheduler().runGlobalAtFixedRate(() -> { if (Config.getBoolean("allitems") && Challenges.getPlugin().getTimer().isRunning()) { if (itemsToSearch.size() != 0) { for (Player pp : Bukkit.getOnlinePlayers()) { @@ -87,12 +89,12 @@ for (Player pl : Bukkit.getOnlinePlayers()) { pl.playSound(pl.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 0.2f, 1); } - Bukkit.getScheduler().cancelTask(ItemScheduler); + ItemScheduler.cancel(); } } else { bossBar.removeAll(); } - }, 0, 10); + }, 1, 10); } public static void next(Player p, Boolean skipped) { @@ -112,6 +114,7 @@ ChatUtil.sendBrodcastMessage("Neues Item: " + ChatUtil.BLUE + item.toString().replace("_", " ") + ChatUtil.GREEN + " (Es fehlen noch " + ChatUtil.BLUE + (foundItems.size()) + ChatUtil.GREEN + " Items)"); for (Player pp : Bukkit.getOnlinePlayers()) { pp.playSound(pp.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1, 1); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, pp, 50, ChatUtil.GREEN); } } } diff --git a/src/main/java/de/fanta/challenges/challenges/BedrockWallChallenge.java b/src/main/java/de/fanta/challenges/challenges/BedrockWallChallenge.java index e27c79e..470c1a4 100644 --- a/src/main/java/de/fanta/challenges/challenges/BedrockWallChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/BedrockWallChallenge.java @@ -29,7 +29,7 @@ } private void setWall(Location loc) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runLocalDelayed(loc, () -> { World world = loc.getWorld(); for (int y = world.getMinHeight(); y < world.getMaxHeight(); y++) { Block block = loc.set(loc.getX(), y, loc.getZ()).getBlock(); diff --git a/src/main/java/de/fanta/challenges/challenges/Challenge.java b/src/main/java/de/fanta/challenges/challenges/Challenge.java new file mode 100644 index 0000000..56f0272 --- /dev/null +++ b/src/main/java/de/fanta/challenges/challenges/Challenge.java @@ -0,0 +1,17 @@ +package de.fanta.challenges.challenges; + +import org.bukkit.event.player.PlayerExpChangeEvent; +import org.bukkit.inventory.ItemStack; + +public interface Challenge { + + String getName(); + + ItemStack createNewDisplayItem(); + + boolean isActive(); + + default void handlePlayerExpChange(PlayerExpChangeEvent e) { + + } +} diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BingoChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BingoChallengeEvent.java index d1e6e0f..db2d876 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BingoChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BingoChallengeEvent.java @@ -9,6 +9,7 @@ import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.fanta.challenges.utils.CubesideModUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -195,6 +196,7 @@ plugin.getScoreManager().updateScore(new ChallengePlayer(player.getUniqueId()), 1); ChatUtil.sendNormalMessage(player, "Item: " + ChatUtil.BLUE + itemStack.getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, player, 50, ChatUtil.GREEN); if (plugin.getScoreManager().getScore(new ChallengePlayer(player.getUniqueId())) == materials.size()) { plugin.getTimer().stopTimer(); @@ -225,6 +227,7 @@ } ChatUtil.sendNormalMessage(onlinePlayer, "Item: " + ChatUtil.BLUE + itemStack.getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); onlinePlayer.playSound(onlinePlayer.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, onlinePlayer, 50, ChatUtil.GREEN); if (plugin.getScoreManager().getScore(TeamUtils.getPlayerTeam(onlinePlayer)) == materials.size()) { if (eventend) { diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java index 82148bd..a12a0ae 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/BridgeRaceChallengeEvent.java @@ -253,7 +253,7 @@ setBedrock(getPlayerLocation(player).clone()); Location teleportLocation = getPlayerLocation(player).clone().add(0.5, 2, 0.5); teleportLocation.setYaw(-90); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> player.teleport(teleportLocation), 1L); + plugin.getScheduler().runDelayedOnEntity(player, () -> player.teleport(teleportLocation), 1L); } private static Location getPlayerLocation(Player player) { diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java index 5500110..89cda07 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DeathrunChallengeEvent.java @@ -120,7 +120,7 @@ public void onDamage(EntityDamageEvent e) { if (e.getEntity() instanceof Player p) { if (Objects.equals(Config.getString("event.type"), "deathrun") && plugin.getTimer().isRunning()) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.setWalkSpeed((float) (p.getHealth() / 100f)), 1L); + plugin.getScheduler().runDelayedOnEntity(p, () -> p.setWalkSpeed((float) (p.getHealth() / 100f)), 1L); } } } @@ -166,7 +166,7 @@ } else { World world = Bukkit.getWorld("world"); world.setGameRule(GameRule.MAX_ENTITY_CRAMMING, Bukkit.getServer().getMaxPlayers()); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runGlobalDelayed(() -> { for (Player pp : Bukkit.getOnlinePlayers()) { plugin.getScoreManager().join(new ChallengePlayer(pp.getUniqueId())); Location spawn = world.getSpawnLocation(); diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DifferentItemsChallenge.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DifferentItemsChallenge.java index 98c61e4..7791a96 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DifferentItemsChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/DifferentItemsChallenge.java @@ -7,6 +7,7 @@ import de.fanta.challenges.scoreboard.ScoreManager; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.fanta.challenges.utils.CubesideModUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; @@ -16,12 +17,14 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerAttemptPickupItemEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketEntityEvent; import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -66,6 +69,35 @@ if (playerInv != null && playerInv.equals(e.getClickedInventory())) { return; } + if (e.getClickedInventory() instanceof CraftingInventory) { + ChatUtil.sendDebugMessage(e.getWhoClicked(), "Cancel crafting"); + return; + } + + ItemStack itemStack = e.getCurrentItem(); + if (itemStack != null && itemStack.getType() != Material.AIR) { + addDiscoveredItem(player, itemStack); + } + } + + @EventHandler + public void onItemCraft(CraftItemEvent e) { + Player player = (Player) e.getWhoClicked(); + Inventory playerInv = BingoItemsGui.getPlayerInvs().get(player.getUniqueId()); + if (e.getClickedInventory() == null) { + return; + } + if (!isRunning()) { + return; + } + if (playerInv != null && playerInv.equals(e.getClickedInventory())) { + return; + } + + if (e.isCancelled()) { + return; + } + ItemStack itemStack = e.getCurrentItem(); if (itemStack != null && itemStack.getType() != Material.AIR) { addDiscoveredItem(player, itemStack); @@ -133,6 +165,7 @@ plugin.getScoreManager().updateScore(new ChallengePlayer(player.getUniqueId()), 1); ChatUtil.sendNormalMessage(player, "Item: " + ChatUtil.BLUE + itemStack.getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); player.playSound(player, Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 2.0F); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, player, 50, ChatUtil.GREEN); updateBossBar(); } } diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java index 80ad5ca..74f5168 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/ForceItemChallengeEvent.java @@ -8,6 +8,7 @@ import de.fanta.challenges.utils.ChatSkullAPI.ChatSkull; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.fanta.challenges.utils.CubesideModUtils; import de.fanta.challenges.utils.guiutils.AbstractWindow; import de.fanta.challenges.utils.guiutils.GUIUtils; import org.bukkit.Bukkit; @@ -393,7 +394,7 @@ public void onRespawn(PlayerRespawnEvent e) { if (isRunning()) { Player player = e.getPlayer(); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> addArmorStand(player), 1L); + plugin.getScheduler().runDelayedOnEntity(player, () -> addArmorStand(player), 1L); PlayerInventory inventory = e.getPlayer().getInventory(); int countSkipper = 0; @@ -537,6 +538,7 @@ playerMaterials.put(player.getUniqueId(), itemList); plugin.getScoreManager().updateScore(new ChallengePlayer(player.getUniqueId()), 1); ChatUtil.sendNormalMessage(player, "Item: " + ChatUtil.BLUE + new ItemStack(pickupItem).getI18NDisplayName() + ChatUtil.GREEN + " wurde Registriert"); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, player, 50, ChatUtil.GREEN); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 1.0F, 1.0F); updateItem(player); @@ -584,7 +586,7 @@ } public void addArmorStand(Player player) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(player, () -> { if (!player.isDead()) { mountArmorStand(player); if (itemByPlayerList.get(player.getUniqueId()) != null) { diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/SammelFieberChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/SammelFieberChallengeEvent.java index c7032eb..f20a869 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/SammelFieberChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeEvents/SammelFieberChallengeEvent.java @@ -176,7 +176,7 @@ } } } - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> e.getInventory().clear(), 1); + plugin.getScheduler().runLocalDelayed(e.getInventory().getLocation(), () -> e.getInventory().clear(), 1); } private void updatePlayerBossBar() { diff --git a/src/main/java/de/fanta/challenges/challenges/ChallengeGoals.java b/src/main/java/de/fanta/challenges/challenges/ChallengeGoals.java index a8edd23..ffd6488 100644 --- a/src/main/java/de/fanta/challenges/challenges/ChallengeGoals.java +++ b/src/main/java/de/fanta/challenges/challenges/ChallengeGoals.java @@ -4,7 +4,9 @@ import de.fanta.challenges.ServerType; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.iani.cubesideutils.StringUtil; import net.md_5.bungee.api.ChatColor; +import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; @@ -27,7 +29,11 @@ ChatUtil.sendBrodcastMessage(""); ChatUtil.sendBrodcastMessage(""); ChatUtil.sendBrodcastMessage(""); - ChatUtil.sendBrodcastMessage(ChatUtil.ORANGE + " >> " + ChatUtil.GREEN + "Der " + ChatUtil.BLUE + ChatColor.BOLD + e.getEntity().getName().toLowerCase() + ChatUtil.GREEN + " wurde besiegt."); + if (e.getEntity().getCustomName() != null) { + ChatUtil.sendBrodcastMessage(ChatUtil.ORANGE + " >> " + ChatUtil.BLUE + ChatColor.BOLD + e.getEntity().getCustomName() + ChatUtil.GREEN + " wurde besiegt."); + } else { + ChatUtil.sendBrodcastMessage(ChatUtil.ORANGE + " >> " + ChatUtil.GREEN + "Der " + ChatUtil.BLUE + ChatColor.BOLD + StringUtil.capitalizeFirstLetter(e.getEntity().getName().toLowerCase(), false) + ChatUtil.GREEN + " wurde besiegt."); + } ChatUtil.sendBrodcastMessage(ChatUtil.ORANGE + " >> " + ChatUtil.GREEN + "Benötigte Zeit: " + plugin.getTimer().formatTime(ChatUtil.BLUE) + ChatUtil.GREEN + "!"); ChatUtil.sendBrodcastMessage(ChatUtil.ORANGE + " >> " + ChatUtil.GREEN + "Seed: " + ChatUtil.BLUE + ChatColor.BOLD + Bukkit.getWorlds().get(0).getSeed()); if (e.getEntity().getType() == EntityType.ENDER_DRAGON) { diff --git a/src/main/java/de/fanta/challenges/challenges/ClearInventoryByDamageChallenge.java b/src/main/java/de/fanta/challenges/challenges/ClearInventoryByDamageChallenge.java index f1f5b5c..526e3bc 100644 --- a/src/main/java/de/fanta/challenges/challenges/ClearInventoryByDamageChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/ClearInventoryByDamageChallenge.java @@ -3,6 +3,7 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.fanta.challenges.utils.CubesideModUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; @@ -21,6 +22,7 @@ if (plugin.getTimer().isRunning() && p.getGameMode() == GameMode.SURVIVAL && !plugin.getVanish().isVanish(p)) { for (Player pp : Bukkit.getOnlinePlayers()) { pp.getInventory().clear(); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, pp, 50, ChatUtil.RED); ChatUtil.sendNormalMessage(pp, ChatUtil.BLUE + p.getName() + ChatUtil.ORANGE + " hat Schaden bekommen! Alle Inventare wurden geleert!"); } } diff --git a/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java b/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java index c4dcd09..63dc784 100644 --- a/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/MLGChallenge.java @@ -61,7 +61,7 @@ if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId())) { mlgResult(e.getPlayer(), true); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> e.getPlayer().spigot().respawn(), 1L); + plugin.getScheduler().runDelayedOnEntity(e.getPlayer(), () -> e.getPlayer().spigot().respawn(), 1L); } } } @@ -96,7 +96,7 @@ @EventHandler public void onBucketEmpty(PlayerBucketEmptyEvent e) { if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runLocalDelayed(e.getBlock().getLocation(), () -> { if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId()) && !e.getPlayer().isDead()) { mlgResult(e.getPlayer(), false); } @@ -107,7 +107,7 @@ @EventHandler public void onBlockPlace(BlockPlaceEvent e) { if (isMLGinProgress() && e.getPlayer().getWorld().getName().equals("mlg_challenge")) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runLocalDelayed(e.getBlock().getLocation(), () -> { if (mlgPlayerMap.containsKey(e.getPlayer().getUniqueId()) && !e.getPlayer().isDead()) { mlgResult(e.getPlayer(), false); } @@ -119,7 +119,7 @@ public void onEntityMount(EntityMountEvent e) { if (isMLGinProgress() && e.getMount().getWorld().getName().equals("mlg_challenge")) { if (e.getEntity() instanceof Player player) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(e.getMount(), () -> { if (mlgPlayerMap.containsKey(player.getUniqueId()) && !player.isDead()) { mlgResult(player, false); } @@ -177,9 +177,9 @@ mlgBlocks.add(Material.TWISTING_VINES); } Material mlgItem = mlgBlocks.get(random.nextInt(mlgBlocks.size())); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.getInventory().setItemInMainHand(new ItemStack(mlgItem)), 1L); + plugin.getScheduler().runDelayedOnEntity(p, () -> p.getInventory().setItemInMainHand(new ItemStack(mlgItem)), 1L); } else { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.getInventory().setItemInMainHand(new ItemStack(Material.WATER_BUCKET)), 1L); + plugin.getScheduler().runDelayedOnEntity(p, () -> p.getInventory().setItemInMainHand(new ItemStack(Material.WATER_BUCKET)), 1L); } if (mlgLocation == null) { @@ -219,14 +219,14 @@ } if (mlgPlayerMap.isEmpty()) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> setMLGinProgress(false), 60L); + plugin.getScheduler().runGlobalDelayed(() -> setMLGinProgress(false), 60L); } } private static void mlgBack(final Player p, Location loc, ItemStack[] content) { p.teleport(loc); p.getInventory().setContents(content); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> p.setInvulnerable(false), 60L); + plugin.getScheduler().runDelayedOnEntity(p, () -> p.setInvulnerable(false), 60L); } private static void tick() { diff --git a/src/main/java/de/fanta/challenges/challenges/ManHunt.java b/src/main/java/de/fanta/challenges/challenges/ManHunt.java new file mode 100644 index 0000000..742ec1d --- /dev/null +++ b/src/main/java/de/fanta/challenges/challenges/ManHunt.java @@ -0,0 +1,282 @@ +package de.fanta.challenges.challenges; + +import de.fanta.challenges.Challenges; +import de.fanta.challenges.events.TimerChangedEvent; +import de.fanta.challenges.utils.ChatUtil; +import de.fanta.challenges.utils.Config; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; +import org.bukkit.event.player.PlayerArmorStandManipulateEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerSwapHandItemsEvent; +import org.bukkit.inventory.CraftingInventory; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.CompassMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ManHunt implements Listener { + private static final Challenges plugin = Challenges.getPlugin(); + private int taskId = -1; + private final HashMap locationList = new HashMap<>(); + private static final NamespacedKey hunterItemKey = new NamespacedKey(plugin, "HunterItem"); + private static ItemStack hunterItem; + + @EventHandler + public void onActivation(TimerChangedEvent event) { + if (isRunning()) { + if (event.isRunning()) { + startUpdateTask(); + } else { + stopUpdateTask(); + } + } + } + + @EventHandler + public void onDropItem(PlayerDropItemEvent e) { + if (isRunning()) { + ItemStack stack = e.getItemDrop().getItemStack(); + ItemMeta meta = stack.getItemMeta(); + + if (meta != null && meta.getPersistentDataContainer().has(hunterItemKey)) { + e.setCancelled(true); + } + } + } + + private boolean isRunning() { + return Config.getBoolean("manhunt") && plugin.getTimer().isRunning(); + } + + @EventHandler + public void onSwapItem(PlayerSwapHandItemsEvent e) { + if (!isRunning()) { + return; + } + Player p = e.getPlayer(); + ItemStack stack = p.getInventory().getItemInMainHand(); + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(hunterItemKey)) { + e.setCancelled(true); + } + } + + @EventHandler + public void onItemMove(InventoryMoveItemEvent e) { + if (!isRunning()) { + return; + } + ItemStack stack = e.getItem(); + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(hunterItemKey)) { + e.setCancelled(true); + } + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent e) { + if (!isRunning()) { + return; + } + ItemStack stack = e.getCurrentItem(); + ItemStack stackInHand = e.getCursor(); + Player player = (Player) e.getWhoClicked(); + ItemMeta meta = null; + ItemMeta metaInHand = null; + + if (stack != null) { + meta = stack.getItemMeta(); + } + + if (stackInHand != null) { + metaInHand = stackInHand.getItemMeta(); + } + + if (e.getClick() == ClickType.NUMBER_KEY) { + int slot = e.getHotbarButton(); + if (slot >= 0 && slot < 9) { + if (!e.getWhoClicked().getInventory().equals(e.getInventory())) { + ItemStack swap = e.getWhoClicked().getInventory().getItem(slot); + if (swap != null) { + ItemMeta swapItemMeta = swap.getItemMeta(); + if (swapItemMeta != null && swapItemMeta.getPersistentDataContainer().has(hunterItemKey)) { + e.setCancelled(true); + } + } + } + } + } + + if (meta != null && meta.getPersistentDataContainer().has(hunterItemKey) || metaInHand != null && metaInHand.getPersistentDataContainer().has(hunterItemKey)) { + switch (e.getAction()) { + case NOTHING, PICKUP_ALL, PICKUP_HALF, PICKUP_ONE, PICKUP_SOME, PLACE_ALL, PLACE_ONE, PLACE_SOME, SWAP_WITH_CURSOR, COLLECT_TO_CURSOR, HOTBAR_SWAP -> { + if (e.getClickedInventory() != player.getInventory()) { + e.setCancelled(true); + } + } + case MOVE_TO_OTHER_INVENTORY -> { + if (!(e.getInventory() instanceof CraftingInventory)) { + e.setCancelled(true); + } + } + default -> e.setCancelled(true); + } + } + } + + @EventHandler + public void onItemDrag(InventoryDragEvent e) { + if (!isRunning()) { + return; + } + ItemStack stack = e.getCursor(); + ItemMeta stackMeta = null; + ItemStack oldStack = e.getOldCursor(); + ItemMeta oldStackMeta = null; + if (stack != null) { + if (stack.getItemMeta() != null) { + stackMeta = stack.getItemMeta(); + } + } + + if (oldStack.getItemMeta() != null) { + oldStackMeta = oldStack.getItemMeta(); + } + + if (stackMeta != null && stackMeta.getPersistentDataContainer().has(hunterItemKey) || oldStackMeta != null && oldStackMeta.getPersistentDataContainer().has(hunterItemKey)) { + if (!(e.getInventory() instanceof CraftingInventory)) { + e.setCancelled(true); + } + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerInteractEntity(PlayerArmorStandManipulateEvent e) { + if (!isRunning()) { + return; + } + Player p = e.getPlayer(); + ItemStack stack = p.getInventory().getItemInMainHand(); + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(hunterItemKey)) { + e.setCancelled(true); + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e) { + if (!isRunning()) { + return; + } + ItemStack[] inv = e.getEntity().getInventory().getContents(); + for (ItemStack stack : inv) { + if (stack != null) { + ItemMeta meta = stack.getItemMeta(); + if (meta != null && meta.getPersistentDataContainer().has(hunterItemKey)) { + e.getItemsToKeep().add(stack); + e.getDrops().remove(stack); + } + } + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + if (!Config.getBoolean("manhunt")) { + return; + } + Player player = e.getPlayer(); + int count = 0; + + for (ItemStack stack : player.getInventory().getContents()) { + if (stack != null && stack.getItemMeta() instanceof CompassMeta compassMeta && compassMeta.getPersistentDataContainer().has(hunterItemKey)) { + count++; + } + } + + if (count == 0) { + player.getInventory().setItem(8, hunterItem); + } + } + public void startUpdateTask() { + taskId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L); + } + + public void stopUpdateTask() { + plugin.getServer().getScheduler().cancelTask(taskId); + } + + private void tick() { + Player editor = plugin.getCurrentEditor(); + if (editor == null) { + return; + } + locationList.put(editor.getWorld(), editor.getLocation()); + for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + if (locationList.get(player.getWorld()) != null) { + for (ItemStack stack : player.getInventory().getContents()) { + if (stack != null && stack.getItemMeta() instanceof CompassMeta compassMeta && compassMeta.getPersistentDataContainer().has(hunterItemKey)) { + compassMeta.setLodestone(locationList.get(player.getWorld())); + compassMeta.setLodestoneTracked(false); + stack.setItemMeta(compassMeta); + } + } + } + } + } + + public static ItemStack createHunterItem() { + ItemStack stack = new ItemStack(Material.COMPASS, 1); + CompassMeta meta = (CompassMeta) stack.getItemMeta(); + List lorelist = new ArrayList<>(); + meta.setDisplayName(ChatUtil.GREEN + "Hunter Kompass"); + lorelist.add(ChatUtil.GREEN + "Zeigt die Richtung zum gejagten Spieler"); + meta.setLore(lorelist); + meta.addEnchant(Enchantment.VANISHING_CURSE, 1, true); + meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + meta.getPersistentDataContainer().set(hunterItemKey, PersistentDataType.STRING, "HunterItem"); + stack.setItemMeta(meta); + + return stack; + } + + public static void start() { + hunterItem = createHunterItem(); + for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + if (plugin.getCurrentEditor() != null && plugin.getCurrentEditor() != pp) { + pp.getInventory().setItem(8, hunterItem); + } + } + } + + public static void stop() { + for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + for (ItemStack stack : pp.getInventory().getContents()) { + if (stack != null && stack.getItemMeta() instanceof CompassMeta compassMeta && compassMeta.getPersistentDataContainer().has(hunterItemKey)) { + stack.setAmount(0); + } + } + } + } +} diff --git a/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java b/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java index 6de29be..218a82d 100644 --- a/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/MobRemoveWorldChallenge.java @@ -60,8 +60,8 @@ if (!Config.getBoolean("mobremoveworld")) { return; } - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - Location loc = new Location(world, box.getCenterX(), box.getCenterY(), box.getCenterZ()); + Location loc = new Location(world, box.getCenterX(), box.getCenterY(), box.getCenterZ()); + plugin.getScheduler().runLocalDelayed(loc, () -> { double boundingwithX = box.getWidthX() / 2; double boundingwithZ = box.getWidthZ() / 2; int worldMinHeight = world.getMinHeight(); diff --git a/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java b/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java index e23b086..0a30c47 100644 --- a/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java +++ b/src/main/java/de/fanta/challenges/challenges/WorldBorderLevelChallenge.java @@ -1,7 +1,9 @@ package de.fanta.challenges.challenges; import de.fanta.challenges.Challenges; +import de.fanta.challenges.utils.ChatUtil; import de.fanta.challenges.utils.Config; +import de.fanta.challenges.utils.CubesideModUtils; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -43,7 +45,7 @@ Player p = e.getPlayer(); if (plugin.getTimer().isRunning() && e.getPlayer().getGameMode() == GameMode.SURVIVAL && !plugin.getVanish().isVanish(p)) { if (Config.getBoolean("worldborderlevel")) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(p, () -> { Config.setValue("worldborderlevelxp", e.getPlayer().getExp()); plugin.saveConfig(); xpSync(e.getPlayer(), false); @@ -64,6 +66,7 @@ if (e.getOldLevel() < e.getNewLevel()) { for (Player pp : Bukkit.getOnlinePlayers()) { pp.playSound(pp.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 0.03f, 1); + CubesideModUtils.sendFlashScreenToCubesideMod(plugin, pp, 200, ChatUtil.GREEN); } } } @@ -81,7 +84,7 @@ @EventHandler public void onRespawn(PlayerRespawnEvent e) { if (Config.getBoolean("worldborderlevel")) { - borderSync(); + plugin.getScheduler().runDelayedOnEntity(e.getPlayer(), WorldBorderLevelChallenge::borderSync, 1L); } } @@ -162,7 +165,7 @@ } private void xpSync(Player p, Boolean borderupdate) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(p, () -> { for (Player player : Bukkit.getOnlinePlayers()) { if (player != p) { player.setLevel(Config.getInt("worldborderlevellevel")); diff --git a/src/main/java/de/fanta/challenges/commands/challenges/ChallengesKickCommand.java b/src/main/java/de/fanta/challenges/commands/challenges/ChallengesKickCommand.java index 64e62ff..3973b55 100644 --- a/src/main/java/de/fanta/challenges/commands/challenges/ChallengesKickCommand.java +++ b/src/main/java/de/fanta/challenges/commands/challenges/ChallengesKickCommand.java @@ -47,7 +47,7 @@ plugin.addBannedPlayer(punishedPlayer.getUniqueId(), false); plugin.portPlayerToLobby(punishedPlayer); ChatUtil.sendNormalMessage(player, "Du hast " + ChatUtil.BLUE + punishedPlayer.getName() + ChatUtil.GREEN + " gekickt. Der Spieler kann in einer Minute wieder Joinen"); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runGlobalDelayed(() -> { if (plugin.isPlayerBanned(punishedPlayer.getUniqueId())) { plugin.removeBannedPlayer(punishedPlayer.getUniqueId(), false); } diff --git a/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java b/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java index 93ec441..9373c0a 100644 --- a/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java +++ b/src/main/java/de/fanta/challenges/commands/event/EventStartCommand.java @@ -36,13 +36,13 @@ if (sender.hasPermission("challenges.event")) { AtomicInteger i = new AtomicInteger(4); - Bukkit.getScheduler().runTaskTimer(plugin, bukkitTask -> { + plugin.getScheduler().runGlobalAtFixedRate(task -> { int j = i.decrementAndGet(); ChatUtil.sendTitleToAll("Event", j > 0 ? "" + j : "Go", ChatUtil.BLUE); if (j <= 0) { - bukkitTask.cancel(); + task.cancel(); World world = Bukkit.getWorld("world"); if (plugin.getServerType() != ServerType.ADVENTURE) { world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE, true); diff --git a/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java b/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java index 55f7e3e..4592a19 100644 --- a/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java +++ b/src/main/java/de/fanta/challenges/commands/reset/ResetConfirmCommand.java @@ -65,7 +65,7 @@ SaveWorldUtils.saveWorld(plugin.getFirstEditor().getUniqueId().toString(), SaveSlot.SLOT_AUTO); } - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, Bukkit::shutdown, 60); + plugin.getScheduler().runGlobalDelayed(Bukkit::shutdown, 60); } else if (plugin.getCurrentEditor() != null) { ChatUtil.sendErrorMessage(sender, "Du bist kein Editor! Nur" + plugin.getCurrentEditor().getName() + " kann die Map zurücksetzen!"); return true; diff --git a/src/main/java/de/fanta/challenges/guis/eventgui/SammelFieberSettingsGui.java b/src/main/java/de/fanta/challenges/guis/eventgui/SammelFieberSettingsGui.java index 1fb7eba..5147c6e 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/SammelFieberSettingsGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/SammelFieberSettingsGui.java @@ -114,9 +114,7 @@ return; } - Bukkit.getScheduler().runTask(plugin, () -> { - getPlayer().updateInventory(); - }); + plugin.getScheduler().run(() -> getPlayer().updateInventory()); return; } default -> event.setCancelled(true); @@ -139,9 +137,7 @@ } } - Bukkit.getScheduler().runTask(plugin, () -> { - getPlayer().updateInventory(); - }); + plugin.getScheduler().run(() -> getPlayer().updateInventory()); } @Override @@ -184,7 +180,7 @@ } private void returnToEventSettingsSafely() { - Bukkit.getScheduler().runTask(plugin, () -> getParent().open()); + plugin.getScheduler().run(() -> getParent().open()); } } diff --git a/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java b/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java index de78a0a..a7f5223 100644 --- a/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java +++ b/src/main/java/de/fanta/challenges/guis/settingsgui/ChallengesGui.java @@ -4,6 +4,7 @@ import de.fanta.challenges.challenges.AllAdvancementsChallenge; import de.fanta.challenges.challenges.AllItemsChallenge; import de.fanta.challenges.challenges.MLGChallenge; +import de.fanta.challenges.challenges.ManHunt; import de.fanta.challenges.challenges.WorldBorderLevelChallenge; import de.fanta.challenges.guis.challengesettingsguis.BedrockWallSettingsGui; import de.fanta.challenges.guis.challengesettingsguis.LevelBorderSettingsGui; @@ -55,6 +56,7 @@ private static final int TIED_TOGETHER_INDEX = 39; private static final int MOB_REMOVE_WORLD_INDEX = 40; private static final int ALL_ADVANCEMENT_INDEX = 41; + private static final int MANHUNT_INDEX = 42; public ChallengesGui(Player player) { super(player, Bukkit.createInventory(player, WINDOW_SIZE, plugin.getGUIPREFIX() + " >> Challenges")); @@ -308,6 +310,17 @@ ChatUtil.sendTitleToAll("Challenge", "All Advancement aktiviert", ChatUtil.GREEN); } } + case MANHUNT_INDEX -> { + if (Config.getBoolean("manhunt")) { + ManHunt.stop(); + Config.setValue("manhunt", false); + ChatUtil.sendTitleToAll("Challenge", "Manhunt deaktiviert", ChatUtil.RED); + } else { + ManHunt.start(); + Config.setValue("manhunt", true); + ChatUtil.sendTitleToAll("Challenge", "Manhunt aktiviert", ChatUtil.GREEN); + } + } default -> { } } @@ -477,6 +490,13 @@ item = GUIUtils.createGuiItem(Material.KNOWLEDGE_BOOK, ChatUtil.RED + "All Advancement deaktiviert"); } } + case MANHUNT_INDEX -> { + if (Config.getBoolean("manhunt")) { + item = GUIUtils.createGuiItem(Material.COMPASS, ChatUtil.GREEN + "ManHunt aktiviert", true); + } else { + item = GUIUtils.createGuiItem(Material.COMPASS, ChatUtil.RED + "ManHunt deaktiviert"); + } + } default -> item = GUIUtils.EMPTY_ICON; } this.getInventory().setItem(i, item); diff --git a/src/main/java/de/fanta/challenges/listeners/ChallengeListener.java b/src/main/java/de/fanta/challenges/listeners/ChallengeListener.java new file mode 100644 index 0000000..00949e3 --- /dev/null +++ b/src/main/java/de/fanta/challenges/listeners/ChallengeListener.java @@ -0,0 +1,13 @@ +package de.fanta.challenges.listeners; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerExpChangeEvent; + +public class ChallengeListener implements Listener { + + @EventHandler + public void onXPChange(PlayerExpChangeEvent e) { + + } +} diff --git a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java index 6cf283c..75e81b2 100644 --- a/src/main/java/de/fanta/challenges/listeners/EventRegistration.java +++ b/src/main/java/de/fanta/challenges/listeners/EventRegistration.java @@ -1,6 +1,7 @@ package de.fanta.challenges.listeners; import de.fanta.challenges.Challenges; +import de.fanta.challenges.Troll; import de.fanta.challenges.challenges.AllAdvancementsChallenge; import de.fanta.challenges.challenges.BedrockWallChallenge; import de.fanta.challenges.challenges.ChallengeEvents.BingoChallengeEvent; @@ -16,6 +17,7 @@ import de.fanta.challenges.challenges.FloorIsLavaChallenge; import de.fanta.challenges.challenges.IceRunnerChallenge; import de.fanta.challenges.challenges.MLGChallenge; +import de.fanta.challenges.challenges.ManHunt; import de.fanta.challenges.challenges.MobRemoveWorldChallenge; import de.fanta.challenges.challenges.NoFallDamageChallenge; import de.fanta.challenges.challenges.NoJumpChallenge; @@ -93,6 +95,8 @@ pM.registerEvents(new BridgeRaceChallengeEvent(), plugin); pM.registerEvents(new DifferentItemsChallenge(), plugin); pM.registerEvents(new MLGChallenge(), plugin); + pM.registerEvents(new ManHunt(), plugin); + //pM.registerEvents(new Troll(plugin), plugin); if (plugin.getProtocolVersion() >= 759) { pM.registerEvents(new WorldBorderLevelChallenge(), plugin); diff --git a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java index 1618126..8be974d 100644 --- a/src/main/java/de/fanta/challenges/listeners/PlayerListener.java +++ b/src/main/java/de/fanta/challenges/listeners/PlayerListener.java @@ -94,7 +94,7 @@ public void onPlayerRespawn(PlayerRespawnEvent e) { if (!Config.getBoolean("respawn")) { e.getPlayer().sendTitle(ChatUtil.GREEN + "Du bist gestorben!", ChatUtil.RED + "Du bist nun Zuschauer", 10, 80, 10); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> e.getPlayer().setGameMode(GameMode.SPECTATOR), 1); + plugin.getScheduler().runDelayedOnEntity(e.getPlayer(), () -> e.getPlayer().setGameMode(GameMode.SPECTATOR), 1); } if (Config.getBoolean("nether.enabled")) { Location spawn = Bukkit.getWorlds().get(1).getSpawnLocation(); diff --git a/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java b/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java index 6cf1beb..4ecf669 100644 --- a/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java +++ b/src/main/java/de/fanta/challenges/listeners/QuitJoinListener.java @@ -56,7 +56,7 @@ } } if (plugin.getCurrentEditor() == null) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(p, () -> { if (p.hasPermission("Challenges.editor")) { plugin.setCurrentEditor(p); @@ -139,7 +139,7 @@ Bukkit.getPluginManager().callEvent(new PlayerCountChangedEvent(Bukkit.getOnlinePlayers().size() - plugin.getVanish().countVanishPlayers() - 1)); if (plugin.isWaitingForShutdown() && Bukkit.getOnlinePlayers().size() == 1) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> Bukkit.getPluginManager().callEvent(new ServerStatusChangedEvent(false)), 1L); + plugin.getScheduler().runGlobalDelayed(() -> Bukkit.getPluginManager().callEvent(new ServerStatusChangedEvent(false)), 1L); } } } diff --git a/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java b/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java new file mode 100644 index 0000000..ea628af --- /dev/null +++ b/src/main/java/de/fanta/challenges/schedular/BukkitScheduler.java @@ -0,0 +1,72 @@ +package de.fanta.challenges.schedular; + +import de.fanta.challenges.Challenges; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import java.util.function.Consumer; + +public class BukkitScheduler implements Scheduler { + + private final Challenges plugin; + + public BukkitScheduler(Challenges plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + Bukkit.getScheduler().runTaskAsynchronously(this.plugin, task); + } + + @Override + public void run(Runnable task) { + Bukkit.getScheduler().runTask(this.plugin, task); + } + + @Override + public CancellableTask runGlobalDelayed(Runnable task, long delay) { + return Bukkit.getScheduler().runTaskLater(this.plugin, task, delay)::cancel; + } + + @Override + public void runLocalDelayed(Location location, Runnable task, long delay) { + runGlobalDelayed(task, delay); + } + + @Override + public CancellableTask runLocalAtFixedRate(Location location, Runnable task, long delay, long period) { + return runGlobalAtFixedRate(task, delay, period); + } + + @Override + public void runLocalAtFixedRate(Location location, Consumer taskConsumer, long delay, long period) { + runGlobalAtFixedRate(taskConsumer, delay, period); + } + + @Override + public CancellableTask runGlobalAtFixedRate(Runnable task, long delay, long period) { + return Bukkit.getScheduler().runTaskTimer(this.plugin, task, delay, period)::cancel; + } + + @Override + public void runGlobalAtFixedRate(Consumer taskConsumer, long delay, long period) { + Bukkit.getScheduler().runTaskTimer(this.plugin, bukkitTask -> taskConsumer.accept(bukkitTask::cancel), delay, period); + } + + @Override + public CancellableTask runOnEntityAtFixedRate(Entity entity, Runnable task, long delay, long period) { + return runGlobalAtFixedRate(task, delay, period); + } + + @Override + public void runOnEntityAtFixedRate(Entity entity, Consumer taskConsumer, long delay, long period) { + runLocalAtFixedRate(null, taskConsumer, delay, period); + } + + @Override + public void runDelayedOnEntity(Entity entity, Runnable task, long delay) { + Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, task, delay); + } +} diff --git a/src/main/java/de/fanta/challenges/schedular/CancellableTask.java b/src/main/java/de/fanta/challenges/schedular/CancellableTask.java new file mode 100644 index 0000000..bf1585e --- /dev/null +++ b/src/main/java/de/fanta/challenges/schedular/CancellableTask.java @@ -0,0 +1,5 @@ +package de.fanta.challenges.schedular; + +public interface CancellableTask { + void cancel(); +} diff --git a/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java b/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java new file mode 100644 index 0000000..ae437e6 --- /dev/null +++ b/src/main/java/de/fanta/challenges/schedular/FoliaScheduler.java @@ -0,0 +1,74 @@ +package de.fanta.challenges.schedular; + +import de.fanta.challenges.Challenges; +import io.papermc.paper.threadedregions.scheduler.ScheduledTask; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import java.util.function.Consumer; + +public class FoliaScheduler implements Scheduler { + + private final Challenges plugin; + + public FoliaScheduler(Challenges plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + Bukkit.getServer().getAsyncScheduler().runNow(this.plugin, scheduledTask -> task.run()); + } + + @Override + public void run(Runnable task) { + Bukkit.getServer().getGlobalRegionScheduler().run(this.plugin, scheduledTask -> task.run()); + } + + @Override + public CancellableTask runGlobalDelayed(Runnable task, long delay) { + return Bukkit.getServer().getGlobalRegionScheduler().runDelayed(this.plugin, scheduledTask -> task.run(), delay)::cancel; + } + + @Override + public void runLocalDelayed(Location location, Runnable task, long delay) { + Bukkit.getServer().getRegionScheduler().runDelayed(this.plugin, location, scheduledTask -> task.run(), delay); + } + + @Override + public CancellableTask runLocalAtFixedRate(Location location, Runnable task, long delay, long period) { + return Bukkit.getServer().getRegionScheduler().runAtFixedRate(this.plugin, location, scheduledTask -> task.run(), delay, period)::cancel; + } + + @Override + public void runLocalAtFixedRate(Location location, Consumer taskConsumer, long delay, long period) { + Bukkit.getServer().getRegionScheduler().runAtFixedRate(this.plugin, location, scheduledTask -> taskConsumer.accept(scheduledTask::cancel), delay, period); + } + + @Override + public CancellableTask runGlobalAtFixedRate(Runnable task, long delay, long period) { + return Bukkit.getServer().getGlobalRegionScheduler().runAtFixedRate(this.plugin, scheduledTask -> task.run(), delay, period)::cancel; + } + + @Override + public void runGlobalAtFixedRate(Consumer taskConsumer, long delay, long period) { + Bukkit.getServer().getGlobalRegionScheduler().runAtFixedRate(this.plugin, scheduledTask -> taskConsumer.accept(scheduledTask::cancel), delay, period); + } + + @Override + public CancellableTask runOnEntityAtFixedRate(Entity entity, Runnable task, long delay, long period) { + ScheduledTask createdTask = entity.getScheduler().runAtFixedRate(this.plugin, scheduledTask -> task.run(), null, delay, period); + return createdTask == null ? null : createdTask::cancel; + } + + @Override + public void runOnEntityAtFixedRate(Entity entity, Consumer taskConsumer, long delay, long period) { + entity.getScheduler().runAtFixedRate(this.plugin, scheduledTask -> taskConsumer.accept(scheduledTask::cancel), null, delay, period); + } + + @Override + public void runDelayedOnEntity(Entity entity, Runnable task, long delay) { + entity.getScheduler().runDelayed(this.plugin, scheduledTask -> task.run(), null, delay); + } +} diff --git a/src/main/java/de/fanta/challenges/schedular/Scheduler.java b/src/main/java/de/fanta/challenges/schedular/Scheduler.java new file mode 100644 index 0000000..aa95d1b --- /dev/null +++ b/src/main/java/de/fanta/challenges/schedular/Scheduler.java @@ -0,0 +1,40 @@ +package de.fanta.challenges.schedular; + +import de.fanta.challenges.Challenges; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +import java.util.function.Consumer; + +public interface Scheduler { + + void runAsync(Runnable task); + + void run(Runnable task); + + CancellableTask runGlobalDelayed(Runnable task, long delay); + + default void runGlobalDelayed(Runnable task) { + runGlobalDelayed(task, 1); + } + + void runLocalDelayed(Location location, Runnable task, long delay); + + default void runLocalDelayed(Runnable task) { + runGlobalDelayed(task, 1); + } + + CancellableTask runLocalAtFixedRate(Location location, Runnable task, long delay, long period); + + void runLocalAtFixedRate(Location location, Consumer taskConsumer, long delay, long period); + + CancellableTask runGlobalAtFixedRate(Runnable task, long delay, long period); + + void runGlobalAtFixedRate(Consumer taskConsumer, long delay, long period); + + CancellableTask runOnEntityAtFixedRate(Entity entity, Runnable task, long delay, long period); + + void runOnEntityAtFixedRate(Entity entity, Consumer taskConsumer, long delay, long period); + + void runDelayedOnEntity(Entity entity, Runnable task, long delay); +} diff --git a/src/main/java/de/fanta/challenges/teams/TeamListener.java b/src/main/java/de/fanta/challenges/teams/TeamListener.java index 13b4eb9..1bd9599 100644 --- a/src/main/java/de/fanta/challenges/teams/TeamListener.java +++ b/src/main/java/de/fanta/challenges/teams/TeamListener.java @@ -173,7 +173,7 @@ } Player p = e.getPlayer(); - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + plugin.getScheduler().runDelayedOnEntity(p, () -> { ChallengeTeam team = TeamUtils.getPlayerTeam(p); if (team == null) { return; diff --git a/src/main/java/de/fanta/challenges/utils/CubesideModUtils.java b/src/main/java/de/fanta/challenges/utils/CubesideModUtils.java new file mode 100644 index 0000000..8b250ce --- /dev/null +++ b/src/main/java/de/fanta/challenges/utils/CubesideModUtils.java @@ -0,0 +1,41 @@ +package de.fanta.challenges.utils; + +import de.fanta.challenges.Challenges; +import de.iani.cubesideutils.MinecraftDataOutputStream; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.entity.Player; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +public class CubesideModUtils { + + + + public static void sendFlashScreenToCubesideMod(Challenges plugin, Player player, int duration, ChatColor color) { + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (player == null) { + return; + } + if (!player.getListeningPluginChannels().contains(plugin.getCubesideMod_ModChannel())) { + return; + } + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + MinecraftDataOutputStream dataOut = new MinecraftDataOutputStream(out); + int cubesideDateChannel = 1; + int cubesideDateChannelVersion = 0; + try { + dataOut.writeByte(cubesideDateChannel); + dataOut.writeByte(cubesideDateChannelVersion); + dataOut.writeInt(color.getColor().getRGB()); + dataOut.writeInt(duration); + dataOut.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + player.sendPluginMessage(plugin, plugin.getCubesideMod_ModChannel(), out.toByteArray()); + }, 1L); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ab6a1cb..fddf07f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -35,6 +35,7 @@ gravestone: false editsettings: false resetwithseed: false +manhunt: false #Mögliche werte: 1-6 backpack_size: 3 mlg: diff --git a/src/main/resources/items.yml b/src/main/resources/items.yml index 9e1b530..aa4cdba 100644 --- a/src/main/resources/items.yml +++ b/src/main/resources/items.yml @@ -105,4 +105,6 @@ - ENDER_DRAGON_SPAWN_EGG - WITHER_SPAWN_EGG - IRON_GOLEM_SPAWN_EGG - - SNOW_GOLEM_SPAWN_EGG \ No newline at end of file + - SNOW_GOLEM_SPAWN_EGG + - SUSPICIOUS_SAND + - SNIFFER_SPAWN_EGG \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f62427f..6a204c5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ version: ${project.version} author: ${project.author} api-version: 1.16 -depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils, PlayerUUIDCache] +depend: [CubesideUtils, VanishNoPacket, GlobalPort, CubesideNMSUtils, PlayerUUIDCache, LibsDisguises] softdepend: [CubesideStatistics] commands: hp: