1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 11:45:51 +00:00

First step towards a task

This commit is contained in:
TheBusyBiscuit 2020-10-18 01:44:32 +02:00
parent 07eba9319a
commit c4bf0ecdd2
2 changed files with 87 additions and 52 deletions

View File

@ -1,18 +1,13 @@
package io.github.thebusybiscuit.slimefun4.implementation.listeners; package io.github.thebusybiscuit.slimefun4.implementation.listeners;
import org.bukkit.HeightMap; import javax.annotation.Nonnull;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import javax.annotation.Nonnull;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
@ -34,56 +29,14 @@ public class BeeWingListener implements Listener {
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onApproachGround(PlayerMoveEvent e) { public void onApproachGround(playe e) {
Player player = e.getPlayer(); Player player = e.getPlayer();
// Checking if the player is even falling.
if (e.getTo().getBlockY() == e.getFrom().getBlockY()) {
return;
}
if (!player.isGliding()) return;
if (player.isOnGround()) return;
if (player.hasPotionEffect(PotionEffectType.SLOW_FALLING)) return;
ItemStack chestplate = player.getInventory().getChestplate(); ItemStack chestplate = player.getInventory().getChestplate();
if (!SlimefunUtils.isItemSimilar(chestplate, SlimefunItems.BEE_WINGS, true) || !Slimefun.hasUnlocked(player, chestplate, true)) { if (!SlimefunUtils.isItemSimilar(chestplate, SlimefunItems.BEE_WINGS, true) || !Slimefun.hasUnlocked(player, chestplate, true)) {
return; return;
} }
Location loc = player.getLocation();
int distanceToHighestBlock = (loc.getBlockY() - player.getWorld().getHighestBlockYAt(loc, HeightMap.WORLD_SURFACE));
// getDistanceToGround will only fire when playerDistanceToHighestBlock is negative (which happens when a player is flying under an existing structure)
if (distanceToHighestBlock < 0) {
int distanceToGround = getDistanceToGround(loc.getBlock(), 6);
if (distanceToGround < 1) return;
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 40, 0));
return;
}
else if (distanceToHighestBlock <= 6) {
player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 40, 0));
}
}
/**
* Calculates the distance of the given {@link Block} from the ground.
*
* @param b
* The {@link Block} to calculate from.
* @param limit
* The limit of {@link Block blocks} to check under the given {@link Block b}.
*
*/
private int getDistanceToGround(@Nonnull Block b, int limit) {
for (int i = 1; i <= limit; i++) {
Block relative = b.getRelative(0, -i, 0);
if (relative.getType().isSolid()) {
return i;
}
}
return 0;
} }
} }

View File

@ -0,0 +1,82 @@
package io.github.thebusybiscuit.slimefun4.implementation.tasks;
import javax.annotation.Nonnull;
import org.bukkit.Bukkit;
import org.bukkit.HeightMap;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public class BeeWingsTask extends PlayerTask {
private Location lastLocation;
public BeeWingsTask(@Nonnull Player p) {
super(p);
lastLocation = p.getLocation();
}
@Override
protected void executeTask() {
if (p.hasPotionEffect(PotionEffectType.SLOW_FALLING)) {
return;
}
if (p.getLocation().getY() < lastLocation.getY()) {
Location loc = p.getLocation();
int distanceToHighestBlock = (loc.getBlockY() - loc.getWorld().getHighestBlockYAt(loc, HeightMap.WORLD_SURFACE));
// getDistanceToGround will only fire when playerDistanceToHighestBlock is negative (which happens when a
// player
// is flying under an existing structure)
if (distanceToHighestBlock < 0) {
int distanceToGround = getDistanceToGround(loc.getBlock(), 6);
if (distanceToGround < 1) {
return;
}
p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 40, 0));
} else if (distanceToHighestBlock <= 6) {
p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 40, 0));
}
}
lastLocation = p.getLocation();
}
/**
* Calculates the distance of the given {@link Block} from the ground.
*
* @param b
* The {@link Block} to calculate from.
* @param limit
* The limit of {@link Block blocks} to check under the given {@link Block b}.
*
*/
private int getDistanceToGround(@Nonnull Block b, int limit) {
for (int i = 1; i <= limit; i++) {
Block relative = b.getRelative(0, -i, 0);
if (relative.getType().isSolid()) {
return i;
}
}
return 0;
}
@Override
protected boolean isValid() {
// The task is only valid as long as the Player is alive and gliding
if (!p.isOnline() || !p.isValid() || p.isDead() || !p.isGliding()) {
Bukkit.getScheduler().cancelTask(id);
return false;
}
return true;
}
}