diff --git a/pom.xml b/pom.xml index 3bf913e..5e1d3a1 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,10 @@ sonatype https://oss.sonatype.org/content/groups/public/ + + public-rpg + https://repo.aurora-pixels.com/repository/public-rpg/ + @@ -31,6 +35,12 @@ 1.20.6-R0.1-SNAPSHOT provided + + com.sk89q + fastasyncworldedit + 2.11.1 + 857 + \ No newline at end of file diff --git a/src/main/java/com/yaohun/enderdragonWars/data/DirectionPoint.java b/src/main/java/com/yaohun/enderdragonWars/data/DirectionPoint.java new file mode 100644 index 0000000..d1115a4 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/data/DirectionPoint.java @@ -0,0 +1,84 @@ +package com.yaohun.enderdragonwars.data; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.Objects; + +public class DirectionPoint extends Point { + + private float yaw; + private float pitch; + + public DirectionPoint(int x, int y, int z, float yaw, float pitch) { + super(x, y, z); + this.yaw = yaw; + this.pitch = pitch; + } + + public DirectionPoint(double x, double y, double z) { + this(x, y, z, 0f, 0f); + } + + public DirectionPoint(double x, double y, double z, float yaw, float pitch) { + super(x, y, z); + this.yaw = yaw; + this.pitch = pitch; + } + + public float getPitch() { + return pitch; + } + + public float getYaw() { + return yaw; + } + + public void setYaw(float yaw) { + this.yaw = yaw; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + @Override + public Location toLocation(World world) { + return new Location(world, getX(), getY(), getZ(), yaw, pitch); + } + + public static DirectionPoint of(Location location) { + return new DirectionPoint(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + + @Override + public String toString() { + return "DirectionPoint{" + + "x=" + getX() + + ", y=" + getY() + + ", z=" + getZ() + + ", yaw=" + yaw + + ", pitch=" + pitch + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DirectionPoint that = (DirectionPoint) o; + return super.equals(o) && Float.compare(that.yaw, yaw) == 0 && Float.compare(that.pitch, pitch) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), yaw, pitch); + } + + public static DirectionPoint deserialize(ConfigurationSection section) { + return new DirectionPoint(section.getDouble("x"), section.getDouble("y"), section.getDouble("z"), (float) section.getDouble("yaw"), (float) section.getDouble("pitch")); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/data/Point.java b/src/main/java/com/yaohun/enderdragonWars/data/Point.java new file mode 100644 index 0000000..87b0159 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/data/Point.java @@ -0,0 +1,101 @@ +package com.yaohun.enderdragonwars.data; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.Objects; + +public class Point { + + private double x; + private double y; + private double z; + + public Point(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Point(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public int getBlockX() { + return (int) Math.floor(x); + } + + public int getBlockY() { + return (int) Math.floor(y); + } + + public int getBlockZ() { + return (int) Math.floor(z); + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public void setX(double x) { + this.x = x; + } + + public void setY(double y) { + this.y = y; + } + + public void setZ(double z) { + this.z = z; + } + + public Point clone() { + return new Point(x, y, z); + } + + public Location toLocation(World world) { + return new Location(world, x, y, z, 0, 0); + } + + public static Point of(Location location) { + return new Point(location.getX(), location.getY(), location.getZ()); + } + + public static Point deserialize(ConfigurationSection section) { + return new Point(section.getDouble("x"), section.getDouble("y"), section.getDouble("z")); + } + + @Override + public String toString() { + return "Point{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Point point = (Point) o; + return Double.compare(point.x, x) == 0 && Double.compare(point.y, y) == 0 && Double.compare(point.z, z) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/data/Region.java b/src/main/java/com/yaohun/enderdragonWars/data/Region.java new file mode 100644 index 0000000..63fc298 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/data/Region.java @@ -0,0 +1,51 @@ +package com.yaohun.enderdragonwars.data; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; + +public class Region { + + private World world; + private Point min; + private Point max; + + public Region(World world, Point min, Point max) { + this.world = world; + this.min = min; + this.max = max; + } + + public World getWorld() { + return world; + } + + public Point getMin() { + return min; + } + + public Point getMax() { + return max; + } + + public static Region deserialize(ConfigurationSection section) { + World world1 = Bukkit.getWorld(section.getString("world")); + Point point1 = Point.deserialize(section.getConfigurationSection("min")); + Point point2 = Point.deserialize(section.getConfigurationSection("max")); + return new Region(world1, point1, point2); + } + + public boolean isInRegion(Location location) { + if (!location.getWorld().getName().equalsIgnoreCase(world.getName())) { + return false; + } + return (location.getBlockX() >= this.min.getX() + && location.getBlockX() <= this.max.getX() + && location.getBlockY() >= this.min.getY() + && location.getBlockY() <= this.max.getY() + && location.getBlockZ() >= this.min.getZ() + && location.getBlockZ() <= this.max.getZ()); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/AddMaxHealthEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/AddMaxHealthEffect.java new file mode 100644 index 0000000..695355b --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/AddMaxHealthEffect.java @@ -0,0 +1,47 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.Main; +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.Particle; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.UUID; + +public class AddMaxHealthEffect extends GiftEffect { + + public static UUID uuid = UUID.randomUUID(); + + public AddMaxHealthEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + new BukkitRunnable() { + private int count = 0; + @Override + public void run() { + if (count >= 10) { + cancel(); + return; + } + player.spawnParticle(Particle.HEART, player.getLocation().add(0, 0.5, 0), 1, 0.25, 0.25, 0.25, 0.1); + if (player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue() < 120) { + player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() + 2); + player.setHealth(Math.min(player.getHealth() + 2, player.getMaxHealth())); + } + count++; + } + }.runTaskTimer(Main.plugin, 0L, 1L); + } + + @Override + public int getQueueTime() { + return 55; + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/BlackHoleEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/BlackHoleEffect.java new file mode 100644 index 0000000..e1c2b69 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/BlackHoleEffect.java @@ -0,0 +1,169 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.Main; +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.util.RandomUtil; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.*; + +public class BlackHoleEffect extends GiftEffect { + + private static int seconds = 15; + private boolean stop = false; + + public BlackHoleEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + List fallingBlocks = new ArrayList<>(); + Location location = game.getPlayer().getLocation().add(0, 2, 0); + new BukkitRunnable() { + private int i = 0; + @Override + public void run() { + if (i >= seconds*2) { + stop = true; + fallingBlocks.forEach(fallingBlock -> fallingBlock.setGravity(true)); + location.getWorld().createExplosion(location, 3.0F, false, false); + cancel(); + return; + } + Set blocks = getRandomUpBlocks(location, 6, 10); + for (Block block : blocks) { + FallingBlock fallingBlock = location.getWorld().spawnFallingBlock(block.getLocation().add(0.5, 0, 0.5), block.getBlockData()); + fallingBlock.setDropItem(false); + fallingBlock.setHurtEntities(false); + fallingBlock.setGravity(false); + block.setType(Material.AIR); + fallingBlocks.add(fallingBlock); + } + i++; + } + }.runTaskTimer(Main.plugin, 0L, 10L); + new BukkitRunnable() { + private Set uuids = new HashSet<>(); + @Override + public void run() { + if (stop) { + cancel(); + return; + } + double r = 16; + for (Entity entity : location.getWorld().getNearbyEntities(location, r, r, r)) { + if (entity instanceof FallingBlock) { + continue; + } + Location location1 = entity.getLocation(); + Vector vector = location.toVector().subtract(location1.toVector()); + vector.normalize(); + vector.multiply(0.25); + entity.setVelocity(vector); + if (entity instanceof LivingEntity livingEntity) { + livingEntity.damage(1); + } + if (entity instanceof Player player) { + player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20 * 3, 0, true, true, true)); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 20 * 3, 0, true, true, true)); + } + } + Iterator iterator = fallingBlocks.iterator(); + while (iterator.hasNext()) { + FallingBlock fallingBlock = iterator.next(); + org.bukkit.util.Vector vector = fallingBlock.getLocation().toVector(); + org.bukkit.util.Vector vector1 = location.toVector(); + Vector vector2 = vector1.subtract(vector); + vector2.normalize(); + vector2.multiply(0.65); + fallingBlock.setVelocity(vector2); + if (!uuids.contains(fallingBlock.getUniqueId())) { + if (RandomUtil.random(0.5)) { + uuids.add(fallingBlock.getUniqueId()); + } else { + fallingBlock.remove(); + iterator.remove(); + } + } + } + } + }.runTaskTimer(Main.plugin, 0L, 5L); + new BukkitRunnable() { + private Set uuids = new HashSet<>(); + @Override + public void run() { + if (stop) { + cancel(); + return; + } + location.getWorld().spawnParticle(Particle.CLOUD, location, 10, 1.5, 1.5, 1.5, 0.01); + location.getWorld().spawnParticle(Particle.INFESTED, location, 10, 1.5, 1.5, 1.5, 0.01); + location.getWorld().spawnParticle(Particle.LARGE_SMOKE, location, 10, 1.5, 1.5, 1.5, 0.01); + location.getWorld().spawnParticle(Particle.SQUID_INK, location, 10, 1.5, 1.5, 1.5, 0.01); + Iterator iterator = fallingBlocks.iterator(); + while (iterator.hasNext()) { + FallingBlock fallingBlock = iterator.next(); + org.bukkit.util.Vector vector = fallingBlock.getLocation().toVector(); + org.bukkit.util.Vector vector1 = location.toVector(); + Vector vector2 = vector1.subtract(vector); + vector2.normalize(); + vector2.multiply(0.65); + fallingBlock.setVelocity(vector2); + if (!uuids.contains(fallingBlock.getUniqueId())) { + if (RandomUtil.random(0.5)) { + uuids.add(fallingBlock.getUniqueId()); + } else { + fallingBlock.remove(); + iterator.remove(); + } + } + } + } + }.runTaskTimer(Main.plugin, 0L, 1L); + } + + private Set getRandomUpBlocks(Location location, int size, int amount) { + List blocks = new ArrayList<>(); + int minX = location.getBlockX() - size; + int minY = location.getBlockY() - size * 2; + int minZ = location.getBlockZ() - size; + int maxX = location.getBlockX() + size; + int maxY = location.getBlockY() + size; + int maxZ = location.getBlockZ() + size; + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = maxY; y >= minY; y--) { + Block block = location.getWorld().getBlockAt(x, y, z); + if (!block.getType().equals(Material.AIR)) { + blocks.add(block); + break; + } + } + } + } + Set blocks1 = new HashSet<>(); + if (blocks.isEmpty()) { + return blocks1; + } + for (int i = 0; i < amount; i++) { + int k = RandomUtil.getRandomInt(0, blocks.size() - 1); + Block block = blocks.remove(k); + blocks1.add(block); + } + return blocks1; + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effectevent/BomBomEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/BomBomEffect.java similarity index 72% rename from src/main/java/com/yaohun/enderdragonWars/effectevent/BomBomEffect.java rename to src/main/java/com/yaohun/enderdragonWars/effect/types/BomBomEffect.java index b5132e6..0d01368 100644 --- a/src/main/java/com/yaohun/enderdragonWars/effectevent/BomBomEffect.java +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/BomBomEffect.java @@ -1,23 +1,24 @@ -package com.yaohun.enderdragonwars.effectevent; +package com.yaohun.enderdragonwars.effect.types; +import com.sk89q.worldedit.EditSession; import com.yaohun.enderdragonwars.Main; import com.yaohun.enderdragonwars.effect.GiftEffect; import com.yaohun.enderdragonwars.game.Game; import com.yaohun.enderdragonwars.util.EntityUtil; import net.kyori.adventure.text.Component; import org.bukkit.*; +import org.bukkit.attribute.Attribute; import org.bukkit.block.Block; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.FallingBlock; -import org.bukkit.entity.Player; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.*; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ColorableArmorMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import java.util.ArrayList; import java.util.Iterator; @@ -36,6 +37,7 @@ public class BomBomEffect extends GiftEffect { private static final ItemStack ITEM_7; private List fallingBlocks = new ArrayList<>(); + private BossBar bossBar; protected boolean stop = false; @@ -45,8 +47,10 @@ public class BomBomEffect extends GiftEffect { @Override public void apply(Game game) { + bossBar = Bukkit.createBossBar("§4§l毁天灭地", BarColor.RED, BarStyle.SOLID); World world = game.getWorld(); Player player = game.getPlayer(); + bossBar.addPlayer(player); ArmorStand armorStand = (ArmorStand) world.spawnEntity(player.getLocation(), EntityType.ARMOR_STAND, CreatureSpawnEvent.SpawnReason.CUSTOM, (entity)->{ ArmorStand armorStand1 = (ArmorStand) entity; armorStand1.setArms(true); @@ -62,23 +66,38 @@ public class BomBomEffect extends GiftEffect { armorStand1.getEquipment().setItem(EquipmentSlot.CHEST, ITEM_2); armorStand1.getEquipment().setItem(EquipmentSlot.LEGS, ITEM_3); armorStand1.getEquipment().setItem(EquipmentSlot.FEET, ITEM_4); + armorStand1.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(6.0); }); new BukkitRunnable() { private int count = 0; @Override public void run() { - if (count >= 10) { + Location loc = armorStand.getLocation().clone().add(0, 8, 0); + if (count > 30) { armorStand.remove(); - for (int i =0; i < 3; i++) { + for (int i = 0; i < 3; i++) { armorStand.getWorld().createExplosion(armorStand.getLocation(), 5f, true, true); } + Random random = new Random(); + for (int i = 0; i < 500; i++) { + FallingBlock fallingBlock = (FallingBlock) world.spawnEntity(loc, EntityType.FALLING_BLOCK, CreatureSpawnEvent.SpawnReason.CUSTOM, (fallingBlockEntity)->{ + FallingBlock fallingBlock1 = (FallingBlock) fallingBlockEntity; + fallingBlock1.setBlockData(Bukkit.createBlockData(Material.MAGMA_BLOCK)); + fallingBlock1.setDropItem(false); + fallingBlock1.setCancelDrop(true); + }); + fallingBlocks.add(fallingBlock); + EntityUtil.shoot(fallingBlock, (Math.random() * 1.8D - 1.5D) * 0.1f, 0.2f + Math.random() * 0.1f, (Math.random() * 1.8D - 1.5D) * 0.1f, 3f + random.nextFloat() * 1.5f, 0f); + player.getWorld().playSound(fallingBlock.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1f, 1f); + } + bossBar.removeAll(); stop = true; cancel(); return; } Random random = new Random(); - for (int i = 0; i < 30; i++) { - FallingBlock fallingBlock = (FallingBlock) world.spawnEntity(armorStand.getLocation(), EntityType.FALLING_BLOCK, CreatureSpawnEvent.SpawnReason.CUSTOM, (fallingBlockEntity)->{ + for (int i = 0; i < 35; i++) { + FallingBlock fallingBlock = (FallingBlock) world.spawnEntity(loc, EntityType.FALLING_BLOCK, CreatureSpawnEvent.SpawnReason.CUSTOM, (fallingBlockEntity)->{ FallingBlock fallingBlock1 = (FallingBlock) fallingBlockEntity; fallingBlock1.setBlockData(Bukkit.createBlockData(Material.MAGMA_BLOCK)); fallingBlock1.setDropItem(false); @@ -89,6 +108,14 @@ public class BomBomEffect extends GiftEffect { EntityUtil.shoot(fallingBlock, (Math.random() * 2.5D - 1.5D) * 0.1f, 0.4f + Math.random() * 0.15f, (Math.random() * 2.5D - 1.5D) * 0.1f, 3f + random.nextFloat() * 1.5f, 0f); player.getWorld().playSound(fallingBlock.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1f, 1f); } + for (int i = 0; i < 15; i++) { + TNTPrimed tntPrimed = (TNTPrimed) world.spawnEntity(loc, EntityType.TNT, CreatureSpawnEvent.SpawnReason.CUSTOM, (tntEntity)->{ + TNTPrimed tntPrimed1 = (TNTPrimed) tntEntity; + tntPrimed1.setFuseTicks(80); + tntPrimed1.setYield(4); + }); + EntityUtil.shoot(tntPrimed, (Math.random() * 2D - 1.5D) * 0.08f, 0.1f + Math.random() * 0.025f, (Math.random() * 2D - 1.5D) * 0.08f, 3f + random.nextFloat() * 1.5f, 0f); + } count++; } }.runTaskTimer(Main.plugin, 0L, 15L); @@ -105,6 +132,7 @@ public class BomBomEffect extends GiftEffect { armorStand.getEquipment().setItem(EquipmentSlot.CHEST, flag ? ITEM_2 : ITEM_5); armorStand.getEquipment().setItem(EquipmentSlot.LEGS, flag ? ITEM_3 : ITEM_6); armorStand.getEquipment().setItem(EquipmentSlot.FEET, flag ? ITEM_4 : ITEM_7); + bossBar.setTitle(flag? "§4§l毁天灭地" : "§c§l毁天灭地"); count++; } }.runTaskTimer(Main.plugin, 0L, 5L); @@ -125,7 +153,6 @@ public class BomBomEffect extends GiftEffect { } }.runTaskTimer(Main.plugin, 0L, 2L); new BukkitRunnable() { - private int count = 0; @Override public void run() { if (fallingBlocks.isEmpty()) { @@ -135,18 +162,19 @@ public class BomBomEffect extends GiftEffect { Iterator iterator = fallingBlocks.iterator(); while (iterator.hasNext()) { FallingBlock fallingBlock = iterator.next(); - Location location = fallingBlock.getLocation().add(0, -2, 0); - Block block = location.getBlock(); - if (block.getType() != Material.AIR) { + Location location = fallingBlock.getLocation(); + if (fallingBlock.isOnGround() || fallingBlock.isDead()) { location.getWorld().createExplosion(location, 5f, true, true); + armorStand.getWorld().spawnParticle(Particle.LAVA, fallingBlock.getLocation(), 35, 1.5, 1.5, 1.5, 0.05); + armorStand.getWorld().spawnParticle(Particle.FLAME, fallingBlock.getLocation(), 35, 1.5, 1.5, 1.5, 0.01); location.add(0, 1, 0).getBlock().setType(Material.LAVA); fallingBlock.remove(); iterator.remove(); + return; } } - count++; } - }.runTaskTimer(Main.plugin, 0L, 2L); + }.runTaskTimer(Main.plugin, 0L, 1L); } static { diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/ClearInventoryEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/ClearInventoryEffect.java new file mode 100644 index 0000000..eb9ce60 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/ClearInventoryEffect.java @@ -0,0 +1,91 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.Main; +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.util.RandomUtil; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.entity.Allay; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class ClearInventoryEffect extends GiftEffect { + + public ClearInventoryEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + World world = game.getWorld(); + Player player = game.getPlayer(); + List allays = new ArrayList<>(); + new BukkitRunnable() { + private int totalCount = Math.max(15, getUseableItemCount(player).size()); + private int count = 0; + @Override + public void run() { + if (count > totalCount) { + for (Allay allay : allays) { + allay.getWorld().spawnParticle(Particle.WAX_OFF, allay.getLocation(), 30, 0.5, 0.5, 0.5, 0.1); + allay.remove(); + } + player.getInventory().clear(); + cancel(); + return; + } + Allay allay = (Allay) world.spawnEntity(player.getLocation().add(0, 1, 0), EntityType.ALLAY, CreatureSpawnEvent.SpawnReason.CUSTOM, (entity)->{ + Allay allay1 = (Allay) entity; + Vector vector = player.getEyeLocation().getDirection(); + vector.normalize(); + vector.multiply(0.5); + allay1.setVelocity(vector); + allay1.setGlowing(true); + allay1.setCollidable(false); + allay1.setInvulnerable(true); + ItemStack item = takeRandomItem(player); + if (item == null) { + item = new ItemStack(Material.DIAMOND); + } + allay1.getEquipment().setItemInMainHand(item); + }); + player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 1, 1); + allays.add(allay); + count++; + } + }.runTaskTimer(Main.plugin, 10L, 4L); + } + + private List getUseableItemCount(Player player) { + List useableSlots = new ArrayList<>(); + for (int i = 0; i < 36; i++) { + ItemStack item = player.getInventory().getItem(i); + if (item != null && item.getType() != Material.AIR) { + useableSlots.add(i); + } + } + return useableSlots; + } + + private ItemStack takeRandomItem(Player player) { + List useableSlots = getUseableItemCount(player); + if (useableSlots.isEmpty()) { + return null; + } + int i = RandomUtil.getRandomInt(0, useableSlots.size() - 1); + ItemStack item = player.getInventory().getItem(useableSlots.get(i)); + player.getInventory().setItem(useableSlots.get(i), null); + return item; + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/FiveLightningEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/FiveLightningEffect.java new file mode 100644 index 0000000..98e88e3 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/FiveLightningEffect.java @@ -0,0 +1,32 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.Main; +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class FiveLightningEffect extends GiftEffect { + + public FiveLightningEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + new BukkitRunnable() { + private int count = 0; + @Override + public void run() { + if (count > 5) { + cancel(); + return; + } + player.getWorld().strikeLightning(player.getLocation()); + count++; + } + }.runTaskTimer(Main.plugin, 0, 10L); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/GiveTotemEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/GiveTotemEffect.java new file mode 100644 index 0000000..6194e2c --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/GiveTotemEffect.java @@ -0,0 +1,21 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class GiveTotemEffect extends GiftEffect { + + public GiveTotemEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + player.getInventory().addItem(new ItemStack(Material.TOTEM_OF_UNDYING)); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/LavaPoolEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/LavaPoolEffect.java new file mode 100644 index 0000000..d572baa --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/LavaPoolEffect.java @@ -0,0 +1,71 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.util.RandomUtil; +import net.kyori.adventure.text.Component; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Blaze; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.MagmaCube; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class LavaPoolEffect extends GiftEffect { + + public LavaPoolEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + Location location = player.getLocation(); + + int size = 20; + + int minX = location.getBlockX() - size / 2; + int minY = location.getBlockY() - 3; + int minZ = location.getBlockZ() - size / 2; + int maxX = location.getBlockX() + size / 2; + int maxY = location.getBlockY(); + int maxZ = location.getBlockZ() + size / 2; + + for (int i = 0; i < 6; i++) { + Location location1 = getRandomLocation(location.add(0, 3, 0), size - 3, 3, size - 3); + Blaze blaze = (Blaze) location1.getWorld().spawnEntity(location1, EntityType.BLAZE); + blaze.setTarget(player); + blaze.customName(Component.text("§4§l烈焰人")); + blaze.setCustomNameVisible(true); + } + for (int i = 0; i < 6; i++) { + Location location1 = getRandomLocation(location, size - 3, 0, size - 3); + MagmaCube magmaCube = (MagmaCube) location1.getWorld().spawnEntity(location1, EntityType.MAGMA_CUBE); + magmaCube.setTarget(player); + magmaCube.customName(Component.text("§4§l岩浆怪")); + magmaCube.setCustomNameVisible(true); + } + player.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 20 * 60, 1, true, true, true)); + + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + for (int z = minZ; z <= maxZ; z++) { + Block block = location.getWorld().getBlockAt(x, y, z); + block.setType(Material.LAVA); + } + } + } + + } + + private Location getRandomLocation(Location location, double xRange, double yRange, double zRange) { + return new Location(location.getWorld(), + RandomUtil.getRandomDouble(location.getX() - xRange, location.getX() + xRange, 1), + RandomUtil.getRandomDouble(location.getY() - yRange, location.getY() + yRange, 1), + RandomUtil.getRandomDouble(location.getZ() - zRange, location.getZ() + zRange, 1)); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/LuckyBlockEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/LuckyBlockEffect.java new file mode 100644 index 0000000..6352609 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/LuckyBlockEffect.java @@ -0,0 +1,55 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.util.ItemStackBuilder; +import com.yaohun.enderdragonwars.util.RandomUtil; +import net.kyori.adventure.text.Component; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class LuckyBlockEffect extends GiftEffect { + + private static List itemStacks = new ArrayList<>(); + + public LuckyBlockEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + game.getPlayer().getInventory().addItem(new ItemStackBuilder(Material.SPONGE).setDisplayName("§6§l幸运方块").build()); + } + + public static void openLuckyBlock(Player player, Block block) { + Location location = block.getLocation().add(0.5, 0.5, 0.5); + location.getWorld().spawnParticle(Particle.FIREWORK, location, 35, 0.55, 0.55, 0.55, 0.05); + player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1, 1); + ItemStack itemStack = itemStacks.get(RandomUtil.getRandomInt(0, itemStacks.size() - 1)); + Item item = location.getWorld().dropItemNaturally(location, itemStack); + item.setOwner(player.getUniqueId()); + if (itemStack.getItemMeta().hasDisplayName()) { + item.customName(itemStack.getItemMeta().displayName()); + item.setCustomNameVisible(true); + } + item.setGlowing(true); + } + + static { + itemStacks.add(new ItemStackBuilder(Material.IRON_SWORD).addEnchant(Enchantment.SHARPNESS, 3).build()); + itemStacks.add(new ItemStackBuilder(Material.IRON_SWORD).addEnchant(Enchantment.SHARPNESS, 3).setDisplayName("§6§l幸运铁剑").build()); + itemStacks.add(new ItemStackBuilder(Material.GOLDEN_SWORD).addEnchant(Enchantment.SHARPNESS, 5).addEnchant(Enchantment.FIRE_ASPECT, 2).setDisplayName("§6§l幸运金剑").build()); + itemStacks.add(new ItemStackBuilder(Material.DIAMOND_CHESTPLATE).addEnchant(Enchantment.PROTECTION, 3).setDisplayName("§6§l幸运钻石胸甲").build()); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerBigEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerBigEffect.java new file mode 100644 index 0000000..e560f46 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerBigEffect.java @@ -0,0 +1,24 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; + +public class PlayerBigEffect extends GiftEffect { + + public PlayerBigEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + if (player.getAttribute(Attribute.GENERIC_SCALE).getBaseValue() >= 20) { + return; + } + player.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(player.getAttribute(Attribute.GENERIC_SCALE).getBaseValue() + 0.5); + player.getAttribute(Attribute.PLAYER_BLOCK_INTERACTION_RANGE).setBaseValue(player.getAttribute(Attribute.PLAYER_BLOCK_INTERACTION_RANGE).getBaseValue() + 1); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerResetEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerResetEffect.java new file mode 100644 index 0000000..25cbf8e --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerResetEffect.java @@ -0,0 +1,21 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; + +public class PlayerResetEffect extends GiftEffect { + + public PlayerResetEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + player.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(1); + player.getAttribute(Attribute.PLAYER_BLOCK_INTERACTION_RANGE).setBaseValue(4.5); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerSmallEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerSmallEffect.java new file mode 100644 index 0000000..e79e4d4 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/PlayerSmallEffect.java @@ -0,0 +1,24 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; + +public class PlayerSmallEffect extends GiftEffect { + + public PlayerSmallEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + if (player.getAttribute(Attribute.GENERIC_SCALE).getBaseValue() <= 0.1) { + return; + } + player.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(player.getAttribute(Attribute.GENERIC_SCALE).getBaseValue() - 0.5); + player.getAttribute(Attribute.PLAYER_BLOCK_INTERACTION_RANGE).setBaseValue(player.getAttribute(Attribute.PLAYER_BLOCK_INTERACTION_RANGE).getBaseValue() - 0.5); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/SpawnBuildEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/SpawnBuildEffect.java new file mode 100644 index 0000000..3710768 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/SpawnBuildEffect.java @@ -0,0 +1,20 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.util.WEUtil; +import org.bukkit.entity.Player; + +public class SpawnBuildEffect extends GiftEffect { + + public SpawnBuildEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + WEUtil.loadSchematics(player.getLocation(), "anquanwu"); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/SpawnEnderPortalEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/SpawnEnderPortalEffect.java new file mode 100644 index 0000000..08fafb7 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/SpawnEnderPortalEffect.java @@ -0,0 +1,50 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.data.Region; +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.util.BuildSpawner; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.List; + +public class SpawnEnderPortalEffect extends GiftEffect { + + private static final List MATERIAL_LIST = Arrays.asList(Material.WHITE_WOOL, Material.BLACK_WOOL, Material.BROWN_WOOL, Material.BLUE_WOOL, Material.GREEN_WOOL, Material.RED_WOOL, Material.YELLOW_WOOL, Material.PURPLE_WOOL, Material.ORANGE_WOOL, Material.PINK_WOOL, Material.LIGHT_BLUE_WOOL, Material.LIME_WOOL); + + + public SpawnEnderPortalEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + int chunkWight = 2; + int chunkLength = 2; + int ladderLength = 3; + int ladderAmount = 5; + int platformWidth = 3; + int platformLength = 7; + int levelAmount = 15; + World world = game.getWorld(); + Player player = game.getPlayer(); + Location location = player.getLocation(); + BuildSpawner buildSpawner = new BuildSpawner(world, BuildSpawner.Direction.NORTH, location.getBlockX(), location.getBlockY() - 1, location.getBlockZ(), chunkWight, chunkLength, ladderLength, ladderAmount, platformWidth, platformLength, levelAmount, BuildSpawner.SpawnMode.MODE_2, MATERIAL_LIST); + Region region = buildSpawner.getEffectiveRegion(world); + for (int x = region.getMin().getBlockX(); x <= region.getMax().getBlockX(); x++) { + for (int y = region.getMin().getBlockY(); y <= region.getMax().getBlockY(); y++) { + for (int z = region.getMin().getBlockZ(); z <= region.getMax().getBlockZ(); z++) { + if (world.getBlockAt(x, y, z).getType() != Material.AIR) { + world.getBlockAt(x, y, z).setType(Material.AIR); + } + } + } + } + buildSpawner.spawn(); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/SummonIronGolem.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/SummonIronGolem.java new file mode 100644 index 0000000..60f10b5 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/SummonIronGolem.java @@ -0,0 +1,20 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +public class SummonIronGolem extends GiftEffect { + + public SummonIronGolem(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + player.getWorld().spawnEntity(player.getLocation(), EntityType.IRON_GOLEM); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/TakeMaxHealthEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/TakeMaxHealthEffect.java new file mode 100644 index 0000000..71959e5 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/TakeMaxHealthEffect.java @@ -0,0 +1,26 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.Particle; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; + +public class TakeMaxHealthEffect extends GiftEffect { + + public TakeMaxHealthEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + player.spawnParticle(Particle.SMOKE, player.getLocation().add(0, 1, 0), 30, 0.25, 0.25, 0.25, 0.05); + if (player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() <= 20) { + return; + } + player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() - 20); + } + + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/effect/types/ToHeavenEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/ToHeavenEffect.java new file mode 100644 index 0000000..1c1da6c --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/ToHeavenEffect.java @@ -0,0 +1,45 @@ +package com.yaohun.enderdragonwars.effect.types; + +import com.yaohun.enderdragonwars.Main; +import com.yaohun.enderdragonwars.effect.GiftEffect; +import com.yaohun.enderdragonwars.game.Game; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +public class ToHeavenEffect extends GiftEffect { + + public ToHeavenEffect(String audience) { + super(audience); + } + + @Override + public void apply(Game game) { + Player player = game.getPlayer(); + double radius = 1.5D; + new BukkitRunnable() { + private int count = 0; + private double angle = 0; + private double speed = 1.25; + private int skyTnt = 0; + @Override + public void run() { + if (count >= 200) { + cancel(); + return; + } + double radius = 1.5; + double angleStep = Math.PI / 4; + double angle = skyTnt * angleStep; + Vector vector = new Vector(radius * Math.cos(angle), 0.5, radius * Math.sin(angle)); + player.setVelocity(vector); + skyTnt++; + if (skyTnt >= 8) { + skyTnt = 0; + } + count++; + } + }.runTaskTimer(Main.plugin, 0L, 1L); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonwars/effectevent/ClearInvEffect.java b/src/main/java/com/yaohun/enderdragonWars/effect/types/WorldDestroyEffect.java similarity index 55% rename from src/main/java/com/yaohun/enderdragonwars/effectevent/ClearInvEffect.java rename to src/main/java/com/yaohun/enderdragonWars/effect/types/WorldDestroyEffect.java index 0378bd4..28ef939 100644 --- a/src/main/java/com/yaohun/enderdragonwars/effectevent/ClearInvEffect.java +++ b/src/main/java/com/yaohun/enderdragonWars/effect/types/WorldDestroyEffect.java @@ -1,11 +1,11 @@ -package com.yaohun.enderdragonwars.effectevent; +package com.yaohun.enderdragonwars.effect.types; import com.yaohun.enderdragonwars.effect.GiftEffect; import com.yaohun.enderdragonwars.game.Game; -public class ClearInvEffect extends GiftEffect { +public class WorldDestroyEffect extends GiftEffect { - public ClearInvEffect(String audience) { + public WorldDestroyEffect(String audience) { super(audience); } diff --git a/src/main/java/com/yaohun/enderdragonWars/effectevent/ClearInvEffect.java b/src/main/java/com/yaohun/enderdragonWars/effectevent/ClearInvEffect.java deleted file mode 100644 index 75d408f..0000000 --- a/src/main/java/com/yaohun/enderdragonWars/effectevent/ClearInvEffect.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.yaohun.enderdragonWars.effectevent; - -import com.yaohun.enderdragonWars.effect.GiftEffect; -import com.yaohun.enderdragonWars.game.Game; - -public class ClearInvEffect extends GiftEffect { - - public ClearInvEffect(String audience) { - super(audience); - } - - @Override - public void apply(Game game) { - /* - * 获取玩家背包中所有物品然后从头上像喷泉一样到处散落 - * 给这些掉落的物品添加一个nbt antipick: true - * */ - - } -} diff --git a/src/main/java/com/yaohun/enderdragonWars/listener/PlayerListener.java b/src/main/java/com/yaohun/enderdragonWars/listener/PlayerListener.java new file mode 100644 index 0000000..c188708 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/listener/PlayerListener.java @@ -0,0 +1,81 @@ +package com.yaohun.enderdragonwars.listener; + +import com.yaohun.enderdragonwars.effect.types.LuckyBlockEffect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.IronGolem; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +import java.util.HashMap; +import java.util.Map; + +public class PlayerListener implements Listener { + + private static Map totem = new HashMap<>(); + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if (event.getEntity() instanceof Player player) { + PlayerInventory inventory = player.getInventory(); + Material item = Material.TOTEM_OF_UNDYING; + ItemStack mainhand = inventory.getItemInMainHand(); + ItemStack offhand = inventory.getItemInOffHand(); + if (player.getHealth() - event.getFinalDamage() <= 0.0d && inventory.contains(item)) { + if (mainhand != null && mainhand.getType() == item) { + return; + } + if ((offhand == null || offhand.getType() != item)) { + this.totem.put(player, inventory.getItemInOffHand()); + ItemStack[] contents = inventory.getContents(); + int length = contents.length; + int i = 0; + while (true) { + if (i >= length) { + break; + } + ItemStack totem = contents[i]; + if (totem != null && totem.getType().equals(item)) { + totem.setAmount(totem.getAmount() - 1); + break; + } + i++; + } + inventory.setItemInOffHand(new ItemStack(Material.TOTEM_OF_UNDYING)); + } + } + } + } + + @EventHandler + public void onPlayerBreakBlock(BlockBreakEvent event) { + Player player = event.getPlayer(); + Block block = event.getBlock(); + if (block.getType() == Material.SPONGE) { + event.setCancelled(true); + block.setType(Material.AIR); + LuckyBlockEffect.openLuckyBlock(player, block); + } + } + + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + if (entity instanceof IronGolem) { + entity.addPassenger(player); + } + } + + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/manager/GiftEffectManager.java b/src/main/java/com/yaohun/enderdragonWars/manager/GiftEffectManager.java index 5f9a8f7..d772418 100644 --- a/src/main/java/com/yaohun/enderdragonWars/manager/GiftEffectManager.java +++ b/src/main/java/com/yaohun/enderdragonWars/manager/GiftEffectManager.java @@ -2,8 +2,8 @@ package com.yaohun.enderdragonwars.manager; import com.yaohun.enderdragonwars.effect.GiftEffect; import com.yaohun.enderdragonwars.effect.GiftQueue; -import com.yaohun.enderdragonwars.effectevent.BomBomEffect; -import com.yaohun.enderdragonwars.effectevent.ClearInvEffect; +import com.yaohun.enderdragonwars.effect.types.BomBomEffect; +import com.yaohun.enderdragonwars.effect.types.ClearInventoryEffect; import org.bukkit.scheduler.BukkitTask; import java.util.HashMap; @@ -41,7 +41,7 @@ public class GiftEffectManager { } public static void registerAll() { - registerGiftEffect("清理背包", ClearInvEffect::new); + registerGiftEffect("清理背包", ClearInventoryEffect::new); registerGiftEffect("火山喷发", BomBomEffect::new); } diff --git a/src/main/java/com/yaohun/enderdragonWars/util/BuildSpawner.java b/src/main/java/com/yaohun/enderdragonWars/util/BuildSpawner.java new file mode 100644 index 0000000..25385e1 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/util/BuildSpawner.java @@ -0,0 +1,462 @@ +package com.yaohun.enderdragonwars.util; + +import com.yaohun.enderdragonwars.Main; +import com.yaohun.enderdragonwars.data.Point; +import com.yaohun.enderdragonwars.data.Region; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.EndPortalFrame; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.Arrays; +import java.util.List; + +public class BuildSpawner { + + private World world; + private Direction initialDirection; + private int originX; + private int originY; + private int originZ; + private int chunkWight; + private int chunkLength; + private int ladderLength; + private int ladderAmount; + private int platformWidth; + private int platformLength; + private int levelAmount; + private SpawnMode spawnMode; + + private int nowX; + private int nowY; + private int nowZ; + private Direction nowDirection; + + private List materials; + + protected ISpawnModeHander spawnModeHander; + + public BuildSpawner(World world, Direction initialDirection, int originX, int originY, int originZ, int chunkWight, int chunkLength, int ladderLength, int ladderAmount, int platformWidth, int platformLength, int levelAmount, SpawnMode spawnMode, List materials) { + this.world = world; + this.initialDirection = initialDirection; + this.originX = originX; + this.originY = originY; + this.originZ = originZ; + this.chunkWight = chunkWight; + this.chunkLength = chunkLength; + this.ladderLength = ladderLength; + this.ladderAmount = ladderAmount; + this.platformWidth = platformWidth; + this.platformLength = platformLength; + this.levelAmount = levelAmount; + this.spawnMode = spawnMode; + this.materials = materials; + + nowX = originX; + nowY = originY; + nowZ = originZ; + nowDirection = initialDirection; + if (spawnMode == SpawnMode.MODE_1) { + spawnModeHander = new SpawnModeHandler_1(); + } else if (spawnMode == SpawnMode.MODE_2) { + spawnModeHander = new SpawnModeHandler_2(); + } + } + + public void spawn() { + nowX = originX; + nowY = originY; + nowZ = originZ; + nowDirection = initialDirection; + if (spawnModeHander != null) { + spawnModeHander.spawn(); + } + } + + private void spawnPlatform(int x, int y, int z, Direction direction) { + if (direction == Direction.EAST || direction == Direction.WEST) { + for (int i = 0; i < platformLength; i++) { + for (int j = 0; j < platformWidth; j++) { + int x1 = x + (i * chunkWight) * direction.getPlatformVector().getBlockX(); + int z1 = z + (j * chunkLength) * direction.getPlatformVector().getBlockZ(); + spawnPlatformChunk(x1, y, z1, direction); + } + } + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + for (int i = 0; i < platformLength; i++) { + for (int j = 0; j < platformWidth; j++) { + int x1 = x + (j * chunkLength) * direction.getPlatformVector().getBlockX(); + int z1 = z + (i * chunkWight) * direction.getPlatformVector().getBlockZ(); + spawnPlatformChunk(x1, y, z1, direction); + } + } + } + } + + private void spawnLadder(int x, int y, int z, Direction direction) { + for (int i = 0; i < ladderAmount; i++) { + for (int j = 0; j < ladderLength; j++) { + int x1 = getLadderX(i, j, x, z, direction); + int z1 = getLadderZ(i, j, x, z, direction); + spawnLadderChunk(x1, y + i + 1, z1, direction); + } + } + } + + private int getLadderX(int i, int j, int x, int z, Direction direction) { + switch (direction) { + case EAST: + case WEST: + return x + (i * chunkWight) * direction.getLadderVector().getBlockX(); + case SOUTH: + case NORTH: + return x + (j * chunkLength) * direction.getLadderVector().getBlockX(); + } + return x; + } + + private int getLadderZ(int i, int j, int x, int z, Direction direction) { + switch (direction) { + case EAST: + case WEST: + return z + (j * chunkLength) * direction.getLadderVector().getBlockZ(); + case SOUTH: + case NORTH: + return z + (i * chunkWight) * direction.getLadderVector().getBlockZ(); + } + return z; + } + + private void spawnPlatformChunk(int x, int y, int z, Direction direction) { + Material material = getRandomMaterial(); + if (direction == Direction.EAST || direction == Direction.WEST) { + for (int i = 0; i < chunkWight; i++) { + for (int j = 0; j < chunkLength; j++) { + int x1 = x + i * direction.getPlatformVector().getBlockX(); + int z1 = z + j * direction.getPlatformVector().getBlockZ(); + world.getBlockAt(x1, y, z1).setType(material); + } + } + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + for (int i = 0; i < chunkWight; i++) { + for (int j = 0; j < chunkLength; j++) { + int x1 = x + j * direction.getPlatformVector().getBlockX(); + int z1 = z + i * direction.getPlatformVector().getBlockZ(); + world.getBlockAt(x1, y, z1).setType(material); + } + } + } + } + + private void spawnLadderChunk(int x, int y, int z, Direction direction) { + Material material = getRandomMaterial(); + if (direction == Direction.EAST || direction == Direction.WEST) { + for (int i = 0; i < chunkWight; i++) { + for (int j = 0; j < chunkLength; j++) { + int x1 = x + i * direction.getLadderVector().getBlockX(); + int z1 = z + j * direction.getLadderVector().getBlockZ(); + world.getBlockAt(x1, y, z1).setType(material); + } + } + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + for (int i = 0; i < chunkLength; i++) { + for (int j = 0; j < chunkWight; j++) { + int x1 = x + i * direction.getLadderVector().getBlockX(); + int z1 = z + j * direction.getLadderVector().getBlockZ(); + world.getBlockAt(x1, y, z1).setType(material); + } + } + } + } + + private void transformDirection() { + nowDirection = nowDirection.getRightDirection(); + } + + private enum TransformType { + PLATFORM, + LADDER + } + + public enum Direction { + + NORTH(new Vector(1.0, 1.0, -1.0), new Vector(-1.0, 1.0, -1.0), new Vector(1.0, 1.0, -1.0)), + EAST(new Vector(1.0, 1.0, 1.0), new Vector(1.0, 1.0, -1.0), new Vector(1.0, 1.0, 1.0)), + SOUTH(new Vector(-1.0, 1.0, 1.0), new Vector(1.0, 1.0, 1.0), new Vector(-1.0, 1.0, 1.0)), + WEST(new Vector(-1.0, 1.0, -1.0), new Vector(-1.0, 1.0, 1.0), new Vector(-1.0, 1.0, -1.0)); + + private final Vector vector; + private final Vector platformVector; + private final Vector ladderVector; + + Direction(Vector vector, Vector platformVector, Vector ladderVector) { + this.vector = vector; + this.platformVector = platformVector; + this.ladderVector = ladderVector; + } + + public Vector getVector() { + return vector; + } + + public Vector getPlatformVector() { + return platformVector; + } + + public Vector getLadderVector() { + return ladderVector; + } + + public Direction getRightDirection() { + switch (this) { + case NORTH: + return EAST; + case EAST: + return SOUTH; + case SOUTH: + return WEST; + case WEST: + return NORTH; + } + return null; + } + + } + + public Region getEffectiveRegion(World world) { + return spawnModeHander.getEffectiveRegion(world); + } + + public int getHeight() { + return spawnModeHander.getHeight(); + } + + public enum SpawnMode { + + MODE_1, + MODE_2 + + } + + private class SpawnModeHandler_1 implements ISpawnModeHander { + @Override + public void spawn() { + new BukkitRunnable() { + private int count = 0; + @Override + public void run() { + if (count >= levelAmount) { + spawnPlatform(nowX, nowY, nowZ, nowDirection); + cancel(); + return; + } + spawnPlatform(nowX, nowY, nowZ, nowDirection); + transformXYZ(TransformType.PLATFORM, nowDirection); + transformDirection(); + spawnLadder(nowX, nowY, nowZ, nowDirection); + transformXYZ(TransformType.LADDER, nowDirection); + transformDirection(); + count++; + } + }.runTaskTimer(Main.plugin, 0L, 3L); + } + + @Override + public Region getEffectiveRegion(World world) { + if (initialDirection == Direction.NORTH || initialDirection == Direction.SOUTH) { + int minX = originX + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockX(); + int minY = originY; + int minZ = originZ; + int maxX = originX + ladderAmount * ladderLength * chunkLength * initialDirection.getLadderVector().getBlockX() + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockX() + 1; + int maxY = originY + levelAmount * 5 + 1; + int maxZ = originZ + (platformLength * chunkLength) * initialDirection.getPlatformVector().getBlockZ() + 1; + return new Region(world, new Point(minX, minY, minZ), new Point(maxX, maxY, maxZ)); + } else if (initialDirection == Direction.EAST || initialDirection == Direction.WEST) { + int minX = originX; + int minY = originY; + int minZ = originZ + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockZ(); + int maxX = originX + (platformLength * chunkLength) * initialDirection.getPlatformVector().getBlockX() + 1; + int maxY = originY + levelAmount * 5 + 1; + int maxZ = originZ + ladderAmount * ladderLength * chunkLength * initialDirection.getLadderVector().getBlockX() + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockZ() + 1; + return new Region(world, new Point(minX, minY, minZ), new Point(maxX, maxY, maxZ)); + } + return null; + } + + @Override + public int getHeight() { + return levelAmount * 5; + } + + private void transformXYZ(TransformType transformType, Direction direction) { + if (transformType == TransformType.PLATFORM) { + if (direction == Direction.EAST || direction == Direction.WEST) { + nowX += (platformLength * chunkWight - 1) * direction.getPlatformVector().getX(); + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + nowZ += (platformLength * chunkWight - 1) * direction.getPlatformVector().getZ(); + } + switch (nowDirection) { + case EAST: + nowZ += 1; + break; + case SOUTH: + nowX -= 1; + break; + case WEST: + nowZ -= 1; + break; + case NORTH: + nowX += 1; + break; + } + } else if (transformType == TransformType.LADDER) { + nowY += ladderAmount; + if (direction == Direction.EAST || direction == Direction.WEST) { + nowX += (ladderAmount * chunkWight) * direction.getLadderVector().getBlockX(); + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + nowZ += (ladderAmount * chunkWight) * direction.getLadderVector().getBlockZ(); + } + } + } + } + + private class SpawnModeHandler_2 implements ISpawnModeHander { + + @Override + public void spawn() { + new BukkitRunnable() { + private int count = 0; + @Override + public void run() { + if (count >= levelAmount) { + spawnPlatform(nowX, nowY, nowZ, nowDirection); + Region region = getEffectiveRegion(world); + int centerX = (region.getMax().getBlockX() - region.getMin().getBlockX() + 1) / 2; + int centerZ = (region.getMax().getBlockZ() - region.getMin().getBlockZ() + 1) / 2; + Point blockCenterPoint = new Point(region.getMin().getBlockX() + centerZ, region.getMax().getBlockY() - 3, region.getMin().getBlockZ() + centerZ); + Block block = world.getBlockAt(blockCenterPoint.getBlockX(), blockCenterPoint.getBlockY(), blockCenterPoint.getBlockZ()); + for (int i = -6; i <= 6; i++) { + for (int j = -6; j <= 6; j++) { + if (Math.abs(i) == 6 && Math.abs(j) == 6) { + continue; + } + Block block1 = world.getBlockAt(blockCenterPoint.getBlockX() + i, blockCenterPoint.getBlockY(), blockCenterPoint.getBlockZ() + j); + if (Math.abs(i) <= 5 && Math.abs(j) <= 5) { + block1.setType(Material.END_PORTAL); + } else { + block1.setType(Material.END_PORTAL_FRAME); + EndPortalFrame endPortalFrame = (EndPortalFrame) block1.getBlockData(); + endPortalFrame.setEye(true); + block1.setBlockData(endPortalFrame); + } + } + } + block.getWorld().strikeLightning(block.getLocation().add(0.5, 0, 0.5)); + block.getWorld().getPlayers().forEach(player -> player.playSound(player.getLocation(), Sound.BLOCK_END_PORTAL_SPAWN, 1.0f, 1.0f)); + cancel(); + return; + } + spawnPlatform(nowX, nowY, nowZ, nowDirection); + transformXYZ(TransformType.PLATFORM, nowDirection, 0); + spawnLadder(nowX, nowY, nowZ, nowDirection); + transformXYZ(TransformType.LADDER, nowDirection, 0); + transformDirection(); + count++; + } + }.runTaskTimer(Main.plugin, 0L, 3L); + } + + @Override + public Region getEffectiveRegion(World world) { + if (initialDirection == Direction.NORTH || initialDirection == Direction.SOUTH) { + int minX = originX + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockX(); + int minZ = originZ; + minZ += (platformLength * chunkLength) * initialDirection.getPlatformVector().getBlockZ(); + minZ += (ladderAmount * chunkLength) * initialDirection.getLadderVector().getBlockZ(); + minZ += (platformWidth * chunkWight) * initialDirection.getRightDirection().getPlatformVector().getBlockZ(); + int maxX = originX + ladderAmount * ladderLength * chunkLength * initialDirection.getLadderVector().getBlockX() + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockX()+ 1; + int maxZ = originZ; + int maxY = originY + levelAmount * 5 + 1; + return new Region(world, new Point(minX, originY, minZ), new Point(maxX, maxY, maxZ)); + } else if (initialDirection == Direction.EAST || initialDirection == Direction.WEST) { + int minX = originX; + int minZ = originZ + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockZ(); + minX += (platformLength * chunkLength) * initialDirection.getPlatformVector().getBlockX(); + minX += (ladderAmount * chunkLength) * initialDirection.getLadderVector().getBlockX(); + minX += (platformWidth * chunkWight) * initialDirection.getRightDirection().getPlatformVector().getBlockX(); + int maxX = originX; + int maxZ = originZ + ladderAmount * ladderLength * chunkLength * initialDirection.getLadderVector().getBlockZ() + (platformWidth * chunkWight) * initialDirection.getPlatformVector().getBlockZ()+ 1; + int maxY = originY + levelAmount * 5 + 1; + return new Region(world, new Point(minX, originY, minZ), new Point(maxX, maxY, maxZ)); + } + return null; + } + + @Override + public int getHeight() { + return levelAmount * 5; + } + + private void transformXYZ(TransformType transformType, Direction direction, int type) { + if (transformType == TransformType.PLATFORM) { + if (type == 0) { + if (direction == Direction.EAST || direction == Direction.WEST) { + nowX += (platformLength * chunkWight) * direction.getPlatformVector().getX(); + nowZ += (platformWidth * chunkLength - 1) * direction.getPlatformVector().getZ(); + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + nowX += (platformWidth * chunkLength - 1) * direction.getPlatformVector().getX(); + nowZ += (platformLength * chunkWight) * direction.getPlatformVector().getZ(); + } + } else if (type == 1) { + if (direction == Direction.EAST || direction == Direction.WEST) { + nowX += (platformLength * chunkWight - 1) * direction.getPlatformVector().getX(); + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + nowZ += (platformLength * chunkWight - 1) * direction.getPlatformVector().getZ(); + } + switch (nowDirection) { + case EAST: + nowZ += 1; + break; + case SOUTH: + nowX -= 1; + break; + case WEST: + nowZ -= 1; + break; + case NORTH: + nowX += 1; + break; + } + } + } else if (transformType == TransformType.LADDER) { + nowY += ladderAmount; + if (direction == Direction.EAST || direction == Direction.WEST) { + nowX += (ladderAmount * chunkWight) * direction.getLadderVector().getBlockX(); + } else if (direction == Direction.NORTH || direction == Direction.SOUTH) { + nowZ += (ladderAmount * chunkWight) * direction.getLadderVector().getBlockZ(); + } + } + } + + } + + public void setInitialDirection(Direction initialDirection) { + this.initialDirection = initialDirection; + } + + private interface ISpawnModeHander { + void spawn(); + + Region getEffectiveRegion(World world); + + int getHeight(); + } + + public Material getRandomMaterial() { + return materials.get(RandomUtil.getRandomInt(0, materials.size() - 1)); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/util/ItemStackBuilder.java b/src/main/java/com/yaohun/enderdragonWars/util/ItemStackBuilder.java new file mode 100644 index 0000000..5e85915 --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/util/ItemStackBuilder.java @@ -0,0 +1,345 @@ +package com.yaohun.enderdragonwars.util; + +import org.bukkit.*; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.block.banner.Pattern; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; +import org.bukkit.potion.PotionEffect; + +import java.lang.reflect.Field; +import java.util.*; + +public class ItemStackBuilder { + + private ItemStack itemStack; + + private Material type; + + private int amount; + + private short data; + + private ItemMeta meta; + + private String displayName; + + private int customModelData; + + private List lore; + + private Map enchants; + + private Set itemFlags; + + private List potionEffects; + private List patterns; + private List fireworkEffects; + + public ItemStackBuilder(Material material) { + this.itemStack = new ItemStack(material); + this.type = material; + this.amount = 1; + this.data = 0; + this.meta = this.itemStack.getItemMeta(); + this.displayName = this.meta.getDisplayName(); + this.customModelData = this.meta.hasCustomModelData() ? this.meta.getCustomModelData() : -1; + this.lore = new ArrayList<>(); + this.enchants = new HashMap<>(); + this.itemFlags = new HashSet<>(); + this.potionEffects = new ArrayList<>(); + this.patterns = new ArrayList<>(); + this.fireworkEffects = new ArrayList<>(); + } + + public ItemStackBuilder(ItemStack item) { + this.itemStack = item.clone(); + this.type = item.getType(); + this.amount = item.getAmount(); + this.data = item.getDurability(); + this.meta = item.getItemMeta(); + this.displayName = this.meta.getDisplayName(); + this.customModelData = this.meta.hasCustomModelData() ? this.meta.getCustomModelData() : -1; + this.lore = this.meta.getLore() == null ? new ArrayList<>() : meta.getLore(); + this.enchants = this.meta.getEnchants(); + this.itemFlags = this.meta.getItemFlags(); + this.potionEffects = new ArrayList<>(); + this.patterns = new ArrayList<>(); + this.fireworkEffects = new ArrayList<>(); + } + + public ItemStack build() { + ItemStack item = new ItemStack(type, amount); + item.setType(type); + item.setAmount(amount); + if (enchants != null) { + item.addUnsafeEnchantments(enchants); + } + ItemMeta itemMeta = item.getItemMeta(); + if (displayName != null) { + itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', displayName)); + } + if (lore != null) { + List l = new ArrayList<>(); + lore.forEach((s) -> { + l.add(ChatColor.translateAlternateColorCodes('&', s)); + }); + itemMeta.setLore(l); + } + if (this.customModelData != -1) { + itemMeta.setCustomModelData(customModelData); + } + if (itemFlags != null) { + for (ItemFlag flag : itemFlags) { + itemMeta.addItemFlags(flag); + } + } + if (fireworkEffects != null && fireworkEffects.size() > 0 && (type.equals(Material.FIREWORK_STAR) || type.equals(Material.FIREWORK_ROCKET))) { + FireworkMeta fireworkMeta = (FireworkMeta) itemMeta; + for (FireworkEffect effect : fireworkEffects) { + fireworkMeta.addEffect(effect); + } + } + item.setItemMeta(itemMeta); + return item; + } + + public int getAmount() { + return amount; + } + + public Material getType() { + return type; + } + + public List getLore() { + return lore; + } + + public int getCustomModelData() { + return customModelData; + } + + public Map getEnchants() { + return enchants; + } + + public Set getItemFlags() { + return itemFlags; + } + + public List getPotionEffects() { + return potionEffects; + } + + public List getFireworkEffects() { + return fireworkEffects; + } + + public List getPatterns() { + return patterns; + } + + public String getDisplayName() { + return displayName; + } + + public short getData() { + return data; + } + + public ItemStackBuilder setItemStack(ItemStack item) { + this.itemStack = item; + return this; + } + + public ItemStackBuilder setType(Material type) { + this.type = type; + return this; + } + + public ItemStackBuilder setCustomModelData(int customModelData) { + this.customModelData = customModelData; + return this; + } + + public ItemStackBuilder setAmount(int amount) { + this.amount = amount; + return this; + } + + public ItemStackBuilder setData(int data) { + if (data > 255) { + data = 255; + } + this.data = (short) data; + return this; + } + + public ItemStackBuilder setData(short data) { + this.data = data; + return this; + } + + public ItemStackBuilder setItemMeta(ItemMeta meta) { + this.meta = meta; + return this; + } + + public ItemStackBuilder setDisplayName(String name) { + this.displayName = name; + return this; + } + + public ItemStackBuilder setLore(List loreList) { + this.lore = loreList; + return this; + } + + public ItemStackBuilder setLore(String... lores) { + this.lore = new ArrayList<>(Arrays.asList(lores)); + return this; + } + + public ItemStackBuilder addLore(String lore) { + this.lore.add(lore); + return this; + } + + public ItemStackBuilder addLore(String... lores) { + this.lore.addAll(Arrays.asList(lores)); + return this; + } + + public ItemStackBuilder addLore(List lores) { + for (String lore : lores) { + this.lore.add(lore); + } + return this; + } + + public ItemStackBuilder addAttributeModifier(Attribute attribute, AttributeModifier attributeModifier) { + this.meta.addAttributeModifier(attribute, attributeModifier); + return this; + } + + public ItemStackBuilder removeAttributeModifier(Attribute attribute) { + this.meta.removeAttributeModifier(attribute); + return this; + } + + public ItemStackBuilder removeAttributeModifier(EquipmentSlot equipmentSlot) { + this.meta.removeAttributeModifier(equipmentSlot); + return this; + } + + public ItemStackBuilder removeAttributeModifier(Attribute attribute, AttributeModifier attributeModifier) { + this.meta.removeAttributeModifier(attribute, attributeModifier); + return this; + } + + public ItemStackBuilder addEnchant(Enchantment ench, int level) { + this.enchants.put(ench, level); + return this; + } + + public ItemStackBuilder removeEnchant(Enchantment ench) { + this.enchants.remove(ench); + return this; + } + + public ItemStackBuilder setEnchants(Map enchants) { + this.enchants = enchants; + return this; + } + + public ItemStackBuilder setEnchants(List enchants) { + this.enchants = getEnchantsFromList(enchants); + return this; + } + + public ItemStackBuilder setItemFlags(Set itemFlags) { + this.itemFlags = itemFlags; + return this; + } + + public ItemStackBuilder addItemFlags(ItemFlag[] itemFlags) { + this.itemFlags.addAll(Arrays.asList(itemFlags)); + return this; + } + + public ItemStackBuilder addItemFlags(ItemFlag itemFlag) { + this.itemFlags.add(itemFlag); + return this; + } + + public ItemStackBuilder addPotionEffect(PotionEffect potionEffect) { + this.potionEffects.add(potionEffect); + return this; + } + + public ItemStackBuilder addPattern(Pattern pattern) { + this.patterns.add(pattern); + return this; + } + + public ItemStackBuilder addFireworkEffect(FireworkEffect fireworkEffect) { + this.fireworkEffects.add(fireworkEffect); + return this; + } + + protected Map getEnchantsFromList(List enchants) { + Map map = new HashMap<>(); + if (enchants == null) { + return map; + } + for (String s : enchants) { + if (s.contains(":")) { + String[] part = s.split(":"); + Enchantment en = Enchantment.getByName(part[0]); + if (en == null) { + continue; + } + map.put(en, Integer.parseInt(part[1])); + } + } + return map; + } + + protected static ItemStack setEnchants(ItemStack stack, List enchants) { + if (enchants == null) { + return stack; + } + for (String s : enchants) { + if (s.contains(":")) { + String[] part = s.split(":"); + Enchantment en = Enchantment.getByName(part[0]); + if (en == null) { + continue; + } + if (stack.getType() != Material.ENCHANTED_BOOK) { + stack.addUnsafeEnchantment(en, Integer.parseInt(part[1])); + } else { + EnchantmentStorageMeta esm = (EnchantmentStorageMeta) stack.getItemMeta(); + esm.addStoredEnchant(en, Integer.parseInt(part[1]), true); + stack.setItemMeta((ItemMeta) esm); + } + } + } + return stack; + } + + private void setField(Object instance, String name, Object value) throws ReflectiveOperationException { + Field field = instance.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(instance, value); + } + +} diff --git a/src/main/java/com/yaohun/enderdragonWars/util/WEUtil.java b/src/main/java/com/yaohun/enderdragonWars/util/WEUtil.java new file mode 100644 index 0000000..b6d4aee --- /dev/null +++ b/src/main/java/com/yaohun/enderdragonWars/util/WEUtil.java @@ -0,0 +1,44 @@ +package com.yaohun.enderdragonwars.util; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; +import com.sk89q.worldedit.math.BlockVector3; +import com.yaohun.enderdragonwars.Main; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +import java.io.File; + +public class WEUtil { + + public static void loadSchematics(Location location, String fileName) { + File path = new File(Main.plugin.getDataFolder(), "schematics"); + if (!path.exists()) { + path.mkdirs(); + } + File schematicFile = new File(path,fileName+".schem"); + if (!schematicFile.exists()) { + Main.plugin.saveResource("schematics/"+fileName+".schem", false); + } + World world = location.getWorld(); + EditSession editSession = WorldEdit.getInstance().newEditSession(BukkitAdapter.adapt(world)); + Bukkit.getScheduler().runTaskAsynchronously (Main.plugin, () -> { + try { + Clipboard clipboard = ClipboardFormats.findByFile(schematicFile).load(schematicFile); + clipboard.paste(BukkitAdapter.adapt(world), BlockVector3.at(location.getBlockX(), location.getBlockY(), location.getBlockZ())); + clipboard.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + editSession.close(); + } + } + ); + + } + +} diff --git a/src/main/java/com/yaohun/enderdragonwars/Main.java b/src/main/java/com/yaohun/enderdragonwars/Main.java index 2557ef9..a4933b1 100644 --- a/src/main/java/com/yaohun/enderdragonwars/Main.java +++ b/src/main/java/com/yaohun/enderdragonwars/Main.java @@ -1,9 +1,11 @@ package com.yaohun.enderdragonwars; -import com.yaohun.enderdragonwars.effectevent.BomBomEffect; +import com.yaohun.enderdragonwars.effect.types.*; import com.yaohun.enderdragonwars.game.Game; +import com.yaohun.enderdragonwars.listener.PlayerListener; import com.yaohun.enderdragonwars.manager.GameManager; import com.yaohun.enderdragonwars.manager.GiftEffectManager; +import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -22,6 +24,8 @@ public class Main extends JavaPlugin { GiftEffectManager.registerAll(); gameManager = new GameManager(); game = new Game(); + + Bukkit.getPluginManager().registerEvents(new PlayerListener(), this); } @Override @@ -32,6 +36,32 @@ public class Main extends JavaPlugin { game.startGame(player); if (subCommand.equalsIgnoreCase("1")) { new BomBomEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("2")) { + new ClearInventoryEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("3")) { + new FiveLightningEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("4")) { + new BlackHoleEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("5")) { + new LavaPoolEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("6")) { + new AddMaxHealthEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("7")) { + new TakeMaxHealthEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("8")) { + new SpawnEnderPortalEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("9")) { + new PlayerBigEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("10")) { + new PlayerSmallEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("11")) { + new PlayerResetEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("12")) { + new SpawnBuildEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("13")) { + new ToHeavenEffect(player.getName()).apply(game); + } else if (subCommand.equalsIgnoreCase("14")) { + new LuckyBlockEffect(player.getName()).apply(game); } } return true; diff --git a/src/main/resources/schematics/anquanwu.schem b/src/main/resources/schematics/anquanwu.schem new file mode 100644 index 0000000..00011bb Binary files /dev/null and b/src/main/resources/schematics/anquanwu.schem differ