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.
This commit is contained in:
Vahagn Tovmasian 2020-07-11 22:05:45 -07:00 committed by GitHub
parent c12e0daebb
commit 3c1d6b7b85
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
36 changed files with 419 additions and 426 deletions

View file

@ -65,7 +65,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- lang3 -->

View file

@ -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) {

View file

@ -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<String> addonClone = new CopyOnWriteArrayList<String>(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();
@ -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:

View file

@ -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) {

View file

@ -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<? extends Ability> 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");
}
}

View file

@ -81,6 +81,14 @@ public abstract class ElementalAbility extends CoreAbility {
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;
final double phase = days % 8;

View file

@ -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<Location, Information> TEMP_FIRE = new ConcurrentHashMap<Location, Information>();
private static final Map<Block, Player> SOURCE_PLAYERS = new ConcurrentHashMap<>();
public FireAbility(final Player player) {
super(player);
@ -52,9 +52,16 @@ 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
@ -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")));
}
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());
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());
}
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,9 +156,13 @@ 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) {
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) {
if (getConfig().getBoolean("Properties.Fire.PlaySound")) {
@ -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) {
@ -204,47 +204,12 @@ public abstract class FireAbility extends ElementalAbility {
}
}
/** Removes all temp fire that no longer needs to be there */
public static void removeFire() {
final Iterator<Location> 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<Block, Player> getSourcePlayers() {
return SOURCE_PLAYERS;
}
}

View file

@ -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;

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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());
}

View file

@ -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());

View file

@ -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());

View file

@ -442,6 +442,8 @@ public class ConfigManager {
final ArrayList<String> earthBlocks = new ArrayList<String>();
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<String> metalBlocks = new ArrayList<String>();
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<String> sandBlocks = new ArrayList<String>();
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,6 +649,9 @@ 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);

View file

@ -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<Block, Player> IGNITED_BLOCKS = new ConcurrentHashMap<>();
private static final Map<Block, Long> IGNITED_TIMES = new ConcurrentHashMap<>();
private static final Map<Location, BlockState> 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,77 +86,27 @@ public class BlazeArc extends FireAbility {
final Block ignitable = getIgnitable(block);
if (ignitable != null) {
this.ignite(ignitable);
}
}
}
public static void dissipateAll() {
if (DISSIPATE_REMOVE_TIME != 0) {
for (final Block block : IGNITED_TIMES.keySet()) {
if (block.getType() != Material.FIRE) {
removeBlock(block);
int difference = ignitable.getY() - this.location.getBlockY();
this.location.add(0, difference, 0);
} else {
final long time = IGNITED_TIMES.get(block);
if (System.currentTimeMillis() > time + DISSIPATE_REMOVE_TIME) {
block.setType(Material.AIR);
removeBlock(block);
}
}
}
}
}
public static void handleDissipation() {
for (final Block block : IGNITED_BLOCKS.keySet()) {
if (block.getType() != Material.FIRE) {
IGNITED_BLOCKS.remove(block);
remove();
return;
}
}
}
public static Block getIgnitable(final Block block) {
Block top = block;
public Block getIgnitable(final Block block) {
for (int i = 0; i < 2; i++) {
if (GeneralMethods.isSolid(top.getRelative(BlockFace.DOWN))) {
break;
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];
}
}
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);
}
}
public static void removeAroundPoint(final Location location, final double radius) {
for (final BlazeArc stream : getAbilities(BlazeArc.class)) {
@ -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<Block, Player> getIgnitedBlocks() {
return IGNITED_BLOCKS;
}
public static Map<Block, Long> getIgnitedTimes() {
return IGNITED_TIMES;
}
public static Map<Location, BlockState> getReplacedBlocks() {
return REPLACED_BLOCKS;
}
public void setLocation(final Location location) {
this.location = location;
}

View file

@ -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,13 +72,13 @@ 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();
}
@ -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,19 +135,16 @@ 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)) {
@ -162,21 +178,14 @@ 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());
}
}
}
}
@ -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;
}
}

View file

@ -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;
}

View file

@ -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);
}
}

View file

@ -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) {

View file

@ -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);

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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());
}

View file

@ -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;

View file

@ -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)) {

View file

@ -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();
}

View file

@ -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();
}
}

View file

@ -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));
}
}
}

View file

@ -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;

View file

@ -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) {
public TempBlock(final Block block, final BlockData newData) {
this(block, newData, 0);
}
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()));
}

View file

@ -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)));
}
}

View file

@ -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);

View file

@ -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<Block> blocks = new ArrayList<Block>();
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);
}

View file

@ -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