Fixes + improve standingon
-Blocks standing on is now a list -Fixed a stuck issue when clipping into walls
This commit is contained in:
@@ -12,6 +12,7 @@ import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface Terminator {
|
||||
@@ -52,7 +53,7 @@ public interface Terminator {
|
||||
|
||||
boolean isBotOnGround();
|
||||
|
||||
Block getStandingOn();
|
||||
List<Block> getStandingOn();
|
||||
|
||||
void setBotPitch(float pitch);
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import net.nuggetmc.tplus.api.event.BotDamageByPlayerEvent;
|
||||
import net.nuggetmc.tplus.api.event.BotDeathEvent;
|
||||
import net.nuggetmc.tplus.api.event.BotFallDamageEvent;
|
||||
import net.nuggetmc.tplus.api.event.TerminatorLocateTargetEvent;
|
||||
import net.nuggetmc.tplus.api.utils.BotUtils;
|
||||
import net.nuggetmc.tplus.api.utils.MathUtils;
|
||||
import net.nuggetmc.tplus.api.utils.PlayerUtils;
|
||||
import org.bukkit.*;
|
||||
@@ -444,6 +445,71 @@ public class LegacyAgent extends Agent {
|
||||
BlockFace dir = player.getFacing();
|
||||
LegacyLevel level = null;
|
||||
Block get = null;
|
||||
|
||||
BoundingBox box = player.getBoundingBox();
|
||||
double[] xVals = new double[]{
|
||||
box.getMinX(),
|
||||
box.getMaxX() - 0.01
|
||||
};
|
||||
|
||||
double[] zVals = new double[]{
|
||||
box.getMinZ(),
|
||||
box.getMaxZ() - 0.01
|
||||
};
|
||||
List<Location> locStanding = new ArrayList<>();
|
||||
for (double x : xVals) {
|
||||
for (double z : zVals) {
|
||||
Location loc = new Location(player.getWorld(), Math.floor(x), npc.getLocation().getBlockY(), Math.floor(z));
|
||||
if (!locStanding.contains(loc))
|
||||
locStanding.add(loc);
|
||||
}
|
||||
}
|
||||
Collections.sort(locStanding, (a, b) ->
|
||||
Double.compare(BotUtils.getHorizSqDist(a, player.getLocation()), BotUtils.getHorizSqDist(b, player.getLocation())));
|
||||
|
||||
//Break potential obstructing walls
|
||||
for (Location loc : locStanding) {
|
||||
boolean up = false;
|
||||
get = loc.getBlock();
|
||||
if (!LegacyMats.FENCE.contains(get.getType())) {
|
||||
up = true;
|
||||
get = loc.add(0, 1, 0).getBlock();
|
||||
if (!LegacyMats.FENCE.contains(get.getType())) {
|
||||
get = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (get != null) {
|
||||
int distanceX = get.getLocation().getBlockX() - player.getLocation().getBlockX();
|
||||
int distanceZ = get.getLocation().getBlockZ() - player.getLocation().getBlockZ();
|
||||
if (distanceX == 1 && distanceZ == 0) {
|
||||
if (dir == BlockFace.NORTH || dir == BlockFace.SOUTH) {
|
||||
npc.faceLocation(get.getLocation());
|
||||
level = up ? LegacyLevel.EAST : LegacyLevel.EAST_D;
|
||||
}
|
||||
} else if (distanceX == -1 && distanceZ == 0) {
|
||||
if (dir == BlockFace.NORTH || dir == BlockFace.SOUTH) {
|
||||
npc.faceLocation(get.getLocation());
|
||||
level = up ? LegacyLevel.WEST : LegacyLevel.WEST_D;
|
||||
}
|
||||
} else if (distanceX == 0 && distanceZ == 1) {
|
||||
if (dir == BlockFace.EAST || dir == BlockFace.WEST) {
|
||||
npc.faceLocation(get.getLocation());
|
||||
level = up ? LegacyLevel.SOUTH : LegacyLevel.SOUTH_D;
|
||||
}
|
||||
} else if (distanceX == 0 && distanceZ == -1) {
|
||||
if (dir == BlockFace.EAST || dir == BlockFace.WEST) {
|
||||
npc.faceLocation(get.getLocation());
|
||||
level = up ? LegacyLevel.NORTH : LegacyLevel.NORTH_D;
|
||||
}
|
||||
}
|
||||
|
||||
if (level != null) {
|
||||
preBreak(npc, player, get, level);
|
||||
return level;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (dir) {
|
||||
case NORTH:
|
||||
@@ -457,7 +523,7 @@ public class LegacyAgent extends Agent {
|
||||
get = get.getLocation().add(0, -2, 0).getBlock();
|
||||
level = LegacyLevel.NORTH_D_2;
|
||||
} else {
|
||||
Block standing = npc.getStandingOn();
|
||||
Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0);
|
||||
if(standing == null)
|
||||
break;
|
||||
boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY()
|
||||
@@ -500,7 +566,7 @@ public class LegacyAgent extends Agent {
|
||||
get = get.getLocation().add(0, -2, 0).getBlock();
|
||||
level = LegacyLevel.SOUTH_D_2;
|
||||
} else {
|
||||
Block standing = npc.getStandingOn();
|
||||
Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0);
|
||||
if(standing == null)
|
||||
break;
|
||||
boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY()
|
||||
@@ -543,7 +609,7 @@ public class LegacyAgent extends Agent {
|
||||
get = get.getLocation().add(0, -2, 0).getBlock();
|
||||
level = LegacyLevel.EAST_D_2;
|
||||
} else {
|
||||
Block standing = npc.getStandingOn();
|
||||
Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0);
|
||||
if(standing == null)
|
||||
break;
|
||||
boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY()
|
||||
@@ -586,7 +652,7 @@ public class LegacyAgent extends Agent {
|
||||
get = get.getLocation().add(0, -2, 0).getBlock();
|
||||
level = LegacyLevel.WEST_D_2;
|
||||
} else {
|
||||
Block standing = npc.getStandingOn();
|
||||
Block standing = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0);
|
||||
if(standing == null)
|
||||
break;
|
||||
boolean obstructed = standing.getLocation().getBlockY() == player.getLocation().getBlockY()
|
||||
@@ -782,7 +848,7 @@ public class LegacyAgent extends Agent {
|
||||
return false;
|
||||
|
||||
if (c && npc.getLocation().getBlockY() > loc.getBlockY() + 1) {
|
||||
Block block = npc.getStandingOn();
|
||||
Block block = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0);
|
||||
if (block == null)
|
||||
return false;
|
||||
npc.look(BlockFace.DOWN);
|
||||
@@ -798,7 +864,7 @@ public class LegacyAgent extends Agent {
|
||||
b.setY(0);
|
||||
|
||||
if (npc.getLocation().getBlockY() > loc.getBlockY() + 10 && a.distance(b) < 10) {
|
||||
Block block = npc.getStandingOn();
|
||||
Block block = npc.getStandingOn().isEmpty() ? null : npc.getStandingOn().get(0);
|
||||
if (block == null)
|
||||
return false;
|
||||
npc.look(BlockFace.DOWN);
|
||||
@@ -938,7 +1004,7 @@ public class LegacyAgent extends Agent {
|
||||
cur = player.getLocation().add(0, 2, 0).getBlock();
|
||||
break;
|
||||
case BELOW:
|
||||
cur = bot.getStandingOn();
|
||||
cur = bot.getStandingOn().isEmpty() ? null : bot.getStandingOn().get(0);
|
||||
break;
|
||||
case NORTH_U:
|
||||
cur = player.getLocation().add(0, 2, -1).getBlock();
|
||||
|
||||
@@ -1,20 +1,30 @@
|
||||
package net.nuggetmc.tplus.api.event;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import net.nuggetmc.tplus.api.Terminator;
|
||||
|
||||
public class BotFallDamageEvent {
|
||||
|
||||
private final Terminator bot;
|
||||
private final List<Block> standingOn;
|
||||
|
||||
private boolean cancelled;
|
||||
|
||||
public BotFallDamageEvent(Terminator bot) {
|
||||
public BotFallDamageEvent(Terminator bot, List<Block> standingOn) {
|
||||
this.bot = bot;
|
||||
this.standingOn = standingOn;
|
||||
}
|
||||
|
||||
public Terminator getBot() {
|
||||
return bot;
|
||||
}
|
||||
|
||||
public List<Block> getStandingOn() {
|
||||
return standingOn;
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package net.nuggetmc.tplus.api.utils;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.util.BoundingBox;
|
||||
import org.bukkit.util.NumberConversions;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
@@ -13,7 +16,9 @@ public class BotUtils {
|
||||
Material.WATER,
|
||||
Material.LAVA,
|
||||
Material.TWISTING_VINES,
|
||||
Material.VINE
|
||||
Material.VINE,
|
||||
Material.LADDER,
|
||||
Material.COBWEB
|
||||
));
|
||||
|
||||
public static UUID randomSteveUUID() {
|
||||
@@ -29,4 +34,8 @@ public class BotUtils {
|
||||
public static boolean solidAt(BoundingBox playerBox, BoundingBox blockBox) {
|
||||
return playerBox.overlaps(blockBox);
|
||||
}
|
||||
|
||||
public static double getHorizSqDist(Location blockLoc, Location pLoc) {
|
||||
return NumberConversions.square(blockLoc.getX() + 0.5 - pLoc.getX()) + NumberConversions.square(blockLoc.getZ() + 0.5 - pLoc.getZ());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
@@ -74,6 +75,7 @@ public class Bot extends ServerPlayer implements Terminator {
|
||||
private byte groundTicks;
|
||||
private byte jumpTicks;
|
||||
private byte noFallTicks;
|
||||
private List<Block> standingOn = new ArrayList<>();
|
||||
private boolean ignoredByMobs = true;
|
||||
private UUID targetPlayer = null;
|
||||
private Bot(MinecraftServer minecraftServer, ServerLevel worldServer, GameProfile profile) {
|
||||
@@ -392,7 +394,7 @@ public class Bot extends ServerPlayer implements Terminator {
|
||||
|
||||
private void fallDamageCheck() { // TODO create a better bot event system in the future, also have bot.getAgent()
|
||||
if (groundTicks != 0 && noFallTicks == 0 && !(oldVelocity.getY() >= -0.8) && !BotUtils.NO_FALL.contains(getLocation().getBlock().getType())) {
|
||||
BotFallDamageEvent event = new BotFallDamageEvent(this);
|
||||
BotFallDamageEvent event = new BotFallDamageEvent(this, new ArrayList<>(getStandingOn()));
|
||||
|
||||
plugin.getManager().getAgent().onFallDamage(event);
|
||||
|
||||
@@ -526,11 +528,10 @@ public class Bot extends ServerPlayer implements Terminator {
|
||||
return false;
|
||||
}
|
||||
|
||||
return getStandingOn() != null;
|
||||
return checkStandingOn();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block getStandingOn() {
|
||||
public boolean checkStandingOn() {
|
||||
World world = getBukkitEntity().getWorld();
|
||||
AABB box = getBoundingBox();
|
||||
|
||||
@@ -545,6 +546,8 @@ public class Bot extends ServerPlayer implements Terminator {
|
||||
};
|
||||
BoundingBox playerBox = new BoundingBox(box.minX, position().y - 0.01, box.minZ,
|
||||
box.maxX, position().y + getBbHeight(), box.maxZ);
|
||||
List<Block> standingOn = new ArrayList<>();
|
||||
List<Location> locations = new ArrayList<>();
|
||||
|
||||
for (double x : xVals) {
|
||||
for (double z : zVals) {
|
||||
@@ -552,7 +555,10 @@ public class Bot extends ServerPlayer implements Terminator {
|
||||
Block block = world.getBlockAt(loc);
|
||||
|
||||
if ((block.getType().isSolid() || canStandOn(block.getType())) && BotUtils.solidAt(playerBox, block.getBoundingBox())) {
|
||||
return block;
|
||||
if (!locations.contains(block.getLocation())) {
|
||||
standingOn.add(block);
|
||||
locations.add(block.getLocation());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -568,12 +574,25 @@ public class Bot extends ServerPlayer implements Terminator {
|
||||
|
||||
if ((LegacyMats.FENCE.contains(block.getType()) || LegacyMats.GATES.contains(block.getType()))
|
||||
&& block.getType().isSolid() && BotUtils.solidAt(playerBox, modifiedBox)) {
|
||||
return block;
|
||||
if (!locations.contains(block.getLocation())) {
|
||||
standingOn.add(block);
|
||||
locations.add(block.getLocation());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
//Closest block comes first
|
||||
Collections.sort(standingOn, (a, b) ->
|
||||
Double.compare(BotUtils.getHorizSqDist(a.getLocation(), getLocation()), BotUtils.getHorizSqDist(b.getLocation(), getLocation())));
|
||||
|
||||
this.standingOn = standingOn;
|
||||
return !standingOn.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Block> getStandingOn() {
|
||||
return standingOn;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user