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