diff --git a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java index aa2a0fb..14d42b5 100644 --- a/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java +++ b/src/main/java/de/fanta/challenges/challenges/ForceItemChallengeEvent.java @@ -2,12 +2,25 @@ import de.fanta.challenges.Challenges; import de.fanta.challenges.events.TimerChangedEvent; +import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.Objects; +import java.util.Random; public class ForceItemChallengeEvent implements Listener { private static boolean running; @@ -23,6 +36,13 @@ public static ArrayList materials = new ArrayList<>(); + public static HashMap entityList = new HashMap<>(); + public static HashMap itemByPlayerList = new HashMap<>(); + + private int taskId = -1; + + private final Random random = new Random(); + @EventHandler public void onActivation(TimerChangedEvent event) { if (Objects.equals(plugin.getConfig().getString("event.type"), "forceitem")) { @@ -32,10 +52,88 @@ materials.add(material); } } + + startUpdateTask(); + + for (Player pp : plugin.getVanish().getPlayerListWithoutVanishPlayers()) { + if (pp.getPassengers().isEmpty()) { + Material material = materials.get(random.nextInt((materials.size() - 1) + 1)); + itemByPlayerList.put(pp, material); + ArmorStand stand = (ArmorStand) pp.getWorld().spawnEntity(pp.getLocation(), EntityType.ARMOR_STAND); + stand.setInvisible(true); + stand.getEquipment().setHelmet(new ItemStack(material)); + stand.setMarker(true); + entityList.remove(pp); + entityList.put(pp, stand); + pp.addPassenger(stand); + } + } + setRunning(true); } else { + stopUpdateTask(); setRunning(false); } } } + + + @EventHandler + public void PlayerLeave(PlayerQuitEvent e) { + if (isRunning()) { + Player player = e.getPlayer(); + Entity entity = entityList.get(player); + if (entity != null) { + entity.remove(); + entityList.get(player).remove(); + } + } + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPort(PlayerTeleportEvent e) { + Player player = e.getPlayer(); + Entity entity = entityList.get(player); + if (entity != null) { + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { + entity.teleport(player.getLocation()); + player.addPassenger(entityList.get(player)); + }, 3L); + + } + } + + public void startUpdateTask() { + taskId = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, this::tick, 1L, 1L)); + } + + public void stopUpdateTask() { + Bukkit.getScheduler().cancelTask(taskId); + taskId = -1; + } + + private void tick() { + for (Player player : entityList.keySet()) { + 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()) { + Location standLocation = location.clone().add(0, 500, 0); + entityList.get(player).teleport(standLocation); + } + } else { + if (player.getPassengers().isEmpty()) { + entityList.get(player).teleport(player.getLocation()); + player.addPassenger(entityList.get(player)); + } + } + + if (!player.getPassengers().isEmpty()) { + for (Entity entity : player.getPassengers()) { + entity.setRotation(location.getYaw(), location.getPitch()); + } + } + } + } } diff --git a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java index 6e1ab6e..ecd7835 100644 --- a/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java +++ b/src/main/java/de/fanta/challenges/guis/eventgui/EventGui.java @@ -29,6 +29,8 @@ private static final int DEATH_COUNTER_INDEX = 14; private static final int SAMMEL_FIEBER_INDEX = 15; private static final int ORE_BATTLE_INDEX = 16; + + private static final int FORCE_ITEM_INDEX = 17; //TODO muss noch schön gemacht werden. private static final int BINGO_ITEMS_INDEX = 19; private static final int SAMMEL_FIEBER_SETTINGS_INDEX = 24; private static final int CLOSE_IDEX = 26; @@ -74,6 +76,11 @@ } else { EVENT_GUI.setItem(ORE_BATTLE_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_ORE, ChatUtil.RED + "Ore Battle Event", ChatUtil.GREEN + "Baue so viele erze ab wie möglich.")); } + if (Objects.equals(plugin.getConfig().getString("event.type"), "forceitem")) { + EVENT_GUI.setItem(FORCE_ITEM_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_BLOCK, ChatUtil.GREEN + "Force Item Event", true, ChatUtil.GREEN + "Farm so viele Blöcke wie möglich.")); + } else { + EVENT_GUI.setItem(FORCE_ITEM_INDEX, GUIUtils.createGuiItem(Material.DIAMOND_BLOCK, ChatUtil.RED + "Force Item Event", ChatUtil.GREEN + "Farm so viele Blöcke wie möglich.")); + } if (Objects.equals(plugin.getConfig().getString("event.type"), "sammelfieber")) { EVENT_GUI.setItem(SAMMEL_FIEBER_INDEX, GUIUtils.createGuiItem(Material.HOPPER, ChatUtil.GREEN + "Sammel Fieber Event", true, ChatUtil.GREEN + "Sammle so viel Items wie möglich!")); EVENT_GUI.setItem(SAMMEL_FIEBER_SETTINGS_INDEX, GUIUtils.createGuiItem(Material.NETHER_STAR, ChatUtil.GREEN + "Sammel Fieber Event Settings")); @@ -134,6 +141,10 @@ GUIUtils.setConfig("event.type", "orebattle"); GUIUtils.sendTitleToAll("Event", "Ore Battle", ChatUtil.GREEN); } + case FORCE_ITEM_INDEX -> { + GUIUtils.setConfig("event.type", "forceitem"); + GUIUtils.sendTitleToAll("Event", "Force Item", ChatUtil.GREEN); + } } createEventGUI(p);