mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 01:48:04 -04:00
entities: rework velocity
This commit is contained in:
parent
c8a56cbb78
commit
c613aec539
@ -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 <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* 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<Entity, Velocity> entities = new HashMap<>();
|
|
||||||
|
|
||||||
public VelocityHandler(PlayConnection connection) {
|
|
||||||
this.connection = connection;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void handleVelocity(Entity entity, Velocity velocity) {
|
|
||||||
// ToDo
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 <https://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* 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)"
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,7 +26,9 @@ import de.bixilon.minosoft.data.mappings.entities.EntityType
|
|||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape
|
import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape
|
||||||
import de.bixilon.minosoft.gui.rendering.chunk.models.AABB
|
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.network.connection.PlayConnection
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import glm_.vec3.Vec3
|
import glm_.vec3.Vec3
|
||||||
import java.lang.reflect.InvocationTargetException
|
import java.lang.reflect.InvocationTargetException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -46,6 +48,8 @@ abstract class Entity(
|
|||||||
|
|
||||||
var entityMetaData: EntityMetaData = EntityMetaData(connection)
|
var entityMetaData: EntityMetaData = EntityMetaData(connection)
|
||||||
|
|
||||||
|
var velocity: Vec3? = null
|
||||||
|
|
||||||
protected open val hasCollisions = true
|
protected open val hasCollisions = true
|
||||||
|
|
||||||
private val defaultAABB = AABB(
|
private val defaultAABB = AABB(
|
||||||
@ -230,6 +234,22 @@ abstract class Entity(
|
|||||||
return delta
|
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
|
private val aabb: AABB
|
||||||
get() = defaultAABB + position
|
get() = defaultAABB + position
|
||||||
|
|
||||||
|
@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.network.connection
|
|||||||
|
|
||||||
import de.bixilon.minosoft.Minosoft
|
import de.bixilon.minosoft.Minosoft
|
||||||
import de.bixilon.minosoft.config.StaticConfiguration
|
import de.bixilon.minosoft.config.StaticConfiguration
|
||||||
import de.bixilon.minosoft.data.VelocityHandler
|
|
||||||
import de.bixilon.minosoft.data.accounts.Account
|
import de.bixilon.minosoft.data.accounts.Account
|
||||||
import de.bixilon.minosoft.data.assets.MultiAssetsManager
|
import de.bixilon.minosoft.data.assets.MultiAssetsManager
|
||||||
import de.bixilon.minosoft.data.commands.CommandRootNode
|
import de.bixilon.minosoft.data.commands.CommandRootNode
|
||||||
@ -59,7 +58,6 @@ class PlayConnection(
|
|||||||
val scoreboardManager = ScoreboardManager()
|
val scoreboardManager = ScoreboardManager()
|
||||||
val mapping = VersionMapping()
|
val mapping = VersionMapping()
|
||||||
val sender = PacketSender(this)
|
val sender = PacketSender(this)
|
||||||
val velocityHandler = VelocityHandler(this)
|
|
||||||
lateinit var assetsManager: MultiAssetsManager
|
lateinit var assetsManager: MultiAssetsManager
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
@ -12,20 +12,20 @@
|
|||||||
*/
|
*/
|
||||||
package de.bixilon.minosoft.protocol.packets.s2c.play
|
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.network.connection.PlayConnection
|
||||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||||
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
|
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
|
||||||
import de.bixilon.minosoft.util.logging.Log
|
import de.bixilon.minosoft.util.logging.Log
|
||||||
|
import glm_.vec3.Vec3
|
||||||
|
|
||||||
class EntityVelocityS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
class EntityVelocityS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
||||||
val entityId: Int = buffer.readEntityId()
|
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) {
|
override fun handle(connection: PlayConnection) {
|
||||||
val entity = connection.world.getEntity(entityId) ?: return
|
val entity = connection.world.getEntity(entityId) ?: return
|
||||||
|
entity.velocity = velocity
|
||||||
connection.velocityHandler.handleVelocity(entity, velocity)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun log() {
|
override fun log() {
|
||||||
|
@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play;
|
|||||||
|
|
||||||
import de.bixilon.minosoft.config.StaticConfiguration;
|
import de.bixilon.minosoft.config.StaticConfiguration;
|
||||||
import de.bixilon.minosoft.data.entities.EntityRotation;
|
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.Entity;
|
||||||
import de.bixilon.minosoft.data.entities.entities.UnknownEntityException;
|
import de.bixilon.minosoft.data.entities.entities.UnknownEntityException;
|
||||||
import de.bixilon.minosoft.data.entities.meta.EntityMetaData;
|
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.network.connection.PlayConnection;
|
||||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket;
|
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket;
|
||||||
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
|
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
||||||
import de.bixilon.minosoft.util.logging.Log;
|
import de.bixilon.minosoft.util.logging.Log;
|
||||||
import glm_.vec3.Vec3;
|
import glm_.vec3.Vec3;
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ import static de.bixilon.minosoft.protocol.protocol.ProtocolVersions.*;
|
|||||||
|
|
||||||
public class PacketSpawnMob extends PlayS2CPacket {
|
public class PacketSpawnMob extends PlayS2CPacket {
|
||||||
private final int entityId;
|
private final int entityId;
|
||||||
private final Velocity velocity;
|
private final Vec3 velocity;
|
||||||
private final Entity entity;
|
private final Entity entity;
|
||||||
private UUID entityUUID;
|
private UUID entityUUID;
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ public class PacketSpawnMob extends PlayS2CPacket {
|
|||||||
position = buffer.readEntityPosition();
|
position = buffer.readEntityPosition();
|
||||||
}
|
}
|
||||||
EntityRotation rotation = new EntityRotation(buffer.readAngle(), buffer.readAngle(), buffer.readAngle());
|
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;
|
EntityMetaData metaData = null;
|
||||||
if (buffer.getVersionId() < V_19W34A) {
|
if (buffer.getVersionId() < V_19W34A) {
|
||||||
@ -82,9 +82,8 @@ public class PacketSpawnMob extends PlayS2CPacket {
|
|||||||
@Override
|
@Override
|
||||||
public void handle(PlayConnection connection) {
|
public void handle(PlayConnection connection) {
|
||||||
connection.fireEvent(new EntitySpawnEvent(connection, this));
|
connection.fireEvent(new EntitySpawnEvent(connection, this));
|
||||||
|
|
||||||
connection.getWorld().addEntity(this.entityId, this.entityUUID, getEntity());
|
connection.getWorld().addEntity(this.entityId, this.entityUUID, getEntity());
|
||||||
connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity());
|
entity.setVelocity(velocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -95,9 +94,4 @@ public class PacketSpawnMob extends PlayS2CPacket {
|
|||||||
public Entity getEntity() {
|
public Entity getEntity() {
|
||||||
return this.entity;
|
return this.entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Velocity getVelocity() {
|
|
||||||
return this.velocity;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@
|
|||||||
package de.bixilon.minosoft.protocol.packets.s2c.play;
|
package de.bixilon.minosoft.protocol.packets.s2c.play;
|
||||||
|
|
||||||
import de.bixilon.minosoft.data.entities.EntityRotation;
|
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.Entity;
|
||||||
import de.bixilon.minosoft.data.mappings.DefaultRegistries;
|
import de.bixilon.minosoft.data.mappings.DefaultRegistries;
|
||||||
import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent;
|
import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent;
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
|
||||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket;
|
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket;
|
||||||
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
|
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer;
|
||||||
|
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition;
|
||||||
import de.bixilon.minosoft.util.logging.Log;
|
import de.bixilon.minosoft.util.logging.Log;
|
||||||
import glm_.vec3.Vec3;
|
import glm_.vec3.Vec3;
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ public class PacketSpawnObject extends PlayS2CPacket {
|
|||||||
private final int entityId;
|
private final int entityId;
|
||||||
private UUID entityUUID;
|
private UUID entityUUID;
|
||||||
private final Entity entity;
|
private final Entity entity;
|
||||||
private Velocity velocity;
|
private Vec3 velocity;
|
||||||
|
|
||||||
public PacketSpawnObject(PlayInByteBuffer buffer) throws Exception {
|
public PacketSpawnObject(PlayInByteBuffer buffer) throws Exception {
|
||||||
this.entityId = buffer.readEntityId();
|
this.entityId = buffer.readEntityId();
|
||||||
@ -58,10 +58,10 @@ public class PacketSpawnObject extends PlayS2CPacket {
|
|||||||
|
|
||||||
if (buffer.getVersionId() < V_15W31A) {
|
if (buffer.getVersionId() < V_15W31A) {
|
||||||
if (data != 0) {
|
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 {
|
} 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) {
|
if (buffer.getVersionId() < V_19W05A) {
|
||||||
@ -77,7 +77,7 @@ public class PacketSpawnObject extends PlayS2CPacket {
|
|||||||
connection.fireEvent(new EntitySpawnEvent(connection, this));
|
connection.fireEvent(new EntitySpawnEvent(connection, this));
|
||||||
|
|
||||||
connection.getWorld().addEntity(this.entityId, this.entityUUID, getEntity());
|
connection.getWorld().addEntity(this.entityId, this.entityUUID, getEntity());
|
||||||
connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity());
|
entity.setVelocity(velocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -88,9 +88,4 @@ public class PacketSpawnObject extends PlayS2CPacket {
|
|||||||
public Entity getEntity() {
|
public Entity getEntity() {
|
||||||
return this.entity;
|
return this.entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Velocity getVelocity() {
|
|
||||||
return this.velocity;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,10 @@ public final class ProtocolDefinition {
|
|||||||
public static final int TICKS_PER_SECOND = 20;
|
public static final int TICKS_PER_SECOND = 20;
|
||||||
public static final int TICK_TIME = 1000 / TICKS_PER_SECOND;
|
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 int SEA_LEVEL_HEIGHT = 62;
|
||||||
|
|
||||||
public static final float HEIGHT_SEA_LEVEL_MODIFIER = 0.00166667f;
|
public static final float HEIGHT_SEA_LEVEL_MODIFIER = 0.00166667f;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user