diff --git a/src/de/steamwar/lobby/LobbySystem.java b/src/de/steamwar/lobby/LobbySystem.java index 1bdab28..736fb9f 100644 --- a/src/de/steamwar/lobby/LobbySystem.java +++ b/src/de/steamwar/lobby/LobbySystem.java @@ -44,6 +44,8 @@ public class LobbySystem extends JavaPlugin { pm.registerEvents(new EnderPearlListener(), instance); getCommand("fly").setExecutor(new FlyCommand()); + + new RabbitListener(); } diff --git a/src/de/steamwar/lobby/listener/PlayerConnectionListener.java b/src/de/steamwar/lobby/listener/PlayerConnectionListener.java index ab66243..9cbe282 100644 --- a/src/de/steamwar/lobby/listener/PlayerConnectionListener.java +++ b/src/de/steamwar/lobby/listener/PlayerConnectionListener.java @@ -46,6 +46,7 @@ public class PlayerConnectionListener implements Listener { player.teleport(new Location(Bukkit.getWorlds().get(0), Config.SpawnX, Config.SpawnY, Config.SpawnZ, Config.Yaw, Config.Pitch)); player.getInventory().clear(); LobbyInventory.givePlayerLobbyItems(player); + player.getInventory().setHelmet(RabbitListener.getEggHead()); player.setGameMode(GameMode.ADVENTURE); player.setHealth(20); player.setFoodLevel(20); diff --git a/src/de/steamwar/lobby/listener/PlayerSeatListener.java b/src/de/steamwar/lobby/listener/PlayerSeatListener.java index a0ac093..025e316 100644 --- a/src/de/steamwar/lobby/listener/PlayerSeatListener.java +++ b/src/de/steamwar/lobby/listener/PlayerSeatListener.java @@ -88,7 +88,7 @@ public class PlayerSeatListener implements Listener { if (((Stairs) event.getClickedBlock().getBlockData()).getShape() != Stairs.Shape.STRAIGHT) return; - if (event.getPlayer().isInsideVehicle()) + if (event.getPlayer().isInsideVehicle() && event.getPlayer().getVehicle().getType() == EntityType.ARROW) event.getPlayer().getVehicle().remove(); if (event.getClickedBlock().getRelative(0, 1, 0).getType() != Material.AIR) @@ -111,7 +111,7 @@ public class PlayerSeatListener implements Listener { public void onEntityDismount(EntityDismountEvent event) { seats.remove(getSeatLocation(event.getDismounted().getLocation())); - if (event.getEntityType() != EntityType.PLAYER) + if (event.getEntityType() != EntityType.ARROW) return; event.getDismounted().remove(); @@ -119,7 +119,7 @@ public class PlayerSeatListener implements Listener { @EventHandler public void onPlayerQuit(PlayerQuitEvent event) { - if (event.getPlayer().isInsideVehicle()) + if (event.getPlayer().isInsideVehicle() && event.getPlayer().getVehicle().getType() == EntityType.ARROW) event.getPlayer().getVehicle().remove(); } diff --git a/src/de/steamwar/lobby/listener/RabbitListener.java b/src/de/steamwar/lobby/listener/RabbitListener.java new file mode 100644 index 0000000..2a420a2 --- /dev/null +++ b/src/de/steamwar/lobby/listener/RabbitListener.java @@ -0,0 +1,113 @@ +package de.steamwar.lobby.listener; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import de.steamwar.lobby.LobbySystem; +import de.steamwar.lobby.utils.Config; +import org.bukkit.*; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.entity.Rabbit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.lang.reflect.Field; +import java.time.Instant; +import java.util.*; + +public class RabbitListener implements Listener { + + private static final List EGGS = new ArrayList<>(); + + static { + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjkxYzQyYjE3MWZlZDZiZWE2ZmRmNGQ4NzJkNThiZDMzZDdjZTA5ZWVlZGRhMzZlNTQxNTFmODg5MDY2YmU0ZSJ9fX0="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTMwNGJkMzE2MTFmODYzYTZiMDFlNmUzZjVhN2MwOWQwYWU1YzA3YTA5NDEyZmNhYTMxYmM1Mzc2OGYzYjI4OSJ9fX0="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWIyY2VkNGU1NjYwNWFiZDJhNjA4YjZkNzE1MDE2NzhjNjBjNTcyMjYwNGZlYWE3MjEwNjc2OWIwZDNhYzc1OSJ9fX0="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzQyZWFlMTJiNjg0OWU1YTg2Zjg0NzczNWI5ZDY5ZTE4OWYzNjYwNjE1NmE1Yzk2ODU5ZjRlODljMjQzYTI5MyJ9fX0="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTZhNjA1MWY3ZjZmNDM5ZDhmMjE0YzIzNGU4ZTJjNDc3NjMwMDUyNDMyZTQyNjA3ZjA0MDRiODQwYjUzY2VhYiJ9fX0="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTI0ODY5Nzk5ZWZkM2UzZTI2N2ZlYjQ1ZjEyYzk0YWJhMTJiYWQzMTk1NmNmMmU0MmYwMzVkN2U5YjRjIn19fQ=="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjIxMDkwNzlkZGUxNWFkYWU1NTljNDdhYTZkZTRiZGFkYjE4NmE0YjMwZGE1YWNiZWU3NDE1YTk3ODhmN2UifX19"); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWViZjc4ZTFjMWIwMWRlY2ZiNmIzZGY1MjU4MTY4YzNhYTg3NDg3MWJlNGJjNGRiMjU1ODRlZDU5MGE1NTdiMiJ9fX0="); + EGGS.add("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGEzZGRjZTJjNTU2ZjIyZmRhMzE3OTc4MzlmZmQxZDA0MjhhZmUxMmE0NWMwNzM1NTk1MWY0NDRjNzc0YWQifX19"); + } + + public RabbitListener() { + Bukkit.getPluginManager().registerEvents(this, LobbySystem.getInstance()); + World world = Bukkit.getWorlds().get(0); + spreadRabbits(250, world); + Bukkit.getScheduler().runTaskTimer(LobbySystem.getInstance(), () -> { + Rabbit rabbit = world.getEntitiesByClass(Rabbit.class).iterator().next(); + world.spawn(rabbit.getLocation(), Firework.class, firework -> { + FireworkMeta meta = firework.getFireworkMeta(); + meta.clearEffects(); + meta.addEffects(FireworkEffect.builder().with(FireworkEffect.Type.BURST).trail(true).withColor(Color.WHITE).build()); + meta.setPower(1); + firework.setFireworkMeta(meta); + }); + }, 60*20, 60*20); + } + + public static void spreadRabbits(int count, World world) { + world.setAmbientSpawnLimit(count); + world.setAnimalSpawnLimit(count); + world.setMonsterSpawnLimit(count); + Random rand = new Random(); + int boundX = Config.BorderMaxX - Config.BorderMinX; + int boundZ = Config.BorderMaxZ - Config.BorderMinZ; + for (int i = 0; i < count; i++) { + int relX = rand.nextInt(boundX); + int relZ = rand.nextInt(boundZ); + Location loc = new Location(world, relX + Config.BorderMinX, 255, relZ + Config.BorderMinZ); + world.spawn(loc, Rabbit.class, rabbit -> { + rabbit.setRabbitType(Rabbit.Type.WHITE); + rabbit.setInvulnerable(true); + rabbit.setCustomName("§fOsterhase"); + rabbit.setPersistent(true); + }); + } + } + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if(event.getEntityType() == EntityType.RABBIT) { + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + if(event.getRightClicked().getType() == EntityType.RABBIT) { + Player p = event.getPlayer(); + event.setCancelled(true); + event.getRightClicked().addPassenger(p); + } + } + + public static ItemStack getEggHead() { + return getCustomTextureHead(new ItemStack(Material.PLAYER_HEAD), + EGGS.get(Math.toIntExact(Instant.now().getEpochSecond() % EGGS.size()))); + } + + private static ItemStack getCustomTextureHead(ItemStack head, String value) { + SkullMeta meta = (SkullMeta) head.getItemMeta(); + meta.setDisplayName("§eEierkopf"); + GameProfile profile = new GameProfile(UUID.randomUUID(), ""); + profile.getProperties().put("textures", new Property("textures", value)); + Field profileField = null; + try { + profileField = meta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + profileField.set(meta, profile); + } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { + e.printStackTrace(); + } + head.setItemMeta(meta); + return head; + } +}