diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java index 611170f37..c6db06459 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java @@ -466,7 +466,12 @@ public class UtilBlock public static Block getHighest(World world, Location location) { - return getHighest(world, location.getBlockX(), location.getBlockZ(), null); + return getHighest(world, location.getBlockX(), location.getBlockZ()); + } + + public static Block getHighest(World world, Block block) + { + return getHighest(world, block.getLocation()); } public static Block getHighest(World world, int x, int z, HashSet ignore) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java index 2f8c8e4e6..0a09d01e7 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java @@ -1,6 +1,10 @@ package mineplex.game.clans.clans.siege; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.Location; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockPlaceEvent; @@ -15,6 +19,7 @@ import mineplex.game.clans.clans.siege.outpost.CommandSiegeSupplies; import mineplex.game.clans.clans.siege.outpost.OutpostManager; import mineplex.game.clans.clans.siege.weapon.Cannon; import mineplex.game.clans.clans.siege.weapon.Catapult; +import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; public class SiegeManager extends MiniPlugin { @@ -22,6 +27,10 @@ public class SiegeManager extends MiniPlugin private OutpostManager _outpostManager; + public static SiegeManager Instance; + + public List LiveSiegeWeapons = new ArrayList<>(); + public SiegeManager(JavaPlugin plugin, ClansManager clans) { super("Siege", plugin); @@ -31,6 +40,8 @@ public class SiegeManager extends MiniPlugin _outpostManager = new OutpostManager(clans, this); addCommand(new CommandSiegeSupplies(_outpostManager)); + + Instance = this; } @EventHandler @@ -86,7 +97,7 @@ public class SiegeManager extends MiniPlugin public void spawnCannon(Player player, Location location) { - new Cannon(location, _clans.getClan(player)); + new Cannon(location, _clans.getClan(player), this); } public boolean trySpawnCatapult(Player player, Location location) @@ -116,8 +127,26 @@ public class SiegeManager extends MiniPlugin public void spawnCatapult(Player player, Location location) { - Catapult catapult = new Catapult(location, _clans.getClan(player)); + Catapult catapult = new Catapult(location, _clans.getClan(player), this); _outpostManager.getPlugin().getServer().getPluginManager().registerEvents(catapult, _outpostManager.getPlugin()); } + + public void dead(SiegeWeapon weapon) + { + LiveSiegeWeapons.remove(weapon); + } + + public SiegeWeapon close(Block block) + { + for (SiegeWeapon weapon : LiveSiegeWeapons) + { + if (weapon.getLocation().distance(block.getLocation()) <= weapon.getSize() + 3.d) + { + return weapon; + } + } + + return null; + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/events/SiegeWeaponExplodeEvent.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/events/SiegeWeaponExplodeEvent.java new file mode 100644 index 000000000..c0bec7a14 --- /dev/null +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/events/SiegeWeaponExplodeEvent.java @@ -0,0 +1,53 @@ +package mineplex.game.clans.clans.siege.events; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; +import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; + +public class SiegeWeaponExplodeEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + + private SiegeWeapon _weapon; + private WeaponProjectile _projectile; + + private boolean _cancelled; + + public SiegeWeaponExplodeEvent(SiegeWeapon weapon, WeaponProjectile projectile) + { + _weapon = weapon; + _projectile = projectile; + } + + public SiegeWeapon getWeapon() + { + return _weapon; + } + + public WeaponProjectile getProjectile() + { + return _projectile; + } + + public boolean isCancelled() + { + return _cancelled; + } + + public void setCancelled(boolean cancelled) + { + _cancelled = cancelled; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } +} \ No newline at end of file diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java index 1a6be7234..fe70e3e8c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java @@ -48,6 +48,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansBlacklist; +import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent; import mineplex.game.clans.clans.siege.weapon.Cannon; import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; import mineplex.game.clans.core.repository.ClanTerritory; @@ -97,6 +98,9 @@ public class Outpost implements Listener private long _spawnTime; + public double _maxHealth = 4500; + public double _health = _maxHealth; + public Outpost(OutpostManager host, ClanInfo clan, Location location, OutpostType type) { _host = host; @@ -468,6 +472,20 @@ public class Outpost implements Listener _clan.inform("Your Clan's Outpost has been destroyed.", null); } + @EventHandler + public void onSiegeWeaponExplode(SiegeWeaponExplodeEvent event) + { + if (UtilAlg.inBoundingBox(event.getProjectile().getLocation(), _startCorner.clone().subtract(4, 2, 4), _endCorner.clone().add(4, 2, 4))) + { + if (getHealth() > 700) + { + event.setCancelled(true); + } + + removeHealth(800); + } + } + public ClanInfo getClan() { return _clan; @@ -503,4 +521,36 @@ public class Outpost implements Listener { return UtilAlg.inBoundingBox(location, _siegeAreaStart.clone().subtract(.9, 0, .9), _siegeAreaEnd.clone().add(.9, 0, .9)); } + + // Health Management + + public final double getHealth() + { + return _health; + } + + public final String getDisplayHealth() + { + return UtilText.getProgress(null, _health / _maxHealth, null, false, 12); + } + + public final void setHealth(double health) + { + _health = UtilMath.clamp(health, 0, _maxHealth); + + if (_health == 0) + { + kill(); + } + } + + public final void removeHealth(double health) + { + setHealth(_health - health); + } + + public final void addHealth(double health) + { + setHealth(_health + health); + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java index 28253d311..5b20f80b7 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java @@ -22,6 +22,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemBuilder; import mineplex.game.clans.clans.ClanInfo; +import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes; import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; import mineplex.game.clans.clans.siege.weapon.util.AccessRule; @@ -32,9 +33,9 @@ public class Cannon extends SiegeWeapon { public static final ItemStack CANNON_ITEM = new ItemBuilder(Material.IRON_BLOCK, 1).setRawTitle(C.cBlue + "Cannon").setLore(C.cWhite + "BOOM BABY!").build(); - public Cannon(Location location, ClanInfo clan) + public Cannon(Location location, ClanInfo clan, SiegeManager siegeManager) { - super(location, 600.d, "Cannon", clan, clan.Clans); + super(location, 1200.d, "Cannon", clan, clan.Clans, siegeManager); location.add(.5, 0, .5); @@ -57,6 +58,11 @@ public class Cannon extends SiegeWeapon setProjectileAttributes(new ProjectileAttributes().setPrimedTnt().setDoCrater().craterSize(3).craterChanceOfAir(2.d)); setFireRule(new AccessRule(AccessType.LCLICK_BB, player -> { + if (!isRiding(player)) + { + return false; + } + if (!_owner.isMember(player)) { UtilPlayer.message(player, F.main("Clans", "This cannon is not owned by your Clan.")); @@ -75,11 +81,6 @@ public class Cannon extends SiegeWeapon return false; } - if (!isRiding(player)) - { - return false; - } - return true; })); @@ -140,7 +141,7 @@ public class Cannon extends SiegeWeapon @Override public void Fire(WeaponProjectile projectile) { - projectile.setLocation(projectile.getLocation().add(.5, .2, .5)); + projectile.setLocation(projectile.getLocation().add(.0, .2, .0)); UtilParticle.PlayParticleToAll(ParticleType.LARGE_EXPLODE, projectile.getLocation(), new Vector(0, 0, 0), .1f, 2, ViewDist.MAX); UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(projectile.getLocation(), Sound.EXPLODE, 1.f, 1.f)); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java index ee0d7d4da..b7a4b534c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java @@ -22,6 +22,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.itemstack.ItemBuilder; import mineplex.game.clans.clans.ClanInfo; +import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes; import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; import mineplex.game.clans.clans.siege.weapon.util.AccessRule; @@ -32,13 +33,13 @@ public class Catapult extends SiegeWeapon { public static final ItemStack CATAPULT_ITEM = new ItemBuilder(Material.GOLD_BLOCK, 1).setRawTitle(C.cBlue + "Catapult").setLore(C.cWhite + "AWHHH YEAH!!!").build(); - public Catapult(Location location, ClanInfo clan) + public Catapult(Location location, ClanInfo clan, SiegeManager siegeManager) { - super(location, 600.d, "Catapult", clan, clan.Clans); + super(location, 1600.d, "Catapult", clan, clan.Clans, siegeManager); location.add(.5, 0, .5); - setBoundingBox(3); + setBoundingBox(1); setStateInfo("Unloaded", new WeaponStateInfo(Material.PACKED_ICE, (byte) 0)); setStateInfo("Loaded", new WeaponStateInfo(Material.ENDER_PORTAL_FRAME, (byte) 0)); @@ -57,7 +58,16 @@ public class Catapult extends SiegeWeapon setProjectileAttributes(new ProjectileAttributes().setFallingBlock().setFallingBlockType(Material.TNT).setDoCrater().craterSize(3).craterChanceOfAir(1.3d)); + _invertRotation = true; + + _rotSpeed = 40.0f; + setFireRule(new AccessRule(AccessType.LCLICK_BB, player -> { + if (!isRiding(player)) + { + return false; + } + if (!_owner.isMember(player)) { UtilPlayer.message(player, F.main("Clans", "This Catapult is not owned by your Clan.")); @@ -76,11 +86,6 @@ public class Catapult extends SiegeWeapon return false; } - if (!isRiding(player)) - { - return false; - } - return true; })); @@ -138,19 +143,12 @@ public class Catapult extends SiegeWeapon addEntity(armorStand, "WEAPON"); } - @Override - public float Rotate(float nextYaw) - { - return nextYaw + 180; - } - @Override public void Fire(WeaponProjectile projectile) { - projectile.setLocation(projectile.getLocation().add(.5, .2, .5)); + projectile.setLocation(projectile.getLocation().add(.0, 3, .0)); - UtilParticle.PlayParticleToAll(ParticleType.LARGE_EXPLODE, projectile.getLocation(), new Vector(0, 0, 0), .1f, 2, ViewDist.MAX); - UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(projectile.getLocation(), Sound.EXPLODE, 1.f, 1.f)); + UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(projectile.getLocation(), Sound.BAT_TAKEOFF, 2.f, .45f)); } @Override diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java index 558dee7ab..1118271ce 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java @@ -2,10 +2,13 @@ package mineplex.game.clans.clans.siege.weapon; import java.util.List; import java.util.Map; +import java.util.function.Function; import org.apache.commons.lang.Validate; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -23,12 +26,15 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.util.EulerAngle; +import org.spigotmc.event.entity.EntityDismountEvent; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import mineplex.core.common.util.C; import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; @@ -39,6 +45,7 @@ import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansManager; +import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes; import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; import mineplex.game.clans.clans.siege.weapon.util.AccessRule; @@ -49,6 +56,7 @@ import mineplex.game.clans.clans.siege.weapon.util.WeaponStateInfo; public abstract class SiegeWeapon implements Listener { protected ClansManager _clans; + protected SiegeManager _siegeManager; protected ClanInfo _owner; protected final String _name; @@ -78,6 +86,8 @@ public abstract class SiegeWeapon implements Listener // Firing stuff + protected boolean _invertRotation; + private Material _firepowerType; private Material _ammunitionType; @@ -92,13 +102,16 @@ public abstract class SiegeWeapon implements Listener private ProjectileAttributes _projectileAttributes; private WeaponProjectile _projectile; + protected float _rotSpeed = 20.f; + private long _lastRight = -1; private long _lastLeft = -1; protected long _lastFired; - public SiegeWeapon(Location location, double maxHealth, String name, ClanInfo owner, ClansManager clansManager) + public SiegeWeapon(Location location, double maxHealth, String name, ClanInfo owner, ClansManager clansManager, SiegeManager siegeManager) { + _siegeManager = siegeManager; _location = location; _name = name; _health = _maxHealth = maxHealth; @@ -143,7 +156,7 @@ public abstract class SiegeWeapon implements Listener _boundingBoxSize = size; - _collisionBox = size == 1 ? BarrierCollisionBox.single(_location.clone()) : BarrierCollisionBox.all(_location.clone().subtract((size - 1) / 2, 0, (size - 1) / 2), _location.clone().add(((size - 1) / 2) + .5, size - 1, ((size - 1) / 2) + .5)); + _collisionBox = size == 1 ? BarrierCollisionBox.single(_location.clone()) : BarrierCollisionBox.all(_location.clone().subtract((size - 1) / 2, 0, (size - 1) / 2), _location.clone().add(((size - 1) / 2) + .2, size - 1, ((size - 1) / 2) + .2)); _collisionBox.Construct(); _collisionBox.registerRight((block, player) -> handleRightClick(player)); _collisionBox.registerLeft((block, player) -> handleLeftClick(player)); @@ -178,7 +191,7 @@ public abstract class SiegeWeapon implements Listener { ArmorStand armorStand = (ArmorStand) getEntity("WEAPON"); double standYaw = Math.toDegrees(armorStand.getHeadPose().getY()) % 360; - double riderYaw = getRider().getLocation().getYaw() % 360; + double riderYaw = (getRider().getLocation().getYaw() + (_invertRotation ? 180 : 0)) % 360; // riderYaw = 350 and standYaw = 20 // dif should be -30 and not 330 @@ -186,7 +199,7 @@ public abstract class SiegeWeapon implements Listener if (dif > 180) dif -= 360; if (dif < -180) dif += 360; - double yaw = Rotate((float) ((float)standYaw + Math.min(dif / 20.f, 4f))); + double yaw = (float) ((float)standYaw + Math.min(dif / _rotSpeed, 4f)); armorStand.setHeadPose(new EulerAngle(0, Math.toRadians(yaw), 0)); } @@ -326,6 +339,8 @@ public abstract class SiegeWeapon implements Listener _comprisedOf.clear(); _infoHologram.stop(); + _siegeManager.dead(this); + HandlerList.unregisterAll(this); } @@ -376,6 +391,51 @@ public abstract class SiegeWeapon implements Listener } } + private void dismount(Player player) + { + //2 in ecah + + Block origin = player.getLocation().getBlock(); + + BlockFace[] faces = { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST }; + + Block suitable = null; + + findAir: for (int yTests = 0; yTests < _boundingBoxSize; yTests++) + { + final int fyt = yTests; + + Function function = block -> { + Block up = block; + + for (int x = 0; x < fyt; x++) + { + up = up.getRelative(BlockFace.UP); + } + + return up; + }; + + for (BlockFace face : faces) + { + Block testFor = origin.getRelative(face).getRelative(face); + + if (UtilItem.isBoundless(function.apply(testFor).getType())) + { + suitable = function.apply(testFor); + break findAir; + } + } + } + + if (suitable == null) + { + suitable = UtilBlock.getHighest(origin.getWorld(), origin).getRelative(BlockFace.UP); + } + + player.teleport(suitable.getRelative(BlockFace.UP).getLocation()); + } + private void handleLeftClick(Player player) { if (_lastLeft == -1) @@ -448,11 +508,6 @@ public abstract class SiegeWeapon implements Listener { } - protected float Rotate(float yaw) - { - return yaw; - } - // Entity Management protected final void addEntity(Entity entity, String uniqueName) @@ -671,6 +726,15 @@ public abstract class SiegeWeapon implements Listener }, 3L); } + @EventHandler + public void onDismount(EntityDismountEvent event) + { + if (event.getDismounted().equals(getEntity("PLAYERMOUNT"))) + { + dismount((Player) event.getEntity()); + } + } + @EventHandler public void onInteract(PlayerInteractAtEntityEvent event) { @@ -701,6 +765,17 @@ public abstract class SiegeWeapon implements Listener } } + + public boolean inProtection(Block block) + { + if (block.getLocation().distance(_location) < _boundingBoxSize + 1.65 && block.getLocation().getY() <= _location.getY() + 2) + { + return true; + } + + return false; + } + @EventHandler public void onInteract(PlayerArmorStandManipulateEvent event) { @@ -723,5 +798,15 @@ public abstract class SiegeWeapon implements Listener Tick(); } + + public Location getLocation() + { + return _location; + } + + public double getSize() + { + return _boundingBoxSize; + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java index d1c2bd242..45e07fc2a 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/Crater.java @@ -23,6 +23,8 @@ import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilServer; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.game.clans.clans.siege.SiegeManager; +import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent; import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; public class Crater implements Listener @@ -41,7 +43,7 @@ public class Crater implements Listener private final List _blocks; - public Crater(SiegeWeapon weapon, Location origin, int size, double airChance, boolean doFire) + public Crater(SiegeWeapon weapon, WeaponProjectile projectile, Location origin, int size, double airChance, boolean doFire) { _weapon = weapon; _origin = origin; @@ -101,6 +103,7 @@ public class Crater implements Listener HashMap blockList = new HashMap(); int iR = (int) _size + 1; + loop: for (int x = -iR; x <= iR; x++) { for (int z = -iR; z <= iR; z++) @@ -113,7 +116,14 @@ public class Crater implements Listener if (offset <= _size) { - blockList.put(curBlock, offset); + SiegeWeapon weapon = SiegeManager.Instance.close(curBlock); + if (weapon != null) + { + weapon.removeHealth(453); + break loop; + } + + blockList.put(curBlock, Double.valueOf(offset)); } } } @@ -122,7 +132,7 @@ public class Crater implements Listener for (Entry entry : blockList.entrySet()) { Block block = entry.getKey(); - double distance = entry.getValue(); + double distance = entry.getValue().doubleValue(); boolean air = distance <= _airChance || (Math.random() > (distance) / 3.65d); @@ -154,7 +164,7 @@ public class Crater implements Listener for (Entry entry : blockList.entrySet()) { Block block = entry.getKey(); - double distance = entry.getValue(); + double distance = entry.getValue().doubleValue(); if (block.getType() == Material.AIR) continue; @@ -167,6 +177,7 @@ public class Crater implements Listener !block.getRelative(BlockFace.DOWN).getType().equals(CHARRED_TYPE)) { _blocks.add(new CraterBlock(block.getLocation(), distance, CHARRED_TYPE)); + if (_fire) { _blocks.add(new CraterBlock(block.getRelative(BlockFace.UP).getLocation(), distance, Material.FIRE)); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/WeaponProjectile.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/WeaponProjectile.java index 70fb2b4f2..4707bffe1 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/WeaponProjectile.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/projectile/WeaponProjectile.java @@ -19,6 +19,7 @@ import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilServer; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent; import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; public class WeaponProjectile implements Listener @@ -95,7 +96,14 @@ public class WeaponProjectile implements Listener .filter(block -> !UtilItem.isBoundless(block.getType())) .iterator().hasNext() && _projectileEntity.getTicksLived() >= 10) { - new Crater(_weapon, UtilBlock.nearestFloor(_projectileEntity.getLocation()), _attributes._craterSize, _attributes._craterChanceOfAir, _attributes._craterDoFire); + SiegeWeaponExplodeEvent newEvent = new SiegeWeaponExplodeEvent(_weapon, this); + + UtilServer.getPluginManager().callEvent(newEvent); + + if (!newEvent.isCancelled()) + { + new Crater(_weapon, this, UtilBlock.nearestFloor(_projectileEntity.getLocation()), _attributes._craterSize, _attributes._craterChanceOfAir, _attributes._craterDoFire); + } UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(_projectileEntity.getLocation(), Sound.EXPLODE, 1.f, 1.f));