cannons updates
This commit is contained in:
parent
a41521d6a9
commit
0252436990
@ -516,7 +516,7 @@ public class UtilAlg
|
|||||||
return new AxisAlignedBB(a.getX(), a.getY(), a.getZ(), b.getX(), b.getY(), b.getZ());
|
return new AxisAlignedBB(a.getX(), a.getY(), a.getZ(), b.getX(), b.getY(), b.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Location offset(Location location, double strength, float yaw, boolean reverse)
|
public static Location moveForward(Location location, double strength, float yaw, boolean reverse)
|
||||||
{
|
{
|
||||||
double x = location.getX();
|
double x = location.getX();
|
||||||
double z = location.getZ();
|
double z = location.getZ();
|
||||||
@ -526,10 +526,10 @@ public class UtilAlg
|
|||||||
x = reverse ? (x + strength * Math.sin(rad)) : (x - strength * Math.sin(rad));
|
x = reverse ? (x + strength * Math.sin(rad)) : (x - strength * Math.sin(rad));
|
||||||
z = reverse ? (z - strength * Math.cos(rad)) : (z + strength * Math.cos(rad));
|
z = reverse ? (z - strength * Math.cos(rad)) : (z + strength * Math.cos(rad));
|
||||||
|
|
||||||
return new Location(location.getWorld(), x, location.getY(), z);
|
return new Location(location.getWorld(), x, location.getY(), z, location.getYaw(), location.getPitch());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Location offset(Location location, double strength, float yaw, float pitch, boolean reverse)
|
public static Location moveForward(Location location, double strength, float yaw, float pitch, boolean reverse)
|
||||||
{
|
{
|
||||||
double x = location.getX();
|
double x = location.getX();
|
||||||
double y = location.getY();
|
double y = location.getY();
|
||||||
|
@ -1409,4 +1409,21 @@ public class UtilBlock
|
|||||||
|
|
||||||
return itemStacks;
|
return itemStacks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Location nearestFloor(Location location)
|
||||||
|
{
|
||||||
|
if (!UtilItem.isBoundless(location.getBlock().getType()))
|
||||||
|
{
|
||||||
|
return location.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
Location gr = location.clone();
|
||||||
|
|
||||||
|
while (UtilItem.isBoundless(gr.getBlock().getType()) && gr.getY() > 0)
|
||||||
|
{
|
||||||
|
gr.subtract(0, 0.5, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return gr.getBlock().getLocation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,12 +277,9 @@ public class ItemBuilder
|
|||||||
ItemBuilder newBuilder = new ItemBuilder(_mat);
|
ItemBuilder newBuilder = new ItemBuilder(_mat);
|
||||||
|
|
||||||
newBuilder.setTitle(_title);
|
newBuilder.setTitle(_title);
|
||||||
|
|
||||||
for (String lore : _lore)
|
_lore.forEach(newBuilder::addLore);
|
||||||
{
|
|
||||||
newBuilder.addLore(lore);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Map.Entry<Enchantment, Integer> entry : _enchants.entrySet())
|
for (Map.Entry<Enchantment, Integer> entry : _enchants.entrySet())
|
||||||
{
|
{
|
||||||
newBuilder.addEnchantment(entry.getKey(), entry.getValue());
|
newBuilder.addEnchantment(entry.getKey(), entry.getValue());
|
||||||
|
@ -87,8 +87,8 @@ public class ClansBanCommand extends CommandBase<ClansBanManager>
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UtilPlayer.message(caller, C.cGold + "/cp <username> <timeInDays(number)/p(ermanent)> <description> - Bans the specified player for the specified amount of time");
|
UtilPlayer.message(caller, C.cGold + "/cb <username> <timeInDays(number)/p(ermanent)> <description> - Bans the specified player for the specified amount of time");
|
||||||
UtilPlayer.message(caller, C.cGold + "/cp <username> - Displays the \"Clans Punish\" UI, and will display all of the player's past bans (including current ones)");
|
UtilPlayer.message(caller, C.cGold + "/cb <username> - Displays the \"Clans Punish\" UI, and will display all of the player's past bans (including current ones)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
package mineplex.game.clans.clans.siege.cannon;
|
package mineplex.game.clans.clans.siege.cannon;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftArmorStand;
|
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftArmorStand;
|
||||||
import org.bukkit.entity.ArmorStand;
|
import org.bukkit.entity.ArmorStand;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
@ -30,13 +29,11 @@ import org.bukkit.inventory.Inventory;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
import org.bukkit.util.BlockIterator;
|
|
||||||
import org.bukkit.util.EulerAngle;
|
import org.bukkit.util.EulerAngle;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import mineplex.core.common.util.C;
|
import mineplex.core.common.util.C;
|
||||||
import mineplex.core.common.util.F;
|
import mineplex.core.common.util.F;
|
||||||
import mineplex.core.common.util.NautArrayList;
|
|
||||||
import mineplex.core.common.util.UtilAlg;
|
import mineplex.core.common.util.UtilAlg;
|
||||||
import mineplex.core.common.util.UtilBlock;
|
import mineplex.core.common.util.UtilBlock;
|
||||||
import mineplex.core.common.util.UtilEnt;
|
import mineplex.core.common.util.UtilEnt;
|
||||||
@ -49,6 +46,7 @@ import mineplex.core.common.util.UtilParticle.ViewDist;
|
|||||||
import mineplex.core.common.util.UtilPlayer;
|
import mineplex.core.common.util.UtilPlayer;
|
||||||
import mineplex.core.common.util.UtilServer;
|
import mineplex.core.common.util.UtilServer;
|
||||||
import mineplex.core.itemstack.ItemBuilder;
|
import mineplex.core.itemstack.ItemBuilder;
|
||||||
|
import mineplex.core.recharge.Recharge;
|
||||||
import mineplex.core.updater.UpdateType;
|
import mineplex.core.updater.UpdateType;
|
||||||
import mineplex.core.updater.event.UpdateEvent;
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
|
||||||
@ -56,13 +54,11 @@ public class Cannon implements Listener
|
|||||||
{
|
{
|
||||||
public static final ItemStack CANNON_ITEM = new ItemBuilder(Material.IRON_BLOCK, 1).setRawTitle(C.cBlue + "Cannon").setLore(C.cWhite + "BOOM BABY!").build();
|
public static final ItemStack CANNON_ITEM = new ItemBuilder(Material.IRON_BLOCK, 1).setRawTitle(C.cBlue + "Cannon").setLore(C.cWhite + "BOOM BABY!").build();
|
||||||
|
|
||||||
public static final int MAX_SULPHUR = 2;
|
public static final int MAX_SULPHUR = 3;
|
||||||
|
|
||||||
public static final int TNT_SLOT = 4;
|
public static final int TNT_SLOT = 4;
|
||||||
public static final List<Integer> SULPHUR_SLOTS = Arrays.asList(1, 3, 5, 7);
|
public static final List<Integer> SULPHUR_SLOTS = Arrays.asList(1, 3, 5, 7);
|
||||||
public static final List<Integer> EMPTY_SLOTS = Arrays.asList(0, 2, 6, 8);
|
public static final List<Integer> EMPTY_SLOTS = Arrays.asList(0, 6, 8);
|
||||||
|
|
||||||
private long _lastFired = -1;
|
|
||||||
|
|
||||||
private Location _location;
|
private Location _location;
|
||||||
private CannonState _state;
|
private CannonState _state;
|
||||||
@ -70,20 +66,23 @@ public class Cannon implements Listener
|
|||||||
private Player _rider;
|
private Player _rider;
|
||||||
|
|
||||||
// Entity Information
|
// Entity Information
|
||||||
private NautArrayList<Entity> _entities;
|
private List<Entity> _entities;
|
||||||
|
|
||||||
|
private List<CannonCrater> _craters;
|
||||||
|
|
||||||
private TNTPrimed _projectile;
|
private TNTPrimed _projectile;
|
||||||
|
|
||||||
private Location _backLoc;
|
|
||||||
|
|
||||||
private Inventory _inventory;
|
private Inventory _inventory;
|
||||||
|
|
||||||
|
private long _lastFired = -1;
|
||||||
|
|
||||||
public Cannon(Location location)
|
public Cannon(Location location)
|
||||||
{
|
{
|
||||||
_location = location;
|
_location = location;
|
||||||
_state = CannonState.UNLOADED;
|
_state = CannonState.UNLOADED;
|
||||||
|
|
||||||
_entities = new NautArrayList<>();
|
_entities = new ArrayList<>();
|
||||||
|
_craters = new ArrayList<>();
|
||||||
|
|
||||||
_inventory = UtilServer.getServer().createInventory(null, InventoryType.DISPENSER, C.cRedB + "Cannon");
|
_inventory = UtilServer.getServer().createInventory(null, InventoryType.DISPENSER, C.cRedB + "Cannon");
|
||||||
|
|
||||||
@ -93,6 +92,10 @@ public class Cannon implements Listener
|
|||||||
public void cleanup()
|
public void cleanup()
|
||||||
{
|
{
|
||||||
_entities.forEach(Entity::remove);
|
_entities.forEach(Entity::remove);
|
||||||
|
_craters.forEach(CannonCrater::cleanup);
|
||||||
|
|
||||||
|
_entities.clear();
|
||||||
|
_craters.clear();
|
||||||
|
|
||||||
HandlerList.unregisterAll(this);
|
HandlerList.unregisterAll(this);
|
||||||
}
|
}
|
||||||
@ -157,32 +160,15 @@ public class Cannon implements Listener
|
|||||||
updateEntities();
|
updateEntities();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateCannon()
|
|
||||||
{
|
|
||||||
long timeSinceLast = System.currentTimeMillis() - _lastFired;
|
|
||||||
|
|
||||||
if (timeSinceLast < 5000)
|
|
||||||
{
|
|
||||||
if (timeSinceLast <= 1500)
|
|
||||||
{
|
|
||||||
getArmorStand().teleport(getArmorStand().getLocation().clone().add(UtilAlg.getTrajectory2d(getArmorStandLocation(), _backLoc).multiply(((double) timeSinceLast) / 1500.d)));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getArmorStand().teleport(getArmorStand().getLocation().clone().add(UtilAlg.getTrajectory2d(_backLoc, getArmorStandLocation()).multiply(((double) timeSinceLast) / 3500.d)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void fire()
|
public void fire()
|
||||||
{
|
{
|
||||||
TNTPrimed tnt = _location.getWorld().spawn(_location, TNTPrimed.class);
|
TNTPrimed tnt = _location.getWorld().spawn(_location.clone().add(.5, .3, .5), TNTPrimed.class);
|
||||||
|
|
||||||
_projectile = tnt;
|
_projectile = tnt;
|
||||||
|
|
||||||
Vector velocity = UtilAlg.getTrajectory(
|
Vector velocity = UtilAlg.getTrajectory(
|
||||||
getArmorStand().getLocation(),
|
getArmorStand().getLocation(),
|
||||||
UtilAlg.offset(
|
UtilAlg.moveForward(
|
||||||
getArmorStand().getLocation(),
|
getArmorStand().getLocation(),
|
||||||
2.,
|
2.,
|
||||||
(float) Math.toDegrees(getArmorStand().getHeadPose().getY()), false))
|
(float) Math.toDegrees(getArmorStand().getHeadPose().getY()), false))
|
||||||
@ -194,15 +180,7 @@ public class Cannon implements Listener
|
|||||||
_inventory.setItem(TNT_SLOT, UtilInv.decrement(_inventory.getItem(TNT_SLOT)));
|
_inventory.setItem(TNT_SLOT, UtilInv.decrement(_inventory.getItem(TNT_SLOT)));
|
||||||
SULPHUR_SLOTS.forEach(_inventory::clear);
|
SULPHUR_SLOTS.forEach(_inventory::clear);
|
||||||
|
|
||||||
Iterator<Block> itr = new BlockIterator(new Location(getArmorStand().getLocation().getWorld(), getArmorStand().getLocation().getX(), getArmorStand().getLocation().getY(), getArmorStand().getLocation().getZ(), getArmorStand().getLocation().getYaw() + 180, getArmorStand().getLocation().getPitch()), 0, 1);
|
UtilParticle.PlayParticleToAll(ParticleType.LARGE_EXPLODE, getArmorStandLocation(), new Vector(0, 0, 0), .1f, 2, ViewDist.MAX);
|
||||||
while (itr.hasNext())
|
|
||||||
{
|
|
||||||
Block block = itr.next();
|
|
||||||
|
|
||||||
_backLoc = block.getLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
UtilParticle.PlayParticleToAll(ParticleType.LARGE_EXPLODE, getArmorStandLocation(), new Vector(0, 0, 0), 1.f, 2, ViewDist.MAX);
|
|
||||||
UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(getArmorStandLocation(), Sound.EXPLODE, 1.f, 1.f));
|
UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(getArmorStandLocation(), Sound.EXPLODE, 1.f, 1.f));
|
||||||
|
|
||||||
_lastFired = System.currentTimeMillis();
|
_lastFired = System.currentTimeMillis();
|
||||||
@ -220,19 +198,22 @@ public class Cannon implements Listener
|
|||||||
|
|
||||||
public void updateProjectile()
|
public void updateProjectile()
|
||||||
{
|
{
|
||||||
if (_projectile != null && _projectile.getTicksLived() >= 40)
|
if (_projectile != null)
|
||||||
{
|
{
|
||||||
if (UtilBlock.getInBoundingBox(_projectile.getLocation().subtract(.5, .5, .5), _projectile.getLocation().add(.5, .5, .5))
|
UtilParticle.PlayParticleToAll(ParticleType.SMOKE, _projectile.getLocation().add(0, .5, 0), new Vector(0, 0, 0), .1f, 3, ViewDist.MAX);
|
||||||
.stream()
|
UtilParticle.PlayParticleToAll(ParticleType.FLAME, _projectile.getLocation().add(0, .5, 0), new Vector(0, 0, 0), .1f, 3, ViewDist.MAX);
|
||||||
.filter(block -> !UtilItem.isBoundless(block.getType()))
|
|
||||||
.iterator().hasNext())
|
if (Math.abs(_projectile.getVelocity().getX()) < 0.1 || Math.abs(_projectile.getVelocity().getZ()) < 0.1)
|
||||||
{
|
{
|
||||||
//Do Explosion;
|
//Do Explosion;
|
||||||
|
|
||||||
|
_craters.add(new CannonCrater(this, UtilBlock.nearestFloor(_projectile.getLocation())));
|
||||||
|
|
||||||
|
UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, _projectile.getLocation(), new Vector(0, 0, 0), .1f, 4, ViewDist.MAX);
|
||||||
|
UtilServer.getServer().getOnlinePlayers().forEach(player -> player.playSound(_projectile.getLocation(), Sound.EXPLODE, 1.f, 1.f));
|
||||||
|
|
||||||
_projectile.remove();
|
_projectile.remove();
|
||||||
_projectile = null;
|
_projectile = null;
|
||||||
|
|
||||||
Bukkit.broadcastMessage("boom");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -241,7 +222,10 @@ public class Cannon implements Listener
|
|||||||
{
|
{
|
||||||
if (canBeFired())
|
if (canBeFired())
|
||||||
{
|
{
|
||||||
fire();
|
if (Recharge.Instance.use(_rider, "Fire Cannon", 10000 /* 10 seconds */, true, false))
|
||||||
|
{
|
||||||
|
fire();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -288,7 +272,7 @@ public class Cannon implements Listener
|
|||||||
|
|
||||||
private boolean canBeFired()
|
private boolean canBeFired()
|
||||||
{
|
{
|
||||||
return getTnt() > 0 && getPower() > 0;
|
return getTnt() > 0 && getPower() > 0 && _projectile == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
@ -309,8 +293,6 @@ public class Cannon implements Listener
|
|||||||
checkInv();
|
checkInv();
|
||||||
|
|
||||||
updateProjectile();
|
updateProjectile();
|
||||||
|
|
||||||
updateCannon();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkInv()
|
public void checkInv()
|
||||||
@ -452,19 +434,24 @@ public class Cannon implements Listener
|
|||||||
|
|
||||||
if (_rider != null)
|
if (_rider != null)
|
||||||
{
|
{
|
||||||
ArmorStand _armorStand = (ArmorStand) UtilMath.getFirst(_entities);
|
if (System.currentTimeMillis() - _lastFired < 5000)
|
||||||
double standYaw = Math.toDegrees(_armorStand.getHeadPose().getY()) % 360;
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArmorStand armorStand = (ArmorStand) UtilMath.getFirst(_entities);
|
||||||
|
double standYaw = Math.toDegrees(armorStand.getHeadPose().getY()) % 360;
|
||||||
double riderYaw = _rider.getLocation().getYaw() % 360;
|
double riderYaw = _rider.getLocation().getYaw() % 360;
|
||||||
|
|
||||||
double dif = riderYaw - standYaw;
|
double dif = riderYaw - standYaw;
|
||||||
double yaw = standYaw + (dif / 20.f);
|
double yaw = standYaw + (dif / 20.f);
|
||||||
|
|
||||||
Location pos = _armorStand.getLocation();
|
Location pos = armorStand.getLocation();
|
||||||
|
|
||||||
pos.setYaw((float) yaw);
|
pos.setYaw((float) yaw);
|
||||||
|
|
||||||
_armorStand.teleport(pos);
|
armorStand.teleport(pos);
|
||||||
_armorStand.setHeadPose(new EulerAngle(0, Math.toRadians(yaw), 0));
|
armorStand.setHeadPose(new EulerAngle(0, Math.toRadians(yaw), 0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,128 @@
|
|||||||
|
package mineplex.game.clans.clans.siege.cannon;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||||
|
|
||||||
|
import mineplex.core.common.util.UtilBlock;
|
||||||
|
import mineplex.core.common.util.UtilItem;
|
||||||
|
import mineplex.core.common.util.UtilMath;
|
||||||
|
import mineplex.core.common.util.UtilServer;
|
||||||
|
import mineplex.core.updater.UpdateType;
|
||||||
|
import mineplex.core.updater.event.UpdateEvent;
|
||||||
|
import mineplex.game.clans.clans.ClansManager;
|
||||||
|
|
||||||
|
public class CannonCrater implements Listener
|
||||||
|
{
|
||||||
|
private static final long MAX_LIFEETIME = 100000 /* 10 minutes of lifetime for the fire particles */;
|
||||||
|
private static final double EXPL_RADIUS = 3;
|
||||||
|
|
||||||
|
private Cannon _host;
|
||||||
|
private Location _origin;
|
||||||
|
|
||||||
|
private long _birthTime;
|
||||||
|
|
||||||
|
private List<CraterBlock> _blocks;
|
||||||
|
|
||||||
|
public CannonCrater(Cannon cannon, Location origin)
|
||||||
|
{
|
||||||
|
_host = cannon;
|
||||||
|
_origin = origin;
|
||||||
|
|
||||||
|
_birthTime = System.currentTimeMillis();
|
||||||
|
_blocks = new ArrayList<>();
|
||||||
|
|
||||||
|
UtilServer.getServer().getPluginManager().registerEvents(this, ClansManager.getInstance().getPlugin());
|
||||||
|
|
||||||
|
createExplosion();
|
||||||
|
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void updateEffects(UpdateEvent event)
|
||||||
|
{
|
||||||
|
if (event.getType() != UpdateType.TICK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createExplosion()
|
||||||
|
{
|
||||||
|
_blocks.add(new CraterBlock(_origin, Material.AIR));
|
||||||
|
|
||||||
|
HashMap<Block, Double> blockList = new HashMap<Block, Double>();
|
||||||
|
int iR = (int) EXPL_RADIUS + 1;
|
||||||
|
|
||||||
|
for (int x = -iR; x <= iR; x++)
|
||||||
|
{
|
||||||
|
for (int z = -iR; z <= iR; z++)
|
||||||
|
{
|
||||||
|
for (int y = -iR; y <= iR; y++)
|
||||||
|
{
|
||||||
|
Block curBlock = _origin.getBlock().getRelative(x, y, z);
|
||||||
|
|
||||||
|
double offset = UtilMath.offset(_origin, curBlock.getLocation());
|
||||||
|
|
||||||
|
if (offset <= EXPL_RADIUS)
|
||||||
|
{
|
||||||
|
blockList.put(curBlock, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Entry<Block, Double> entry : blockList.entrySet())
|
||||||
|
{
|
||||||
|
Block block = entry.getKey();
|
||||||
|
double distance = entry.getValue();
|
||||||
|
|
||||||
|
boolean air = distance <= 2 || (Math.random() > (distance) / 3.65d);
|
||||||
|
|
||||||
|
if (block.getType() == Material.AIR) continue;
|
||||||
|
|
||||||
|
if (air)
|
||||||
|
{
|
||||||
|
_blocks.add(new CraterBlock(block.getLocation(), Material.AIR));
|
||||||
|
|
||||||
|
Block above = block.getRelative(BlockFace.UP);
|
||||||
|
|
||||||
|
while (!UtilItem.isBoundless((above = above.getRelative(BlockFace.UP)).getType()))
|
||||||
|
{
|
||||||
|
_blocks.add(new CraterBlock(above.getLocation(), Material.AIR));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (distance > 2 && Math.random() > .75 && UtilItem.isBoundless(block.getRelative(BlockFace.UP).getType()))
|
||||||
|
{
|
||||||
|
_blocks.add(new CraterBlock(block.getLocation(), Material.COAL_BLOCK));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_blocks.forEach(CraterBlock::set);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void cleanup()
|
||||||
|
{
|
||||||
|
HandlerList.unregisterAll(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package mineplex.game.clans.clans.siege.cannon;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
public class CraterBlock
|
||||||
|
{
|
||||||
|
public Material Type;
|
||||||
|
public byte Data;
|
||||||
|
|
||||||
|
public Location Location;
|
||||||
|
|
||||||
|
public CraterBlock(Location location, Material type, byte data)
|
||||||
|
{
|
||||||
|
Location = location;
|
||||||
|
Type = type;
|
||||||
|
Data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CraterBlock(Location location, Material type)
|
||||||
|
{
|
||||||
|
this(location, type, (byte) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set()
|
||||||
|
{
|
||||||
|
Location.getBlock().setType(Type);
|
||||||
|
Location.getBlock().setData(Data);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user