package me.gtacraft.listener;
import com.google.common.collect.Lists;
import me.gtacraft.GTAGuns;
import me.gtacraft.event.*;
import me.gtacraft.gun.BulletData;
import me.gtacraft.gun.GunData;
import me.gtacraft.player.GunHolder;
import me.gtacraft.plugins.melondrop.task.MelonDropTask;
import me.gtacraft.util.*;
import me.vaqxine.VNPC.tasks.CrimeResponseTask;
import me.vaqxine.WorldRegeneration.RegenerationAPI;
import net.minecraft.server.v1_7_R3.*;
import org.bukkit.*;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_7_R3.CraftServer;
import org.bukkit.craftbukkit.v1_7_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftItemStack;
import org.bukkit.entity.*;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.entity.*;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.BlockIterator;
import org.bukkit.util.Vector;
import java.util.*;
/**
* Created by Connor on 4/27/14. Designed for the GTA-Guns project.
*/
public class GunListener implements Listener {
@EventHandler
public void onGunFireEvent(final PlayerInteractEvent e) {
Runnable async = new Runnable() {
@Override
public void run() {
final int slot = e.getPlayer().getInventory().getHeldItemSlot();
final GunHolder holder = GunHolder.getHolder(e.getPlayer());
if (holder.getCurrentWeapon() == null)
return;
final GunData held = GunUtil.getGunData(holder.getContainedGuns(), holder.getHolder().getItemInHand());
if (held == null || held.isFiring())
return;
if (e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK) && acceptable(e.getClickedBlock()))
return;
//shoot
if (held.isReloading())
return;
if (held.cantShoot())
return;
final Player player = holder.getHolder();
int $bullets = held.getDefaultAttribute("bulletsfired", 1).getIntValue();
final int id = held.getAttribute("ammotype.id").getIntValue();
final byte data = (byte)(int)held.getAttribute("ammotype.data").getIntValue();
int merge = GunUtil.hasEnough(id, data, player);
final int bullets = merge > $bullets ? $bullets : merge;
if (bullets == 0)
return;
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGuns.getInstnace(), new Runnable() {
@Override
public void run() {
final double accuracy = held.getAttribute("accuracy").getDoubleValue();
final double bulletSpeed = held.getDefaultAttribute("bulletspeed", 2.0).getDoubleValue();
final int burst = held.getDefaultAttribute("bullets", 1).getIntValue();
final int bulletDelay = held.getDefaultAttribute("bulletdelay", 0).getIntValue();
PreFireEvent preFire = new PreFireEvent(player.getEyeLocation(), holder, false);
Bukkit.getPluginManager().callEvent(preFire);
if (preFire.isCancelled())
return;
if (held.getDefaultAttribute("usage.single", false).getBooleanValue()) {
int amount = player.getItemInHand().getAmount();
if (amount == 1) {
player.getInventory().remove(player.getItemInHand());
}
else {
player.getInventory().getItemInHand().setAmount(player.getInventory().getItemInHand().getAmount()-1);
}
player.updateInventory();
//parse single usage purpose
String special = held.getDefaultAttribute("usage.special", "").getStringValue();
if (special.equalsIgnoreCase("grenade")) {
special(player, held, false, false);
} else if (special.equalsIgnoreCase("flashbang")) {
special(player, held, true, false);
} else if (special.equalsIgnoreCase("molotov")) {
special(player, held, false, true);
}
return;
}
held.setFiring(bullets*bulletDelay);
for (int i = 0; i < bullets; i++) {
new BukkitRunnable() {
public void run() {
if (held.isReloading())
return;
if (held.updateAmmo(player) || !GunUtil.removeOne(id, data, player))
return;
for (int j = 0; j < burst; j++) {
SoundUtil.playSound(player.getLocation(), held.getDefaultAttribute("sounds.shoot", "").getStringValue(), Bukkit.getOnlinePlayers());
Projectile proj = player.launchProjectile(GunUtil.getProjectile(held.getAttribute("bulletprojectile").getStringValue()));
if (proj instanceof WitherSkull) {
WitherSkull ws = (WitherSkull)proj;
ws.setCharged(false);
ws.setYield(0.0f);
} else if (proj instanceof Fireball) {
final Fireball fb = (Fireball)proj;
fb.setYield(0);
}
BulletData fired = new BulletData(proj, held);
WeaponFireEvent firedEvent = new WeaponFireEvent(fired);
Bukkit.getPluginManager().callEvent(firedEvent);
Vector v = proj.getVelocity();
v = v.multiply(bulletSpeed);
v = v.add(new Vector((Math.random()*accuracy)-(accuracy/2), (Math.random()*accuracy)-(accuracy/2), (Math.random()*accuracy)-(accuracy/2)));
proj.setVelocity(v);
}
SoundUtil.playSound(holder.getHolder(), held.getDefaultAttribute("sounds.cooldown", "").getStringValue(), Bukkit.getOnlinePlayers());
holder.doKnockback(held);
if (scope.containsKey(holder.getHolder())) {
PacketPlayOutEntityEquipment equip = new PacketPlayOutEntityEquipment(holder.getHolder().getEntityId(), 3, CraftItemStack.asNMSCopy(new ItemStack(Material.getMaterial(86))));
((CraftPlayer)holder.getHolder()).getHandle().playerConnection.sendPacket(equip);
}
}
}.runTaskLater(GTAGuns.getInstnace(), (long) (bulletDelay*i));
}
new BukkitRunnable() {
public void run() {
if (held != null && holder != null && held.getAttribute("clipammo").getIntValue() == 0)
held.forceReload(holder.getHolder());
}
}.runTaskLater(GTAGuns.getInstnace(), (long) (bulletDelay*bullets)+3);
held.setNextAvailable(held.getDefaultAttribute("shotdelay", 0).getIntValue());
}
});
} else if (e.getAction().equals(Action.LEFT_CLICK_AIR)) {
held.forceReload(holder.getHolder());
}
e.setCancelled(true);
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGuns.getInstnace(), async);
}
private static boolean acceptable(Block clickedBlock) {
int id = clickedBlock.getTypeId();
switch (id) {
case 54:
case 69:
case 77:
case 84:
case 85:
case 96:
case 107:
case 113:
case 116:
case 120:
case 131:
case 137:
case 138:
case 143:
case 145:
case 146:
case 154:
case 158:
case 323:
case 68:
case 63: return true;
default: return false;
}
}
private HashMap<Player, ItemStack> scope = new HashMap<Player, ItemStack>();
private List<Player> deny_scope = Lists.newArrayList();
@EventHandler
public void onPlayerSneak(PlayerToggleSneakEvent e) {
final Player p = e.getPlayer();
if (deny_scope.contains(p))
return;
GunHolder holder = GunHolder.getHolder(p);
GunData held = holder.getCurrentWeapon();
if (p.hasPotionEffect(PotionEffectType.SLOW) && held == null) {
if (scope.containsKey(p)) {
PacketPlayOutEntityEquipment equip = new PacketPlayOutEntityEquipment(e.getPlayer().getEntityId(), 3, CraftItemStack.asNMSCopy(new ItemStack(Material.AIR)));
((CraftPlayer)e.getPlayer()).getHandle().playerConnection.sendPacket(equip);
ItemStack reset = scope.remove(p);
p.getEquipment().setHelmet(reset);
p.updateInventory();
deny_scope.add(p);
Runnable delay = new Runnable() {
public void run() {
deny_scope.remove(p);
}
};
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGuns.getInstnace(), delay, 5);
if (holder.getLastWeapon() != null) {
SoundUtil.playSound(p, holder.getLastWeapon().getDefaultAttribute("sounds.zoom_off", "").getStringValue(), p);
holder.getLastWeapon().setZoomed(false);
}
}
p.removePotionEffect(PotionEffectType.SLOW);
} else if (held == null)
return;
if (held == null) {
p.removePotionEffect(PotionEffectType.SLOW);
return;
}
if (e.isSneaking() && held.getDefaultAttribute("zoom.allowed", false).getBooleanValue() && !held.isZoomed()) {
int zoom = held.getDefaultAttribute("zoom.amount", 2).getIntValue();
if (zoom >= 10) {
//scope
scope.put(p, p.getEquipment().getHelmet());
PacketPlayOutEntityEquipment equip = new PacketPlayOutEntityEquipment(holder.getHolder().getEntityId(), 3, CraftItemStack.asNMSCopy(new ItemStack(Material.getMaterial(86))));
((CraftPlayer)holder.getHolder()).getHandle().playerConnection.sendPacket(equip);
}
holder.getHolder().addPotionEffect(new PotionEffect(PotionEffectType.SLOW, Integer.MAX_VALUE, zoom));
SoundUtil.playSound(holder.getHolder(), held.getDefaultAttribute("sounds.zoom_on", "").getStringValue(), p);
e.setCancelled(true);
held.setZoomed(true);
return;
}
else {
e.getPlayer().removePotionEffect(PotionEffectType.SLOW);
if (holder.getCurrentWeapon() == null)
return;
if (!holder.getCurrentWeapon().isZoomed())
return;
SoundUtil.playSound(holder.getHolder(), held.getDefaultAttribute("sounds.zoom_off", "").getStringValue(), p);
if (held.getDefaultAttribute("zoom.amount", 0).getIntValue() >= 10) {
PacketPlayOutEntityEquipment equip = new PacketPlayOutEntityEquipment(e.getPlayer().getEntityId(), 3, CraftItemStack.asNMSCopy(new ItemStack(Material.AIR)));
((CraftPlayer)e.getPlayer()).getHandle().playerConnection.sendPacket(equip);
ItemStack reset = scope.remove(p);
p.getEquipment().setHelmet(reset);
p.updateInventory();
deny_scope.add(p);
Runnable delay = new Runnable() {
public void run() {
deny_scope.remove(p);
}
};
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGuns.getInstnace(), delay, 5);
}
held.setZoomed(false);
}
}
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
if (!(e.getEntity() instanceof LivingEntity))
return;
if (e.getDamager() instanceof Projectile) {
Projectile proj = (Projectile)e.getDamager();
BulletData gd = BulletData.getBulletData(proj);
ExplosionUtil.explode(gd);
if (gd == null)
return;
WeaponDamageEntityEvent wdee = new WeaponDamageEntityEvent(gd, e.getEntity());
Bukkit.getPluginManager().callEvent(wdee);
if (wdee.isCancelled())
return;
double rangedRemoval = gd.getGunData().getDefaultAttribute("range", 0.0).getDoubleValue();
double damage = gd.getGunData().getAttribute("damage").getDoubleValue();
e.setDamage(ArmorUtil.recomputeDamage((LivingEntity)e.getEntity(), damage)-(rangedRemoval*gd.getInitialLocation().distance(gd.getProjectile().getLocation())));
}
}
static int totalBreakTicks = Integer.MIN_VALUE;
private static void sendBreakPacket(double speed, Block chip) {
int x = chip.getX();
int y = chip.getY();
int z = chip.getZ();
Location at = chip.getLocation();
if (speed < 20)
return;
int damage = (int)((speed/200.0)*9);
damage = damage > 9 ? 9 : damage;
PacketPlayOutBlockBreakAnimation ppobba = new PacketPlayOutBlockBreakAnimation(totalBreakTicks++, x, y, z, damage);
for (Player pl : Bukkit.getOnlinePlayers()) {
pl.playEffect(chip.getLocation(), Effect.STEP_SOUND, chip.getTypeId());
((CraftPlayer) pl).getHandle().playerConnection.sendPacket(ppobba);
}
}
public static List<FallingBlock> fall_blocks_explode = Lists.newArrayList();
@EventHandler
public void onEntitySpawnBlock(EntityChangeBlockEvent event) {
if (fall_blocks_explode.contains(event.getEntity())) {
fall_blocks_explode.remove(event.getEntity());
FallingBlock cast = (FallingBlock)event.getEntity();
int id = cast.getBlockId();
byte data = cast.getBlockData();
Location hit = event.getBlock().getLocation();
event.setCancelled(true);
hit.getWorld().playEffect(hit, Effect.STEP_SOUND, id, data);
}
}
@EventHandler
public void onItemDrop(ItemSpawnEvent event) {
Item i = event.getEntity();
int x = i.getItemStack().getTypeId();
if(x == 6 || x == 37 || x == 38 || x == 81 || x == 175)
event.setCancelled(true);
}
@EventHandler
public void projHit(ProjectileHitEvent e) {
Projectile proj = e.getEntity();
final Block hit = getHit(proj);
BulletHitBlockEvent bhbe = new BulletHitBlockEvent(hit.getLocation());
Bukkit.getPluginManager().callEvent(bhbe);
e.getEntity().remove();
if (bhbe.isCancelled())
return;
if (molotov.containsKey(proj)) {
Runnable run = molotov.remove(proj);
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGuns.getInstnace(), run);
CrimeResponseTask.addCrimeLocation(proj.getLocation(), e.getEntity().getShooter());
return;
}
BulletData gd = BulletData.getBulletData(proj);
ExplosionUtil.explode(gd);
if (gd == null)
return;
final int id = hit.getTypeId();
Runnable async = new Runnable() {
@Override
public void run() {
sendCrackPacket(hit, id);
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGuns.getInstnace(), async);
if (break_chance.containsKey(hit.getTypeId())) {
double roll = Math.random()*100;
if (roll <= break_chance.get(hit.getTypeId())) {
Location add = checkDoor(hit.getLocation());
if (add != null) {
RegenerationAPI.queueBlockForRegeneration(add.getBlock(), 60);
add.getWorld().playEffect(add, Effect.STEP_SOUND, add.getBlock().getTypeId(), add.getBlock().getData());
add.getBlock().setType(Material.AIR);
}
RegenerationAPI.queueBlockForRegeneration(hit, 60);
hit.setType(Material.AIR);
}
else
sendBreakPacket(gd.getBulletSpeed(), hit);
} else {
Location add = checkDoor(hit.getLocation());
if (add != null) {
RegenerationAPI.queueBlockForRegeneration(add.getBlock(), 60);
add.getWorld().playEffect(add, Effect.STEP_SOUND, add.getBlock().getTypeId(), add.getBlock().getData());
add.getBlock().setType(Material.AIR);
}
RegenerationAPI.queueBlockForRegeneration(hit, 60);
hit.setType(Material.AIR);
}
}
private Location checkDoor(Location hit) {
if (hit.getBlock().getType().equals(Material.WOODEN_DOOR) || hit.getBlock().getType().equals(Material.IRON_DOOR_BLOCK)) {
Location up = hit.clone().add(0, 1, 0);
Location down = hit.clone().add(0, -1, 0);
if (up.getBlock().getType().equals(Material.WOODEN_DOOR) || up.getBlock().getType().equals(Material.IRON_DOOR_BLOCK)) {
return up;
} else if (down.getBlock().getType().equals(Material.WOODEN_DOOR) || down.getBlock().getType().equals(Material.IRON_DOOR_BLOCK)) {
return down;
}
}
return null;
}
public void sendCrackPacket(Block b, int typeID) {
Packet particles = new PacketPlayOutWorldEvent(2001, Math.round(b.getX()), Math.round(b.getY()), Math.round(b.getZ()), typeID, false);
((CraftServer) Bukkit.getServer()).getServer().getPlayerList().sendPacketNearby(b.getX(), b.getY(), b.getZ(), 16, ((CraftWorld) b.getWorld()).getHandle().dimension, particles);
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onBlockBreak(final BlockBreakEvent event) {
if (!(event.getPlayer().getGameMode().equals(GameMode.CREATIVE))) {
Location add = checkDoor(event.getBlock().getLocation());
if (Bukkit.getPluginManager().getPlugin("GTA-Melondrop") != null) {
if (MelonDropTask.wrapped != null && MelonDropTask.wrapped.equals(event.getBlock()))
return;
}
if (add != null) {
RegenerationAPI.queueBlockForRegeneration(add.getBlock(), 30);
sendCrackPacket(add.getBlock(), add.getBlock().getTypeId());
add.getBlock().setType(Material.AIR);
}
event.setCancelled(true);
RegenerationAPI.queueBlockForRegeneration(event.getBlock(), 30);
event.getBlock().setType(Material.AIR);
}
}
@EventHandler
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
if (event.getEntity().getType().equals(EntityType.FALLING_BLOCK))
event.setCancelled(true);
}
static List<Material> redstone_material = Lists.newArrayList();
static {
redstone_material.add(Material.REDSTONE_BLOCK);
redstone_material.add(Material.STONE_BUTTON);
redstone_material.add(Material.WOOD_BUTTON);
redstone_material.add(Material.STONE_PLATE);
redstone_material.add(Material.WOOD_PLATE);
redstone_material.add(Material.IRON_PLATE);
redstone_material.add(Material.GOLD_PLATE);
}
@EventHandler
public void onPhysicsEvent(BlockPhysicsEvent event) {
Material t = event.getChangedType();
if (redstone_material.contains(t))
return;
if (!(t.equals(Material.WATER)) && !(t.equals(Material.STATIONARY_WATER)))
event.setCancelled(true);
}
private static Block getHit(Projectile proj) {
BlockIterator bi = new BlockIterator(proj.getWorld(), proj.getLocation().toVector(), proj.getVelocity().normalize(), 0.0D, 7);
Block hit = null;
while (bi.hasNext()) {
hit = bi.next();
if (hit.getTypeId() != 0)
break;
}
return hit;
}
private static HashMap<Projectile, Runnable> molotov = new HashMap<Projectile, Runnable>();
private static void special(final Player player, final GunData held, final boolean flash, final boolean fire) {
PreFireEvent preFire = new PreFireEvent(player.getEyeLocation(), GunHolder.getHolder(player), (!flash && !fire));
Bukkit.getPluginManager().callEvent(preFire);
if (preFire.isCancelled())
return;
String preShoot = held.getDefaultAttribute("sound.use", "").getStringValue();
if (preShoot != "")
SoundUtil.playSound(player.getLocation(), preShoot, player);
final double radius = held.getDefaultAttribute("usage.radius", 2.0).getDoubleValue();
final double damage = held.getAttribute("damage").getDoubleValue();
final int flashDuration = held.getDefaultAttribute("usage.duration", 4).getIntValue();
final double accuracy = held.getAttribute("accuracy").getDoubleValue();
final double bulletSpeed = held.getDefaultAttribute("bulletspeed", 2.0).getDoubleValue();
int $id = held.getDefaultAttribute("usage.drop.id", 1).getIntValue();
byte $data = (byte)held.getDefaultAttribute("usage.drop.data", 0).getIntValue();
if (fire) {
final Projectile proj = player.launchProjectile(Snowball.class);
SpecialFireEvent fireEvent = new SpecialFireEvent(proj.getLocation(), proj, null);
Bukkit.getPluginManager().callEvent(fireEvent);
Vector v = proj.getVelocity();
v = v.multiply(bulletSpeed);
v = v.add(new Vector((Math.random()*accuracy)-(accuracy/2), (Math.random()*accuracy)-(accuracy/2), (Math.random()*accuracy)-(accuracy/2)));
proj.setVelocity(v);
molotov.put(proj, new Runnable() {
public void run() {
for (LivingEntity player : proj.getWorld().getLivingEntities()) {
if (player.getLocation().distance(proj.getLocation()) <= radius) {
player.setFireTicks(held.getDefaultAttribute("usage.fire", 10).getIntValue()*20);
}
}
ParticleEffects.sendToLocation(ParticleEffects.FLAME, proj.getLocation(), (float)radius/2, (float)radius/3, (float)radius/2, 0f, (int)(radius*50));
ParticleEffects.sendToLocation(ParticleEffects.LARGE_SMOKE, proj.getLocation(), (float)radius/2, (float)radius/3, (float)radius/2, 0f, (int)(radius*50));
SoundUtil.playSound(proj.getLocation(), held.getDefaultAttribute("sounds.flash", "GLASS-1-0-0").getStringValue(), Bukkit.getOnlinePlayers());
}
});
return;
}
ItemStack stack = new ItemStack($id, 1, (short)0, $data);
final Item proj = player.getWorld().dropItem(player.getEyeLocation(), stack);
SpecialFireEvent fireEvent = new SpecialFireEvent(proj.getLocation(), null, proj);
Bukkit.getPluginManager().callEvent(fireEvent);
Vector v = player.getEyeLocation().getDirection();
v.normalize();
v = v.multiply(bulletSpeed);
v = v.add(new Vector((Math.random()*accuracy)-(accuracy/2), (Math.random()*accuracy)-(accuracy/2), (Math.random()*accuracy)-(accuracy/2)));
ExplosionUtil.deny_pickup.add(proj);
proj.setVelocity(v);
Runnable explode = new Runnable() {
public void run() {
final Location current = proj.getLocation();
proj.remove();
if (flash) {
SoundUtil.playSound(current, held.getDefaultAttribute("sounds.special", "FIREWORK_TWINKLE-1-2-0").getStringValue(), Bukkit.getOnlinePlayers());
ParticleEffects.sendToLocation(ParticleEffects.CLOUD, current, (float)radius, (float)radius, (float)radius, 0.1f, 50);
}
else if (!fire) {
SoundUtil.playSound(current, held.getDefaultAttribute("sounds.special", "EXPLODE-1-0-0").getStringValue(), Bukkit.getOnlinePlayers());
ParticleEffects.sendToLocation(ParticleEffects.HUGE_EXPLOSION, current, 0f, 0f, 0f, 1f, 1);
//compute kaboom
ExplosionUtil.destroyBlocks(radius, current, 30);
}
else {
ParticleEffects.sendToLocation(ParticleEffects.FLAME, current, (float) radius, 2f, (float) radius, 0f, (int) (radius * 50));
SoundUtil.playSound(current, held.getDefaultAttribute("sounds.special", "GLASS-1-0-0").getStringValue(), Bukkit.getOnlinePlayers());
}
final List<LivingEntity> online = proj.getWorld().getLivingEntities();
Runnable inRadius = new Runnable() {
@Override
public void run() {
List<LivingEntity> inRange = Lists.newArrayList();
for (LivingEntity player : online) {
if (player.getLocation().distance(current) <= radius)
inRange.add(player);
}
final List<LivingEntity> clone = new ArrayList<LivingEntity>(inRange);
Runnable sync = new Runnable() {
public void run() {
for (LivingEntity _player : clone) {
if (flash)
_player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20*flashDuration, 1));
else {
PreFireEvent pfe = new PreFireEvent(_player.getLocation(), GunHolder.getHolder(player), true);
Bukkit.getPluginManager().callEvent(pfe);
if (!(pfe.isCancelled()))
_player.damage(ArmorUtil.recomputeDamage(_player, damage-(_player.getLocation().distance(current)/2)));
}
}
}
};
ExplosionUtil.deny_pickup.remove(proj);
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGuns.getInstnace(), sync);
}
};
Bukkit.getScheduler().scheduleAsyncDelayedTask(GTAGuns.getInstnace(), inRadius);
}
};
Bukkit.getScheduler().scheduleSyncDelayedTask(GTAGuns.getInstnace(), explode, held.getDefaultAttribute("usage.timer", 5).getIntValue()*20);
}
//default 100%
static HashMap<Integer, Integer> break_chance = new HashMap<Integer, Integer>();
static {
break_chance.put(1, 20);
break_chance.put(2, 70);
break_chance.put(3, 70);
break_chance.put(4, 35);
break_chance.put(5, 60);
break_chance.put(7, 0);
break_chance.put(12, 90);
break_chance.put(17, 45);
break_chance.put(22, 40);
break_chance.put(35, 95);
break_chance.put(41, 15);
break_chance.put(42, 10);
break_chance.put(43, 50);
break_chance.put(44, 75);
break_chance.put(45, 30);
break_chance.put(47, 60);
break_chance.put(48, 20);
break_chance.put(49, 7);
break_chance.put(53, 60);
break_chance.put(57, 2);
break_chance.put(58, 60);
break_chance.put(61, 30);
break_chance.put(82, 65);
break_chance.put(84, 50);
break_chance.put(87, 20);
break_chance.put(88, 15);
break_chance.put(89, 85);
break_chance.put(98, 20);
break_chance.put(101, 50);
break_chance.put(103, 0);
break_chance.put(108, 30);
break_chance.put(109, 20);
break_chance.put(112, 15);
break_chance.put(113, 15);
break_chance.put(114, 15);
break_chance.put(116, 5);
break_chance.put(120, 60);
break_chance.put(121, 30);
break_chance.put(123, 90);
break_chance.put(128, 50);
break_chance.put(130, 5);
break_chance.put(133, 4);
break_chance.put(134, 60);
break_chance.put(135, 60);
break_chance.put(136, 60);
break_chance.put(138, 85);
break_chance.put(139, 40);
break_chance.put(145, 10);
break_chance.put(154, 10);
break_chance.put(155, 35);
break_chance.put(156, 50);
break_chance.put(159, 65);
break_chance.put(162, 45);
break_chance.put(172, 65);
break_chance.put(173, 40);
break_chance.put(174, 95);
}
}