diff --git a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java index 8715e39..b04f2e4 100644 --- a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java @@ -49,6 +49,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; import org.kitteh.vanish.event.VanishStatusChangeEvent; +import org.spigotmc.event.entity.EntityDismountEvent; import java.util.ArrayList; import java.util.Collection; @@ -150,16 +151,9 @@ if (isRunning()) { Player player = e.getPlayer(); if (e.getNewGameMode() == GameMode.SPECTATOR) { - if (entityList.containsKey(player.getUniqueId())) { - entityList.get(e.getPlayer().getUniqueId()).remove(); - } + removeArmorStand(player); } else { - mountArmorStand(player); - if (itemByPlayerList.get(player.getUniqueId()) != null) { - updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); - } else { - updateItem(player); - } + addArmorStand(player); } } } @@ -169,20 +163,16 @@ if (isRunning()) { Player player = e.getPlayer(); if (e.isVanishing()) { - if (entityList.containsKey(player.getUniqueId())) { - entityList.get(e.getPlayer().getUniqueId()).remove(); - } + removeArmorStand(player); } else { if (plugin.getScoreManager().getScores().containsKey(new ChallengePlayer(player))) { plugin.getScoreManager().join(new ChallengePlayer(player)); } - mountArmorStand(player); - if (itemByPlayerList.get(player.getUniqueId()) != null) { - updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); - } else { + addArmorStand(player); + + if (itemByPlayerList.get(player.getUniqueId()) == null) { plugin.getScoreManager().join(new ChallengePlayer(player)); - updateItem(player); updateBossBar(); player.getInventory().setItem(8, skipItem); } @@ -194,11 +184,7 @@ public void onPlayerLeave(PlayerQuitEvent e) { if (isRunning()) { Player player = e.getPlayer(); - Entity entity = entityList.get(player.getUniqueId()); - if (entity != null) { - entity.remove(); - entityList.get(player.getUniqueId()).remove(); - } + removeArmorStand(player); plugin.getScoreManager().leave(new ChallengePlayer(player)); } } @@ -211,27 +197,23 @@ return; } plugin.getScoreManager().join(new ChallengePlayer(player)); - mountArmorStand(player); - if (itemByPlayerList.get(player.getUniqueId()) != null) { - updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); - } else { + + addArmorStand(player); + + if (itemByPlayerList.get(player.getUniqueId()) == null) { player.getInventory().setItem(8, skipItem); - updateItem(player); } } } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPort(PlayerTeleportEvent e) { - Player player = e.getPlayer(); - Entity entity = entityList.get(player.getUniqueId()); - if (entity != null) { - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { - entity.teleport(player.getLocation()); - player.addPassenger(entityList.get(player.getUniqueId())); - }, 3L); - + if (!isRunning()) { + return; } + Player player = e.getPlayer(); + + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> addArmorStand(player), 5L); } @EventHandler @@ -376,10 +358,7 @@ } } } - - if (entityList.containsKey(e.getEntity().getUniqueId())) { - entityList.get(e.getPlayer().getUniqueId()).remove(); - } + removeArmorStand(e.getEntity()); } } @@ -387,12 +366,7 @@ public void onRespawn(PlayerRespawnEvent e) { if (isRunning()) { Player player = e.getPlayer(); - mountArmorStand(player); - if (itemByPlayerList.get(player.getUniqueId()) != null) { - updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); - } else { - updateItem(player); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> addArmorStand(player), 1L); } } @@ -422,37 +396,41 @@ } + @EventHandler + public void onDismountEntity(EntityDismountEvent e) { + if (isRunning()) { + Entity dismountedEntity = e.getEntity(); + if (entityListContainsEntity(dismountedEntity)) { + e.setCancelled(true); + } + } + } + public void startUpdateTask() { - taskId = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L)); + taskId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L); } public void stopUpdateTask() { - Bukkit.getScheduler().cancelTask(taskId); - taskId = -1; + plugin.getServer().getScheduler().cancelTask(taskId); } private void tick() { - for (UUID uuid : entityList.keySet()) { - if (!(Bukkit.getOfflinePlayer(uuid) instanceof Player player)) { + for (Player player : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + if (player.getGameMode() == GameMode.SPECTATOR) { return; } + + if (plugin.getVanish().isVanish(player)) { + return; + } + Location location = player.getLocation(); Block block = location.getBlock(); - if (block.getType() == Material.NETHER_PORTAL || block.getType() == Material.END_PORTAL || block.getType() == Material.END_GATEWAY) { - if (!player.getPassengers().isEmpty()) { - if (entityList.containsKey(player.getUniqueId())) { - entityList.get(player.getUniqueId()).remove(); - } - } + removeArmorStand(player); } else { - if (player.getPassengers().isEmpty()) { - mountArmorStand(player); - if (itemByPlayerList.get(player.getUniqueId()) != null) { - updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); - } else { - updateItem(player); - } + if (!entityListContainsUUID(player.getUniqueId())) { + addArmorStand(player); } } @@ -467,17 +445,21 @@ public void mountArmorStand(Player player) { if (player.getPassengers().isEmpty()) { ArmorStand stand = (ArmorStand) player.getWorld().spawnEntity(player.getLocation(), EntityType.ARMOR_STAND); - stand.setInvisible(true); stand.setMarker(true); - entityList.remove(player.getUniqueId()); - entityList.put(player.getUniqueId(), stand); + stand.setInvisible(true); + stand.setInvulnerable(true); + stand.setCollidable(false); + stand.setPersistent(false); + stand.setRemoveWhenFarAway(true); + entityListRemove(player.getUniqueId()); + entityListAdd(player.getUniqueId(), stand); player.addPassenger(stand); } } public void updateArmorStand(Player player, Material material) { - if (entityList.containsKey(player.getUniqueId())) { - ArmorStand stand = (ArmorStand) entityList.get(player.getUniqueId()); + if (entityListContainsUUID(player.getUniqueId())) { + ArmorStand stand = (ArmorStand) entityListGetEntity(player.getUniqueId()); stand.getEquipment().setHelmet(new ItemStack(material)); Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { @@ -540,4 +522,45 @@ bossBar.setTitle(bossBarTitle); } } + + public void entityListAdd(UUID uuid, Entity entity) { + entityList.put(uuid, entity); + } + + public void entityListRemove(UUID uuid) { + entityList.remove(uuid); + } + + public boolean entityListContainsUUID(UUID uuid) { + return entityList.containsKey(uuid); + } + + public boolean entityListContainsEntity(Entity entity) { + return entityList.containsValue(entity); + } + + public Entity entityListGetEntity(UUID uuid) { + return entityList.get(uuid); + } + + public void removeArmorStand(Player player) { + if (entityListContainsUUID(player.getUniqueId())) { + entityListGetEntity(player.getUniqueId()).remove(); + entityListRemove(player.getUniqueId()); + } + } + + public void addArmorStand(Player player) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (!player.isDead()) { + mountArmorStand(player); + if (itemByPlayerList.get(player.getUniqueId()) != null) { + updateArmorStand(player, itemByPlayerList.get(player.getUniqueId())); + } else { + updateItem(player); + } + } + }, 1L); + + } }