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: