|
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