STAGE 1 HANDSHAKES FINALLY WORK

This commit is contained in:
ProtoByter 2022-11-03 08:32:15 +00:00
parent da4ad52819
commit 3e72533aa8
3 changed files with 79 additions and 53 deletions

View File

@ -16,15 +16,14 @@ import org.muellerssoftware.openproximitychatfabric.mixins.ClientConnectionInvok
public class OPCFabricClient implements ClientModInitializer {
private static KeyBinding keyBinding;
private static final Stage1HandshakeBuilder.Movement[] movements = {
new Stage1HandshakeBuilder.Movement(270,-45),
new Stage1HandshakeBuilder.Movement(270,45),
new Stage1HandshakeBuilder.Movement(90,45),
new Stage1HandshakeBuilder.Movement(270,-45),
new Stage1HandshakeBuilder.Movement(90,45),
new Stage1HandshakeBuilder.Movement(0, 0),
new Stage1HandshakeBuilder.Movement(270, 45),
new Stage1HandshakeBuilder.Movement(0, 0)
private static final Stage1HandshakeBuilder.HandshakeMovement[] movements = {
new Stage1HandshakeBuilder.HandshakeMovement(90,-45),
new Stage1HandshakeBuilder.HandshakeMovement(90,45),
new Stage1HandshakeBuilder.HandshakeMovement(-90,45),
new Stage1HandshakeBuilder.HandshakeMovement(90,-45),
new Stage1HandshakeBuilder.HandshakeMovement(-90,45),
new Stage1HandshakeBuilder.HandshakeMovement(90, 45),
new Stage1HandshakeBuilder.HandshakeMovement(0, 0)
};
@Override
public void onInitializeClient() {
@ -43,11 +42,11 @@ public class OPCFabricClient implements ClientModInitializer {
ClientConnectionInvoker invoker = (ClientConnectionInvoker) client.player.networkHandler.getConnection();
//ViewLock.setLocked(true);
for (Stage1HandshakeBuilder.Movement movement : movements) {
for (Stage1HandshakeBuilder.HandshakeMovement movement : movements) {
invoker.sendIm(new PlayerMoveC2SPacket.LookAndOnGround(movement.yaw, movement.pitch, client.player.isOnGround()), null);
/*try {
try {
Thread.sleep(100);
} catch (InterruptedException e) {}*/
} catch (InterruptedException ignored) {}
//OPCFabric.LOGGER.info("Sent move packet with yaw: " + (entity.getYaw() + movement.deltaYaw) + " and pitch: " + (entity.getPitch() + movement.deltaPitch));
}
//ViewLock.setLocked(false);

View File

@ -9,63 +9,84 @@ import java.util.Arrays;
import java.util.Objects;
public class Stage1HandshakeBuilder {
public static class Movement {
public static class HandshakeMovement {
public float yaw;
public float pitch;
public Movement(float yaw, float pitch) {
public HandshakeMovement(float yaw, float pitch) {
this.pitch = pitch;
this.yaw = yaw;
}
public Movement(double yaw, double pitch) {
public HandshakeMovement(double yaw, double pitch) {
this.pitch = (float)pitch;
this.yaw = (float)yaw;
}
static boolean convertFromYawHandshakeForm(float yaw) throws IllegalArgumentException {
if (yaw > 80 && yaw < 100) {
return true;
} else if (yaw > -100 && yaw < -80) {
return false;
} else {
throw new IllegalArgumentException("Yaw value is not a valid handshake value");
}
}
static boolean convertFromPitchHandshakeForm(float pitch) {
if (pitch > 35 && pitch < 55) {
return true;
} else if (pitch < -35 && pitch > -55) {
return false;
} else {
throw new IllegalArgumentException("Pitch value is not a valid handshake value");
}
}
public HandshakeMovement convertToHandshakeForm() throws IllegalArgumentException {
return new HandshakeMovement(convertFromYawHandshakeForm(yaw) ? 90 : -90, convertFromPitchHandshakeForm(pitch) ? 45 : -45);
}
@Override
public int hashCode() {
return Objects.hash(yaw, pitch);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Movement movement = (Movement) o;
return Float.compare(movement.yaw, yaw) == 0 && Float.compare(movement.pitch, pitch) == 0;
}
@Override
public int hashCode() {
return Objects.hash(yaw, pitch);
HandshakeMovement that = (HandshakeMovement) o;
return Float.compare(that.yaw, yaw) == 0 && Float.compare(that.pitch, pitch) == 0;
}
}
private final ArrayList<Movement> movements = new ArrayList<>();
private final ArrayList<HandshakeMovement> movements = new ArrayList<>();
private PlayerEntity player;
private static final Movement[] MAGIC_MOVES = {
new Movement(270,-45),
new Movement(270,45),
new Movement(90,45),
new Movement(270,-45),
new Movement(90,45),
new Movement(0, 0)
public boolean built = false;
private static final HandshakeMovement[] MAGIC_MOVES = {
new HandshakeMovement(90,-45),
new HandshakeMovement(90,45),
new HandshakeMovement(-90,45),
new HandshakeMovement(90,-45),
new HandshakeMovement(-90,45)
};
private static final Movement[] FRIENDSHIP_MOVES = {
new Movement(90, 45),
new Movement(0, 0)
};
private static final HandshakeMovement FRIENDSHIP_MOVE = new HandshakeMovement(-90, 45);
private static final Movement[] OMNIFRIEND_MOVES = {
new Movement(270, 45),
new Movement(0, 0)
};
private static final HandshakeMovement OMNIFRIEND_MOVE = new HandshakeMovement(90, 45);
public Stage1HandshakeBuilder withPlayer(PlayerEntity player) {
this.player = player;
return this;
}
public Stage1HandshakeBuilder addDelta(float yaw, float pitch) {
Movement movement = new Movement(yaw, pitch);
public Stage1HandshakeBuilder add(HandshakeMovement movement) {
if (this.movements.size() == 0) {
this.movements.add(movement);
}
@ -85,12 +106,12 @@ public class Stage1HandshakeBuilder {
throw new HandshakeException("Too few stored head movements (need at least 24)");
}
ArrayList<Movement> handshake = null;
ArrayList<HandshakeMovement> handshake = null;
for (int i = 0; i < this.movements.size() - 6; i++) {
if (Arrays.equals(this.movements.subList(i, i + 6).toArray(), MAGIC_MOVES)) {
for (int i = 0; i < this.movements.size() - 5; i++) {
if (Arrays.equals(this.movements.subList(i, i + 5).toArray(), MAGIC_MOVES)) {
// Found start of handshake
handshake = new ArrayList<>(this.movements.subList(i, i + 12));
handshake = new ArrayList<>(this.movements.subList(i, i + 6));
break;
}
}
@ -99,9 +120,9 @@ public class Stage1HandshakeBuilder {
OPCFabric.LOGGER.info("Found handshake in {}'s head movements", this.player.getName().asTruncatedString(64));
ConnectionFilterType filterType;
PlayerEntity player;
if (Arrays.equals(handshake.subList(6, 8).toArray(), FRIENDSHIP_MOVES)) {
if (handshake.get(5).equals(FRIENDSHIP_MOVE)) {
filterType = ConnectionFilterType.Friend;
} else if (Arrays.equals(handshake.subList(6, 8).toArray(), OMNIFRIEND_MOVES)){
} else if (handshake.get(5).equals(OMNIFRIEND_MOVE)) {
filterType = ConnectionFilterType.Everyone;
} else {
return null;

View File

@ -20,15 +20,21 @@ public class OtherClientPlayerEntityMixin {
OPCFabric.tracked_players.put(player.getUuid(), new Stage1HandshakeBuilder().withPlayer(player));
}
Stage1HandshakeBuilder builder = OPCFabric.tracked_players.get(player.getUuid());
builder.addDelta((float) (accessor.getServerHeadYaw()), (float) (accessor.getServerPitch()));
if (builder.readyToBuild()) {
if (!builder.built) {
try {
Stage1Handshake handshake = builder.tryBuild();
if (handshake != null) {
OPCFabric.LOGGER.info("Found Stage 1 Handshake for player {}", handshake.getPlayer().getName());
builder.add(new Stage1HandshakeBuilder.HandshakeMovement(accessor.getServerHeadYaw(), accessor.getServerPitch()).convertToHandshakeForm());
} catch (IllegalArgumentException ignored) {
}
if (builder.readyToBuild()) {
try {
Stage1Handshake handshake = builder.tryBuild();
if (handshake != null) {
OPCFabric.LOGGER.info("Found Stage 1 Handshake for player {}", handshake.getPlayer().getName());
builder.built = true;
}
} catch (HandshakeException e) {
OPCFabric.LOGGER.info("Caught HandshakeException ({})", e.getMessage());
}
} catch (HandshakeException e) {
OPCFabric.LOGGER.info("Caught HandshakeException ({})", e.getMessage());
}
}
}