|
3 | 3 | import com.jedk1.jedcore.JCMethods;
|
4 | 4 | import com.jedk1.jedcore.JedCore;
|
5 | 5 | import com.jedk1.jedcore.configuration.JedCoreConfig;
|
6 |
| -import com.jedk1.jedcore.util.RegenTempBlock; |
7 | 6 | import com.projectkorra.projectkorra.GeneralMethods;
|
8 | 7 | import com.projectkorra.projectkorra.ability.AddonAbility;
|
9 | 8 | import com.projectkorra.projectkorra.ability.ElementalAbility;
|
|
15 | 14 |
|
16 | 15 | import org.bukkit.Location;
|
17 | 16 | import org.bukkit.Material;
|
| 17 | +import org.bukkit.World; |
18 | 18 | import org.bukkit.block.Block;
|
19 | 19 | import org.bukkit.block.BlockFace;
|
20 | 20 | import org.bukkit.block.data.Levelled;
|
|
27 | 27 | import java.util.ArrayList;
|
28 | 28 | import java.util.Arrays;
|
29 | 29 | import java.util.HashMap;
|
| 30 | +import java.util.HashSet; |
30 | 31 | import java.util.List;
|
31 | 32 | import java.util.Random;
|
| 33 | +import java.util.Set; |
32 | 34 |
|
33 | 35 | public class Drain extends WaterAbility implements AddonAbility {
|
34 | 36 |
|
35 | 37 | private final List<Location> locations = new ArrayList<>();
|
| 38 | + static final Set<TempBlock> WATER_TEMPS = new HashSet<>(); |
36 | 39 |
|
37 | 40 | //Savannas are 1.0 temp with 0 humidity. Deserts are 2.0 temp with 0 humidity.
|
38 | 41 | private static float MAX_TEMP = 1.0F;
|
@@ -107,10 +110,10 @@ public void setFields() {
|
107 | 110 | blastSpeed = config.getDouble("Abilities.Water.Drain.BlastSpeed");
|
108 | 111 | useRain = config.getBoolean("Abilities.Water.Drain.AllowRainSource");
|
109 | 112 | drainTemps = config.getBoolean("Abilities.Water.Drain.DrainTempBlocks");
|
110 |
| - |
| 113 | + |
111 | 114 | applyModifiers();
|
112 | 115 | }
|
113 |
| - |
| 116 | + |
114 | 117 | private void applyModifiers() {
|
115 | 118 | if (isNight(player.getWorld())) {
|
116 | 119 | cooldown -= ((long) getNightFactor(cooldown) - cooldown);
|
@@ -197,9 +200,11 @@ private void fireBlast() {
|
197 | 200 |
|
198 | 201 | private void displayWaterSource() {
|
199 | 202 | Location location = player.getEyeLocation().add(player.getLocation().getDirection().multiply(holdRange));
|
200 |
| - if (!GeneralMethods.isSolid(location.getBlock()) || isTransparent(location.getBlock())) { |
201 |
| - Block block = location.getBlock(); |
202 |
| - new RegenTempBlock(block, Material.WATER, Material.WATER.createBlockData(bd -> ((Levelled)bd).setLevel(charge)), 100L); |
| 203 | + Block block = location.getBlock(); |
| 204 | + if (!GeneralMethods.isSolid(block) || isTransparent(block)) { |
| 205 | + TempBlock tb = new TempBlock(block, Material.WATER.createBlockData(bd -> ((Levelled) bd).setLevel(charge)), 100L); |
| 206 | + WATER_TEMPS.add(tb); |
| 207 | + tb.setRevertTask(() -> WATER_TEMPS.remove(tb)); |
203 | 208 | }
|
204 | 209 | }
|
205 | 210 |
|
@@ -250,25 +255,29 @@ private void checkForValidSource() {
|
250 | 255 | List<Location> locs = GeneralMethods.getCircle(player.getLocation(), radius, radius, false, true, 0);
|
251 | 256 | for (int i = 0; i < locs.size(); i++) {
|
252 | 257 | Block block = locs.get(rand.nextInt(locs.size()-1)).getBlock();
|
253 |
| - if (block.getY() > block.getWorld().getMinHeight() && block.getY() < block.getWorld().getMaxHeight()) { |
254 |
| - if (rand.nextInt(chance) == 0) { |
255 |
| - double temp = player.getLocation().getWorld().getTemperature(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()); |
256 |
| - double humidity = player.getLocation().getWorld().getHumidity(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()); |
257 |
| - if (useRain && player.getWorld().hasStorm() && !(temp >= MAX_TEMP || humidity <= MIN_HUMIDITY)) { |
258 |
| - if (player.getLocation().getY() >= player.getWorld().getHighestBlockAt(player.getLocation()).getLocation().getY()) { |
259 |
| - if (block.getLocation().getY() >= player.getWorld().getHighestBlockAt(player.getLocation()).getLocation().getY()) { |
260 |
| - locations.add(block.getLocation().clone().add(.5, .5, .5)); |
| 258 | + if (rand.nextInt(chance) == 0) { |
| 259 | + Location pLoc = player.getLocation(); |
| 260 | + World world = pLoc.getWorld(); |
| 261 | + double temp = world.getTemperature(pLoc.getBlockX(), pLoc.getBlockY(), pLoc.getBlockZ()); |
| 262 | + double humidity = world.getHumidity(pLoc.getBlockX(), pLoc.getBlockY(), pLoc.getBlockZ()); |
| 263 | + if (block.getY() > world.getMinHeight() && block.getY() < world.getMaxHeight()) { |
| 264 | + Location bLoc = block.getLocation(); |
| 265 | + if (useRain && world.hasStorm() && !(temp >= MAX_TEMP || humidity <= MIN_HUMIDITY)) { |
| 266 | + if (pLoc.getY() >= world.getHighestBlockAt(pLoc).getLocation().getY()) { |
| 267 | + if (bLoc.getY() >= world.getHighestBlockAt(pLoc).getLocation().getY()) { |
| 268 | + locations.add(bLoc.clone().add(.5, .5, .5)); |
261 | 269 | return;
|
262 | 270 | }
|
263 | 271 | }
|
264 | 272 | }
|
265 |
| - if (usePlants && JCMethods.isSmallPlant(block) && !isObstructed(block.getLocation(), player.getEyeLocation())) { |
| 273 | + if (usePlants && JCMethods.isSmallPlant(block) && !isObstructed(bLoc, player.getEyeLocation())) { |
266 | 274 | drainPlant(block);
|
267 |
| - } else if(usePlants && ElementalAbility.isPlant(block) && !isObstructed(block.getLocation(), player.getEyeLocation())) { |
268 |
| - locations.add(block.getLocation().clone().add(.5, .5, .5)); |
269 |
| - new RegenTempBlock(block, Material.AIR, Material.AIR.createBlockData(), regenDelay); |
| 275 | + } else if (usePlants && ElementalAbility.isPlant(block) && !isObstructed(bLoc, player.getEyeLocation())) { |
| 276 | + locations.add(bLoc.clone().add(.5, .5, .5)); |
| 277 | + new TempBlock(block, Material.AIR.createBlockData(), regenDelay); |
270 | 278 | } else if (isWater(block)) {
|
271 |
| - if (drainTemps || !TempBlock.isTempBlock(block)) { |
| 279 | + TempBlock tb = TempBlock.get(block); |
| 280 | + if ((tb == null || (drainTemps && !WATER_TEMPS.contains(tb)))) { |
272 | 281 | drainWater(block);
|
273 | 282 | }
|
274 | 283 | }
|
@@ -303,23 +312,25 @@ private void drainPlant(Block block) {
|
303 | 312 | if (JCMethods.isDoublePlant(block.getType())) {
|
304 | 313 | block = block.getRelative(BlockFace.DOWN);
|
305 | 314 | locations.add(block.getLocation().clone().add(.5, .5, .5));
|
306 |
| - new RegenTempBlock(block, Material.DEAD_BUSH, Material.DEAD_BUSH.createBlockData(), regenDelay); |
| 315 | + new TempBlock(block, Material.DEAD_BUSH.createBlockData(), regenDelay); |
307 | 316 | return;
|
308 | 317 | }
|
309 | 318 | block = block.getRelative(BlockFace.DOWN);
|
310 | 319 | }
|
311 | 320 | locations.add(block.getLocation().clone().add(.5, .5, .5));
|
312 |
| - new RegenTempBlock(block, Material.DEAD_BUSH, Material.DEAD_BUSH.createBlockData(), regenDelay); |
| 321 | + new TempBlock(block, Material.DEAD_BUSH.createBlockData(), regenDelay); |
313 | 322 | }
|
314 | 323 | }
|
315 | 324 |
|
316 | 325 | private void drainWater(Block block) {
|
317 | 326 | if (isTransparent(block.getRelative(BlockFace.UP)) && !isWater(block.getRelative(BlockFace.UP))) {
|
318 | 327 | locations.add(block.getLocation().clone().add(.5, .5, .5));
|
319 | 328 | if (block.getBlockData() instanceof Waterlogged) {
|
320 |
| - new RegenTempBlock(block, block.getBlockData().getMaterial(), block.getBlockData().getMaterial().createBlockData(bd -> ((Waterlogged) bd).setWaterlogged(false)), regenDelay); |
| 329 | + new TempBlock(block, block.getType().createBlockData(bd -> ((Waterlogged) bd).setWaterlogged(false)), regenDelay); |
321 | 330 | } else {
|
322 |
| - new RegenTempBlock(block, Material.WATER, Material.WATER.createBlockData(bd -> ((Levelled) bd).setLevel(1)), regenDelay); |
| 331 | + TempBlock tb = new TempBlock(block, Material.WATER.createBlockData(bd -> ((Levelled) bd).setLevel(1)), regenDelay); |
| 332 | + WATER_TEMPS.add(tb); |
| 333 | + tb.setRevertTask(() -> WATER_TEMPS.remove(tb)); |
323 | 334 | }
|
324 | 335 | }
|
325 | 336 | }
|
|
0 commit comments