Adding click command and teleport checks

This commit is contained in:
Dawson
2022-09-04 11:38:52 -04:00
parent f8a41744d1
commit ba00ee166e
8 changed files with 282 additions and 17 deletions
@@ -4,13 +4,18 @@ import dev.brighten.ac.data.APlayer;
import dev.brighten.ac.packet.ProtocolVersion;
import dev.brighten.ac.utils.reflections.impl.MinecraftReflection;
import dev.brighten.ac.utils.reflections.types.WrappedField;
import dev.brighten.ac.utils.world.BlockData;
import dev.brighten.ac.utils.world.CollisionBox;
import dev.brighten.ac.utils.world.types.SimpleCollisionBox;
import lombok.val;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
public class MovementUtils {
@@ -84,6 +89,83 @@ public class MovementUtils {
}
}
public static Location findGroundLocation(APlayer player, int lowestBelow) {
// Player is on the ground, so no need to calculate
if(player.getInfo().isServerGround()) {
return player.getMovement().getTo().getLoc().toLocation(player.getBukkitPlayer().getWorld());
}
int x = MathHelper.floor_double(player.getMovement().getTo().getX()),
startY = MathHelper.floor_double(player.getMovement().getTo().getY()),
z = MathHelper.floor_double(player.getMovement().getTo().getZ());
for(int y = startY ; y > startY - lowestBelow ; y--) {
val block = BlockUtils
.getBlockAsync(new Location(player.getBukkitPlayer().getWorld(), x, y, z));
if(!block.isPresent()) break; //No point in continuing since the one below will still be not present.
if(Materials.checkFlag(block.get().getType(), Materials.SOLID)
&& Materials.checkFlag(block.get().getType(), Materials.LIQUID)) {
CollisionBox box = BlockData.getData(block.get().getType())
.getBox(block.get(), ProtocolVersion.getGameVersion());
if(box instanceof SimpleCollisionBox) {
SimpleCollisionBox sbox = (SimpleCollisionBox) box;
return new Location(block.get().getWorld(), x, sbox.yMax, z);
} else {
List<SimpleCollisionBox> sboxes = new ArrayList<>();
box.downCast(sboxes);
double maxY = sboxes.stream().max(Comparator.comparing(sbox -> sbox.yMax)).map(s -> s.yMax)
.orElse(y + 1.);
return new Location(block.get().getWorld(), x, maxY, z);
}
}
}
return new Location(player.getBukkitPlayer().getWorld(), player.getMovement().getTo().getX(), startY, player.getMovement().getTo().getZ());
}
public static Location findGroundLocation(Location toStart, int lowestBelow) {
// Player is on the ground, so no need to calculate
int x = MathHelper.floor_double(toStart.getX()),
startY = MathHelper.floor_double(toStart.getY()),
z = MathHelper.floor_double(toStart.getZ());
for(int y = startY ; y > startY - lowestBelow ; y--) {
val block = BlockUtils
.getBlockAsync(new Location(toStart.getWorld(), x, y, z));
if(!block.isPresent()) break; //No point in continuing since the one below will still be not present.
if(Materials.checkFlag(block.get().getType(), Materials.SOLID)
&& Materials.checkFlag(block.get().getType(), Materials.LIQUID)) {
CollisionBox box = BlockData.getData(block.get().getType())
.getBox(block.get(), ProtocolVersion.getGameVersion());
if(box instanceof SimpleCollisionBox) {
SimpleCollisionBox sbox = (SimpleCollisionBox) box;
return new Location(block.get().getWorld(), x, sbox.yMax, z);
} else {
List<SimpleCollisionBox> sboxes = new ArrayList<>();
box.downCast(sboxes);
double maxY = sboxes.stream().max(Comparator.comparing(sbox -> sbox.yMax)).map(s -> s.yMax)
.orElse(y + 1.);
return new Location(block.get().getWorld(), x, maxY, z);
}
}
}
return new Location(toStart.getWorld(), toStart.getX(), startY, toStart.getZ());
}
public static float getTotalHeight(float initial) {
return getTotalHeight(ProtocolVersion.V1_8_9, initial);
}