mirror of
https://github.com/TotalFreedomMC/TF-ProjectKorra.git
synced 2025-02-14 04:47:51 +00:00
Improved Earth Dynamic Sourcing
This commit is contained in:
parent
c56bd64be4
commit
c446f320f5
1 changed files with 94 additions and 43 deletions
|
@ -2,6 +2,7 @@ package com.projectkorra.ProjectKorra.Utilities;
|
|||
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -12,21 +13,18 @@ import com.projectkorra.ProjectKorra.earthbending.EarthMethods;
|
|||
import com.projectkorra.ProjectKorra.waterbending.WaterMethods;
|
||||
|
||||
/**
|
||||
* BlockSource is a class that handles water and earth bending sources.
|
||||
* When a Player left clicks or presses shift the update method is called
|
||||
* which attempts to update the player's sources.
|
||||
* BlockSource is a class that handles water and earth bending sources. When a Player left clicks or
|
||||
* presses shift the update method is called which attempts to update the player's sources.
|
||||
*
|
||||
* In this class ClickType refers to the way in which the source was selected.
|
||||
* For example, Surge has two different ways to select a source, one involving shift and
|
||||
* another involving left clicks.
|
||||
* In this class ClickType refers to the way in which the source was selected. For example, Surge
|
||||
* has two different ways to select a source, one involving shift and another involving left clicks.
|
||||
*/
|
||||
public class BlockSource {
|
||||
public static enum BlockSourceType {
|
||||
WATER, ICE, PLANT, EARTH, METAL, LAVA
|
||||
}
|
||||
|
||||
private static HashMap<Player, HashMap<BlockSourceType, HashMap<ClickType, BlockSourceInformation>>> playerSources =
|
||||
new HashMap<Player, HashMap<BlockSourceType, HashMap<ClickType, BlockSourceInformation>>>();
|
||||
private static HashMap<Player, HashMap<BlockSourceType, HashMap<ClickType, BlockSourceInformation>>> playerSources = new HashMap<Player, HashMap<BlockSourceType, HashMap<ClickType, BlockSourceInformation>>>();
|
||||
private static FileConfiguration config = ProjectKorra.plugin.getConfig();
|
||||
// The player should never need to grab source blocks from farther than this.
|
||||
private static double MAX_RANGE = config.getDouble("Abilities.Water.WaterManipulation.Range");
|
||||
|
@ -61,14 +59,14 @@ public class BlockSource {
|
|||
putSource(player, earthBlock, BlockSourceType.METAL, clickType);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// We need to handle lava differently, since getEarthSourceBlock doesn't account for
|
||||
// lava. We should only select the lava source if it is closer than the earth.
|
||||
Block lavaBlock = EarthMethods.getLavaSourceBlock(player, MAX_RANGE);
|
||||
double earthDist = earthBlock != null ?
|
||||
earthBlock.getLocation().distanceSquared(player.getLocation()) : Double.MAX_VALUE;
|
||||
double lavaDist = lavaBlock != null ?
|
||||
lavaBlock.getLocation().distanceSquared(player.getLocation()) : Double.MAX_VALUE;
|
||||
double earthDist = earthBlock != null ? earthBlock.getLocation().distanceSquared(player.getLocation())
|
||||
: Double.MAX_VALUE;
|
||||
double lavaDist = lavaBlock != null ? lavaBlock.getLocation().distanceSquared(player.getLocation())
|
||||
: Double.MAX_VALUE;
|
||||
if (lavaBlock != null && lavaDist <= earthDist) {
|
||||
putSource(player, null, BlockSourceType.EARTH, clickType);
|
||||
putSource(player, lavaBlock, BlockSourceType.LAVA, clickType);
|
||||
|
@ -94,18 +92,17 @@ public class BlockSource {
|
|||
BlockSourceInformation info = new BlockSourceInformation(player, block, sourceType, clickType);
|
||||
playerSources.get(player).get(sourceType).put(clickType, info);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Access a block source information depending on a range and click type.
|
||||
* Access a block source information depending on a source and click type.
|
||||
*
|
||||
* @param player the player that is trying to bend.
|
||||
* @param range the maximum range to access the block.
|
||||
* @param clickType the action that was performed to access the source, either
|
||||
* ClickType.SHIFT_DOWN or ClickType.LEFT_CLICK.
|
||||
* @return a valid bendable block, or null if none was found.
|
||||
*/
|
||||
public static BlockSourceInformation getBlockSourceInformation(Player player, double range,
|
||||
BlockSourceType sourceType, ClickType clickType) {
|
||||
public static BlockSourceInformation getBlockSourceInformation(Player player, BlockSourceType sourceType,
|
||||
ClickType clickType) {
|
||||
if (!playerSources.containsKey(player)) {
|
||||
return null;
|
||||
} else if (!playerSources.get(player).containsKey(sourceType)) {
|
||||
|
@ -113,21 +110,37 @@ public class BlockSource {
|
|||
} else if (!playerSources.get(player).get(sourceType).containsKey(clickType)) {
|
||||
return null;
|
||||
}
|
||||
BlockSourceInformation blockInfo = playerSources.get(player).get(sourceType).get(clickType);
|
||||
return isStillAValidSource(blockInfo, range, clickType) ? blockInfo : null;
|
||||
return playerSources.get(player).get(sourceType).get(clickType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Access a block source information depending on a range, source, and click type.
|
||||
*
|
||||
* @param player the player that is trying to bend.
|
||||
* @param range the maximum range to access the block.
|
||||
* @param sourceType the elemental type of block to find.
|
||||
* @param clickType the action that was performed to access the source, either
|
||||
* ClickType.SHIFT_DOWN or ClickType.LEFT_CLICK.
|
||||
* @return a valid bendable block, or null if none was found.
|
||||
*/
|
||||
public static BlockSourceInformation getValidBlockSourceInformation(Player player, double range, BlockSourceType sourceType,
|
||||
ClickType clickType) {
|
||||
BlockSourceInformation blockInfo = getBlockSourceInformation(player, sourceType, clickType);
|
||||
return isStillAValidSource(blockInfo, range, clickType) ? blockInfo : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Access a specific type of source block depending on a range and click type.
|
||||
*
|
||||
* @param player the player that is trying to bend.
|
||||
* @param range the maximum range to access the block.
|
||||
* @param sourceType the elemental type of block to find.
|
||||
* @param clickType the action that was performed to access the source, either
|
||||
* ClickType.SHIFT_DOWN or ClickType.LEFT_CLICK.
|
||||
* @return a valid bendable block, or null if none was found.
|
||||
*/
|
||||
public static Block getSourceBlock(Player player, double range, BlockSourceType sourceType, ClickType clickType) {
|
||||
BlockSourceInformation info = getBlockSourceInformation(player, range, sourceType, clickType);
|
||||
BlockSourceInformation info = getValidBlockSourceInformation(player, range, sourceType, clickType);
|
||||
return info != null ? info.getBlock() : null;
|
||||
}
|
||||
|
||||
|
@ -189,7 +202,7 @@ public class BlockSource {
|
|||
boolean allowIce, boolean allowPlant) {
|
||||
return getWaterSourceBlock(player, range, clickType, allowWater, allowIce, allowPlant, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to access a Water bendable block that was recently shifted or clicked on by the
|
||||
* player.
|
||||
|
@ -201,15 +214,16 @@ public class BlockSource {
|
|||
* @param allowWater true if water blocks are allowed.
|
||||
* @param allowIce true if ice blocks are allowed.
|
||||
* @param allowPlant true if plant blocks are allowed.
|
||||
* @param allowWaterBottles true if we should look for a close water block, that may have
|
||||
* been created by a WaterBottle.
|
||||
* @param allowWaterBottles true if we should look for a close water block, that may have been
|
||||
* created by a WaterBottle.
|
||||
* @return a valid Water bendable block, or null if none was found.
|
||||
*/
|
||||
public static Block getWaterSourceBlock(Player player, double range, ClickType clickType, boolean allowWater,
|
||||
boolean allowIce, boolean allowPlant, boolean allowWaterBottles) {
|
||||
Block sourceBlock = null;
|
||||
if (allowWaterBottles) {
|
||||
// Check the block in front of the player's eyes, it may have been created by a WaterBottle.
|
||||
// Check the block in front of the player's eyes, it may have been created by a
|
||||
// WaterBottle.
|
||||
sourceBlock = WaterMethods.getWaterSourceBlock(player, range, allowPlant);
|
||||
if (sourceBlock == null || sourceBlock.getLocation().distance(player.getEyeLocation()) > 3) {
|
||||
sourceBlock = null;
|
||||
|
@ -226,7 +240,7 @@ public class BlockSource {
|
|||
}
|
||||
return sourceBlock;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to access a Earth bendable block that was recently shifted or clicked on by the
|
||||
* player.
|
||||
|
@ -238,9 +252,47 @@ public class BlockSource {
|
|||
* @return a valid Earth bendable block, or null if none was found.
|
||||
*/
|
||||
public static Block getEarthSourceBlock(Player player, double range, ClickType clickType) {
|
||||
return getSourceBlock(player, range, BlockSourceType.EARTH, clickType);
|
||||
return getEarthSourceBlock(player, range, clickType, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to access a Earth bendable block that was recently shifted or clicked on by the
|
||||
* player.
|
||||
*
|
||||
* @param player the player that is trying to bend.
|
||||
* @param range the maximum range to access the block.
|
||||
* @param clickType the action that was performed to access the source, either
|
||||
* ClickType.SHIFT_DOWN or ClickType.LEFT_CLICK.
|
||||
* @param allowNearbySubstitute if a valid earth source could not be found then this method will
|
||||
* attempt to find a nearby valid earth block.
|
||||
* @return a valid Earth bendable block, or null if none was found.
|
||||
*/
|
||||
public static Block getEarthSourceBlock(Player player, double range, ClickType clickType,
|
||||
boolean allowNearbySubstitute) {
|
||||
Block sourceBlock = getSourceBlock(player, range, BlockSourceType.EARTH, clickType);
|
||||
if (sourceBlock == null && allowNearbySubstitute) {
|
||||
BlockSourceInformation blockInfo = getBlockSourceInformation(player,
|
||||
BlockSourceType.EARTH, clickType);
|
||||
|
||||
if (blockInfo == null) {
|
||||
return null;
|
||||
}
|
||||
Block tempBlock = blockInfo.getBlock();
|
||||
if (tempBlock == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Location loc = tempBlock.getLocation();
|
||||
sourceBlock = EarthMethods.getNearbyEarthBlock(loc, 3, 3);
|
||||
if (sourceBlock == null
|
||||
|| Math.abs(sourceBlock.getLocation().distance(player.getEyeLocation())) > range
|
||||
|| !EarthMethods.isEarthbendable(player, sourceBlock)) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return sourceBlock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to access a Lava bendable block that was recently shifted or clicked on by the
|
||||
* player.
|
||||
|
@ -254,10 +306,10 @@ public class BlockSource {
|
|||
public static Block getLavaSourceBlock(Player player, double range, ClickType clickType) {
|
||||
return getSourceBlock(player, range, BlockSourceType.LAVA, clickType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to access a Lava bendable block or an Earth block that was recently shifted or clicked on by the
|
||||
* player.
|
||||
* Attempts to access a Lava bendable block or an Earth block that was recently shifted or
|
||||
* clicked on by the player.
|
||||
*
|
||||
* @param player the player that is trying to bend.
|
||||
* @param range the maximum range to access the block.
|
||||
|
@ -266,21 +318,20 @@ public class BlockSource {
|
|||
* @return a valid Earth or Lava bendable block, or null if none was found.
|
||||
*/
|
||||
public static Block getEarthOrLavaSourceBlock(Player player, double range, ClickType clickType) {
|
||||
BlockSourceInformation earthBlockInfo = getBlockSourceInformation(player, range, BlockSourceType.EARTH, clickType);
|
||||
BlockSourceInformation lavaBlockInfo = getBlockSourceInformation(player, range, BlockSourceType.LAVA, clickType);
|
||||
if (earthBlockInfo == null && lavaBlockInfo == null) {
|
||||
return null;
|
||||
} else if (earthBlockInfo == null && lavaBlockInfo != null) {
|
||||
return lavaBlockInfo.getBlock();
|
||||
} else if (earthBlockInfo != null && lavaBlockInfo == null) {
|
||||
return earthBlockInfo.getBlock();
|
||||
} else if (earthBlockInfo.getCreationTime() <= lavaBlockInfo.getCreationTime()) {
|
||||
return earthBlockInfo.getBlock();
|
||||
} else {
|
||||
/*
|
||||
* When Lava is selected as a source it automatically overrides the previous Earth based source.
|
||||
* Only one of these types can exist, so if Lava exists then we know Earth is null.
|
||||
*/
|
||||
Block earthBlock = getEarthSourceBlock(player, range, clickType);
|
||||
BlockSourceInformation lavaBlockInfo = getValidBlockSourceInformation(player, range, BlockSourceType.LAVA, clickType);
|
||||
if (earthBlock != null) {
|
||||
return earthBlock;
|
||||
} else if (lavaBlockInfo != null) {
|
||||
return lavaBlockInfo.getBlock();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determines if a BlockSourceInformation is valid, depending on the players range from the
|
||||
* source, and if the source has not been modified since the time that it was first created.
|
||||
|
|
Loading…
Reference in a new issue