From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/SetEntityMotionPacket.cpp | 113 ++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Minecraft.World/SetEntityMotionPacket.cpp (limited to 'Minecraft.World/SetEntityMotionPacket.cpp') diff --git a/Minecraft.World/SetEntityMotionPacket.cpp b/Minecraft.World/SetEntityMotionPacket.cpp new file mode 100644 index 00000000..a0749b74 --- /dev/null +++ b/Minecraft.World/SetEntityMotionPacket.cpp @@ -0,0 +1,113 @@ +#include "stdafx.h" +#include +#include "InputOutputStream.h" +#include "net.minecraft.world.entity.h" +#include "PacketListener.h" +#include "SetEntityMotionPacket.h" + + + +void SetEntityMotionPacket::_init(int id, double xd, double yd, double zd) +{ + this->id = id; + double m = 3.9; + if (xd < -m) xd = -m; + if (yd < -m) yd = -m; + if (zd < -m) zd = -m; + if (xd > m) xd = m; + if (yd > m) yd = m; + if (zd > m) zd = m; + xa = (int) (xd * 8000.0); + ya = (int) (yd * 8000.0); + za = (int) (zd * 8000.0); + // 4J - if we could transmit this as bytes (in 1/16 accuracy) then flag to do so + if( ( xa >= (-128 * 16 ) ) && ( ya >= (-128 * 16 ) ) && ( za >= (-128 * 16 ) ) && + ( xa < (128 * 16 ) ) && ( ya < (128 * 16 ) ) && ( za < (128 * 16 ) ) ) + { + useBytes = true; + } + else + { + useBytes = false; + } +} + +SetEntityMotionPacket::SetEntityMotionPacket() +{ + _init(0, 0.0f, 0.0f, 0.0f); +} + +SetEntityMotionPacket::SetEntityMotionPacket(shared_ptr e) +{ + _init(e->entityId, e->xd, e->yd, e->zd); +} + +SetEntityMotionPacket::SetEntityMotionPacket(int id, double xd, double yd, double zd) +{ + _init(id, xd, yd, zd); +} + +void SetEntityMotionPacket::read(DataInputStream *dis) //throws IOException +{ + short idAndFlag = dis->readShort(); + id = idAndFlag & 0x07ff; + if( idAndFlag & 0x0800 ) + { + xa = (int)dis->readByte(); + ya = (int)dis->readByte(); + za = (int)dis->readByte(); + xa = ( xa << 24 ) >> 24; + ya = ( ya << 24 ) >> 24; + za = ( za << 24 ) >> 24; + xa *= 16; + ya *= 16; + za *= 16; + useBytes = true; + } + else + { + xa = dis->readShort(); + ya = dis->readShort(); + za = dis->readShort(); + useBytes = false; + } +} + +void SetEntityMotionPacket::write(DataOutputStream *dos) //throws IOException +{ + if( useBytes ) + { + dos->writeShort(id | 0x800); + dos->writeByte(xa/16); + dos->writeByte(ya/16); + dos->writeByte(za/16); + } + else + { + dos->writeShort(id); + dos->writeShort(xa); + dos->writeShort(ya); + dos->writeShort(za); + } +} + +void SetEntityMotionPacket::handle(PacketListener *listener) +{ + listener->handleSetEntityMotion(shared_from_this()); +} + +int SetEntityMotionPacket::getEstimatedSize() +{ + return useBytes ? 5 : 8; +} + +bool SetEntityMotionPacket::canBeInvalidated() +{ + return true; +} + +bool SetEntityMotionPacket::isInvalidatedBy(shared_ptr packet) +{ + shared_ptr target = dynamic_pointer_cast(packet); + return target->id == id; +} -- cgit v1.2.3