diff --git a/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java b/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java
deleted file mode 100644
index 031623a8c..000000000
--- a/src/main/java/de/bixilon/minosoft/data/VelocityHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Minosoft
- * Copyright (C) 2020 Moritz Zwerger
- *
- * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with this program. If not, see .
- *
- * This software is not affiliated with Mojang AB, the original developer of Minecraft.
- */
-
-package de.bixilon.minosoft.data;
-
-import de.bixilon.minosoft.data.entities.Velocity;
-import de.bixilon.minosoft.data.entities.entities.Entity;
-import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
-
-import java.util.HashMap;
-
-public class VelocityHandler {
- private final PlayConnection connection;
- private final HashMap entities = new HashMap<>();
-
- public VelocityHandler(PlayConnection connection) {
- this.connection = connection;
- }
-
- public void handleVelocity(Entity entity, Velocity velocity) {
- // ToDo
- }
-}
diff --git a/src/main/java/de/bixilon/minosoft/data/entities/Velocity.kt b/src/main/java/de/bixilon/minosoft/data/entities/Velocity.kt
deleted file mode 100644
index 389a41383..000000000
--- a/src/main/java/de/bixilon/minosoft/data/entities/Velocity.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Minosoft
- * Copyright (C) 2020 Moritz Zwerger
- *
- * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with this program. If not, see .
- *
- * This software is not affiliated with Mojang AB, the original developer of Minecraft.
- */
-package de.bixilon.minosoft.data.entities
-
-data class Velocity(val x: Short, val y: Short, val z: Short) {
-
- override fun toString(): String {
- return "($x $y $z)"
- }
-}
diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt
index 011353636..5c3d04949 100644
--- a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt
+++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt
@@ -26,7 +26,9 @@ import de.bixilon.minosoft.data.mappings.entities.EntityType
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape
import de.bixilon.minosoft.gui.rendering.chunk.models.AABB
+import de.bixilon.minosoft.gui.rendering.util.VecUtil
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
+import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import glm_.vec3.Vec3
import java.lang.reflect.InvocationTargetException
import java.util.*
@@ -46,6 +48,8 @@ abstract class Entity(
var entityMetaData: EntityMetaData = EntityMetaData(connection)
+ var velocity: Vec3? = null
+
protected open val hasCollisions = true
private val defaultAABB = AABB(
@@ -230,6 +234,22 @@ abstract class Entity(
return delta
}
+ fun computeTimeStep(deltaTime: Float) {
+ if (! hasNoGravity) {
+ if (velocity == null) {
+ velocity = Vec3(0, deltaTime * ProtocolDefinition.GRAVITY)
+ } else {
+ velocity!!.y += deltaTime * ProtocolDefinition.GRAVITY;
+ }
+ }
+ if (velocity == VecUtil.EMPTY_VEC3) {
+ velocity = null
+ }
+ velocity?.let {
+ move(velocity!! * deltaTime)
+ }
+ }
+
private val aabb: AABB
get() = defaultAABB + position
diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt
index 95569be61..ad538f64c 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt
@@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.network.connection
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.config.StaticConfiguration
-import de.bixilon.minosoft.data.VelocityHandler
import de.bixilon.minosoft.data.accounts.Account
import de.bixilon.minosoft.data.assets.MultiAssetsManager
import de.bixilon.minosoft.data.commands.CommandRootNode
@@ -59,7 +58,6 @@ class PlayConnection(
val scoreboardManager = ScoreboardManager()
val mapping = VersionMapping()
val sender = PacketSender(this)
- val velocityHandler = VelocityHandler(this)
lateinit var assetsManager: MultiAssetsManager
private set
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityVelocityS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityVelocityS2CP.kt
index 0b179be36..aea29af27 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityVelocityS2CP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/EntityVelocityS2CP.kt
@@ -12,20 +12,20 @@
*/
package de.bixilon.minosoft.protocol.packets.s2c.play
-import de.bixilon.minosoft.data.entities.Velocity
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
+import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.logging.Log
+import glm_.vec3.Vec3
class EntityVelocityS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
val entityId: Int = buffer.readEntityId()
- val velocity: Velocity = Velocity(buffer.readShort(), buffer.readShort(), buffer.readShort())
+ val velocity: Vec3 = Vec3(buffer.readShort(), buffer.readShort(), buffer.readShort()) * ProtocolDefinition.VELOCITY_CONSTANT
override fun handle(connection: PlayConnection) {
val entity = connection.world.getEntity(entityId) ?: return
-
- connection.velocityHandler.handleVelocity(entity, velocity)
+ entity.velocity = velocity
}
override fun log() {
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnMob.java b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnMob.java
index fd96a05f3..e4f19922d 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnMob.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnMob.java
@@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play;
import de.bixilon.minosoft.config.StaticConfiguration;
import de.bixilon.minosoft.data.entities.EntityRotation;
-import de.bixilon.minosoft.data.entities.Velocity;
import de.bixilon.minosoft.data.entities.entities.Entity;
import de.bixilon.minosoft.data.entities.entities.UnknownEntityException;
import de.bixilon.minosoft.data.entities.meta.EntityMetaData;
@@ -23,6 +22,7 @@ import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent;
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket;
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
+import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
import de.bixilon.minosoft.util.logging.Log;
import glm_.vec3.Vec3;
@@ -32,7 +32,7 @@ import static de.bixilon.minosoft.protocol.protocol.ProtocolVersions.*;
public class PacketSpawnMob extends PlayS2CPacket {
private final int entityId;
- private final Velocity velocity;
+ private final Vec3 velocity;
private final Entity entity;
private UUID entityUUID;
@@ -55,7 +55,7 @@ public class PacketSpawnMob extends PlayS2CPacket {
position = buffer.readEntityPosition();
}
EntityRotation rotation = new EntityRotation(buffer.readAngle(), buffer.readAngle(), buffer.readAngle());
- this.velocity = new Velocity(buffer.readShort(), buffer.readShort(), buffer.readShort());
+ this.velocity = new Vec3(buffer.readShort(), buffer.readShort(), buffer.readShort()).times(ProtocolDefinition.VELOCITY_CONSTANT);
EntityMetaData metaData = null;
if (buffer.getVersionId() < V_19W34A) {
@@ -82,9 +82,8 @@ public class PacketSpawnMob extends PlayS2CPacket {
@Override
public void handle(PlayConnection connection) {
connection.fireEvent(new EntitySpawnEvent(connection, this));
-
connection.getWorld().addEntity(this.entityId, this.entityUUID, getEntity());
- connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity());
+ entity.setVelocity(velocity);
}
@Override
@@ -95,9 +94,4 @@ public class PacketSpawnMob extends PlayS2CPacket {
public Entity getEntity() {
return this.entity;
}
-
- public Velocity getVelocity() {
- return this.velocity;
- }
-
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnObject.java b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnObject.java
index 8831c7826..dca199dfd 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnObject.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSpawnObject.java
@@ -14,13 +14,13 @@
package de.bixilon.minosoft.protocol.packets.s2c.play;
import de.bixilon.minosoft.data.entities.EntityRotation;
-import de.bixilon.minosoft.data.entities.Velocity;
import de.bixilon.minosoft.data.entities.entities.Entity;
import de.bixilon.minosoft.data.mappings.DefaultRegistries;
import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent;
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket;
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
+import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
import de.bixilon.minosoft.util.logging.Log;
import glm_.vec3.Vec3;
@@ -32,7 +32,7 @@ public class PacketSpawnObject extends PlayS2CPacket {
private final int entityId;
private UUID entityUUID;
private final Entity entity;
- private Velocity velocity;
+ private Vec3 velocity;
public PacketSpawnObject(PlayInByteBuffer buffer) throws Exception {
this.entityId = buffer.readEntityId();
@@ -58,10 +58,10 @@ public class PacketSpawnObject extends PlayS2CPacket {
if (buffer.getVersionId() < V_15W31A) {
if (data != 0) {
- this.velocity = new Velocity(buffer.readShort(), buffer.readShort(), buffer.readShort());
+ this.velocity = new Vec3(buffer.readShort(), buffer.readShort(), buffer.readShort()).times(ProtocolDefinition.VELOCITY_CONSTANT);
}
} else {
- this.velocity = new Velocity(buffer.readShort(), buffer.readShort(), buffer.readShort());
+ this.velocity = new Vec3(buffer.readShort(), buffer.readShort(), buffer.readShort()).times(ProtocolDefinition.VELOCITY_CONSTANT);
}
if (buffer.getVersionId() < V_19W05A) {
@@ -77,7 +77,7 @@ public class PacketSpawnObject extends PlayS2CPacket {
connection.fireEvent(new EntitySpawnEvent(connection, this));
connection.getWorld().addEntity(this.entityId, this.entityUUID, getEntity());
- connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity());
+ entity.setVelocity(velocity);
}
@Override
@@ -88,9 +88,4 @@ public class PacketSpawnObject extends PlayS2CPacket {
public Entity getEntity() {
return this.entity;
}
-
- public Velocity getVelocity() {
- return this.velocity;
- }
-
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java
index 04b89b2c0..6abbc8c57 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java
+++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/ProtocolDefinition.java
@@ -93,6 +93,10 @@ public final class ProtocolDefinition {
public static final int TICKS_PER_SECOND = 20;
public static final int TICK_TIME = 1000 / TICKS_PER_SECOND;
+ public static final float VELOCITY_CONSTANT = 1 / 8000f * TICKS_PER_SECOND;
+
+ public static final float GRAVITY = -10; // TODO: find the correct value
+
public static final int SEA_LEVEL_HEIGHT = 62;
public static final float HEIGHT_SEA_LEVEL_MODIFIER = 0.00166667f;