From d34c1ffc2033f9585415fa047dbec4a71a3b5bf3 Mon Sep 17 00:00:00 2001 From: Sobki Date: Sun, 23 Oct 2016 16:03:05 +1000 Subject: [PATCH] New HeatControl & fixed NPE (#633) * New HeatControl & NPE fix * Updated to latest * Cleaned up HeatControl * Updated PKListener to use HeatControlType instead of Function * Cleaned up, cleaned up HeatControl * Removed melt(...) * Final changes --- .../projectkorra/GeneralMethods.java | 19 +- .../projectkorra/projectkorra/PKListener.java | 10 +- .../projectkorra/ability/FireAbility.java | 32 +- .../configuration/ConfigManager.java | 16 +- .../firebending/FireDamageTimer.java | 2 +- .../firebending/FirebendingManager.java | 1 + .../projectkorra/firebending/HeatControl.java | 434 ++++++++++++++++++ .../firebending/HeatControlCook.java | 166 ------- .../firebending/HeatControlExtinguish.java | 129 ------ .../firebending/HeatControlMelt.java | 98 ---- .../firebending/HeatControlSolidify.java | 255 ---------- 11 files changed, 475 insertions(+), 687 deletions(-) create mode 100644 src/com/projectkorra/projectkorra/firebending/HeatControl.java delete mode 100644 src/com/projectkorra/projectkorra/firebending/HeatControlCook.java delete mode 100644 src/com/projectkorra/projectkorra/firebending/HeatControlExtinguish.java delete mode 100644 src/com/projectkorra/projectkorra/firebending/HeatControlMelt.java delete mode 100644 src/com/projectkorra/projectkorra/firebending/HeatControlSolidify.java diff --git a/src/com/projectkorra/projectkorra/GeneralMethods.java b/src/com/projectkorra/projectkorra/GeneralMethods.java index c6684863..f92c3115 100644 --- a/src/com/projectkorra/projectkorra/GeneralMethods.java +++ b/src/com/projectkorra/projectkorra/GeneralMethods.java @@ -579,7 +579,7 @@ public class GeneralMethods { BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player); if (ConfigManager.defaultConfig.get().getBoolean("Properties.BendingPreview") == true) { - if (ability != null) { + if (ability != null && bPlayer != null) { if (bPlayer.isOnCooldown(ability)) { displayedMessage = ability.getElement().getColor() + "" + ChatColor.STRIKETHROUGH + ability.getName(); @@ -1004,14 +1004,15 @@ public class GeneralMethods { if (avoid.contains(entity)) { continue; } - if (entity.getLocation().distanceSquared(origin) < longestr * longestr - && getDistanceFromLine(direction, origin, entity.getLocation()) < 2 - && (entity instanceof LivingEntity) - && entity.getEntityId() != player.getEntityId() - && entity.getLocation().distanceSquared(origin.clone().add(direction)) < entity.getLocation().distanceSquared(origin.clone().add(direction.clone().multiply(-1))) - && entity.getWorld().equals(origin.getWorld())) { - target = entity; - longestr = entity.getLocation().distance(origin); + if (entity.getWorld().equals(origin.getWorld())) { + if (entity.getLocation().distanceSquared(origin) < longestr * longestr + && getDistanceFromLine(direction, origin, entity.getLocation()) < 2 + && (entity instanceof LivingEntity) + && entity.getEntityId() != player.getEntityId() + && entity.getLocation().distanceSquared(origin.clone().add(direction)) < entity.getLocation().distanceSquared(origin.clone().add(direction.clone().multiply(-1)))) { + target = entity; + longestr = entity.getLocation().distance(origin); + } } } if (target != null) { diff --git a/src/com/projectkorra/projectkorra/PKListener.java b/src/com/projectkorra/projectkorra/PKListener.java index bbc28535..8e4d828d 100644 --- a/src/com/projectkorra/projectkorra/PKListener.java +++ b/src/com/projectkorra/projectkorra/PKListener.java @@ -138,8 +138,8 @@ import com.projectkorra.projectkorra.firebending.FireCombo; import com.projectkorra.projectkorra.firebending.FireDamageTimer; import com.projectkorra.projectkorra.firebending.FireJet; import com.projectkorra.projectkorra.firebending.FireShield; -import com.projectkorra.projectkorra.firebending.HeatControlExtinguish; -import com.projectkorra.projectkorra.firebending.HeatControlSolidify; +import com.projectkorra.projectkorra.firebending.HeatControl; +import com.projectkorra.projectkorra.firebending.HeatControl.HeatControlType; import com.projectkorra.projectkorra.firebending.Illumination; import com.projectkorra.projectkorra.firebending.Lightning; import com.projectkorra.projectkorra.firebending.WallOfFire; @@ -794,7 +794,7 @@ public class PKListener implements Listener { } if (bPlayer.canBendPassive(Element.FIRE) && bPlayer.hasElement(Element.FIRE) && (event.getCause() == DamageCause.FIRE || event.getCause() == DamageCause.FIRE_TICK)) { - event.setCancelled(!HeatControlExtinguish.canBurn(player)); + event.setCancelled(!HeatControl.canBurn(player)); } if (bPlayer.hasElement(Element.EARTH) && event.getCause() == DamageCause.SUFFOCATION && TempBlock.isTempBlock(player.getEyeLocation().getBlock())) { @@ -1345,7 +1345,7 @@ public class PKListener implements Listener { new FireBlastCharged(player); } else if (abil.equalsIgnoreCase("HeatControl")) { - new HeatControlSolidify(player); + new HeatControl(player, HeatControlType.SOLIDIFY); } else if (abil.equalsIgnoreCase("FireBurst")) { new FireBurst(player); @@ -1578,7 +1578,7 @@ public class PKListener implements Listener { new FireJet(player); } else if (abil.equalsIgnoreCase("HeatControl")) { - new HeatControlExtinguish(player); + new HeatControl(player, HeatControlType.MELT); } else if (abil.equalsIgnoreCase("Illumination")) { if (ConfigManager.defaultConfig.get().getBoolean("Abilities.Fire.Illumination.Passive")) { diff --git a/src/com/projectkorra/projectkorra/ability/FireAbility.java b/src/com/projectkorra/projectkorra/ability/FireAbility.java index 063ae12c..b5d2af58 100644 --- a/src/com/projectkorra/projectkorra/ability/FireAbility.java +++ b/src/com/projectkorra/projectkorra/ability/FireAbility.java @@ -1,13 +1,12 @@ package com.projectkorra.projectkorra.ability; -import com.projectkorra.projectkorra.Element; -import com.projectkorra.projectkorra.GeneralMethods; -import com.projectkorra.projectkorra.configuration.ConfigManager; -import com.projectkorra.projectkorra.firebending.BlazeArc; -import com.projectkorra.projectkorra.firebending.HeatControlSolidify; -import com.projectkorra.projectkorra.util.Information; -import com.projectkorra.projectkorra.util.ParticleEffect; -import com.projectkorra.rpg.RPGMethods; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.ConcurrentHashMap; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -18,13 +17,14 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.ConcurrentHashMap; +import com.projectkorra.projectkorra.Element; +import com.projectkorra.projectkorra.GeneralMethods; +import com.projectkorra.projectkorra.configuration.ConfigManager; +import com.projectkorra.projectkorra.firebending.BlazeArc; +import com.projectkorra.projectkorra.firebending.HeatControl; +import com.projectkorra.projectkorra.util.Information; +import com.projectkorra.projectkorra.util.ParticleEffect; +import com.projectkorra.rpg.RPGMethods; public abstract class FireAbility extends ElementalAbility { @@ -218,7 +218,7 @@ public abstract class FireAbility extends ElementalAbility { public static void stopBending() { BlazeArc.removeAllCleanup(); - HeatControlSolidify.revertAllInstances(); + HeatControl.revertAllInstances(); for (Location loc : TEMP_FIRE.keySet()) { revertTempFire(loc); } diff --git a/src/com/projectkorra/projectkorra/configuration/ConfigManager.java b/src/com/projectkorra/projectkorra/configuration/ConfigManager.java index 40dd51e8..51e73b7b 100644 --- a/src/com/projectkorra/projectkorra/configuration/ConfigManager.java +++ b/src/com/projectkorra/projectkorra/configuration/ConfigManager.java @@ -310,7 +310,7 @@ public class ConfigManager { config.addDefault("Abilities.Fire.FireJet.Description", "This ability is used for a limited burst of flight for firebenders. Clicking with this " + "ability selected will launch you in the direction you're looking, granting you " + "controlled flight for a short time. This ability can be used mid-air to prevent falling " + "to your death, but on the ground it can only be used if standing on a block that's " + "ignitable (e.g. not snow or water)."); config.addDefault("Abilities.Fire.FireShield.Description", "FireShield is a basic defensive ability. " + "Clicking with this ability selected will create a " + "small disc of fire in front of you, which will block most " + "attacks and bending. Alternatively, pressing and holding " + "sneak creates a very small shield of fire, blocking most attacks. " + "Creatures that contact this fire are ignited."); config.addDefault("Abilities.Fire.FireShield.DeathMessage", "{victim} scorched theirself on {attacker}'s {ability}"); - config.addDefault("Abilities.Fire.HeatControl.Description", "While this ability is selected, the firebender becomes impervious " + "to fire damage and cannot be ignited. " + "If the user left-clicks with this ability, the targeted area will be " + "extinguished, although it will leave any creature burning engulfed in flames. " + "This ability can also cool lava. If this ability is used while targetting ice or snow, it" + " will instead melt blocks in that area. Finally, sneaking with this ability will cook any food in your hand."); + config.addDefault("Abilities.Fire.HeatControl.Description", "While this ability is selected, the firebender becomes impervious " + "to fire damage and cannot be ignited. " + "HeatControl has four different functions available to the user.\n" + "Cook - Hold shift while holding any raw food in your hand to cook it.\n" + "Extinguish - Hold shift, and any fire within a configurable radius will be extinguished.\n" + "Melt - Left click while looking at ice in order to melt it.\n" + "Solidify - Hold shift while looking at a body of lava to cool it, turning it into stone."); config.addDefault("Abilities.Fire.Illumination.Description", "This ability gives firebenders a means of illuminating the area. It is a toggle - clicking " + "will create a torch that follows you around. The torch will only appear on objects that are " + "ignitable and can hold a torch (e.g. not leaves or ice). If you get too far away from the torch, " + "it will disappear, but will reappear when you get on another ignitable block. Clicking again " + "dismisses this torch."); config.addDefault("Abilities.Fire.Lightning.Description", "Hold sneak while selecting this ability to charge up a lightning strike. Once charged, release sneak to discharge the lightning to the targeted location."); config.addDefault("Abilities.Fire.Lightning.DeathMessage", "{victim} was electrocuted by {attacker}'s {ability}"); @@ -1016,15 +1016,15 @@ public class ConfigManager { config.addDefault("Abilities.Fire.FireShield.FireTicks", 2); config.addDefault("Abilities.Fire.HeatControl.Enabled", true); - config.addDefault("Abilities.Fire.HeatControl.Extinguish.Range", 20); - config.addDefault("Abilities.Fire.HeatControl.Extinguish.Radius", 7); - config.addDefault("Abilities.Fire.HeatControl.Extinguish.Cooldown", 500); - config.addDefault("Abilities.Fire.HeatControl.Solidify.Range", 10); - config.addDefault("Abilities.Fire.HeatControl.Solidify.Radius", 7); - config.addDefault("Abilities.Fire.HeatControl.Solidify.RevertTime", 20000); + config.addDefault("Abilities.Fire.HeatControl.Cook.Interval", 1000); + config.addDefault("Abilities.Fire.HeatControl.Extinguish.Cooldown", 5000); + config.addDefault("Abilities.Fire.HeatControl.Extinguish.Radius", 6); config.addDefault("Abilities.Fire.HeatControl.Melt.Range", 15); config.addDefault("Abilities.Fire.HeatControl.Melt.Radius", 5); - config.addDefault("Abilities.Fire.HeatControl.Cook.CookTime", 2000); + config.addDefault("Abilities.Fire.HeatControl.Solidify.MaxRadius", 10); + config.addDefault("Abilities.Fire.HeatControl.Solidify.Range", 7); + config.addDefault("Abilities.Fire.HeatControl.Solidify.Revert", true); + config.addDefault("Abilities.Fire.HeatControl.Solidify.RevertTime", 120000); config.addDefault("Abilities.Fire.Illumination.Enabled", true); config.addDefault("Abilities.Fire.Illumination.Passive", true); diff --git a/src/com/projectkorra/projectkorra/firebending/FireDamageTimer.java b/src/com/projectkorra/projectkorra/firebending/FireDamageTimer.java index 99aa76db..7e090239 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireDamageTimer.java +++ b/src/com/projectkorra/projectkorra/firebending/FireDamageTimer.java @@ -45,7 +45,7 @@ public class FireDamageTimer { public static void dealFlameDamage(Entity entity) { if (INSTANCES.containsKey(entity) && entity instanceof LivingEntity) { if (entity instanceof Player) { - if (!HeatControlExtinguish.canBurn((Player) entity)) { + if (!HeatControl.canBurn((Player) entity)) { return; } } diff --git a/src/com/projectkorra/projectkorra/firebending/FirebendingManager.java b/src/com/projectkorra/projectkorra/firebending/FirebendingManager.java index 80be973e..0345e7a8 100644 --- a/src/com/projectkorra/projectkorra/firebending/FirebendingManager.java +++ b/src/com/projectkorra/projectkorra/firebending/FirebendingManager.java @@ -17,5 +17,6 @@ public class FirebendingManager implements Runnable { FirePassive.handlePassive(); BlazeArc.dissipateAll(); FireAbility.removeFire(); + HeatControl.manageSolidify(); } } diff --git a/src/com/projectkorra/projectkorra/firebending/HeatControl.java b/src/com/projectkorra/projectkorra/firebending/HeatControl.java new file mode 100644 index 00000000..afe75e22 --- /dev/null +++ b/src/com/projectkorra/projectkorra/firebending/HeatControl.java @@ -0,0 +1,434 @@ +package com.projectkorra.projectkorra.firebending; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.bukkit.Effect; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import com.projectkorra.projectkorra.BendingPlayer; +import com.projectkorra.projectkorra.Element; +import com.projectkorra.projectkorra.GeneralMethods; +import com.projectkorra.projectkorra.ability.EarthAbility; +import com.projectkorra.projectkorra.ability.FireAbility; +import com.projectkorra.projectkorra.util.ParticleEffect; +import com.projectkorra.projectkorra.util.TempBlock; +import com.projectkorra.projectkorra.waterbending.PhaseChangeMelt; + +public class HeatControl extends FireAbility { + + public enum HeatControlType { + COOK, EXTINGUISH, MELT, SOLIDIFY + } + + private static final Material[] COOKABLE_MATERIALS = { Material.RAW_BEEF, Material.RAW_CHICKEN, + Material.RAW_FISH, Material.PORK, Material.POTATO_ITEM, Material.RABBIT, Material.MUTTON }; + + private HeatControlType heatControlType; + + /* + * HeatControl Cook variables + */ + private long cookTime; + private long cookInterval; + + /* + * HeatControl Extinguish variables + */ + private long extinguishCooldown; + private double extinguishRadius; + + /* + * HeatControl Melt variables + */ + private double meltRange; + private double meltRadius; + private Location meltLocation; + + /* + * HeatControl Solidify variables + */ + private int solidifyRadius; + private long solidifyDelay; + private long solidifyLastBlockTime; + private double solidifyMaxRadius; + private double solidifyRange; + private boolean solidifying; + private Location solidifyLocation; + private Random randy; + private ConcurrentHashMap solidifyStone = new ConcurrentHashMap<>(); + private ConcurrentHashMap solidifyRevert = new ConcurrentHashMap<>(); + private List blocks = new ArrayList<>(); + + + public HeatControl(Player player, HeatControlType heatControlType) { + super(player); + + this.heatControlType = heatControlType; + setFields(); + + if (this.heatControlType == HeatControlType.COOK) { + start(); + + } else if (this.heatControlType == HeatControlType.EXTINGUISH) { + if (bPlayer.isOnCooldown(getName() + "Extinguish")) { + remove(); + return; + } + + start(); + + } else if (this.heatControlType == HeatControlType.MELT) { + meltLocation = GeneralMethods.getTargetedLocation(player, meltRange); + for (Block block : GeneralMethods.getBlocksAroundPoint(meltLocation, meltRadius)) { + + if (isMeltable(block)) { + PhaseChangeMelt.melt(player, block); + } + } + + } else if (this.heatControlType == HeatControlType.SOLIDIFY) { + if (!bPlayer.canBend(this)) { + return; + } else if (EarthAbility.getLavaSourceBlock(player, solidifyRange) == null) { + remove(); + new HeatControl(player, HeatControlType.COOK); + return; + } + + solidifyLastBlockTime = System.currentTimeMillis(); + start(); + } + + } + + public void setFields() { + if (this.heatControlType == HeatControlType.COOK) { + this.cookTime = System.currentTimeMillis(); + this.cookInterval = getConfig().getLong("Abilities.Fire.HeatControl.Cook.Interval"); + this.heatControlType = HeatControlType.COOK; + } else if (this.heatControlType == HeatControlType.EXTINGUISH) { + this.extinguishCooldown = getConfig().getLong("Abilities.Fire.HeatControl.Extinguish.Cooldown"); + this.extinguishRadius = getConfig().getLong("Abilities.Fire.HeatControl.Extinguish.Radius"); + this.extinguishRadius = getDayFactor(this.extinguishRadius); + } else if (this.heatControlType == HeatControlType.MELT) { + this.meltRange = getConfig().getDouble("Abilities.Fire.HeatControl.Melt.Range"); + this.meltRadius = getConfig().getDouble("Abilities.Fire.HeatControl.Melt.Radius"); + this.meltRange = getDayFactor(this.meltRange); + this.meltRadius = getDayFactor(this.meltRadius); + } else if (this.heatControlType == HeatControlType.SOLIDIFY) { + this.solidifyRadius = 1; + this.solidifyDelay = 50; + this.solidifyLastBlockTime = 0; + this.solidifyMaxRadius = getConfig().getDouble("Abilities.Fire.HeatControl.Solidify.MaxRadius"); + this.solidifyRange = getConfig().getDouble("Abilities.Fire.HeatControl.Solidify.Range"); + this.randy = new Random(); + } + } + + @SuppressWarnings("deprecation") + @Override + public void progress() { + + if (!bPlayer.canBend(this)) { + remove(); + return; + } + + if (this.heatControlType == HeatControlType.COOK) { + + if (!player.isSneaking()) { + remove(); + return; + } + + if (!isCookable(player.getInventory().getItemInMainHand().getType())) { + remove(); + new HeatControl(player, HeatControlType.EXTINGUISH); + return; + } + + if (System.currentTimeMillis() - cookTime > cookInterval) { + cook(); + cookTime = System.currentTimeMillis(); + return; + } + + displayCookParticles(); + + } else if (this.heatControlType == HeatControlType.EXTINGUISH) { + + if (!player.isSneaking()) { + bPlayer.addCooldown(getName() + "Extinguish", extinguishCooldown); + remove(); + return; + } + + Set blocks = new HashSet<>(); + for (int material : GeneralMethods.NON_OPAQUE) { + blocks.add(Material.getMaterial(material)); + } + + for (Block block : GeneralMethods.getBlocksAroundPoint(player.getLocation(), extinguishRadius)) { + Material material = block.getType(); + if (material == Material.FIRE && !GeneralMethods.isRegionProtectedFromBuild(this, block.getLocation())) { + + block.setType(Material.AIR); + block.getWorld().playEffect(block.getLocation(), Effect.EXTINGUISH, 0); + } + } + + } else if (this.heatControlType == HeatControlType.SOLIDIFY) { + + if (solidifyRadius >= solidifyMaxRadius) { + remove(); + return; + } + + if (!player.isSneaking()) { + remove(); + return; + } + + if (!solidifying) { + solidifying = true; + } + + Location targetLocation = GeneralMethods.getTargetedLocation(player, solidifyRange); + resetLocation(targetLocation); + List area = GeneralMethods.getCircle(solidifyLocation, solidifyRadius, 3, true, true, 0); + solidify(area); + } + + } + + private void cook() { + ItemStack cooked = getCooked(player.getInventory().getItemInMainHand()); + HashMap cantFit = player.getInventory().addItem(cooked); + for (int id : cantFit.keySet()) { + player.getWorld().dropItem(player.getEyeLocation(), cantFit.get(id)); + } + + int amount = player.getInventory().getItemInMainHand().getAmount(); + if (amount == 1) { + player.getInventory().clear(player.getInventory().getHeldItemSlot()); + } else { + player.getInventory().getItemInMainHand().setAmount(amount - 1); + } + } + + private ItemStack getCooked(ItemStack is) { + ItemStack cooked = new ItemStack(Material.AIR); + Material material = is.getType(); + + switch (material) { + case RAW_BEEF: + cooked = new ItemStack(Material.COOKED_BEEF, 1); + break; + case RAW_FISH: + ItemStack salmon = new ItemStack(Material.RAW_FISH, 1, (short) 1); + if (is.getDurability() == salmon.getDurability()) { + cooked = new ItemStack(Material.COOKED_FISH, 1, (short) 1); + } else { + cooked = new ItemStack(Material.COOKED_FISH, 1); + } + break; + case RAW_CHICKEN: + cooked = new ItemStack(Material.COOKED_CHICKEN, 1); + break; + case PORK: + cooked = new ItemStack(Material.GRILLED_PORK, 1); + break; + case POTATO_ITEM: + cooked = new ItemStack(Material.BAKED_POTATO, 1); + break; + case MUTTON: + cooked = new ItemStack(Material.COOKED_MUTTON); + break; + case RABBIT: + cooked = new ItemStack(Material.COOKED_RABBIT); + break; + default: + break; + } + + return cooked; + } + + public void displayCookParticles() { + ParticleEffect.FLAME.display(player.getLocation().clone().add(0, 1, 0), 0.5F, 0.5F, 0.5F, 0, 3); + ParticleEffect.SMOKE.display(player.getLocation().clone().add(0, 1, 0), 0.5F, 0.5F, 0.5F, 0, 2); + } + + public static boolean isCookable(Material material) { + return Arrays.asList(COOKABLE_MATERIALS).contains(material); + } + + public static boolean canBurn(Player player) { + BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player); + if (bPlayer == null) { + return true; + } else if (bPlayer.getBoundAbilityName().equals("HeatControl") || hasAbility(player, FireJet.class)) { + player.setFireTicks(-1); + return false; + } else if (player.getFireTicks() > 80 && bPlayer.canBendPassive(Element.FIRE)) { + player.setFireTicks(80); + } + return true; + } + + public void solidify(List area) { + if (System.currentTimeMillis() < solidifyLastBlockTime + solidifyDelay) { + return; + } + + List lava = new ArrayList(); + for (Location l : area) { + if (isLava(l.getBlock())) { + lava.add(l.getBlock()); + } + } + + solidifyLastBlockTime = System.currentTimeMillis(); + if (lava.size() == 0) { + solidifyRadius++; + return; + } + + Block b = lava.get(randy.nextInt(lava.size())); + + TempBlock tempBlock; + if (TempBlock.isTempBlock(b)) { + tempBlock = TempBlock.get(b); + tempBlock.setType(Material.MAGMA, (byte) 0); + } else { + tempBlock = new TempBlock(b, Material.MAGMA, (byte) 0); + } + + solidifyStone.put(tempBlock, System.currentTimeMillis()); + solidifyRevert.put(tempBlock, System.currentTimeMillis() + 1000); + blocks.add(tempBlock); + } + + @Override + public void remove() { + solidifying = false; + } + + public void removeInstance() { + super.remove(); + } + + public void revert(TempBlock block) { + if (blocks.contains(block)) { + block.revertBlock(); + blocks.remove(block); + } + } + + public void revertAll() { + for (TempBlock tempBlock : blocks) { + tempBlock.revertBlock(); + } + + blocks.clear(); + } + + public static void revertAllInstances() { + for (HeatControl heatControl : getAbilities(HeatControl.class)) { + heatControl.revertAll(); + } + } + + public void resetLocation(Location loc) { + if (solidifyLocation == null) { + solidifyLocation = loc; + return; + } + + if (!loc.equals(solidifyLocation)) { + solidifyRadius = 1; + solidifyLocation = loc; + } + } + + public static void manageSolidify() { + for (HeatControl heatControl : getAbilities(HeatControl.class)) { + + for (TempBlock tempBlock : heatControl.solidifyStone.keySet()) { + + if (System.currentTimeMillis() - heatControl.solidifyStone.get(tempBlock) > 1000) { + + if (getConfig().getBoolean("Abilities.Fire.HeatControl.Solidify.Revert")) { + + tempBlock.setType(Material.STONE, (byte) 0); + heatControl.solidifyRevert.put(tempBlock, System.currentTimeMillis()); + } else { + + tempBlock.revertBlock(); + tempBlock.getBlock().setType(Material.STONE); + } + + ParticleEffect.SMOKE.display(tempBlock.getBlock().getLocation().clone().add(0.5, 1, 0.5), 0.1F, 0.1F, 0.1F, 0.01F, 3); + + // TODO play the smoke in a line from the block to above the player's head. + + tempBlock.getBlock().getWorld().playSound(tempBlock.getBlock().getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 1, 1); + heatControl.solidifyStone.remove(tempBlock); + } + } + + for (TempBlock tempBlock : heatControl.solidifyRevert.keySet()) { + + if (System.currentTimeMillis() - heatControl.solidifyRevert.get(tempBlock) > getConfig().getLong("Abilities.Fire.HeatControl.Solidify.RevertTime")) { + + heatControl.revert(tempBlock); + heatControl.solidifyRevert.remove(tempBlock); + } + } + + if (heatControl.solidifyStone.isEmpty() && heatControl.solidifyRevert.isEmpty() && !heatControl.solidifying) { + + heatControl.removeInstance(); + } + } + + } + + @Override + public boolean isSneakAbility() { + return true; + } + + @Override + public boolean isHarmlessAbility() { + return true; + } + + @Override + public long getCooldown() { + return 0; + } + + @Override + public String getName() { + return "HeatControl"; + } + + @Override + public Location getLocation() { + return player.getLocation(); + } + +} \ No newline at end of file diff --git a/src/com/projectkorra/projectkorra/firebending/HeatControlCook.java b/src/com/projectkorra/projectkorra/firebending/HeatControlCook.java deleted file mode 100644 index ec4ed0e0..00000000 --- a/src/com/projectkorra/projectkorra/firebending/HeatControlCook.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.projectkorra.projectkorra.firebending; - -import com.projectkorra.projectkorra.ability.FireAbility; -import com.projectkorra.projectkorra.util.ParticleEffect; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.Arrays; -import java.util.HashMap; - -public class HeatControlCook extends FireAbility { - - private static final Material[] COOKABLE_MATERIALS = { Material.RAW_BEEF, Material.RAW_CHICKEN, - Material.RAW_FISH, Material.PORK, Material.POTATO_ITEM, Material.RABBIT, Material.MUTTON }; - - private long time; - private long cookTime; - private ItemStack item; - - public HeatControlCook(Player player) { - super(player); - - this.time = System.currentTimeMillis(); - this.cookTime = getConfig().getLong("Abilities.Fire.HeatControl.Cook.CookTime"); - this.item = player.getInventory().getItemInMainHand(); - - if (isCookable(item.getType())) { - start(); - } - } - - private void cook() { - ItemStack cooked = getCooked(item); - HashMap cantFit = player.getInventory().addItem(cooked); - for (int id : cantFit.keySet()) { - player.getWorld().dropItem(player.getEyeLocation(), cantFit.get(id)); - } - - int amount = item.getAmount(); - if (amount == 1) { - player.getInventory().clear(player.getInventory().getHeldItemSlot()); - } else { - item.setAmount(amount - 1); - } - } - - private ItemStack getCooked(ItemStack is) { - ItemStack cooked = new ItemStack(Material.AIR); - Material material = is.getType(); - - switch (material) { - case RAW_BEEF: - cooked = new ItemStack(Material.COOKED_BEEF, 1); - break; - case RAW_FISH: - ItemStack salmon = new ItemStack(Material.RAW_FISH, 1, (short) 1); - if (is.getDurability() == salmon.getDurability()) { - cooked = new ItemStack(Material.COOKED_FISH, 1, (short) 1); - } else { - cooked = new ItemStack(Material.COOKED_FISH, 1); - } - break; - case RAW_CHICKEN: - cooked = new ItemStack(Material.COOKED_CHICKEN, 1); - break; - case PORK: - cooked = new ItemStack(Material.GRILLED_PORK, 1); - break; - case POTATO_ITEM: - cooked = new ItemStack(Material.BAKED_POTATO, 1); - break; - case MUTTON: - cooked = new ItemStack(Material.COOKED_MUTTON); - break; - case RABBIT: - cooked = new ItemStack(Material.COOKED_RABBIT); - break; - default: - break; - } - return cooked; - } - - @Override - public void progress() { - if (!bPlayer.canBendIgnoreCooldowns(this)) { - remove(); - return; - } else if (!item.equals(player.getInventory().getItemInMainHand())) { - time = System.currentTimeMillis(); - item = player.getInventory().getItemInMainHand(); - } - - if (!isCookable(item.getType())) { - remove(); - return; - } else if (System.currentTimeMillis() > time + cookTime) { - cook(); - time = System.currentTimeMillis(); - } - - ParticleEffect.FLAME.display(player.getEyeLocation(), 0.6F, 0.6F, 0.6F, 0, 3); - ParticleEffect.SMOKE.display(player.getEyeLocation(), 0.6F, 0.6F, 0.6F, 0, 1); - } - - public static boolean isCookable(Material material) { - return Arrays.asList(COOKABLE_MATERIALS).contains(material); - } - - @Override - public String getName() { - return "HeatControl"; - } - - @Override - public Location getLocation() { - return player != null ? player.getLocation() : null; - } - - @Override - public long getCooldown() { - return 0; - } - - @Override - public boolean isSneakAbility() { - return false; - } - - @Override - public boolean isHarmlessAbility() { - return true; - } - - public long getTime() { - return time; - } - - public void setTime(long time) { - this.time = time; - } - - public long getCookTime() { - return cookTime; - } - - public void setCookTime(long cookTime) { - this.cookTime = cookTime; - } - - public ItemStack getItem() { - return item; - } - - public void setItem(ItemStack item) { - this.item = item; - } - - public static Material[] getCookableMaterials() { - return COOKABLE_MATERIALS; - } - -} \ No newline at end of file diff --git a/src/com/projectkorra/projectkorra/firebending/HeatControlExtinguish.java b/src/com/projectkorra/projectkorra/firebending/HeatControlExtinguish.java deleted file mode 100644 index 53420d70..00000000 --- a/src/com/projectkorra/projectkorra/firebending/HeatControlExtinguish.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.projectkorra.projectkorra.firebending; - -import com.projectkorra.projectkorra.BendingPlayer; -import com.projectkorra.projectkorra.Element; -import com.projectkorra.projectkorra.GeneralMethods; -import com.projectkorra.projectkorra.ability.FireAbility; - -import org.bukkit.Effect; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; - -import java.util.HashSet; -import java.util.Set; - -public class HeatControlExtinguish extends FireAbility { - - private double range; - private double radius; - private long cooldown; - private Location location; - - @SuppressWarnings("deprecation") - public HeatControlExtinguish(Player player) { - super(player); - - if (!bPlayer.canBend(this) || bPlayer.isOnCooldown("HeatControlExtinguish")) { - return; - } - - this.range = getConfig().getDouble("Abilities.Fire.HeatControl.Extinguish.Range"); - this.radius = getConfig().getDouble("Abilities.Fire.HeatControl.Extinguish.Radius"); - this.cooldown = getConfig().getLong("Abilities.Fire.HeatControl.Extinguish.Cooldown"); - - this.range = getDayFactor(this.range); - this.radius = getDayFactor(this.radius); - Set blocks = new HashSet(); - for (Integer mat : GeneralMethods.NON_OPAQUE) { - blocks.add(Material.getMaterial(mat)); - } - if (isMeltable(player.getTargetBlock(blocks, (int) range))) { - new HeatControlMelt(player); - return; - } - - location = player.getTargetBlock((HashSet) null, (int) range).getLocation(); - for (Block block : GeneralMethods.getBlocksAroundPoint(location, radius)) { - Material mat = block.getType(); - if (mat != Material.FIRE) { - continue; - } else if (GeneralMethods.isRegionProtectedFromBuild(this, block.getLocation())) { - continue; - } else if (block.getType() == Material.FIRE) { - block.setType(Material.AIR); - block.getWorld().playEffect(block.getLocation(), Effect.EXTINGUISH, 0); - } - } - - bPlayer.addCooldown("HeatControlExtinguish", cooldown); - } - - public static boolean canBurn(Player player) { - BendingPlayer bPlayer = BendingPlayer.getBendingPlayer(player); - if (bPlayer == null) { - return true; - } else if (bPlayer.getBoundAbilityName().equals("HeatControl") || hasAbility(player, FireJet.class)) { - player.setFireTicks(-1); - return false; - } else if (player.getFireTicks() > 80 && bPlayer.canBendPassive(Element.FIRE)) { - player.setFireTicks(80); - } - return true; - } - - @Override - public String getName() { - return "HeatControl"; - } - - @Override - public void progress() { - } - - @Override - public Location getLocation() { - return location; - } - - @Override - public long getCooldown() { - return cooldown; - } - - @Override - public boolean isSneakAbility() { - return false; - } - - @Override - public boolean isHarmlessAbility() { - return true; - } - - public double getRange() { - return range; - } - - public void setRange(double range) { - this.range = range; - } - - public double getRadius() { - return radius; - } - - public void setRadius(double radius) { - this.radius = radius; - } - - public void setCooldown(long cooldown) { - this.cooldown = cooldown; - } - - public void setLocation(Location location) { - this.location = location; - } - -} diff --git a/src/com/projectkorra/projectkorra/firebending/HeatControlMelt.java b/src/com/projectkorra/projectkorra/firebending/HeatControlMelt.java deleted file mode 100644 index 1659d355..00000000 --- a/src/com/projectkorra/projectkorra/firebending/HeatControlMelt.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.projectkorra.projectkorra.firebending; - -import com.projectkorra.projectkorra.GeneralMethods; -import com.projectkorra.projectkorra.ability.FireAbility; -import com.projectkorra.projectkorra.waterbending.PhaseChangeMelt; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; - -public class HeatControlMelt extends FireAbility { - - private double range = getConfig().getDouble("Abilities.Fire.HeatControl.Melt.Range"); - private double radius = getConfig().getDouble("Abilities.Fire.HeatControl.Melt.Radius"); - private Location location; - - public HeatControlMelt(Player player) { - super(player); - - this.range = getConfig().getDouble("Abilities.Fire.HeatControl.Melt.Range"); - this.radius = getConfig().getDouble("Abilities.Fire.HeatControl.Melt.Radius"); - - this.range = getDayFactor(range); - this.radius = getDayFactor(radius); - - location = GeneralMethods.getTargetedLocation(player, range); - for (Block block : GeneralMethods.getBlocksAroundPoint(location, radius)) { - if (isMeltable(block)) { - PhaseChangeMelt.melt(player, block); - } else if (isHeatable(block)) { - heat(block); - } - } - } - - @SuppressWarnings("deprecation") - private static void heat(Block block) { - if (block.getType() == Material.OBSIDIAN) { - block.setType(Material.LAVA); - block.setData((byte) 0x0); - } - } - - private static boolean isHeatable(Block block) { - return false; - } - - @Override - public String getName() { - return "HeatControl"; - } - - @Override - public void progress() { - } - - @Override - public Location getLocation() { - return location; - } - - @Override - public long getCooldown() { - return 0; - } - - @Override - public boolean isSneakAbility() { - return false; - } - - @Override - public boolean isHarmlessAbility() { - return true; - } - - public double getRange() { - return range; - } - - public void setRange(double range) { - this.range = range; - } - - public double getRadius() { - return radius; - } - - public void setRadius(double radius) { - this.radius = radius; - } - - public void setLocation(Location location) { - this.location = location; - } - -} diff --git a/src/com/projectkorra/projectkorra/firebending/HeatControlSolidify.java b/src/com/projectkorra/projectkorra/firebending/HeatControlSolidify.java deleted file mode 100644 index c0043097..00000000 --- a/src/com/projectkorra/projectkorra/firebending/HeatControlSolidify.java +++ /dev/null @@ -1,255 +0,0 @@ -package com.projectkorra.projectkorra.firebending; - -import com.projectkorra.projectkorra.GeneralMethods; -import com.projectkorra.projectkorra.ProjectKorra; -import com.projectkorra.projectkorra.ability.EarthAbility; -import com.projectkorra.projectkorra.ability.FireAbility; -import com.projectkorra.projectkorra.util.ParticleEffect; -import com.projectkorra.projectkorra.util.TempBlock; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -public class HeatControlSolidify extends FireAbility { - - private int radius; - private long delay; - private long lastBlockTime; - private long lastParticleTime; - private long revertTime; - private double maxRadius; - private double range; - private Location location; - private Random random; - private ArrayList tempBlocks; - - public HeatControlSolidify(Player player) { - super(player); - - this.radius = 1; - this.delay = 50; - this.lastBlockTime = 0; - this.lastParticleTime = 0; - this.revertTime = getConfig().getLong("Abilities.Fire.HeatControl.Solidify.RevertTime"); - this.maxRadius = getConfig().getDouble("Abilities.Fire.HeatControl.Solidify.Radius"); - this.range = getConfig().getDouble("Abilities.Fire.HeatControl.Solidify.Range"); - this.random = new Random(); - this.tempBlocks = new ArrayList<>(); - - if (!bPlayer.canBend(this)) { - return; - } else if (EarthAbility.getLavaSourceBlock(player, range) == null) { - new HeatControlCook(player); - return; - } - - lastBlockTime = System.currentTimeMillis(); - start(); - } - - @SuppressWarnings("deprecation") - public void freeze(List area) { - if (System.currentTimeMillis() < lastBlockTime + delay) { - return; - } - - List lava = new ArrayList(); - for (Location l : area) { - if (isLava(l.getBlock())) { - lava.add(l.getBlock()); - } - } - - lastBlockTime = System.currentTimeMillis(); - if (lava.size() == 0) { - radius++; - return; - } - - Block b = lava.get(random.nextInt(lava.size())); - TempBlock tb; - - if (TempBlock.isTempBlock(b)) { - tb = TempBlock.get(b); - tb.setType(Material.STONE); - } else { - tb = new TempBlock(b, Material.STONE, b.getData()); - } - - if (!tempBlocks.contains(tb)) { - tempBlocks.add(tb); - } - } - - public void particles(List area) { - if (System.currentTimeMillis() < lastParticleTime + 300) { - return; - } - - lastParticleTime = System.currentTimeMillis(); - for (Location l : area) { - if (isLava(l.getBlock())) { - ParticleEffect.SMOKE.display(l, 0, 0, 0, 0.1f, 2); - } - } - } - - @Override - public void progress() { - if (!bPlayer.canBendIgnoreCooldowns(this)) { - remove(); - return; - } else if (radius >= maxRadius) { - remove(); - return; - } - - Location targetlocation = GeneralMethods.getTargetedLocation(player, range); - resetLocation(targetlocation); - List area = GeneralMethods.getCircle(location, radius, 3, true, true, 0); - particles(area); - freeze(area); - } - - @Override - public void remove() { - if(Bukkit.getServer().getPluginManager().isPluginEnabled(ProjectKorra.plugin.getName())) { - revert(); - } else { - HeatControlSolidify.super.remove(); - } - } - - public void revert() { - new BukkitRunnable() { - @Override - public void run() { - revertAll(); - HeatControlSolidify.super.remove(); - } - }.runTaskLater(ProjectKorra.plugin, revertTime); - } - - public static void revertAllInstances() { - for (HeatControlSolidify heatControlSolidify : getAbilities(HeatControlSolidify.class)) { - heatControlSolidify.revertAll(); - } - } - - public void resetLocation(Location loc) { - if (location == null) { - location = loc; - return; - } - - if (!loc.equals(location)) { - radius = 1; - location = loc; - } - } - - public void revertAll() { - for (TempBlock tb : tempBlocks) { - tb.revertBlock(); - } - tempBlocks.clear(); - } - - @Override - public String getName() { - return "HeatControl"; - } - - @Override - public Location getLocation() { - return location; - } - - @Override - public long getCooldown() { - return 0; - } - - @Override - public boolean isSneakAbility() { - return false; - } - - @Override - public boolean isHarmlessAbility() { - return true; - } - - public int getRadius() { - return radius; - } - - public void setRadius(int radius) { - this.radius = radius; - } - - public long getDelay() { - return delay; - } - - public void setDelay(long delay) { - this.delay = delay; - } - - public long getLastBlockTime() { - return lastBlockTime; - } - - public void setLastBlockTime(long lastBlockTime) { - this.lastBlockTime = lastBlockTime; - } - - public long getLastParticleTime() { - return lastParticleTime; - } - - public void setLastParticleTime(long lastParticleTime) { - this.lastParticleTime = lastParticleTime; - } - - public long getRevertTime() { - return revertTime; - } - - public void setRevertTime(long revertTime) { - this.revertTime = revertTime; - } - - public double getMaxRadius() { - return maxRadius; - } - - public void setMaxRadius(double maxRadius) { - this.maxRadius = maxRadius; - } - - public double getRange() { - return range; - } - - public void setRange(double range) { - this.range = range; - } - - public ArrayList getTempBlocks() { - return tempBlocks; - } - - public void setLocation(Location location) { - this.location = location; - } - -}