Arrows Stopping in Techhider Blocks #208
@ -37,7 +37,7 @@ public class ArrowStopper extends BasicListener {
|
||||
|
||||
private BukkitTask task;
|
||||
private static final Vector NULL_VECTOR = new Vector(0, 0, 0);
|
||||
|
||||
private static final BlockFace[] BLOCK_FACES = {BlockFace.UP, BlockFace.DOWN, BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH};
|
||||
|
||||
public ArrowStopper() {
|
||||
super(Config.TechhiderActive ? EnumSet.of(FightState.RUNNING) : EnumSet.noneOf(FightState.class));
|
||||
}
|
||||
@ -74,28 +74,20 @@ public class ArrowStopper extends BasicListener {
|
||||
private boolean checkBlocks(Block start, Block end) {
|
||||
Block cursor = start;
|
||||
|
||||
while (cursor.getY() != end.getY()) {
|
||||
boolean negativ = cursor.getY() - end.getY() < 0;
|
||||
BlockFace face = negativ?BlockFace.UP:BlockFace.DOWN;
|
||||
while (!cursor.getLocation().equals(end.getLocation())) {
|
||||
BlockFace nearest = BlockFace.SELF;
|
||||
double nearestDistance = cursor.getLocation().distance(end.getLocation());
|
||||
for (BlockFace face : BLOCK_FACES) {
|
||||
Lixfel
hat
Das kannst du nicht Asynchron machen (es dauert 50ms+, bis du einen Chunk für Blockabfragen bekommst), das produziert hier nur Threads. Das kannst du nicht Asynchron machen (es dauert 50ms+, bis du einen Chunk für Blockabfragen bekommst), das produziert hier nur Threads.
|
||||
Block relative = cursor.getRelative(face);
|
||||
double distance = relative.getLocation().distance(end.getLocation());
|
||||
if(distance < nearestDistance) {
|
||||
Lixfel
hat
Ok, wenn ich jetzt richtig verstanden habe, was diese Funktion macht, dann tut sie linear zwischen den Blöcken interpolieren? Ich meine, das ist zwar nicht die korrekte Minecraft-Berechnungsreihenfolge, soll mir aber auch recht sein. Ok, wenn ich jetzt richtig verstanden habe, was diese Funktion macht, dann tut sie linear zwischen den Blöcken interpolieren? Ich meine, das ist zwar nicht die korrekte Minecraft-Berechnungsreihenfolge, soll mir aber auch recht sein.
|
||||
nearestDistance = distance;
|
||||
nearest = face;
|
||||
}
|
||||
}
|
||||
cursor = cursor.getRelative(nearest);
|
||||
if(checkBlock(cursor))
|
||||
return true;
|
||||
cursor = cursor.getRelative(face);
|
||||
}
|
||||
|
||||
while (cursor.getX() != end.getX()) {
|
||||
boolean negativ = cursor.getX() - end.getX() < 0;
|
||||
BlockFace face = negativ?BlockFace.EAST:BlockFace.WEST;
|
||||
if(checkBlock(cursor))
|
||||
return true;
|
||||
cursor = cursor.getRelative(face);
|
||||
}
|
||||
|
||||
while (cursor.getZ() != end.getZ()) {
|
||||
boolean negativ = cursor.getZ() - end.getZ() < 0;
|
||||
BlockFace face = negativ?BlockFace.SOUTH:BlockFace.NORTH;
|
||||
if(checkBlock(cursor))
|
||||
return true;
|
||||
cursor = cursor.getRelative(face);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Statt der (aufwändigen) Verwaltung von LAST_LOCATIONS wäre es wsl. eleganter, mit entity.getVelocity() / 20 zu arbeiten. Das dürfte einiges an Verwaltungsaufwand sparen. Man könnte dann wsl. in run auch mit world.getEntitiesWithClass() arbeiten.
?, entity.getVelocity() gibt einen Vektor zurück, welchen man nicht einfach durch 20 teilen kann
.divide?
braucht einen Vektor
Du brauchst ja sowieso nur die einzelnen Komponenten, also teile doch einfach die durch 20....