Added hit stuff, but it doesn't work yet.
This commit is contained in:
parent
2ebf5ad1bf
commit
236a421296
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.andrewl.aos_core;
|
||||||
|
|
||||||
|
import org.joml.Vector3i;
|
||||||
|
import org.joml.Vector3ic;
|
||||||
|
|
||||||
|
public class Directions {
|
||||||
|
public static final Vector3ic UP = new Vector3i(0, 1, 0);
|
||||||
|
public static final Vector3ic DOWN = new Vector3i(0, -1, 0);
|
||||||
|
public static final Vector3ic NEGATIVE_X = new Vector3i(-1, 0, 0);
|
||||||
|
public static final Vector3ic POSITIVE_X = new Vector3i(1, 0, 0);
|
||||||
|
public static final Vector3ic NEGATIVE_Z = new Vector3i(0, 0, -1);
|
||||||
|
public static final Vector3ic POSITIVE_Z = new Vector3i(0, 0, 1);
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package nl.andrewl.aos_core.model;
|
||||||
|
|
||||||
|
import org.joml.Vector3i;
|
||||||
|
import org.joml.Vector3ic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the point at which a ray hits a block, often used when casting a
|
||||||
|
* ray from a player's location to see if they break or place a block.
|
||||||
|
*/
|
||||||
|
public record Hit (
|
||||||
|
Vector3i pos,
|
||||||
|
Vector3ic norm
|
||||||
|
) {}
|
|
@ -1,5 +1,6 @@
|
||||||
package nl.andrewl.aos_core.model;
|
package nl.andrewl.aos_core.model;
|
||||||
|
|
||||||
|
import nl.andrewl.aos_core.Directions;
|
||||||
import org.joml.Math;
|
import org.joml.Math;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
import org.joml.Vector3i;
|
import org.joml.Vector3i;
|
||||||
|
@ -95,7 +96,7 @@ public class World {
|
||||||
* @return The location of the block that is looked at, or null if none
|
* @return The location of the block that is looked at, or null if none
|
||||||
* could be found.
|
* could be found.
|
||||||
*/
|
*/
|
||||||
public Vector3i getLookingAtPos(Vector3f eyePos, Vector3f eyeDir, float limit) {
|
public Hit getLookingAtPos(Vector3f eyePos, Vector3f eyeDir, float limit) {
|
||||||
if (eyeDir.lengthSquared() == 0 || limit <= 0) return null;
|
if (eyeDir.lengthSquared() == 0 || limit <= 0) return null;
|
||||||
Vector3f pos = new Vector3f(eyePos);
|
Vector3f pos = new Vector3f(eyePos);
|
||||||
Vector3f movement = new Vector3f(); // Pre-allocate this vector.
|
Vector3f movement = new Vector3f(); // Pre-allocate this vector.
|
||||||
|
@ -120,11 +121,22 @@ public class World {
|
||||||
movement.set(eyeDir).mul(minFactor);
|
movement.set(eyeDir).mul(minFactor);
|
||||||
pos.add(movement);
|
pos.add(movement);
|
||||||
if (getBlockAt(pos) > 0) {
|
if (getBlockAt(pos) > 0) {
|
||||||
return new Vector3i(
|
Vector3f prevPos = new Vector3f(pos).sub(movement);
|
||||||
|
Vector3i hitPos = new Vector3i(
|
||||||
(int) Math.floor(pos.x),
|
(int) Math.floor(pos.x),
|
||||||
(int) Math.floor(pos.y),
|
(int) Math.floor(pos.y),
|
||||||
(int) Math.floor(pos.z)
|
(int) Math.floor(pos.z)
|
||||||
);
|
);
|
||||||
|
Vector3ic hitNorm = null;
|
||||||
|
|
||||||
|
if (prevPos.y > hitPos.y + 1) hitNorm = Directions.UP;
|
||||||
|
else if (prevPos.y < hitPos.y) hitNorm = Directions.DOWN;
|
||||||
|
else if (prevPos.x > hitPos.x + 1) hitNorm = Directions.POSITIVE_X;
|
||||||
|
else if (prevPos.x < hitPos.x) hitNorm = Directions.NEGATIVE_X;
|
||||||
|
else if (prevPos.z > hitPos.z + 1) hitNorm = Directions.POSITIVE_Z;
|
||||||
|
else if (prevPos.z < hitPos.z) hitNorm = Directions.NEGATIVE_Z;
|
||||||
|
|
||||||
|
return new Hit(hitPos, hitNorm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package nl.andrewl.aos_core.net.udp;
|
package nl.andrewl.aos_core.net.udp;
|
||||||
|
|
||||||
|
import nl.andrewl.aos_core.model.World;
|
||||||
import nl.andrewl.record_net.Message;
|
import nl.andrewl.record_net.Message;
|
||||||
|
import org.joml.Vector3i;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A message that's sent to clients when a block in a chunk is updated.
|
* A message that's sent to clients when a block in a chunk is updated.
|
||||||
|
@ -16,4 +18,14 @@ public record ChunkUpdateMessage(
|
||||||
int cx, int cy, int cz,
|
int cx, int cy, int cz,
|
||||||
int lx, int ly, int lz,
|
int lx, int ly, int lz,
|
||||||
byte newBlock
|
byte newBlock
|
||||||
) implements Message {}
|
) implements Message {
|
||||||
|
public static ChunkUpdateMessage fromWorld(Vector3i worldPos, World world) {
|
||||||
|
Vector3i chunkPos = World.getChunkPosAt(worldPos);
|
||||||
|
Vector3i localPos = World.getLocalPosAt(worldPos);
|
||||||
|
return new ChunkUpdateMessage(
|
||||||
|
chunkPos.x, chunkPos.y, chunkPos.z,
|
||||||
|
localPos.x, localPos.y, localPos.z,
|
||||||
|
world.getBlockAt(worldPos.x, worldPos.y, worldPos.z)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package nl.andrewl.aos2_server;
|
package nl.andrewl.aos2_server;
|
||||||
|
|
||||||
import nl.andrewl.aos_core.model.Chunk;
|
|
||||||
import nl.andrewl.aos_core.model.Player;
|
import nl.andrewl.aos_core.model.Player;
|
||||||
import nl.andrewl.aos_core.model.World;
|
import nl.andrewl.aos_core.model.World;
|
||||||
import nl.andrewl.aos_core.net.udp.ChunkUpdateMessage;
|
import nl.andrewl.aos_core.net.udp.ChunkUpdateMessage;
|
||||||
|
@ -63,18 +62,25 @@ public class ServerPlayer extends Player {
|
||||||
if (lastInputState.hitting() && now - lastBlockRemovedAt > BLOCK_REMOVE_COOLDOWN) {
|
if (lastInputState.hitting() && now - lastBlockRemovedAt > BLOCK_REMOVE_COOLDOWN) {
|
||||||
Vector3f eyePos = new Vector3f(position);
|
Vector3f eyePos = new Vector3f(position);
|
||||||
eyePos.y += getEyeHeight();
|
eyePos.y += getEyeHeight();
|
||||||
Vector3i targetPos = world.getLookingAtPos(eyePos, viewVector, 10);
|
var hit = world.getLookingAtPos(eyePos, viewVector, 10);
|
||||||
System.out.println(targetPos);
|
System.out.println(hit);
|
||||||
if (targetPos != null) {
|
if (hit != null) {
|
||||||
Vector3i chunkPos = World.getChunkPosAt(targetPos);
|
world.setBlockAt(hit.pos().x, hit.pos().y, hit.pos().z, (byte) 0);
|
||||||
Vector3i localPos = World.getLocalPosAt(targetPos);
|
|
||||||
world.setBlockAt(targetPos.x, targetPos.y, targetPos.z, (byte) 0);
|
|
||||||
lastBlockRemovedAt = now;
|
lastBlockRemovedAt = now;
|
||||||
server.getPlayerManager().broadcastUdpMessage(new ChunkUpdateMessage(
|
server.getPlayerManager().broadcastUdpMessage(ChunkUpdateMessage.fromWorld(hit.pos(), world));
|
||||||
chunkPos.x, chunkPos.y, chunkPos.z,
|
}
|
||||||
localPos.x, localPos.y, localPos.z,
|
}
|
||||||
(byte) 0
|
if (lastInputState.interacting() && now - lastBlockRemovedAt > BLOCK_REMOVE_COOLDOWN) {
|
||||||
));
|
Vector3f eyePos = new Vector3f(position);
|
||||||
|
eyePos.y += getEyeHeight();
|
||||||
|
var hit = world.getLookingAtPos(eyePos, viewVector, 10);
|
||||||
|
System.out.println(hit);
|
||||||
|
if (hit != null) {
|
||||||
|
Vector3i placePos = new Vector3i(hit.pos());
|
||||||
|
placePos.add(hit.norm());
|
||||||
|
world.setBlockAt(placePos.x, placePos.y, placePos.z, (byte) 1);
|
||||||
|
lastBlockRemovedAt = now;
|
||||||
|
server.getPlayerManager().broadcastUdpMessage(ChunkUpdateMessage.fromWorld(placePos, world));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tickMovement(dt, world);
|
tickMovement(dt, world);
|
||||||
|
|
Loading…
Reference in New Issue