From 3c1d6b7b8523eacb8cdef7a246bc7ddf9a35038b Mon Sep 17 00:00:00 2001 From: Vahagn Tovmasian Date: Sat, 11 Jul 2020 22:05:45 -0700 Subject: [PATCH] Blue Fire Update & Firebending Refactor (#1062) ## Additions * Adds Blue Fire SubElement. > *Adds related damage, cooldown, and range modifiers for configuration * Adds Sticks, Sponges, and Chorus Fruit to cookable HeatControl items. * Adds Smoker, BlastFurnace, and extinguished Campfires to blocks which FireBlast can light. * Adds new TempBlock constructor which takes in a `long revertTime` parameter * Adds new blocks to block lists in configuration >* Adds new nether plants to plantBlocks list >* Adds new earth blocks to earthBlocks list ## Fixes * Fixes AvatarState buffs overriding day related buffs for firebending. * Fixes Blaze not going up hills, going through walls (mostly), jumping gaps. * Fixes Furnaces and related blocks not smelting after being activated by FireBlast ## Removals * Removes BlazeArc dependencies for Fire Abilities which ignite the ground. * Removes smoke particles from Fire bending to increase visibility and better emulate the show. ## Misc. Changes * Changes API versioning to 1.16.1 * Fire from Firebending no longer reverts all at once. * Changes Combustion animation to be more beam-like rather than a rehash of FireBlast. * Changes Add, Remove, Display command to properly display space for Blue Fire. * Changes `ElementalAbility#isFire()` to check for SOUL_FIRE_FLAME. * Changes isIgnitable to check whether fire can be placed at that location rather than solely based on flammability. * Changes firebending abilities to use `FireAbility#playFirebendingParticles()` & `FireAbility#createTempFire()` where applicable. * Changes `FireAbility#playFirebendingParticles()` to play blue fire particles when player has the BlueFire subelement. --- pom.xml | 2 +- .../projectkorra/projectkorra/Element.java | 7 +- .../projectkorra/GeneralMethods.java | 49 +++++-- .../projectkorra/projectkorra/PKListener.java | 13 +- .../projectkorra/ability/BlueFireAbility.java | 35 +++++ .../ability/ElementalAbility.java | 8 ++ .../projectkorra/ability/FireAbility.java | 105 +++++--------- .../projectkorra/airbending/AirBlast.java | 3 +- .../projectkorra/airbending/AirShield.java | 3 +- .../projectkorra/airbending/AirSwipe.java | 3 +- .../projectkorra/command/AddCommand.java | 25 ++-- .../projectkorra/command/DisplayCommand.java | 7 +- .../projectkorra/command/RemoveCommand.java | 9 +- .../configuration/ConfigManager.java | 21 ++- .../projectkorra/firebending/BlazeArc.java | 136 ++++-------------- .../projectkorra/firebending/FireBlast.java | 78 ++++++---- .../firebending/FireBlastCharged.java | 52 ++++--- .../projectkorra/firebending/FireBurst.java | 15 +- .../projectkorra/firebending/FireJet.java | 8 +- .../firebending/FireManipulation.java | 10 +- .../projectkorra/firebending/FireShield.java | 23 +-- .../projectkorra/firebending/HeatControl.java | 15 +- .../firebending/Illumination.java | 7 +- .../projectkorra/firebending/WallOfFire.java | 30 ++-- .../firebending/combo/FireComboStream.java | 3 +- .../firebending/combo/FireWheel.java | 3 +- .../firebending/combustion/Combustion.java | 12 +- .../firebending/util/FirebendingManager.java | 5 - .../projectkorra/util/ActionBar.java | 65 +-------- .../projectkorra/util/ParticleEffect.java | 26 +++- .../projectkorra/util/TempBlock.java | 39 ++--- .../waterbending/OctopusForm.java | 15 +- .../projectkorra/waterbending/SurgeWall.java | 3 +- .../projectkorra/waterbending/SurgeWave.java | 7 +- .../waterbending/plant/PlantRegrowth.java | 2 +- src/plugin.yml | 1 + 36 files changed, 419 insertions(+), 426 deletions(-) create mode 100644 src/com/projectkorra/projectkorra/ability/BlueFireAbility.java diff --git a/pom.xml b/pom.xml index fed20210..66ee3301 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ org.spigotmc spigot-api - 1.13.2-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT provided diff --git a/src/com/projectkorra/projectkorra/Element.java b/src/com/projectkorra/projectkorra/Element.java index f898d169..c255d8be 100644 --- a/src/com/projectkorra/projectkorra/Element.java +++ b/src/com/projectkorra/projectkorra/Element.java @@ -57,10 +57,11 @@ public class Element { public static final SubElement SAND = new SubElement("Sand", EARTH); public static final SubElement LIGHTNING = new SubElement("Lightning", FIRE); public static final SubElement COMBUSTION = new SubElement("Combustion", FIRE); + public static final SubElement BLUE_FIRE = new SubElement("BlueFire", FIRE); - private static final Element[] ELEMENTS = { AIR, WATER, EARTH, FIRE, CHI, FLIGHT, SPIRITUAL, BLOOD, HEALING, ICE, PLANT, LAVA, METAL, SAND, LIGHTNING, COMBUSTION }; + private static final Element[] ELEMENTS = { AIR, WATER, EARTH, FIRE, CHI, FLIGHT, SPIRITUAL, BLOOD, HEALING, ICE, PLANT, LAVA, METAL, SAND, LIGHTNING, COMBUSTION, BLUE_FIRE }; private static final Element[] MAIN_ELEMENTS = { AIR, WATER, EARTH, FIRE, CHI }; - private static final SubElement[] SUB_ELEMENTS = { FLIGHT, SPIRITUAL, BLOOD, HEALING, ICE, PLANT, LAVA, METAL, SAND, LIGHTNING, COMBUSTION }; + private static final SubElement[] SUB_ELEMENTS = { FLIGHT, SPIRITUAL, BLOOD, HEALING, ICE, PLANT, LAVA, METAL, SAND, LIGHTNING, COMBUSTION, BLUE_FIRE }; private final String name; private final ElementType type; @@ -139,7 +140,7 @@ public class Element { @Override public String toString() { - return this.getColor() + this.getName(); + return (this == Element.BLUE_FIRE) ? this.getColor() + "Blue Fire": this.getColor() + this.getName(); } public static Element getElement(final String name) { diff --git a/src/com/projectkorra/projectkorra/GeneralMethods.java b/src/com/projectkorra/projectkorra/GeneralMethods.java index d16fa96d..21d4e4a5 100644 --- a/src/com/projectkorra/projectkorra/GeneralMethods.java +++ b/src/com/projectkorra/projectkorra/GeneralMethods.java @@ -157,6 +157,7 @@ public class GeneralMethods { private static Method getAbsorption; private static Method setAbsorption; + private static Method getHandle; public GeneralMethods(final ProjectKorra plugin) { GeneralMethods.plugin = plugin; @@ -164,6 +165,7 @@ public class GeneralMethods { try { getAbsorption = ReflectionHandler.getMethod("EntityHuman", PackageType.MINECRAFT_SERVER, "getAbsorptionHearts"); setAbsorption = ReflectionHandler.getMethod("EntityHuman", PackageType.MINECRAFT_SERVER, "setAbsorptionHearts", Float.class); + getHandle = ReflectionHandler.getMethod("CraftPlayer", PackageType.CRAFTBUKKIT_ENTITY, "getHandle"); } catch (final Exception e) { e.printStackTrace(); } @@ -462,6 +464,10 @@ public class GeneralMethods { if (split[0].contains("p")) { subelements.add(Element.PLANT); } + if (split[0].contains("r")) { + subelements.add(Element.BLUE_FIRE); + } + if (hasAddon) { final CopyOnWriteArrayList addonClone = new CopyOnWriteArrayList(Arrays.asList(split[split.length - 1].split(","))); final long startTime = System.currentTimeMillis(); @@ -672,7 +678,7 @@ public class GeneralMethods { public static float getAbsorbationHealth(final Player player) { try { - final Object entityplayer = ActionBar.getHandle.invoke(player); + final Object entityplayer = getHandle.invoke(player); final Object hearts = getAbsorption.invoke(entityplayer); return (float) hearts; } catch (final Exception e) { @@ -684,7 +690,7 @@ public class GeneralMethods { public static void setAbsorbationHealth(final Player player, final float hearts) { try { - final Object entityplayer = ActionBar.getHandle.invoke(player); + final Object entityplayer = getHandle.invoke(player); setAbsorption.invoke(entityplayer, hearts); } catch (final Exception e) { e.printStackTrace(); @@ -863,7 +869,7 @@ public class GeneralMethods { } return circleblocks; } - + /** * Gets the closest entity within the specified radius around a point * @param center point to check around @@ -873,10 +879,10 @@ public class GeneralMethods { public static Entity getClosestEntity(Location center, double radius) { Entity found = null; Double distance = null; - + for (Entity entity : GeneralMethods.getEntitiesAroundPoint(center, radius)) { double check = center.distanceSquared(entity.getLocation()); - + if (distance == null || check < distance) { found = entity; distance = check; @@ -885,7 +891,7 @@ public class GeneralMethods { return found; } - + /** * Gets the closest LivingEntity within the specified radius around a point * @param center point to check around @@ -895,16 +901,16 @@ public class GeneralMethods { public static LivingEntity getClosestLivingEntity(Location center, double radius) { LivingEntity le = null; Double distance = null; - + for (Entity entity : GeneralMethods.getEntitiesAroundPoint(center, radius)) { double check = center.distanceSquared(entity.getLocation()); - + if (entity instanceof LivingEntity && (distance == null || check < distance)) { le = (LivingEntity) entity; distance = check; } } - + return le; } @@ -1187,7 +1193,7 @@ public class GeneralMethods { public static Entity getTargetedEntity(final Player player, final double range) { return getTargetedEntity(player, range, new ArrayList()); } - + public static Location getTargetedLocation(final Player player, final double range, final boolean ignoreTempBlocks, final boolean checkDiagonals, final Material... nonOpaque2) { final Location origin = player.getEyeLocation(); final Vector direction = origin.getDirection(); @@ -1208,7 +1214,7 @@ public class GeneralMethods { for (double i = 0; i < range; i += 0.2) { location.add(vec); - + if (checkDiagonals && checkDiagonalWall(location, vec)) { location.subtract(vec); break; @@ -1653,7 +1659,7 @@ public class GeneralMethods { if (entity == null) { return false; } - + switch (entity.getType()) { case SKELETON: case STRAY: @@ -1662,7 +1668,8 @@ public class GeneralMethods { case ZOMBIE: case HUSK: case ZOMBIE_VILLAGER: - case PIG_ZOMBIE: + case ZOMBIFIED_PIGLIN: + case ZOGLIN: case DROWNED: case ZOMBIE_HORSE: case SKELETON_HORSE: @@ -2118,6 +2125,9 @@ public class GeneralMethods { if (bPlayer.hasSubElement(Element.PLANT)) { subs.append("p"); } + if (bPlayer.hasSubElement(Element.BLUE_FIRE)) { + subs.append("r"); + } boolean hasAddon = false; for (final Element element : bPlayer.getSubElements()) { if (Arrays.asList(Element.getAddonSubElements()).contains(element)) { @@ -2344,6 +2354,19 @@ public class GeneralMethods { case MAGMA_BLOCK: case LAVA: case JACK_O_LANTERN: + case CRYING_OBSIDIAN: + case SHROOMLIGHT: + case CAMPFIRE: + case SOUL_CAMPFIRE: + case SOUL_TORCH: + case LANTERN: + case SOUL_LANTERN: + case CONDUIT: + case RESPAWN_ANCHOR: + case BROWN_MUSHROOM: + case BREWING_STAND: + case ENDER_CHEST: + case END_PORTAL_FRAME: case END_ROD: return true; default: diff --git a/src/com/projectkorra/projectkorra/PKListener.java b/src/com/projectkorra/projectkorra/PKListener.java index 648046b6..98f9c2c6 100644 --- a/src/com/projectkorra/projectkorra/PKListener.java +++ b/src/com/projectkorra/projectkorra/PKListener.java @@ -143,7 +143,6 @@ import com.projectkorra.projectkorra.event.HorizontalVelocityChangeEvent; import com.projectkorra.projectkorra.event.PlayerChangeElementEvent; import com.projectkorra.projectkorra.event.PlayerJumpEvent; import com.projectkorra.projectkorra.firebending.Blaze; -import com.projectkorra.projectkorra.firebending.BlazeArc; import com.projectkorra.projectkorra.firebending.BlazeRing; import com.projectkorra.projectkorra.firebending.FireBlast; import com.projectkorra.projectkorra.firebending.FireBlastCharged; @@ -372,10 +371,6 @@ public class PKListener implements Listener { if (!event.isCancelled()) { event.setCancelled(!Torrent.canThaw(block)); } - - if (BlazeArc.getIgnitedBlocks().containsKey(block)) { - BlazeArc.removeBlock(block); - } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -477,8 +472,8 @@ public class PKListener implements Listener { public void onEntityCombust(final EntityCombustEvent event) { final Entity entity = event.getEntity(); final Block block = entity.getLocation().getBlock(); - if (BlazeArc.getIgnitedBlocks().containsKey(block) && entity instanceof LivingEntity) { - new FireDamageTimer(entity, BlazeArc.getIgnitedBlocks().get(block)); + if (FireAbility.getSourcePlayers().containsKey(block) && entity instanceof LivingEntity) { + new FireDamageTimer(entity, FireAbility.getSourcePlayers().get(block)); } } @@ -504,8 +499,8 @@ public class PKListener implements Listener { public void onEntityDamageEvent(final EntityDamageEvent event) { final Entity entity = event.getEntity(); - if (event.getCause() == DamageCause.FIRE && BlazeArc.getIgnitedBlocks().containsKey(entity.getLocation().getBlock())) { - new FireDamageTimer(entity, BlazeArc.getIgnitedBlocks().get(entity.getLocation().getBlock())); + if (event.getCause() == DamageCause.FIRE && FireAbility.getSourcePlayers().containsKey(entity.getLocation().getBlock())) { + new FireDamageTimer(entity, FireAbility.getSourcePlayers().get(entity.getLocation().getBlock())); } if (FireDamageTimer.isEnflamed(entity) && event.getCause() == DamageCause.FIRE_TICK) { diff --git a/src/com/projectkorra/projectkorra/ability/BlueFireAbility.java b/src/com/projectkorra/projectkorra/ability/BlueFireAbility.java new file mode 100644 index 00000000..5be58e4f --- /dev/null +++ b/src/com/projectkorra/projectkorra/ability/BlueFireAbility.java @@ -0,0 +1,35 @@ +package com.projectkorra.projectkorra.ability; + +import org.bukkit.entity.Player; + +import com.projectkorra.projectkorra.Element; + +public abstract class BlueFireAbility extends FireAbility implements SubAbility { + + public BlueFireAbility(final Player player) { + super(player); + } + + @Override + public Class getParentAbility() { + return FireAbility.class; + } + + @Override + public Element getElement() { + return Element.BLUE_FIRE; + } + + public static double getDamageFactor() { + return getConfig().getDouble("Properties.Fire.BlueFire.DamageFactor"); + } + + public static double getCooldownFactor() { + return getConfig().getDouble("Properties.Fire.BlueFire.CooldownFactor"); + } + + public static double getRangeFactor() { + return getConfig().getDouble("Properties.Fire.BlueFire.RangeFactor"); + } + +} diff --git a/src/com/projectkorra/projectkorra/ability/ElementalAbility.java b/src/com/projectkorra/projectkorra/ability/ElementalAbility.java index b5146f40..6f8e9db8 100644 --- a/src/com/projectkorra/projectkorra/ability/ElementalAbility.java +++ b/src/com/projectkorra/projectkorra/ability/ElementalAbility.java @@ -80,6 +80,14 @@ public abstract class ElementalAbility extends CoreAbility { public static boolean isEarth(final Material material) { return getConfig().getStringList("Properties.Earth.EarthBlocks").contains(material.toString()); } + + public static boolean isFire(final Block block) { + return block != null ? isFire(block.getType()) : false; + } + + public static boolean isFire(final Material material) { + return material == Material.SOUL_FIRE || material == Material.FIRE; + } public static boolean isFullMoon(final World world) { final double days = Math.ceil(world.getFullTime() / 24000) + 1; diff --git a/src/com/projectkorra/projectkorra/ability/FireAbility.java b/src/com/projectkorra/projectkorra/ability/FireAbility.java index 6b5f1ab4..7460a712 100644 --- a/src/com/projectkorra/projectkorra/ability/FireAbility.java +++ b/src/com/projectkorra/projectkorra/ability/FireAbility.java @@ -1,7 +1,7 @@ package com.projectkorra.projectkorra.ability; import java.util.ArrayList; -import java.util.Iterator; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Random; @@ -13,21 +13,21 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; import com.projectkorra.projectkorra.Element; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.configuration.ConfigManager; -import com.projectkorra.projectkorra.firebending.BlazeArc; -import com.projectkorra.projectkorra.util.Information; import com.projectkorra.projectkorra.util.ParticleEffect; +import com.projectkorra.projectkorra.util.TempBlock; public abstract class FireAbility extends ElementalAbility { - private static final Map TEMP_FIRE = new ConcurrentHashMap(); + private static final Map SOURCE_PLAYERS = new ConcurrentHashMap<>(); public FireAbility(final Player player) { super(player); @@ -52,10 +52,17 @@ public abstract class FireAbility extends ElementalAbility { public void handleCollision(final Collision collision) { super.handleCollision(collision); if (collision.isRemovingFirst()) { - ParticleEffect.BLOCK_CRACK.display(collision.getLocationFirst(), 10, 1, 1, 1, 0.1, Material.FIRE.createBlockData()); + ParticleEffect.BLOCK_CRACK.display(collision.getLocationFirst(), 10, 1, 1, 1, 0.1, getFireType().createBlockData()); } } - + /** + * + * @return Material based on whether the player is a Blue Firebender, SOUL_FIRE if true, FIRE if false. + */ + public Material getFireType() { + return getBendingPlayer().canUseSubElement(SubElement.BLUE_FIRE) ? Material.SOUL_FIRE : Material.FIRE; + } + /** * Returns if fire is allowed to completely replace blocks or if it should * place a temp fire block. @@ -68,23 +75,15 @@ public abstract class FireAbility extends ElementalAbility { * Creates a fire block meant to replace other blocks but reverts when the * fire dissipates or is destroyed. */ - public static void createTempFire(final Location loc) { - if (ElementalAbility.isAir(loc.getBlock().getType())) { - loc.getBlock().setType(Material.FIRE); - return; + public void createTempFire(final Location loc) { + createTempFire(loc, getConfig().getLong("Properties.Fire.RevertTicks") + (long) ((new Random()).nextDouble() * getConfig().getLong("Properties.Fire.RevertTicks"))); + } + + public void createTempFire(final Location loc, final long time) { + if(isIgnitable(loc.getBlock())) { + new TempBlock(loc.getBlock(), getFireType().createBlockData(), time); + SOURCE_PLAYERS.put(loc.getBlock(), this.getPlayer()); } - Information info = new Information(); - final long time = getConfig().getLong("Properties.Fire.RevertTicks") + (long) ((new Random()).nextDouble() * getConfig().getLong("Properties.Fire.RevertTicks")); - if (TEMP_FIRE.containsKey(loc)) { - info = TEMP_FIRE.get(loc); - } else { - info.setBlock(loc.getBlock()); - info.setLocation(loc); - info.setState(loc.getBlock().getState()); - } - info.setTime(time + System.currentTimeMillis()); - loc.getBlock().setType(Material.FIRE); - TEMP_FIRE.put(loc, info); } public double getDayFactor(final double value) { @@ -118,7 +117,7 @@ public abstract class FireAbility extends ElementalAbility { } public static boolean isIgnitable(final Block block) { - return block != null ? isIgnitable(block.getType()) : false; + return (isIgnitable(block.getType()) && Arrays.asList(getTransparentMaterials()).contains(block.getType())) || (GeneralMethods.isSolid(block.getRelative(BlockFace.DOWN)) && isAir(block.getType())); } public static boolean isIgnitable(final Material material) { @@ -147,7 +146,6 @@ public abstract class FireAbility extends ElementalAbility { final float pitch = (float) getConfig().getDouble("Properties.Fire.CombustionSound.Pitch"); Sound sound = Sound.ENTITY_FIREWORK_ROCKET_BLAST; - try { sound = Sound.valueOf(getConfig().getString("Properties.Fire.CombustionSound.Sound")); } catch (final IllegalArgumentException exception) { @@ -158,8 +156,12 @@ public abstract class FireAbility extends ElementalAbility { } } - public static void playFirebendingParticles(final Location loc, final int amount, final double xOffset, final double yOffset, final double zOffset) { - ParticleEffect.FLAME.display(loc, amount, xOffset, yOffset, zOffset); + public void playFirebendingParticles(final Location loc, final int amount, final double xOffset, final double yOffset, final double zOffset) { + if (this.getBendingPlayer().canUseSubElement(SubElement.BLUE_FIRE)) { + ParticleEffect.SOUL_FIRE_FLAME.display(loc, amount, xOffset, yOffset, zOffset); + } else { + ParticleEffect.FLAME.display(loc, amount, xOffset, yOffset, zOffset); + } } public static void playFirebendingSound(final Location loc) { @@ -168,7 +170,6 @@ public abstract class FireAbility extends ElementalAbility { final float pitch = (float) getConfig().getDouble("Properties.Fire.FireSound.Pitch"); Sound sound = Sound.BLOCK_FIRE_AMBIENT; - try { sound = Sound.valueOf(getConfig().getString("Properties.Fire.FireSound.Sound")); } catch (final IllegalArgumentException exception) { @@ -193,7 +194,6 @@ public abstract class FireAbility extends ElementalAbility { final float pitch = (float) getConfig().getDouble("Properties.Fire.LightningSound.Pitch"); Sound sound = Sound.ENTITY_CREEPER_HURT; - try { sound = Sound.valueOf(getConfig().getString("Properties.Fire.LightningSound.Sound")); } catch (final IllegalArgumentException exception) { @@ -203,48 +203,13 @@ public abstract class FireAbility extends ElementalAbility { } } } - - /** Removes all temp fire that no longer needs to be there */ - public static void removeFire() { - final Iterator it = TEMP_FIRE.keySet().iterator(); - while (it.hasNext()) { - final Location loc = it.next(); - final Information info = TEMP_FIRE.get(loc); - if (info.getLocation().getBlock().getType() != Material.FIRE && !ElementalAbility.isAir(info.getLocation().getBlock().getType())) { - revertTempFire(loc); - } else if (ElementalAbility.isAir(info.getBlock().getType()) || System.currentTimeMillis() > info.getTime()) { - revertTempFire(loc); - } - } - } - - /** - * Revert the temp fire at the location if any is there. - * - * @param location The Location - */ - public static void revertTempFire(final Location location) { - if (!TEMP_FIRE.containsKey(location)) { - return; - } - final Information info = TEMP_FIRE.get(location); - if (info.getLocation().getBlock().getType() != Material.FIRE && !ElementalAbility.isAir(info.getLocation().getBlock().getType())) { - if (info.getState().getType().isBurnable() && !info.getState().getType().isOccluding()) { - final ItemStack itemStack = new ItemStack(info.getState().getType(), 1); - info.getState().getBlock().getWorld().dropItemNaturally(info.getLocation(), itemStack); - } - } else { - info.getBlock().setType(info.getState().getType()); - info.getBlock().setBlockData(info.getState().getBlockData()); - } - TEMP_FIRE.remove(location); - } - + public static void stopBending() { - BlazeArc.removeAllCleanup(); - for (final Location loc : TEMP_FIRE.keySet()) { - revertTempFire(loc); - } + SOURCE_PLAYERS.clear(); + } + + public static Map getSourcePlayers() { + return SOURCE_PLAYERS; } } diff --git a/src/com/projectkorra/projectkorra/airbending/AirBlast.java b/src/com/projectkorra/projectkorra/airbending/AirBlast.java index 986d15b9..15774a90 100644 --- a/src/com/projectkorra/projectkorra/airbending/AirBlast.java +++ b/src/com/projectkorra/projectkorra/airbending/AirBlast.java @@ -26,6 +26,7 @@ import com.projectkorra.projectkorra.BendingPlayer; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.ability.AirAbility; +import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.command.Commands; @@ -301,7 +302,7 @@ public class AirBlast extends AirAbility { final Block block = this.location.getBlock(); for (final Block testblock : GeneralMethods.getBlocksAroundPoint(this.location, this.radius)) { - if (testblock.getType() == Material.FIRE) { + if (FireAbility.isFire(testblock.getType())) { testblock.setType(Material.AIR); testblock.getWorld().playEffect(testblock.getLocation(), Effect.EXTINGUISH, 0); continue; diff --git a/src/com/projectkorra/projectkorra/airbending/AirShield.java b/src/com/projectkorra/projectkorra/airbending/AirShield.java index 80d2d69f..97ec55db 100644 --- a/src/com/projectkorra/projectkorra/airbending/AirShield.java +++ b/src/com/projectkorra/projectkorra/airbending/AirShield.java @@ -14,6 +14,7 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.AirAbility; +import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.avatar.AvatarState; @@ -167,7 +168,7 @@ public class AirShield extends AirAbility { } for (final Block testblock : GeneralMethods.getBlocksAroundPoint(this.player.getLocation(), this.radius)) { - if (testblock.getType() == Material.FIRE) { + if (FireAbility.isFire(testblock.getType())) { testblock.setType(Material.AIR); testblock.getWorld().playEffect(testblock.getLocation(), Effect.EXTINGUISH, 0); } diff --git a/src/com/projectkorra/projectkorra/airbending/AirSwipe.java b/src/com/projectkorra/projectkorra/airbending/AirSwipe.java index 999bfa45..1fb81ce8 100644 --- a/src/com/projectkorra/projectkorra/airbending/AirSwipe.java +++ b/src/com/projectkorra/projectkorra/airbending/AirSwipe.java @@ -21,6 +21,7 @@ import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.ability.AirAbility; import com.projectkorra.projectkorra.ability.CoreAbility; import com.projectkorra.projectkorra.ability.ElementalAbility; +import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.command.Commands; @@ -157,7 +158,7 @@ public class AirSwipe extends AirAbility { } for (final Block testblock : GeneralMethods.getBlocksAroundPoint(location, this.radius)) { - if (testblock.getType() == Material.FIRE) { + if (FireAbility.isFire(testblock.getType())) { testblock.setType(Material.AIR); } } diff --git a/src/com/projectkorra/projectkorra/command/AddCommand.java b/src/com/projectkorra/projectkorra/command/AddCommand.java index edd03fe3..ee0a0105 100644 --- a/src/com/projectkorra/projectkorra/command/AddCommand.java +++ b/src/com/projectkorra/projectkorra/command/AddCommand.java @@ -109,7 +109,7 @@ public class AddCommand extends PKCommand { if (elements.length() > 1) { elements.append(ChatColor.YELLOW + ", "); } - elements.append(e.getColor() + e.getName()); + elements.append(e.toString()); bPlayer.getSubElements().clear(); for (final SubElement sub : Element.getAllSubElements()) { @@ -177,18 +177,18 @@ public class AddCommand extends PKCommand { // send the message. final ChatColor color = e.getColor(); if (!(sender instanceof Player) || !((Player) sender).equals(target)) { - if (e != Element.AIR && e != Element.EARTH) { - GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherCFW.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", e.getName() + e.getType().getBender())); - GeneralMethods.sendBrandingMessage(target, color + this.addedCFW.replace("{element}", e.getName() + e.getType().getBender())); + if (e != Element.AIR && e != Element.EARTH && e != Element.BLUE_FIRE) { + GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherCFW.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", e.toString() + e.getType().getBender())); + GeneralMethods.sendBrandingMessage(target, color + this.addedCFW.replace("{element}", e.toString() + e.getType().getBender())); } else { - GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherAE.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", e.getName() + e.getType().getBender())); - GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", e.getName() + e.getType().getBender())); + GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherAE.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", e.toString() + e.getType().getBender())); + GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", e.toString() + e.getType().getBender())); } } else { if (e != Element.AIR && e != Element.EARTH) { - GeneralMethods.sendBrandingMessage(target, color + this.addedCFW.replace("{element}", e.getName() + e.getType().getBender())); + GeneralMethods.sendBrandingMessage(target, color + this.addedCFW.replace("{element}", e.toString() + e.getType().getBender())); } else { - GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", e.getName() + e.getType().getBender())); + GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", e.toString() + e.getType().getBender())); } } @@ -213,16 +213,16 @@ public class AddCommand extends PKCommand { if (!(sender instanceof Player) || !((Player) sender).equals(target)) { if (e != Element.AIR && e != Element.EARTH) { - GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherCFW.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", sub.getName() + sub.getType().getBender())); + GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherCFW.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", sub.toString() + sub.getType().getBender())); } else { - GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherAE.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", sub.getName() + sub.getType().getBender())); + GeneralMethods.sendBrandingMessage(sender, color + this.addedOtherAE.replace("{target}", ChatColor.DARK_AQUA + target.getName() + color).replace("{element}", sub.toString() + sub.getType().getBender())); } } else { if (e != Element.AIR && e != Element.EARTH) { - GeneralMethods.sendBrandingMessage(target, color + this.addedCFW.replace("{element}", sub.getName() + sub.getType().getBender())); + GeneralMethods.sendBrandingMessage(target, color + this.addedCFW.replace("{element}", sub.toString() + sub.getType().getBender())); } else { - GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", sub.getName() + sub.getType().getBender())); + GeneralMethods.sendBrandingMessage(target, color + this.addedAE.replace("{element}", sub.toString() + sub.getType().getBender())); } } GeneralMethods.saveSubElements(bPlayer); @@ -268,6 +268,7 @@ public class AddCommand extends PKCommand { l.add("Plant"); l.add("Sand"); l.add("Spiritual"); + l.add("BlueFire"); for (final SubElement e : Element.getAddonSubElements()) { l.add(e.getName()); } diff --git a/src/com/projectkorra/projectkorra/command/DisplayCommand.java b/src/com/projectkorra/projectkorra/command/DisplayCommand.java index 4038ca98..9bb6c906 100644 --- a/src/com/projectkorra/projectkorra/command/DisplayCommand.java +++ b/src/com/projectkorra/projectkorra/command/DisplayCommand.java @@ -265,11 +265,11 @@ public class DisplayCommand extends PKCommand { sender.sendMessage(ChatColor.YELLOW + "Combos: " + ChatColor.GOLD + "/bending display ChiCombos"); sender.sendMessage(ChatColor.YELLOW + "Passives: " + ChatColor.GOLD + "/bending display ChiPassives"); } else { - sender.sendMessage(element.getSubColor() + "Combos: " + element.getColor() + "/bending display " + element.getName() + "Combos"); - sender.sendMessage(element.getSubColor() + "Passives: " + element.getColor() + "/bending display " + element.getName() + "Passives"); + sender.sendMessage(element.getSubColor() + "Combos: " + element.getColor() + "/bending display " + element.toString() + "Combos"); + sender.sendMessage(element.getSubColor() + "Passives: " + element.getColor() + "/bending display " + element.toString() + "Passives"); for (final SubElement sub : Element.getSubElements(element)) { if (sender.hasPermission("bending." + element.getName().toLowerCase() + "." + sub.getName().toLowerCase())) { - sender.sendMessage(sub.getColor() + sub.getName() + " abilities: " + element.getColor() + "/bending display " + sub.getName()); + sender.sendMessage(sub.toString() + " abilities: " + element.getColor() + "/bending display " + sub.toString()); } } } @@ -370,6 +370,7 @@ public class DisplayCommand extends PKCommand { list.add("Plantbending"); list.add("Sand"); list.add("Spiritual"); + list.add("BlueFire"); for (final SubElement se : Element.getAddonSubElements()) { list.add(se.getName()); diff --git a/src/com/projectkorra/projectkorra/command/RemoveCommand.java b/src/com/projectkorra/projectkorra/command/RemoveCommand.java index cd867a16..2e56d279 100644 --- a/src/com/projectkorra/projectkorra/command/RemoveCommand.java +++ b/src/com/projectkorra/projectkorra/command/RemoveCommand.java @@ -57,7 +57,7 @@ public class RemoveCommand extends PKCommand { senderBPlayer.getSubElements().remove(e); GeneralMethods.saveSubElements(senderBPlayer); GeneralMethods.removeUnusableAbilities(sender.getName()); - GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementSelf.replace("{element}", e.getName() + e.getType().getBending()).replace("{sender}", ChatColor.DARK_AQUA + sender.getName() + e.getColor())); + GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementSelf.replace("{element}", e.toString() + e.getType().getBending()).replace("{sender}", ChatColor.DARK_AQUA + sender.getName() + e.getColor())); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeSubElementEvent(sender, player, (SubElement) e, com.projectkorra.projectkorra.event.PlayerChangeSubElementEvent.Result.REMOVE)); } else { GeneralMethods.sendBrandingMessage(sender, ChatColor.RED + this.wrongElementSelf); @@ -73,7 +73,7 @@ public class RemoveCommand extends PKCommand { GeneralMethods.saveSubElements(senderBPlayer); GeneralMethods.removeUnusableAbilities(sender.getName()); - GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementSelf.replace("{element}", e.getName() + e.getType().getBending())); + GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementSelf.replace("{element}", e.toString() + e.getType().getBending())); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, (Player) sender, e, Result.REMOVE)); return; } else { @@ -123,8 +123,8 @@ public class RemoveCommand extends PKCommand { } GeneralMethods.removeUnusableAbilities(player.getName()); - GeneralMethods.sendBrandingMessage(player, e.getColor() + this.succesfullyRemovedElementTarget.replace("{element}", e.getName() + e.getType().getBending()).replace("{sender}", ChatColor.DARK_AQUA + sender.getName() + e.getColor())); - GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementTargetConfirm.replace("{element}", e.getName() + e.getType().getBending()).replace("{target}", ChatColor.DARK_AQUA + player.getName() + e.getColor())); + GeneralMethods.sendBrandingMessage(player, e.getColor() + this.succesfullyRemovedElementTarget.replace("{element}", e.toString() + e.getType().getBending()).replace("{sender}", ChatColor.DARK_AQUA + sender.getName() + e.getColor())); + GeneralMethods.sendBrandingMessage(sender, e.getColor() + this.succesfullyRemovedElementTargetConfirm.replace("{element}", e.toString() + e.getType().getBending()).replace("{target}", ChatColor.DARK_AQUA + player.getName() + e.getColor())); Bukkit.getServer().getPluginManager().callEvent(new PlayerChangeElementEvent(sender, player, e, Result.REMOVE)); return; } @@ -189,6 +189,7 @@ public class RemoveCommand extends PKCommand { l.add("Plant"); l.add("Sand"); l.add("Spiritual"); + l.add("BlueFire"); for (final SubElement e : Element.getAddonSubElements()) { l.add(e.getName()); diff --git a/src/com/projectkorra/projectkorra/configuration/ConfigManager.java b/src/com/projectkorra/projectkorra/configuration/ConfigManager.java index f3408e79..3c607726 100644 --- a/src/com/projectkorra/projectkorra/configuration/ConfigManager.java +++ b/src/com/projectkorra/projectkorra/configuration/ConfigManager.java @@ -442,6 +442,8 @@ public class ConfigManager { final ArrayList earthBlocks = new ArrayList(); earthBlocks.add(Material.DIRT.toString()); + earthBlocks.add(Material.COARSE_DIRT.toString()); + earthBlocks.add(Material.PODZOL.toString()); earthBlocks.add(Material.MYCELIUM.toString()); earthBlocks.add(Material.STONE.toString()); earthBlocks.add(Material.GRAVEL.toString()); @@ -460,14 +462,20 @@ public class ConfigManager { earthBlocks.add(Material.ANDESITE.toString()); earthBlocks.add(Material.GRANITE.toString()); earthBlocks.add(Material.DIORITE.toString()); + earthBlocks.add(Material.BASALT.toString()); + earthBlocks.add(Material.ANCIENT_DEBRIS.toString()); + earthBlocks.add(Material.BLACKSTONE.toString()); final ArrayList metalBlocks = new ArrayList(); metalBlocks.add(Material.IRON_ORE.toString()); metalBlocks.add(Material.GOLD_ORE.toString()); metalBlocks.add(Material.NETHER_QUARTZ_ORE.toString()); + earthBlocks.add(Material.GILDED_BLACKSTONE.toString()); metalBlocks.add(Material.IRON_BLOCK.toString()); metalBlocks.add(Material.GOLD_BLOCK.toString()); metalBlocks.add(Material.QUARTZ_BLOCK.toString()); + metalBlocks.add(Material.CHAIN.toString()); + metalBlocks.add(Material.NETHERITE_BLOCK.toString()); final ArrayList sandBlocks = new ArrayList(); sandBlocks.add(Material.SAND.toString()); @@ -512,12 +520,20 @@ public class ConfigManager { plantBlocks.add(Material.SUNFLOWER.toString()); plantBlocks.add(Material.POPPY.toString()); plantBlocks.add(Material.FERN.toString()); + plantBlocks.add(Material.LILY_OF_THE_VALLEY.toString()); + plantBlocks.add(Material.WITHER_ROSE.toString()); + plantBlocks.add(Material.CORNFLOWER.toString()); plantBlocks.add(Material.LARGE_FERN.toString()); plantBlocks.add(Material.RED_MUSHROOM.toString()); plantBlocks.add(Material.RED_MUSHROOM_BLOCK.toString()); plantBlocks.add(Material.BROWN_MUSHROOM.toString()); plantBlocks.add(Material.BROWN_MUSHROOM_BLOCK.toString()); plantBlocks.add(Material.MUSHROOM_STEM.toString()); + plantBlocks.add(Material.WARPED_ROOTS.toString()); + plantBlocks.add(Material.CRIMSON_ROOTS.toString()); + plantBlocks.add(Material.TWISTING_VINES_PLANT.toString()); + plantBlocks.add(Material.WEEPING_VINES_PLANT.toString()); + plantBlocks.add(Material.NETHER_SPROUTS.toString()); plantBlocks.add(Material.CACTUS.toString()); plantBlocks.add(Material.PUMPKIN.toString()); plantBlocks.add(Material.PUMPKIN_STEM.toString()); @@ -633,7 +649,10 @@ public class ConfigManager { config.addDefault("Properties.Fire.LightningSound.Sound", "ENTITY_CREEPER_HURT"); config.addDefault("Properties.Fire.LightningSound.Volume", 1); config.addDefault("Properties.Fire.LightningSound.Pitch", 0); - + config.addDefault("Properties.Fire.BlueFire.DamageFactor", 1.1); + config.addDefault("Properties.Fire.BlueFire.CooldownFactor", .9); + config.addDefault("Properties.Fire.BlueFire.RangeFactor", 1.2); + config.addDefault("Properties.Chi.CanBendWithWeapons", true); final ArrayList disabledWorlds = new ArrayList(); diff --git a/src/com/projectkorra/projectkorra/firebending/BlazeArc.java b/src/com/projectkorra/projectkorra/firebending/BlazeArc.java index 94184f74..500e3bea 100644 --- a/src/com/projectkorra/projectkorra/firebending/BlazeArc.java +++ b/src/com/projectkorra/projectkorra/firebending/BlazeArc.java @@ -1,19 +1,14 @@ package com.projectkorra.projectkorra.firebending; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import com.projectkorra.projectkorra.BendingPlayer; -import com.projectkorra.projectkorra.Element; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.GeneralMethods; +import com.projectkorra.projectkorra.ability.BlueFireAbility; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.waterbending.plant.PlantRegrowth; @@ -21,9 +16,6 @@ import com.projectkorra.projectkorra.waterbending.plant.PlantRegrowth; public class BlazeArc extends FireAbility { private static final long DISSIPATE_REMOVE_TIME = 400; - private static final Map IGNITED_BLOCKS = new ConcurrentHashMap<>(); - private static final Map IGNITED_TIMES = new ConcurrentHashMap<>(); - private static final Map REPLACED_BLOCKS = new ConcurrentHashMap<>(); private long time; private long interval; @@ -39,7 +31,12 @@ public class BlazeArc extends FireAbility { super(player); this.range = this.getDayFactor(range); this.speed = getConfig().getLong("Abilities.Fire.Blaze.Speed"); - this.interval = (long) (1000. / this.speed); + this.interval = (long) (1000.0 / this.speed); + + if(bPlayer.canUseSubElement(SubElement.BLUE_FIRE)) { + this.range += BlueFireAbility.getRangeFactor() * range - range; + } + this.origin = location.clone(); this.location = this.origin.clone(); @@ -53,19 +50,17 @@ public class BlazeArc extends FireAbility { } private void ignite(final Block block) { - if (block.getType() != Material.FIRE && !isAir(block.getType())) { + if (!isFire(block.getType()) && !isAir(block.getType())) { if (canFireGrief()) { if (isPlant(block) || isSnow(block)) { new PlantRegrowth(this.player, block); } - } else if (block.getType() != Material.FIRE) { - REPLACED_BLOCKS.put(block.getLocation(), block.getState()); } } - block.setType(Material.FIRE); - IGNITED_BLOCKS.put(block, this.player); - IGNITED_TIMES.put(block, System.currentTimeMillis()); + if (isIgnitable(block)) { + createTempFire(block.getLocation(), DISSIPATE_REMOVE_TIME); + } } @Override @@ -78,10 +73,9 @@ public class BlazeArc extends FireAbility { this.time = System.currentTimeMillis(); final Block block = this.location.getBlock(); - if (block.getType() == Material.FIRE) { + if (isFire(block.getType())) { return; - } - + } if (this.location.distanceSquared(this.origin) > this.range * this.range) { this.remove(); return; @@ -92,76 +86,26 @@ public class BlazeArc extends FireAbility { final Block ignitable = getIgnitable(block); if (ignitable != null) { this.ignite(ignitable); + int difference = ignitable.getY() - this.location.getBlockY(); + this.location.add(0, difference, 0); + } else { + remove(); + return; } } } - public static void dissipateAll() { - if (DISSIPATE_REMOVE_TIME != 0) { - for (final Block block : IGNITED_TIMES.keySet()) { - if (block.getType() != Material.FIRE) { - removeBlock(block); - } else { - final long time = IGNITED_TIMES.get(block); - if (System.currentTimeMillis() > time + DISSIPATE_REMOVE_TIME) { - block.setType(Material.AIR); - removeBlock(block); - } - } + public Block getIgnitable(final Block block) { + + Block[] blockArr = { block.getRelative(BlockFace.UP), block, block.getRelative(BlockFace.DOWN) }; + + for (int i = 0; i < 3; i++) { + if (isFire(blockArr[i].getType()) || isIgnitable(blockArr[i])) { + return blockArr[i]; } } - } - public static void handleDissipation() { - for (final Block block : IGNITED_BLOCKS.keySet()) { - if (block.getType() != Material.FIRE) { - IGNITED_BLOCKS.remove(block); - } - } - } - - public static Block getIgnitable(final Block block) { - Block top = block; - - for (int i = 0; i < 2; i++) { - if (GeneralMethods.isSolid(top.getRelative(BlockFace.DOWN))) { - break; - } - - top = top.getRelative(BlockFace.DOWN); - } - - if (top.getType() == Material.FIRE) { - return top; - } else if (top.getType().isBurnable()) { - return top; - } else if (isAir(top.getType())) { - return top; - } else { - return null; - } - } - - public static boolean isIgnitable(final Player player, final Block block) { - if (!BendingPlayer.getBendingPlayer(player).hasElement(Element.FIRE)) { - return false; - } else if (!GeneralMethods.isSolid(block.getRelative(BlockFace.DOWN))) { - return false; - } else if (block.getType() == Material.FIRE) { - return true; - } else if (block.getType().isBurnable()) { - return true; - } else if (isAir(block.getType())) { - return true; - } else { - return false; - } - } - - public static void removeAllCleanup() { - for (final Block block : IGNITED_BLOCKS.keySet()) { - removeBlock(block); - } + return null; } public static void removeAroundPoint(final Location location, final double radius) { @@ -174,20 +118,6 @@ public class BlazeArc extends FireAbility { } } - public static void removeBlock(final Block block) { - if (IGNITED_BLOCKS.containsKey(block)) { - IGNITED_BLOCKS.remove(block); - } - if (IGNITED_TIMES.containsKey(block)) { - IGNITED_TIMES.remove(block); - } - if (REPLACED_BLOCKS.containsKey(block.getLocation())) { - block.setType(REPLACED_BLOCKS.get(block.getLocation()).getType()); - block.setBlockData(REPLACED_BLOCKS.get(block.getLocation()).getBlockData()); - REPLACED_BLOCKS.remove(block.getLocation()); - } - } - @Override public String getName() { return "Blaze"; @@ -268,18 +198,6 @@ public class BlazeArc extends FireAbility { return DISSIPATE_REMOVE_TIME; } - public static Map getIgnitedBlocks() { - return IGNITED_BLOCKS; - } - - public static Map getIgnitedTimes() { - return IGNITED_TIMES; - } - - public static Map getReplacedBlocks() { - return REPLACED_BLOCKS; - } - public void setLocation(final Location location) { this.location = location; } diff --git a/src/com/projectkorra/projectkorra/firebending/FireBlast.java b/src/com/projectkorra/projectkorra/firebending/FireBlast.java index b8d674b6..c6481f96 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireBlast.java +++ b/src/com/projectkorra/projectkorra/firebending/FireBlast.java @@ -6,9 +6,12 @@ import java.util.Random; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.BlastFurnace; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Campfire; import org.bukkit.block.Furnace; +import org.bukkit.block.Smoker; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -16,7 +19,9 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.ability.AirAbility; +import com.projectkorra.projectkorra.ability.BlueFireAbility; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.attribute.Attribute; @@ -24,7 +29,6 @@ import com.projectkorra.projectkorra.avatar.AvatarState; import com.projectkorra.projectkorra.command.Commands; import com.projectkorra.projectkorra.firebending.util.FireDamageTimer; import com.projectkorra.projectkorra.util.DamageHandler; -import com.projectkorra.projectkorra.util.ParticleEffect; import com.projectkorra.projectkorra.waterbending.plant.PlantRegrowth; public class FireBlast extends FireAbility { @@ -53,7 +57,6 @@ public class FireBlast extends FireAbility { @Attribute(Attribute.KNOCKBACK) private double knockback; private double flameRadius; - private double smokeRadius; private Random random; private Location location; private Location origin; @@ -69,17 +72,17 @@ public class FireBlast extends FireAbility { this.setFields(); this.safeBlocks = safeBlocks; - this.damage = damage; this.location = location.clone(); this.origin = location.clone(); this.direction = direction.clone().normalize(); - this.range = this.getDayFactor(this.range); - this.damage = this.getDayFactor(damage); + + // The following code determines the total additive modifier between Blue Fire & Day Modifiers + this.applyModifiers(); this.start(); } - + public FireBlast(final Player player) { super(player); @@ -91,18 +94,34 @@ public class FireBlast extends FireAbility { this.setFields(); this.isFireBurst = false; - this.damage = this.getDayFactor(getConfig().getDouble("Abilities.Fire.FireBlast.Damage")); + this.damage = getConfig().getDouble("Abilities.Fire.FireBlast.Damage"); this.safeBlocks = new ArrayList<>(); - this.range = this.getDayFactor(this.range); this.location = player.getEyeLocation(); this.origin = player.getEyeLocation(); this.direction = player.getEyeLocation().getDirection().normalize(); this.location = this.location.add(this.direction.clone()); + + // The following code determines the total additive modifier between Blue Fire & Day Modifiers + this.applyModifiers(); this.start(); this.bPlayer.addCooldown("FireBlast", this.cooldown); } + private void applyModifiers() { + int damageMod = 0; + int rangeMod = 0; + + damageMod = (int) (this.getDayFactor(damage) - damage); + rangeMod = (int) (this.getDayFactor(this.range) - this.range); + + damageMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getDamageFactor() * damage - damage) + damageMod : damageMod); + rangeMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getRangeFactor() * range - range) + rangeMod : rangeMod); + + this.range += rangeMod; + this.damage += damageMod; + } + private void setFields() { this.isFireBurst = true; this.powerFurnace = true; @@ -116,28 +135,25 @@ public class FireBlast extends FireAbility { this.fireTicks = getConfig().getDouble("Abilities.Fire.FireBlast.FireTicks"); this.knockback = getConfig().getDouble("Abilities.Fire.FireBlast.Knockback"); this.flameRadius = getConfig().getDouble("Abilities.Fire.FireBlast.FlameParticleRadius"); - this.smokeRadius = getConfig().getDouble("Abilities.Fire.FireBlast.SmokeParticleRadius"); this.random = new Random(); } private void advanceLocation() { if (this.isFireBurst) { this.flameRadius += 0.06; - this.smokeRadius += 0.06; } - + if (this.showParticles) { - ParticleEffect.FLAME.display(this.location, 6, this.flameRadius, this.flameRadius, this.flameRadius); - ParticleEffect.SMOKE_NORMAL.display(this.location, 3, this.smokeRadius, this.smokeRadius, this.smokeRadius); + playFirebendingParticles(this.location, 6, this.flameRadius, this.flameRadius, this.flameRadius); } - + if (GeneralMethods.checkDiagonalWall(this.location, this.direction)) { this.remove(); return; } - + this.location = this.location.add(this.direction.clone().multiply(this.speedFactor)); - + if (this.random.nextInt(4) == 0) { playFirebendingSound(this.location); } @@ -162,20 +178,13 @@ public class FireBlast extends FireAbility { private void ignite(final Location location) { for (final Block block : GeneralMethods.getBlocksAroundPoint(location, this.collisionRadius)) { - if (BlazeArc.isIgnitable(this.player, block) && !this.safeBlocks.contains(block) && !GeneralMethods.isRegionProtectedFromBuild(this, block.getLocation())) { + if (isIgnitable(block) && !this.safeBlocks.contains(block) && !GeneralMethods.isRegionProtectedFromBuild(this, block.getLocation())) { if (canFireGrief()) { if (isPlant(block) || isSnow(block)) { new PlantRegrowth(this.player, block); } - block.setType(Material.FIRE); - } else { - createTempFire(block.getLocation()); - } - - if (this.dissipate) { - BlazeArc.getIgnitedBlocks().put(block, this.player); - BlazeArc.getIgnitedTimes().put(block, System.currentTimeMillis()); } + createTempFire(block.getLocation()); } } } @@ -200,9 +209,23 @@ public class FireBlast extends FireAbility { if (block.getType() == Material.FURNACE && this.powerFurnace) { final Furnace furnace = (Furnace) block.getState(); furnace.setBurnTime((short) 800); - furnace.setCookTime((short) 800); furnace.update(); - } else if (BlazeArc.isIgnitable(this.player, block.getRelative(BlockFace.UP))) { + } else if (block.getType() == Material.SMOKER && this.powerFurnace) { + final Smoker smoker = (Smoker) block.getState(); + smoker.setBurnTime((short) 800); + smoker.update(); + } else if (block.getType() == Material.BLAST_FURNACE && this.powerFurnace) { + final BlastFurnace blastF = (BlastFurnace) block.getState(); + blastF.setBurnTime((short) 800); + blastF.update(); + } else if (block instanceof Campfire) { + final Campfire campfire = (Campfire) block.getBlockData(); + if(!campfire.isLit()) { + if(block.getType() != Material.SOUL_CAMPFIRE || bPlayer.canUseSubElement(SubElement.BLUE_FIRE)) { + campfire.setLit(true); + } + } + } else if (isIgnitable(block.getRelative(BlockFace.UP))) { if ((this.isFireBurst && this.fireBurstIgnite) || !this.isFireBurst) { this.ignite(this.location); } @@ -433,5 +456,4 @@ public class FireBlast extends FireAbility { this.isFireBurst = isFireBurst; } - } diff --git a/src/com/projectkorra/projectkorra/firebending/FireBlastCharged.java b/src/com/projectkorra/projectkorra/firebending/FireBlastCharged.java index 60df8218..8725a5dc 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireBlastCharged.java +++ b/src/com/projectkorra/projectkorra/firebending/FireBlastCharged.java @@ -5,9 +5,7 @@ import java.util.Map; import java.util.Random; 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.Entity; @@ -17,7 +15,9 @@ import org.bukkit.entity.TNTPrimed; import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.ability.AirAbility; +import com.projectkorra.projectkorra.ability.BlueFireAbility; import com.projectkorra.projectkorra.ability.CoreAbility; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.attribute.Attribute; @@ -79,19 +79,37 @@ public class FireBlastCharged extends FireAbility { this.fireTicks = getConfig().getDouble("Abilities.Fire.FireBlast.Charged.FireTicks"); this.innerRadius = this.damageRadius / 2; - if (isDay(player.getWorld())) { - this.chargeTime = (long) (this.chargeTime / getDayFactor()); - this.maxDamage = this.getDayFactor(this.maxDamage); - this.range = this.getDayFactor(this.range); + + this.applyModifiers(); + + if (!player.getEyeLocation().getBlock().isLiquid()) { + this.start(); } + } + + private void applyModifiers() { + long chargeTimeMod = 0; + int damageMod = 0; + int rangeMod = 0; + + if (isDay(player.getWorld())) { + chargeTimeMod = (long) (this.chargeTime / getDayFactor()) - this.chargeTime; + damageMod = (int) (this.getDayFactor(this.maxDamage) - this.maxDamage); + rangeMod = (int) (this.getDayFactor(this.range) - this.range); + } + + chargeTimeMod = (long) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (chargeTime / BlueFireAbility.getCooldownFactor() - chargeTime) + chargeTimeMod : chargeTimeMod); + damageMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getDamageFactor() * maxDamage - maxDamage) + damageMod : damageMod); + rangeMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getRangeFactor() * range - range) + rangeMod : rangeMod); + if (this.bPlayer.isAvatarState()) { this.chargeTime = getConfig().getLong("Abilities.Avatar.AvatarState.Fire.FireBlast.Charged.ChargeTime"); this.maxDamage = getConfig().getDouble("Abilities.Avatar.AvatarState.Fire.FireBlast.Charged.Damage"); } - if (!player.getEyeLocation().getBlock().isLiquid()) { - this.start(); - } + this.chargeTime += chargeTimeMod; + this.maxDamage += damageMod; + this.range += rangeMod; } public static boolean annihilateBlasts(final Location location, final double radius, final Player source) { @@ -207,8 +225,7 @@ public class FireBlastCharged extends FireAbility { private void executeFireball() { for (final Block block : GeneralMethods.getBlocksAroundPoint(this.location, this.collisionRadius)) { - ParticleEffect.FLAME.display(block.getLocation(), 5, 0.5, 0.5, 0.5, 0); - ParticleEffect.SMOKE_NORMAL.display(block.getLocation(), 2, 0.5, 0.5, 0.5, 0); + playFirebendingParticles(block.getLocation(), 5, 0.5, 0.5, 0.5); if ((new Random()).nextInt(4) == 0) { playFirebendingSound(this.location); } @@ -233,15 +250,8 @@ public class FireBlastCharged extends FireAbility { private void ignite(final Location location) { for (final Block block : GeneralMethods.getBlocksAroundPoint(location, this.collisionRadius)) { - if (BlazeArc.isIgnitable(this.player, block)) { - if (block.getType() != Material.FIRE) { - BlazeArc.getReplacedBlocks().put(block.getLocation(), block.getState()); - } - block.setType(Material.FIRE); - if (this.dissipate) { - BlazeArc.getIgnitedBlocks().put(block, this.player); - BlazeArc.getIgnitedTimes().put(block, System.currentTimeMillis()); - } + if (isIgnitable(block)) { + createTempFire(block.getLocation()); } } } @@ -282,7 +292,7 @@ public class FireBlastCharged extends FireAbility { if (!this.launched && !this.charged) { return; } else if (!this.launched) { - this.player.getWorld().playEffect(this.player.getEyeLocation(), Effect.MOBSPAWNER_FLAMES, 0, 3); + playFirebendingParticles(this.player.getEyeLocation().clone().add(this.player.getEyeLocation().getDirection().clone()), 3, .001, .001, .001); return; } diff --git a/src/com/projectkorra/projectkorra/firebending/FireBurst.java b/src/com/projectkorra/projectkorra/firebending/FireBurst.java index 268aeaa5..ed8147a1 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireBurst.java +++ b/src/com/projectkorra/projectkorra/firebending/FireBurst.java @@ -3,7 +3,6 @@ package com.projectkorra.projectkorra.firebending; import java.util.ArrayList; import java.util.List; -import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -12,6 +11,8 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; +import com.projectkorra.projectkorra.Element.SubElement; +import com.projectkorra.projectkorra.ability.BlueFireAbility; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.attribute.Attribute; @@ -49,15 +50,22 @@ public class FireBurst extends FireAbility { return; } + long chargeTimeMod = 0; + if (isDay(player.getWorld())) { - this.chargeTime /= getDayFactor(); + chargeTimeMod = (long) (this.getDayFactor(chargeTime) - chargeTime); } + + chargeTimeMod = (long) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (chargeTime / BlueFireAbility.getCooldownFactor() - chargeTime) + chargeTimeMod : chargeTimeMod); + if (this.bPlayer.isAvatarState()) { this.chargeTime = getConfig().getLong("Abilities.Avatar.AvatarState.Fire.FireBurst.Damage"); this.damage = getConfig().getInt("Abilities.Avatar.AvatarState.Fire.FireBurst.Damage"); this.cooldown = getConfig().getLong("Abilities.Avatar.AvatarState.Fire.FireBurst.Cooldown"); } + this.chargeTime += chargeTimeMod; + this.start(); } @@ -138,7 +146,8 @@ public class FireBurst extends FireAbility { } } else if (this.charged) { final Location location = this.player.getEyeLocation(); - location.getWorld().playEffect(location, Effect.MOBSPAWNER_FLAMES, 4, 3); + location.add(location.getDirection()); + playFirebendingParticles(location, 1, .01, .01, .01); } } diff --git a/src/com/projectkorra/projectkorra/firebending/FireJet.java b/src/com/projectkorra/projectkorra/firebending/FireJet.java index 68da1d7a..8c382942 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireJet.java +++ b/src/com/projectkorra/projectkorra/firebending/FireJet.java @@ -14,7 +14,6 @@ import com.projectkorra.projectkorra.ability.ElementalAbility; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.airbending.AirSpout; import com.projectkorra.projectkorra.attribute.Attribute; -import com.projectkorra.projectkorra.util.ParticleEffect; public class FireJet extends FireAbility { @@ -57,7 +56,7 @@ public class FireJet extends FireAbility { this.speed = this.getDayFactor(this.speed); final Block block = player.getLocation().getBlock(); - if (BlazeArc.isIgnitable(player, block) || ElementalAbility.isAir(block.getType()) || block.getType() == Material.STONE_SLAB || block.getType() == Material.ACACIA_SLAB || block.getType() == Material.BIRCH_SLAB || block.getType() == Material.DARK_OAK_SLAB || block.getType() == Material.JUNGLE_SLAB || block.getType() == Material.OAK_SLAB || block.getType() == Material.SPRUCE_SLAB || isIlluminationTorch(block) || this.bPlayer.isAvatarState()) { + if (isIgnitable(block) || ElementalAbility.isAir(block.getType()) || block.getType() == Material.STONE_SLAB || block.getType() == Material.ACACIA_SLAB || block.getType() == Material.BIRCH_SLAB || block.getType() == Material.DARK_OAK_SLAB || block.getType() == Material.JUNGLE_SLAB || block.getType() == Material.OAK_SLAB || block.getType() == Material.SPRUCE_SLAB || isIlluminationTorch(block) || this.bPlayer.isAvatarState()) { player.setVelocity(player.getEyeLocation().getDirection().clone().normalize().multiply(this.speed)); if (!canFireGrief()) { if (ElementalAbility.isAir(block.getType())) { @@ -65,7 +64,7 @@ public class FireJet extends FireAbility { } } else if (ElementalAbility.isAir(block.getType())) { - block.setType(Material.FIRE); + createTempFire(block.getLocation()); } this.flightHandler.createInstance(player, this.getName()); @@ -93,8 +92,7 @@ public class FireJet extends FireAbility { playFirebendingSound(this.player.getLocation()); } - ParticleEffect.FLAME.display(this.player.getLocation(), 20, 0.6, 0.6, 0.6); - ParticleEffect.SMOKE_NORMAL.display(this.player.getLocation(), 10, 0.6, 0.6, 0.6); + playFirebendingParticles(this.player.getLocation(), 10, 0.3, 0.3, 0.3); double timefactor; if (this.bPlayer.isAvatarState() && this.avatarStateToggled) { diff --git a/src/com/projectkorra/projectkorra/firebending/FireManipulation.java b/src/com/projectkorra/projectkorra/firebending/FireManipulation.java index 63d63a57..e4143a80 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireManipulation.java +++ b/src/com/projectkorra/projectkorra/firebending/FireManipulation.java @@ -15,7 +15,6 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.util.DamageHandler; -import com.projectkorra.projectkorra.util.ParticleEffect; public class FireManipulation extends FireAbility { @@ -113,8 +112,7 @@ public class FireManipulation extends FireAbility { this.points.remove(point); return; } - ParticleEffect.FLAME.display(point, 12, 0.25, 0.25, 0.25); - ParticleEffect.SMOKE_NORMAL.display(point, 6, 0.25, 0.25, 0.25); + playFirebendingParticles(point, 12, 0.25, 0.25, 0.25); for (final Entity entity : GeneralMethods.getEntitiesAroundPoint(point, 1.2D)) { if (entity instanceof LivingEntity && entity.getUniqueId() != this.player.getUniqueId()) { DamageHandler.damageEntity(entity, this.shieldDamage, this); @@ -143,8 +141,7 @@ public class FireManipulation extends FireAbility { for (final Location point : this.points.keySet()) { final Vector direction = this.focalPoint.toVector().subtract(point.toVector()); point.add(direction.clone().multiply(this.streamSpeed / 5)); - ParticleEffect.FLAME.display(point, this.shieldParticles, 0.25, 0.25, 0.25); - ParticleEffect.SMOKE_NORMAL.display(point, this.shieldParticles / 2, 0.25, 0.25, 0.25); + playFirebendingParticles(point, this.shieldParticles, 0.25, 0.25, 0.25); } } else { Vector direction = this.player.getLocation().getDirection().clone(); @@ -173,8 +170,7 @@ public class FireManipulation extends FireAbility { return; } - ParticleEffect.FLAME.display(this.shotPoint, this.streamParticles, 0.5, 0.5, 0.5, 0.01); - ParticleEffect.SMOKE_NORMAL.display(this.shotPoint, this.streamParticles / 2, 0.5, 0.5, 0.5, 0.01); + playFirebendingParticles(this.shotPoint, this.streamParticles, 0.5, 0.5, 0.5); for (final Entity entity : GeneralMethods.getEntitiesAroundPoint(this.shotPoint, 2)) { if (entity instanceof LivingEntity && entity.getUniqueId() != this.player.getUniqueId()) { DamageHandler.damageEntity(entity, this.streamDamage, this); diff --git a/src/com/projectkorra/projectkorra/firebending/FireShield.java b/src/com/projectkorra/projectkorra/firebending/FireShield.java index 1c7ddc0c..f42af507 100644 --- a/src/com/projectkorra/projectkorra/firebending/FireShield.java +++ b/src/com/projectkorra/projectkorra/firebending/FireShield.java @@ -2,10 +2,7 @@ package com.projectkorra.projectkorra.firebending; import java.util.Random; -import org.bukkit.Effect; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -17,7 +14,6 @@ import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.util.Collision; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.firebending.util.FireDamageTimer; -import com.projectkorra.projectkorra.util.ParticleEffect; public class FireShield extends FireAbility { @@ -125,11 +121,8 @@ public class FireShield extends FireAbility { final double rtheta = Math.toRadians(theta); final Location display = this.location.clone().add(this.shieldRadius / 1.5 * Math.cos(rphi) * Math.sin(rtheta), this.shieldRadius / 1.5 * Math.cos(rtheta), this.shieldRadius / 1.5 * Math.sin(rphi) * Math.sin(rtheta)); - if (this.random.nextInt(6) == 0) { - ParticleEffect.SMOKE_NORMAL.display(display, 1, 0, 0, 0); - } if (this.random.nextInt(4) == 0) { - ParticleEffect.FLAME.display(display, 1, 0.1, 0.1, 0.1, 0.013); + playFirebendingParticles(display, 1, 0.1, 0.1, 0.1); } if (this.random.nextInt(7) == 0) { playFirebendingSound(display); @@ -142,13 +135,6 @@ public class FireShield extends FireAbility { this.increment = 20; } - for (final Block testblock : GeneralMethods.getBlocksAroundPoint(this.player.getLocation(), this.shieldRadius)) { - if (testblock.getType() == Material.FIRE) { - testblock.setType(Material.AIR); - testblock.getWorld().playEffect(testblock.getLocation(), Effect.EXTINGUISH, 0); - } - } - for (final Entity entity : GeneralMethods.getEntitiesAroundPoint(this.location, this.shieldRadius)) { if (GeneralMethods.isRegionProtectedFromBuild(this, entity.getLocation())) { continue; @@ -165,15 +151,12 @@ public class FireShield extends FireAbility { this.location = this.player.getEyeLocation().clone(); final Vector direction = this.location.getDirection(); this.location.add(direction.multiply(this.shieldRadius)); - ParticleEffect.FLAME.display(this.location, 3, 0.2, 0.2, 0.2, 0.00023); + playFirebendingParticles(this.location, 3, 0.2, 0.2, 0.2); for (double theta = 0; theta < 360; theta += 20) { final Vector vector = GeneralMethods.getOrthogonalVector(direction, theta, this.discRadius / 1.5); final Location display = this.location.add(vector); - if (this.random.nextInt(6) == 0) { - ParticleEffect.SMOKE_NORMAL.display(display, 1, 0, 0, 0); - } - ParticleEffect.FLAME.display(display, 2, 0.3, 0.2, 0.3, 0.023); + playFirebendingParticles(display, 2, 0.3, 0.2, 0.3); if (this.random.nextInt(4) == 0) { playFirebendingSound(display); } diff --git a/src/com/projectkorra/projectkorra/firebending/HeatControl.java b/src/com/projectkorra/projectkorra/firebending/HeatControl.java index 6cbf61b8..becc04d7 100644 --- a/src/com/projectkorra/projectkorra/firebending/HeatControl.java +++ b/src/com/projectkorra/projectkorra/firebending/HeatControl.java @@ -22,6 +22,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import com.projectkorra.projectkorra.BendingPlayer; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.ability.FireAbility; @@ -43,7 +44,7 @@ public class HeatControl extends FireAbility { COOK, EXTINGUISH, MELT, SOLIDIFY } - private static final Material[] COOKABLE_MATERIALS = { Material.BEEF, Material.CHICKEN, Material.COD, Material.PORKCHOP, Material.POTATO, Material.RABBIT, Material.MUTTON, Material.SALMON, Material.KELP }; + private static final Material[] COOKABLE_MATERIALS = { Material.BEEF, Material.CHICKEN, Material.COD, Material.PORKCHOP, Material.POTATO, Material.RABBIT, Material.MUTTON, Material.SALMON, Material.KELP, Material.WET_SPONGE, Material.CHORUS_FRUIT, Material.STICK }; private HeatControlType heatControlType; @@ -194,7 +195,7 @@ public class HeatControl extends FireAbility { for (final Block block : GeneralMethods.getBlocksAroundPoint(this.player.getLocation(), this.extinguishRadius)) { final Material material = block.getType(); - if (material == Material.FIRE && !GeneralMethods.isRegionProtectedFromBuild(this, block.getLocation())) { + if (isFire(material) && !GeneralMethods.isRegionProtectedFromBuild(this, block.getLocation())) { block.setType(Material.AIR); block.getWorld().playEffect(block.getLocation(), Effect.EXTINGUISH, 0); @@ -273,6 +274,14 @@ public class HeatControl extends FireAbility { case KELP: cooked = new ItemStack(Material.DRIED_KELP); break; + case CHORUS_FRUIT: + cooked = new ItemStack(Material.POPPED_CHORUS_FRUIT); + break; + case WET_SPONGE: + cooked = new ItemStack(Material.SPONGE); + break; + case STICK: + cooked = bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? new ItemStack(Material.SOUL_TORCH) : new ItemStack(Material.TORCH); default: break; } @@ -281,7 +290,7 @@ public class HeatControl extends FireAbility { } public void displayCookParticles() { - ParticleEffect.FLAME.display(this.player.getLocation().clone().add(0, 1, 0), 3, 0.5, 0.5, 0.5); + playFirebendingParticles(this.player.getLocation().clone().add(0, 1, 0), 3, 0.5, 0.5, 0.5); ParticleEffect.SMOKE_NORMAL.display(this.player.getLocation().clone().add(0, 1, 0), 2, 0.5, 0.5, 0.5); } diff --git a/src/com/projectkorra/projectkorra/firebending/Illumination.java b/src/com/projectkorra/projectkorra/firebending/Illumination.java index c7314a81..c16cb502 100644 --- a/src/com/projectkorra/projectkorra/firebending/Illumination.java +++ b/src/com/projectkorra/projectkorra/firebending/Illumination.java @@ -11,6 +11,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import com.projectkorra.projectkorra.Element; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.attribute.Attribute; @@ -112,9 +113,7 @@ public class Illumination extends FireAbility { final Block standingBlock = this.player.getLocation().getBlock(); final Block standBlock = standingBlock.getRelative(BlockFace.DOWN); - if (!BlazeArc.isIgnitable(this.player, standingBlock)) { - return; - } else if (!GeneralMethods.isSolid(standBlock)) { + if (!GeneralMethods.isSolid(standBlock)) { return; } else if (this.block != null && standingBlock.equals(this.block.getBlock())) { return; @@ -125,7 +124,7 @@ public class Illumination extends FireAbility { } this.revert(); - this.block = new TempBlock(standingBlock, Material.TORCH); + this.block = bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? new TempBlock(standingBlock, Material.SOUL_TORCH) : new TempBlock(standingBlock, Material.TORCH); BLOCKS.put(this.block, this.player); } diff --git a/src/com/projectkorra/projectkorra/firebending/WallOfFire.java b/src/com/projectkorra/projectkorra/firebending/WallOfFire.java index e11cd6c8..a45bb920 100644 --- a/src/com/projectkorra/projectkorra/firebending/WallOfFire.java +++ b/src/com/projectkorra/projectkorra/firebending/WallOfFire.java @@ -11,13 +11,14 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.AirAbility; +import com.projectkorra.projectkorra.ability.BlueFireAbility; import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.firebending.util.FireDamageTimer; import com.projectkorra.projectkorra.util.DamageHandler; -import com.projectkorra.projectkorra.util.ParticleEffect; import com.projectkorra.projectkorra.util.TempBlock; public class WallOfFire extends FireAbility { @@ -72,13 +73,23 @@ public class WallOfFire extends FireAbility { this.origin = GeneralMethods.getTargetedLocation(player, this.range); + int widthMod = 0; + int heightMod = 0; + long durationMod = 0; + int damageMod = 0; + if (isDay(player.getWorld())) { - this.width = (int) this.getDayFactor(this.width); - this.height = (int) this.getDayFactor(this.height); - this.duration = (long) this.getDayFactor(this.duration); - this.damage = (int) this.getDayFactor(this.damage); + widthMod = (int) this.getDayFactor(this.width) - this.width; + heightMod = (int) this.getDayFactor(this.height) - this.height; + durationMod = ((long) this.getDayFactor(this.duration) - this.duration); + damageMod = (int) (this.getDayFactor(this.damage) - this.damage); } + widthMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getRangeFactor() * width - width) + widthMod : widthMod); + heightMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getRangeFactor() * height - height) + heightMod : heightMod); + durationMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (duration / BlueFireAbility.getCooldownFactor() - duration) + durationMod : durationMod); + damageMod = (int) (bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? (BlueFireAbility.getDamageFactor() * damage - damage) + damageMod : damageMod); + if (this.bPlayer.isAvatarState()) { this.width = getConfig().getInt("Abilities.Avatar.AvatarState.Fire.WallOfFire.Width"); this.height = getConfig().getInt("Abilities.Avatar.AvatarState.Fire.WallOfFire.Height"); @@ -87,6 +98,11 @@ public class WallOfFire extends FireAbility { this.fireTicks = getConfig().getDouble("Abilities.Avatar.AvatarState.Fire.WallOfFire.FireTicks"); } + this.width += widthMod; + this.height += heightMod; + this.duration += durationMod; + this.damage += damageMod; + this.time = System.currentTimeMillis(); final Block block = this.origin.getBlock(); if (block.isLiquid() || GeneralMethods.isSolid(block)) { @@ -147,9 +163,7 @@ public class WallOfFire extends FireAbility { if (!this.isTransparent(block)) { continue; } - ParticleEffect.FLAME.display(block.getLocation(), 3, 0.6, 0.6, 0.6); - ParticleEffect.SMOKE_NORMAL.display(block.getLocation(), 2, 0.6, 0.6, 0.6); - + playFirebendingParticles(block.getLocation(), 3, 0.6, 0.6, 0.6); if (this.random.nextInt(7) == 0) { playFirebendingSound(block.getLocation()); } diff --git a/src/com/projectkorra/projectkorra/firebending/combo/FireComboStream.java b/src/com/projectkorra/projectkorra/firebending/combo/FireComboStream.java index dd11a98c..de0a9917 100644 --- a/src/com/projectkorra/projectkorra/firebending/combo/FireComboStream.java +++ b/src/com/projectkorra/projectkorra/firebending/combo/FireComboStream.java @@ -15,6 +15,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.util.Vector; import com.projectkorra.projectkorra.BendingPlayer; +import com.projectkorra.projectkorra.Element.SubElement; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.CoreAbility; import com.projectkorra.projectkorra.ability.ElementalAbility; @@ -61,9 +62,9 @@ public class FireComboStream extends BukkitRunnable { this.checkCollisionCounter = 0; this.spread = 0; this.collisionRadius = 2; - this.particleEffect = ParticleEffect.FLAME; this.player = player; this.bPlayer = BendingPlayer.getBendingPlayer(player); + this.particleEffect = bPlayer.canUseSubElement(SubElement.BLUE_FIRE) ? ParticleEffect.SOUL_FIRE_FLAME : ParticleEffect.FLAME; this.coreAbility = coreAbility; this.direction = direction; this.speed = speed; diff --git a/src/com/projectkorra/projectkorra/firebending/combo/FireWheel.java b/src/com/projectkorra/projectkorra/firebending/combo/FireWheel.java index fcbbda38..d963016d 100644 --- a/src/com/projectkorra/projectkorra/firebending/combo/FireWheel.java +++ b/src/com/projectkorra/projectkorra/firebending/combo/FireWheel.java @@ -21,7 +21,6 @@ import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.firebending.util.FireDamageTimer; import com.projectkorra.projectkorra.util.ClickType; import com.projectkorra.projectkorra.util.DamageHandler; -import com.projectkorra.projectkorra.util.ParticleEffect; public class FireWheel extends FireAbility implements ComboAbility { @@ -139,7 +138,7 @@ public class FireWheel extends FireAbility implements ComboAbility { final Vector newDir = this.direction.clone().multiply(this.radius * Math.cos(Math.toRadians(i))); tempLoc.add(newDir); tempLoc.setY(tempLoc.getY() + (this.radius * Math.sin(Math.toRadians(i)))); - ParticleEffect.FLAME.display(tempLoc, 0, 0, 0, 0, 1); + playFirebendingParticles(tempLoc, 0, 0, 0, 0); } for (final Entity entity : GeneralMethods.getEntitiesAroundPoint(this.location, this.radius + 0.5)) { diff --git a/src/com/projectkorra/projectkorra/firebending/combustion/Combustion.java b/src/com/projectkorra/projectkorra/firebending/combustion/Combustion.java index 000884ef..0e6152a5 100644 --- a/src/com/projectkorra/projectkorra/firebending/combustion/Combustion.java +++ b/src/com/projectkorra/projectkorra/firebending/combustion/Combustion.java @@ -41,6 +41,8 @@ public class Combustion extends CombustionAbility { private Location origin; private Vector direction; + private int explosionCount; + public Combustion(final Player player) { super(player); @@ -59,6 +61,7 @@ public class Combustion extends CombustionAbility { this.origin = player.getEyeLocation(); this.direction = player.getEyeLocation().getDirection().normalize(); this.location = this.origin.clone(); + this.explosionCount = 0; if (this.bPlayer.isAvatarState()) { this.range = AvatarState.getValue(this.range); @@ -103,13 +106,17 @@ public class Combustion extends CombustionAbility { } private void advanceLocation() { - ParticleEffect.FIREWORKS_SPARK.display(this.location, 5, Math.random() / 2, Math.random() / 2, Math.random() / 2, 0); - ParticleEffect.FLAME.display(this.location, 2, Math.random() / 2, Math.random() / 2, Math.random() / 2); + ParticleEffect.FIREWORKS_SPARK.display(this.location, 2, .001, .001, .001, 0); + if(explosionCount % 5 == 0) + ParticleEffect.EXPLOSION_LARGE.display(this.location, 1, .001, .001, .001, 0); playCombustionSound(this.location); this.location = this.location.add(this.direction.clone().multiply(this.speedFactor)); + this.explosionCount++; } private void createExplosion(final Location block, final float power, final boolean canBreakBlocks) { + ParticleEffect.EXPLOSION_LARGE.display(block, 3, 2, 2, 2, 0); + if (canFireGrief()) { block.getWorld().createExplosion(block.getX(), block.getY(), block.getZ(), power, true, canBreakBlocks); } @@ -121,6 +128,7 @@ public class Combustion extends CombustionAbility { } } } + this.remove(); } diff --git a/src/com/projectkorra/projectkorra/firebending/util/FirebendingManager.java b/src/com/projectkorra/projectkorra/firebending/util/FirebendingManager.java index e62ef7d4..5221b047 100644 --- a/src/com/projectkorra/projectkorra/firebending/util/FirebendingManager.java +++ b/src/com/projectkorra/projectkorra/firebending/util/FirebendingManager.java @@ -1,8 +1,6 @@ package com.projectkorra.projectkorra.firebending.util; import com.projectkorra.projectkorra.ProjectKorra; -import com.projectkorra.projectkorra.ability.FireAbility; -import com.projectkorra.projectkorra.firebending.BlazeArc; public class FirebendingManager implements Runnable { @@ -14,9 +12,6 @@ public class FirebendingManager implements Runnable { @Override public void run() { - BlazeArc.handleDissipation(); FireDamageTimer.handleFlames(); - BlazeArc.dissipateAll(); - FireAbility.removeFire(); } } diff --git a/src/com/projectkorra/projectkorra/util/ActionBar.java b/src/com/projectkorra/projectkorra/util/ActionBar.java index 90579d76..13a7311c 100644 --- a/src/com/projectkorra/projectkorra/util/ActionBar.java +++ b/src/com/projectkorra/projectkorra/util/ActionBar.java @@ -1,70 +1,15 @@ package com.projectkorra.projectkorra.util; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - import org.bukkit.entity.Player; -import com.projectkorra.projectkorra.util.ReflectionHandler.PackageType; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; public class ActionBar { - private static boolean initialised = false; - private static Constructor chatSer; - private static Constructor packetChat; - public static Method getHandle; - private static Field playerConnection; - private static Method sendPacket; - private static int version; - - static { - try { - version = Integer.parseInt(PackageType.getServerVersion().split("_")[1]); - chatSer = ReflectionHandler.getConstructor(PackageType.MINECRAFT_SERVER.getClass("ChatComponentText"), String.class); - if (version >= 12) { - packetChat = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutChat").getConstructor(PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent"), PackageType.MINECRAFT_SERVER.getClass("ChatMessageType")); - } else { - packetChat = PackageType.MINECRAFT_SERVER.getClass("PacketPlayOutChat").getConstructor(PackageType.MINECRAFT_SERVER.getClass("IChatBaseComponent"), byte.class); - } - getHandle = ReflectionHandler.getMethod("CraftPlayer", PackageType.CRAFTBUKKIT_ENTITY, "getHandle"); - playerConnection = ReflectionHandler.getField("EntityPlayer", PackageType.MINECRAFT_SERVER, false, "playerConnection"); - sendPacket = ReflectionHandler.getMethod(playerConnection.getType(), "sendPacket", PackageType.MINECRAFT_SERVER.getClass("Packet")); - initialised = true; - } catch (final ReflectiveOperationException e) { - initialised = false; - } - } - - public static boolean isInitialised() { - return initialised; - } - - public static boolean sendActionBar(final String message, final Player... player) { - if (!initialised) { - return false; - } - try { - final Object o = chatSer.newInstance(message); - Object packet; - if (version >= 12) { - packet = packetChat.newInstance(o, PackageType.MINECRAFT_SERVER.getClass("ChatMessageType").getEnumConstants()[2]); - } else { - packet = packetChat.newInstance(o, (byte) 2); - } - sendTo(packet, player); - } catch (final ReflectiveOperationException e) { - e.printStackTrace(); - initialised = false; - } - return initialised; - } - - private static void sendTo(final Object packet, final Player... player) throws ReflectiveOperationException { - for (final Player p : player) { - final Object entityplayer = getHandle.invoke(p); - final Object PlayerConnection = playerConnection.get(entityplayer); - sendPacket.invoke(PlayerConnection, packet); + public static void sendActionBar(final String message, final Player... player) { + for (Player e : player) { + e.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(message)); } } } diff --git a/src/com/projectkorra/projectkorra/util/ParticleEffect.java b/src/com/projectkorra/projectkorra/util/ParticleEffect.java index 92b9538b..39749baa 100644 --- a/src/com/projectkorra/projectkorra/util/ParticleEffect.java +++ b/src/com/projectkorra/projectkorra/util/ParticleEffect.java @@ -6,6 +6,9 @@ import org.bukkit.Particle.DustOptions; import org.bukkit.inventory.ItemStack; public enum ParticleEffect { + + ASH (Particle.ASH), + BARRIER (Particle.BARRIER), /** @@ -19,7 +22,11 @@ public enum ParticleEffect { BLOCK_DUST (Particle.BLOCK_DUST), BUBBLE_COLUMN_UP (Particle.BUBBLE_COLUMN_UP), BUBBLE_POP (Particle.BUBBLE_POP), + CAMPFIRE_COSY_SMOKE (Particle.CAMPFIRE_COSY_SMOKE), + CAMPFIRE_SIGNAL_SMOKE (Particle.CAMPFIRE_SIGNAL_SMOKE), CLOUD (Particle.CLOUD), + COMPOSTER (Particle.COMPOSTER), + CRIMSON_SPORE (Particle.CRIMSON_SPORE), CRIT (Particle.CRIT), CRIT_MAGIC (Particle.CRIT_MAGIC), @Deprecated MAGIC_CRIT (Particle.CRIT_MAGIC), CURRENT_DOWN (Particle.CURRENT_DOWN), @@ -28,6 +35,8 @@ public enum ParticleEffect { DRAGON_BREATH (Particle.DRAGON_BREATH), DRIP_LAVA (Particle.DRIP_LAVA), DRIP_WATER (Particle.DRIP_WATER), + DRIPPING_HONEY (Particle.DRIPPING_HONEY), + DRIPPING_OBSIDIAN_TEAR (Particle.DRIPPING_OBSIDIAN_TEAR), ENCHANTMENT_TABLE (Particle.ENCHANTMENT_TABLE), END_ROD (Particle.END_ROD), EXPLOSION_HUGE (Particle.EXPLOSION_HUGE), @Deprecated HUGE_EXPLOSION (Particle.EXPLOSION_HUGE), @@ -38,14 +47,23 @@ public enum ParticleEffect { * Applicable data: {@link BlockData} */ FALLING_DUST (Particle.FALLING_DUST), + FALLING_HONEY (Particle.FALLING_HONEY), + FALLING_LAVA (Particle.FALLING_LAVA), + FALLING_NECTAR (Particle.FALLING_NECTAR), + FALLING_OBSIDIAN_TEAR (Particle.FALLING_OBSIDIAN_TEAR), + FALLING_WATER (Particle.FALLING_WATER), FIREWORKS_SPARK (Particle.FIREWORKS_SPARK), FLAME (Particle.FLAME), + FLASH (Particle.FLASH), HEART (Particle.HEART), /** * Applicable data: {@link ItemStack} */ ITEM_CRACK (Particle.ITEM_CRACK), + LANDING_HONEY (Particle.LANDING_HONEY), + LANDING_LAVA (Particle.LANDING_LAVA), + LANDING_OBSIDIAN_TEAR (Particle.LANDING_OBSIDIAN_TEAR), LAVA (Particle.LAVA), MOB_APPEARANCE (Particle.MOB_APPEARANCE), NAUTILUS (Particle.NAUTILUS), @@ -56,11 +74,15 @@ public enum ParticleEffect { * Applicable data: {@link DustOptions} */ REDSTONE (Particle.REDSTONE), @Deprecated RED_DUST (Particle.REDSTONE), + REVERSE_PORTAL (Particle.REVERSE_PORTAL), SLIME (Particle.SLIME), SMOKE_NORMAL (Particle.SMOKE_NORMAL), @Deprecated SMOKE (Particle.SMOKE_NORMAL), SMOKE_LARGE (Particle.SMOKE_LARGE), @Deprecated LARGE_SMOKE (Particle.SMOKE_LARGE), + SNEEZE (Particle.SNEEZE), SNOW_SHOVEL (Particle.SNOW_SHOVEL), SNOWBALL (Particle.SNOWBALL), @Deprecated SNOWBALL_PROOF (Particle.SNOWBALL), + SOUL (Particle.SOUL), + SOUL_FIRE_FLAME (Particle.SOUL_FIRE_FLAME), SPELL (Particle.SPELL), SPELL_INSTANT (Particle.SPELL_INSTANT), @Deprecated INSTANT_SPELL (Particle.SPELL_INSTANT), SPELL_MOB (Particle.SPELL_MOB), @Deprecated MOB_SPELL (Particle.SPELL_MOB), @@ -75,10 +97,12 @@ public enum ParticleEffect { TOWN_AURA (Particle.TOWN_AURA), VILLAGER_ANGRY (Particle.VILLAGER_ANGRY), @Deprecated ANGRY_VILLAGER (Particle.VILLAGER_ANGRY), VILLAGER_HAPPY (Particle.VILLAGER_HAPPY), @Deprecated HAPPY_VILLAGER (Particle.VILLAGER_HAPPY), + WARPED_SPORE (Particle.WARPED_SPORE), WATER_BUBBLE (Particle.WATER_BUBBLE), @Deprecated BUBBLE (Particle.WATER_BUBBLE), WATER_DROP (Particle.WATER_DROP), WATER_SPLASH (Particle.WATER_SPLASH), @Deprecated SPLASH (Particle.WATER_SPLASH), - WATER_WAKE (Particle.WATER_WAKE), @Deprecated WAKE (Particle.WATER_WAKE); + WATER_WAKE (Particle.WATER_WAKE), @Deprecated WAKE (Particle.WATER_WAKE), + WHITE_ASH (Particle.WHITE_ASH); Particle particle; Class dataClass; diff --git a/src/com/projectkorra/projectkorra/util/TempBlock.java b/src/com/projectkorra/projectkorra/util/TempBlock.java index 077c31f6..f535d163 100644 --- a/src/com/projectkorra/projectkorra/util/TempBlock.java +++ b/src/com/projectkorra/projectkorra/util/TempBlock.java @@ -11,6 +11,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.Container; +import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Levelled; import org.bukkit.scheduler.BukkitRunnable; @@ -30,29 +31,34 @@ public class TempBlock { }); private final Block block; - private BlockData newdata; + private BlockData newData; private BlockState state; private long revertTime; private boolean inRevertQueue; private RevertTask revertTask = null; public TempBlock(final Block block, final Material newtype) { - this(block, newtype.createBlockData()); + this(block, newtype.createBlockData(), 0); } @Deprecated - public TempBlock(final Block block, final Material newtype, final BlockData newdata) { - this(block, newdata); + public TempBlock(final Block block, final Material newtype, final BlockData newData) { + this(block, newData, 0); + } + + public TempBlock(final Block block, final BlockData newData) { + this(block, newData, 0); } - public TempBlock(final Block block, final BlockData newdata) { + public TempBlock(final Block block, final BlockData newData, final long revertTime) { this.block = block; - this.newdata = newdata; + this.newData = newData; + this.setRevertTime(revertTime); if (instances.containsKey(block)) { final TempBlock temp = instances.get(block); - if (!newdata.equals(temp.block.getBlockData())) { - temp.block.setBlockData(newdata, GeneralMethods.isLightEmitting(newdata.getMaterial())); - temp.newdata = newdata; + if (!newData.equals(temp.block.getBlockData())) { + temp.block.setBlockData(newData, GeneralMethods.isLightEmitting(newData.getMaterial())); + temp.newData = newData; } this.state = temp.state; instances.put(block, temp); @@ -62,10 +68,7 @@ public class TempBlock { return; } instances.put(block, this); - block.setBlockData(newdata, GeneralMethods.isLightEmitting(newdata.getMaterial())); - } - if (this.state.getType() == Material.FIRE) { - this.state.setType(Material.AIR); + block.setBlockData(newData, GeneralMethods.isLightEmitting(newData.getMaterial())); } } @@ -139,7 +142,7 @@ public class TempBlock { } public BlockData getBlockData() { - return this.newdata; + return this.newData; } public Location getLocation() { @@ -163,6 +166,10 @@ public class TempBlock { } public void setRevertTime(final long revertTime) { + if(revertTime <= 0) { + return; + } + if (this.inRevertQueue) { REVERT_QUEUE.remove(this); } @@ -172,7 +179,7 @@ public class TempBlock { } public void revertBlock() { - PaperLib.getChunkAtAsync(this.block.getLocation()).thenAccept(result -> this.state.update(true, GeneralMethods.isLightEmitting(this.state.getType()))); + PaperLib.getChunkAtAsync(this.block.getLocation()).thenAccept(result -> this.state.update(true, GeneralMethods.isLightEmitting(this.state.getType()) || !(state.getBlockData() instanceof Bisected))); instances.remove(this.block); REVERT_QUEUE.remove(this); if (this.revertTask != null) { @@ -194,7 +201,7 @@ public class TempBlock { } public void setType(final BlockData data) { - this.newdata = data; + this.newData = data; this.block.setBlockData(data, GeneralMethods.isLightEmitting(data.getMaterial())); } diff --git a/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java b/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java index 99f0ff26..1d1cc480 100644 --- a/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java +++ b/src/com/projectkorra/projectkorra/waterbending/OctopusForm.java @@ -16,6 +16,7 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ProjectKorra; import com.projectkorra.projectkorra.ability.AirAbility; +import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.WaterAbility; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.avatar.AvatarState; @@ -179,7 +180,7 @@ public class OctopusForm extends WaterAbility { } else if (!GeneralMethods.isAdjacentToThreeOrMoreSources(this.sourceBlock) && this.sourceBlock != null) { this.sourceBlock.setType(Material.AIR); } - this.source = new TempBlock(this.sourceBlock, Material.WATER, GeneralMethods.getWaterData(0)); + this.source = new TempBlock(this.sourceBlock, GeneralMethods.getWaterData(0)); } private void attack() { @@ -253,7 +254,7 @@ public class OctopusForm extends WaterAbility { this.sourceLocation = newBlock.getLocation(); if (!GeneralMethods.isSolid(newBlock)) { - this.source = new TempBlock(newBlock, Material.WATER, GeneralMethods.getWaterData(0)); + this.source = new TempBlock(newBlock, GeneralMethods.getWaterData(0)); this.sourceBlock = newBlock; } else { this.remove(); @@ -266,7 +267,7 @@ public class OctopusForm extends WaterAbility { this.sourceLocation = newBlock.getLocation(); if (!GeneralMethods.isSolid(newBlock)) { - this.source = new TempBlock(newBlock, Material.WATER, GeneralMethods.getWaterData(0)); + this.source = new TempBlock(newBlock, GeneralMethods.getWaterData(0)); this.sourceBlock = newBlock; } else { this.remove(); @@ -282,7 +283,7 @@ public class OctopusForm extends WaterAbility { this.source.revertBlock(); } if (!GeneralMethods.isSolid(newBlock)) { - this.source = new TempBlock(newBlock, Material.WATER, GeneralMethods.getWaterData(0)); + this.source = new TempBlock(newBlock, GeneralMethods.getWaterData(0)); this.sourceBlock = newBlock; } } @@ -426,16 +427,16 @@ public class OctopusForm extends WaterAbility { if (!SurgeWave.canThaw(block)) { SurgeWave.thaw(block); } - tblock.setType(Material.WATER, GeneralMethods.getWaterData(0)); + tblock.setType(GeneralMethods.getWaterData(0)); this.newBlocks.add(tblock); } else if (this.blocks.contains(tblock)) { this.newBlocks.add(tblock); } - } else if (this.isWaterbendable(this.player, block) || block.getType() == Material.FIRE || isAir(block.getType())) { + } else if (this.isWaterbendable(this.player, block) || FireAbility.isFire(block.getType()) || isAir(block.getType())) { if (isWater(block) && !TempBlock.isTempBlock(block)) { ParticleEffect.WATER_BUBBLE.display(block.getLocation().clone().add(0.5, 0.5, 0.5), 5, Math.random(), Math.random(), Math.random(), 0); } - this.newBlocks.add(new TempBlock(block, Material.WATER, GeneralMethods.getWaterData(0))); + this.newBlocks.add(new TempBlock(block, GeneralMethods.getWaterData(0))); } } diff --git a/src/com/projectkorra/projectkorra/waterbending/SurgeWall.java b/src/com/projectkorra/projectkorra/waterbending/SurgeWall.java index 9f6fead2..52868949 100644 --- a/src/com/projectkorra/projectkorra/waterbending/SurgeWall.java +++ b/src/com/projectkorra/projectkorra/waterbending/SurgeWall.java @@ -17,6 +17,7 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.BendingPlayer; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.ElementalAbility; +import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.WaterAbility; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.firebending.FireBlast; @@ -269,7 +270,7 @@ public class SurgeWall extends WaterAbility { continue; } else if (WALL_BLOCKS.containsKey(block)) { blocks.add(block); - } else if (!blocks.contains(block) && (ElementalAbility.isAir(block.getType()) || block.getType() == Material.FIRE || this.isWaterbendable(block)) && this.isTransparent(block)) { + } else if (!blocks.contains(block) && (ElementalAbility.isAir(block.getType()) || FireAbility.isFire(block.getType()) || this.isWaterbendable(block)) && this.isTransparent(block)) { WALL_BLOCKS.put(block, this.player); this.addWallBlock(block); blocks.add(block); diff --git a/src/com/projectkorra/projectkorra/waterbending/SurgeWave.java b/src/com/projectkorra/projectkorra/waterbending/SurgeWave.java index 90611298..4a1807a9 100644 --- a/src/com/projectkorra/projectkorra/waterbending/SurgeWave.java +++ b/src/com/projectkorra/projectkorra/waterbending/SurgeWave.java @@ -18,6 +18,7 @@ import org.bukkit.util.Vector; import com.projectkorra.projectkorra.GeneralMethods; import com.projectkorra.projectkorra.ability.AirAbility; import com.projectkorra.projectkorra.ability.ElementalAbility; +import com.projectkorra.projectkorra.ability.FireAbility; import com.projectkorra.projectkorra.ability.WaterAbility; import com.projectkorra.projectkorra.attribute.Attribute; import com.projectkorra.projectkorra.avatar.AvatarState; @@ -170,7 +171,7 @@ public class SurgeWave extends WaterAbility { } final Block oldBlock = block; - if (!ElementalAbility.isAir(block.getType()) && block.getType() != Material.SNOW && !isWater(block) && !isPlant(block)) { + if (!isAir(block.getType()) && block.getType() != Material.SNOW && !isWater(block) && !isPlant(block)) { continue; } else if (isPlant(block)) { block.breakNaturally(); @@ -293,13 +294,13 @@ public class SurgeWave extends WaterAbility { final Block blockl = this.location.getBlock(); final ArrayList blocks = new ArrayList(); - if (!GeneralMethods.isRegionProtectedFromBuild(this, this.location) && (((ElementalAbility.isAir(blockl.getType()) || blockl.getType() == Material.FIRE || isPlant(blockl) || isWater(blockl) || this.isWaterbendable(this.player, blockl))))) { + if (!GeneralMethods.isRegionProtectedFromBuild(this, this.location) && (((isAir(blockl.getType()) || blockl.getType() == Material.FIRE || isPlant(blockl) || isWater(blockl) || this.isWaterbendable(this.player, blockl))))) { for (double i = 0; i <= this.currentRadius; i += .5) { for (double angle = 0; angle < 360; angle += 10) { final Vector vec = GeneralMethods.getOrthogonalVector(this.targetDirection, angle, i); final Block block = this.location.clone().add(vec).getBlock(); - if (!blocks.contains(block) && (ElementalAbility.isAir(block.getType()) || block.getType() == Material.FIRE) || this.isWaterbendable(block)) { + if (!blocks.contains(block) && (isAir(block.getType()) || isFire(block.getType())) || this.isWaterbendable(block)) { blocks.add(block); FireBlast.removeFireBlastsAroundPoint(block.getLocation(), 2); } diff --git a/src/com/projectkorra/projectkorra/waterbending/plant/PlantRegrowth.java b/src/com/projectkorra/projectkorra/waterbending/plant/PlantRegrowth.java index 8a3a5174..df9fa2de 100644 --- a/src/com/projectkorra/projectkorra/waterbending/plant/PlantRegrowth.java +++ b/src/com/projectkorra/projectkorra/waterbending/plant/PlantRegrowth.java @@ -138,4 +138,4 @@ public class PlantRegrowth extends PlantAbility { this.block = block; } -} +} \ No newline at end of file diff --git a/src/plugin.yml b/src/plugin.yml index b0fc6a94..a7f19c11 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -24,6 +24,7 @@ permissions: bending.ability.AvatarState: true bending.water.bloodbending.anytime: true bending.water.bloodbending: true + bending.fire.bluefire: true bending.ability.Flight: true bending.ability.MetalClips.loot: true bending.ability.MetalClips.4clips: true