mirror of
https://github.com/TotalFreedomMC/TF-ProjectKorra.git
synced 2025-02-11 11:40:40 +00:00
Waterbending Methods
Some methods for the Waterbending abilities.
This commit is contained in:
parent
219b1868bd
commit
0180332f4e
3 changed files with 303 additions and 0 deletions
|
@ -5,5 +5,8 @@
|
||||||
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/Bending Plugins/TagAPI.jar"/>
|
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/Bending Plugins/TagAPI.jar"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/LocalServer/plugins/ProjectKorra/Abilities/RaiseEarth.jar"/>
|
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/LocalServer/plugins/ProjectKorra/Abilities/RaiseEarth.jar"/>
|
||||||
|
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/LocalServer/plugins/ProjectKorra/Abilities/WaterManipulation.jar"/>
|
||||||
|
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/LocalServer/plugins/ProjectKorra/Abilities/OctopusForm.jar"/>
|
||||||
|
<classpathentry kind="lib" path="C:/Users/Shawn/Documents/LocalServer/plugins/ProjectKorra/Abilities/PhaseChange.jar"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -13,6 +13,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
|
import org.bukkit.Effect;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
@ -31,6 +32,7 @@ import org.bukkit.util.Vector;
|
||||||
import com.projectkorra.ProjectKorra.Ability.AbilityModule;
|
import com.projectkorra.ProjectKorra.Ability.AbilityModule;
|
||||||
import com.projectkorra.ProjectKorra.Ability.AbilityModuleManager;
|
import com.projectkorra.ProjectKorra.Ability.AbilityModuleManager;
|
||||||
import com.projectkorra.ProjectKorra.earthbending.EarthPassive;
|
import com.projectkorra.ProjectKorra.earthbending.EarthPassive;
|
||||||
|
import com.projectkorra.abilities.PhaseChange.FreezeMelt;
|
||||||
import com.projectkorra.abilities.RaiseEarth.EarthColumn;
|
import com.projectkorra.abilities.RaiseEarth.EarthColumn;
|
||||||
|
|
||||||
public class Methods {
|
public class Methods {
|
||||||
|
@ -483,6 +485,75 @@ public class Methods {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Block getWaterSourceBlock(Player player, double range,
|
||||||
|
boolean plantbending) {
|
||||||
|
Location location = player.getEyeLocation();
|
||||||
|
Vector vector = location.getDirection().clone().normalize();
|
||||||
|
for (double i = 0; i <= range; i++) {
|
||||||
|
Block block = location.clone().add(vector.clone().multiply(i))
|
||||||
|
.getBlock();
|
||||||
|
// if (isRegionProtectedFromBuild(player, Abilities.WaterManipulation,
|
||||||
|
// location))
|
||||||
|
// continue;
|
||||||
|
if (isWaterbendable(block, player)
|
||||||
|
&& (!isPlant(block) || plantbending)) {
|
||||||
|
if (TempBlock.isTempBlock(block)) {
|
||||||
|
TempBlock tb = TempBlock.get(block);
|
||||||
|
byte full = 0x0;
|
||||||
|
if (tb.state.getRawData() != full
|
||||||
|
&& (tb.state.getType() != Material.WATER || tb.state
|
||||||
|
.getType() != Material.STATIONARY_WATER)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isObstructed(Location location1, Location location2) {
|
||||||
|
Vector loc1 = location1.toVector();
|
||||||
|
Vector loc2 = location2.toVector();
|
||||||
|
|
||||||
|
Vector direction = loc2.subtract(loc1);
|
||||||
|
direction.normalize();
|
||||||
|
|
||||||
|
Location loc;
|
||||||
|
|
||||||
|
double max = location1.distance(location2);
|
||||||
|
|
||||||
|
for (double i = 0; i <= max; i++) {
|
||||||
|
loc = location1.clone().add(direction.clone().multiply(i));
|
||||||
|
Material type = loc.getBlock().getType();
|
||||||
|
if (type != Material.AIR
|
||||||
|
&& !Arrays.asList(transparentToEarthbending).contains(
|
||||||
|
type.getId()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAdjacentToFrozenBlock(Block block) {
|
||||||
|
BlockFace[] faces = { BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH,
|
||||||
|
BlockFace.EAST, BlockFace.WEST, BlockFace.SOUTH };
|
||||||
|
boolean adjacent = false;
|
||||||
|
if (Methods.isAbilityInstalled("PhaseChange", "orion304")) {
|
||||||
|
for (BlockFace face : faces) {
|
||||||
|
if (FreezeMelt.frozenblocks.containsKey((block.getRelative(face))))
|
||||||
|
adjacent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return adjacent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void playFocusWaterEffect(Block block) {
|
||||||
|
block.getWorld().playEffect(block.getLocation(), Effect.SMOKE, 4, 20);
|
||||||
|
}
|
||||||
|
|
||||||
public static void removeRevertIndex(Block block) {
|
public static void removeRevertIndex(Block block) {
|
||||||
if (movedearth.containsKey(block)) {
|
if (movedearth.containsKey(block)) {
|
||||||
Information info = movedearth.get(block);
|
Information info = movedearth.get(block);
|
||||||
|
|
229
src/com/projectkorra/ProjectKorra/waterbending/WaterReturn.java
Normal file
229
src/com/projectkorra/ProjectKorra/waterbending/WaterReturn.java
Normal file
|
@ -0,0 +1,229 @@
|
||||||
|
package com.projectkorra.ProjectKorra.waterbending;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
|
import com.projectkorra.ProjectKorra.Methods;
|
||||||
|
import com.projectkorra.ProjectKorra.TempBlock;
|
||||||
|
import com.projectkorra.abilities.OctopusForm.OctopusFormAbility;
|
||||||
|
import com.projectkorra.abilities.WaterManipulation.WaterManipulationAbility;
|
||||||
|
|
||||||
|
public class WaterReturn {
|
||||||
|
|
||||||
|
private static ConcurrentHashMap<Player, WaterReturn> instances = new ConcurrentHashMap<Player, WaterReturn>();
|
||||||
|
// private static int ID = Integer.MIN_VALUE;
|
||||||
|
private static long interval = 50;
|
||||||
|
|
||||||
|
private static final byte full = 0x0;
|
||||||
|
private static double range = 30;
|
||||||
|
|
||||||
|
private Player player;
|
||||||
|
// private int id;
|
||||||
|
private Location location;
|
||||||
|
private TempBlock block;
|
||||||
|
private long time;
|
||||||
|
|
||||||
|
public WaterReturn(Player player, Block block) {
|
||||||
|
if (instances.containsKey(player))
|
||||||
|
return;
|
||||||
|
this.player = player;
|
||||||
|
location = block.getLocation();
|
||||||
|
// if (!Tools.isRegionProtectedFromBuild(player,
|
||||||
|
// Abilities.WaterManipulation, location)
|
||||||
|
// && Tools.canBend(player, Abilities.WaterManipulation)) {
|
||||||
|
if (Methods.isAbilityInstalled("WaterManipulation", "orion304") && Methods.canBend(player.getName(), "WaterManipulation")) {
|
||||||
|
if (Methods.isTransparentToEarthbending(player, block)
|
||||||
|
&& !block.isLiquid())
|
||||||
|
this.block = new TempBlock(block, Material.WATER, full);
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
// if (ID >= Integer.MAX_VALUE) {
|
||||||
|
// ID = Integer.MIN_VALUE;
|
||||||
|
// }
|
||||||
|
// id = ID++;
|
||||||
|
instances.put(player, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void progress() {
|
||||||
|
if (!hasEmptyWaterBottle()) {
|
||||||
|
remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.isDead() || !player.isOnline()) {
|
||||||
|
remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player.getWorld() != location.getWorld()) {
|
||||||
|
remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (System.currentTimeMillis() < time + interval)
|
||||||
|
return;
|
||||||
|
|
||||||
|
time = System.currentTimeMillis();
|
||||||
|
|
||||||
|
Vector direction = Methods
|
||||||
|
.getDirection(location, player.getEyeLocation()).normalize();
|
||||||
|
location = location.clone().add(direction);
|
||||||
|
|
||||||
|
if (location == null || block == null) {
|
||||||
|
remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (location.getBlock().equals(block.getLocation().getBlock()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// if (Tools.isRegionProtectedFromBuild(player,
|
||||||
|
// Abilities.WaterManipulation, location)) {
|
||||||
|
// remove();
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (location.distance(player.getEyeLocation()) > Methods
|
||||||
|
.waterbendingNightAugment(range, player.getWorld())) {
|
||||||
|
remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (location.distance(player.getEyeLocation()) <= 1.5) {
|
||||||
|
fillBottle();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Block newblock = location.getBlock();
|
||||||
|
if (Methods.isTransparentToEarthbending(player, newblock)
|
||||||
|
&& !newblock.isLiquid()) {
|
||||||
|
block.revertBlock();
|
||||||
|
block = new TempBlock(newblock, Material.WATER, full);
|
||||||
|
} else {
|
||||||
|
remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void remove() {
|
||||||
|
if (block != null) {
|
||||||
|
block.revertBlock();
|
||||||
|
block = null;
|
||||||
|
}
|
||||||
|
instances.remove(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasEmptyWaterBottle() {
|
||||||
|
PlayerInventory inventory = player.getInventory();
|
||||||
|
if (inventory.contains(Material.GLASS_BOTTLE)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillBottle() {
|
||||||
|
PlayerInventory inventory = player.getInventory();
|
||||||
|
if (inventory.contains(Material.GLASS_BOTTLE)) {
|
||||||
|
int index = inventory.first(Material.GLASS_BOTTLE);
|
||||||
|
ItemStack item = inventory.getItem(index);
|
||||||
|
if (item.getAmount() == 1) {
|
||||||
|
inventory.setItem(index, new ItemStack(Material.POTION));
|
||||||
|
} else {
|
||||||
|
item.setAmount(item.getAmount() - 1);
|
||||||
|
inventory.setItem(index, item);
|
||||||
|
HashMap<Integer, ItemStack> leftover = inventory
|
||||||
|
.addItem(new ItemStack(Material.POTION));
|
||||||
|
for (int left : leftover.keySet()) {
|
||||||
|
player.getWorld().dropItemNaturally(player.getLocation(),
|
||||||
|
leftover.get(left));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isBending(Player player) {
|
||||||
|
if (Methods.isAbilityInstalled("WaterManipulation", "orion304")) {
|
||||||
|
for (int id : WaterManipulationAbility .instances.keySet()) {
|
||||||
|
if (WaterManipulationAbility.instances.get(id).player.equals(player))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Methods.isAbilityInstalled("OctopusForm", "orion304")) {
|
||||||
|
if (OctopusFormAbility.instances.containsKey(player))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (Methods.isAbilityInstalled("Surge", "orion304")) {
|
||||||
|
for (int id : Wave.instances.keySet()) {
|
||||||
|
if (Wave.instances.get(id).player.equals(player))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int id : WaterWall.instances.keySet()) {
|
||||||
|
if (WaterWall.instances.get(id).player.equals(player))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Methods.isAbilityInstalled("IceSpike", "orion304")) {
|
||||||
|
if (IceSpike2.isBending(player))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasWaterBottle(Player player) {
|
||||||
|
if (instances.containsKey(player))
|
||||||
|
return false;
|
||||||
|
if (isBending(player))
|
||||||
|
return false;
|
||||||
|
PlayerInventory inventory = player.getInventory();
|
||||||
|
return (inventory.contains(new ItemStack(Material.POTION), 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void emptyWaterBottle(Player player) {
|
||||||
|
PlayerInventory inventory = player.getInventory();
|
||||||
|
int index = inventory.first(new ItemStack(Material.POTION));
|
||||||
|
if (index != -1) {
|
||||||
|
ItemStack item = inventory.getItem(index);
|
||||||
|
if (item.getAmount() == 1) {
|
||||||
|
inventory.setItem(index, new ItemStack(Material.GLASS_BOTTLE));
|
||||||
|
} else {
|
||||||
|
item.setAmount(item.getAmount() - 1);
|
||||||
|
inventory.setItem(index, item);
|
||||||
|
HashMap<Integer, ItemStack> leftover = inventory
|
||||||
|
.addItem(new ItemStack(Material.GLASS_BOTTLE));
|
||||||
|
for (int left : leftover.keySet()) {
|
||||||
|
player.getWorld().dropItemNaturally(player.getLocation(),
|
||||||
|
leftover.get(left));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void progressAll() {
|
||||||
|
for (Player player : instances.keySet()) {
|
||||||
|
instances.get(player).progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeAll() {
|
||||||
|
for (Player player : instances.keySet()) {
|
||||||
|
WaterReturn wr = instances.get(player);
|
||||||
|
if (wr.block != null)
|
||||||
|
wr.block.revertBlock();
|
||||||
|
}
|
||||||
|
instances.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue