mirror of
https://github.com/DeveloperExotic/LegacyCrossPlay.git
synced 2026-07-18 01:41:25 +00:00
Add cleaned entitypackets.js
This commit is contained in:
599
src/packets/senders/entitypackets.js
Normal file
599
src/packets/senders/entitypackets.js
Normal file
@@ -0,0 +1,599 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* entitypackets.js */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
const PacketWriter = require("../../packetwriter");
|
||||||
|
|
||||||
|
function sendAddMobPacket(proxy, client, entityInfo) {
|
||||||
|
try {
|
||||||
|
if (!entityInfo || entityInfo.entityId === undefined || entityInfo.javaEntityId === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const entityKey = `${entityInfo.javaEntityId}`;
|
||||||
|
if (client._sentEntities && client._sentEntities.has(entityKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!client._sentEntities) {
|
||||||
|
client._sentEntities = new Set();
|
||||||
|
}
|
||||||
|
client._sentEntities.add(entityKey);
|
||||||
|
|
||||||
|
if (!Number.isFinite(entityInfo.x) || !Number.isFinite(entityInfo.y) || !Number.isFinite(entityInfo.z)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const posX = Math.floor(entityInfo.x * 32);
|
||||||
|
const posY = Math.floor(entityInfo.y * 32);
|
||||||
|
const posZ = Math.floor(entityInfo.z * 32);
|
||||||
|
|
||||||
|
if (!Number.isFinite(posX) || !Number.isFinite(posY) || !Number.isFinite(posZ)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeShort(entityInfo.entityId & 0xFFFF);
|
||||||
|
writer.writeByte(entityInfo.type & 0xff);
|
||||||
|
|
||||||
|
writer.writeInt(posX);
|
||||||
|
writer.writeInt(posY);
|
||||||
|
writer.writeInt(posZ);
|
||||||
|
|
||||||
|
const yRotByte = Math.floor(((entityInfo.yaw % 360) / 360) * 256) & 0xff;
|
||||||
|
const xRotByte = Math.floor(((entityInfo.pitch % 360) / 360) * 256) & 0xff;
|
||||||
|
const yHeadRotByte =
|
||||||
|
Math.floor(((entityInfo.headYaw % 360) / 360) * 256) & 0xff;
|
||||||
|
writer.writeByte(yRotByte);
|
||||||
|
writer.writeByte(xRotByte);
|
||||||
|
writer.writeByte(yHeadRotByte);
|
||||||
|
|
||||||
|
let velX = entityInfo.velocityX || 0;
|
||||||
|
let velY = entityInfo.velocityY || 0;
|
||||||
|
let velZ = entityInfo.velocityZ || 0;
|
||||||
|
velX = Math.max(-3.9, Math.min(3.9, velX));
|
||||||
|
velY = Math.max(-3.9, Math.min(3.9, velY));
|
||||||
|
velZ = Math.max(-3.9, Math.min(3.9, velZ));
|
||||||
|
const velocityX = Math.floor(velX * 8000);
|
||||||
|
const velocityY = Math.floor(velY * 8000);
|
||||||
|
const velocityZ = Math.floor(velZ * 8000);
|
||||||
|
writer.writeShort(velocityX);
|
||||||
|
writer.writeShort(velocityY);
|
||||||
|
writer.writeShort(velocityZ);
|
||||||
|
|
||||||
|
writer.writeByte((0 << 5) | 0);
|
||||||
|
writer.writeByte(0);
|
||||||
|
|
||||||
|
writer.writeByte((1 << 5) | 1);
|
||||||
|
writer.writeShort(300);
|
||||||
|
|
||||||
|
const agableMobTypes = [92, 91, 90, 93, 120];
|
||||||
|
if (agableMobTypes.includes(entityInfo.type)) {
|
||||||
|
const ageMetadata = entityInfo.metadata
|
||||||
|
? entityInfo.metadata.find((m) => m.key === 12)
|
||||||
|
: null;
|
||||||
|
if (ageMetadata && ageMetadata.value !== undefined) {
|
||||||
|
writer.writeByte((2 << 5) | 12);
|
||||||
|
writer.writeInt(ageMetadata.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entityInfo.type === 120) {
|
||||||
|
const professionMetadata = entityInfo.metadata
|
||||||
|
? entityInfo.metadata.find((m) => m.key === 16 && m.type === 2)
|
||||||
|
: null;
|
||||||
|
if (professionMetadata && professionMetadata.value !== undefined) {
|
||||||
|
writer.writeByte((2 << 5) | 16);
|
||||||
|
writer.writeInt(professionMetadata.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const customNameMeta = entityInfo.metadata
|
||||||
|
? entityInfo.metadata.find((m) => m.key === 2 && m.type === 4)
|
||||||
|
: null;
|
||||||
|
if (customNameMeta && customNameMeta.value) {
|
||||||
|
writer.writeByte((4 << 5) | 10);
|
||||||
|
writer.writeUtf(customNameMeta.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const customNameVisibleMeta = entityInfo.metadata
|
||||||
|
? entityInfo.metadata.find((m) => m.key === 3 && m.type === 0)
|
||||||
|
: null;
|
||||||
|
if (customNameVisibleMeta && customNameVisibleMeta.value !== undefined) {
|
||||||
|
writer.writeByte((0 << 5) | 11);
|
||||||
|
writer.writeByte(customNameVisibleMeta.value & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entityInfo.type === 55 || entityInfo.type === 62) {
|
||||||
|
const sizeMetadata = entityInfo.metadata
|
||||||
|
? entityInfo.metadata.find((m) => m.key === 16 && m.type === 0)
|
||||||
|
: null;
|
||||||
|
if (sizeMetadata && sizeMetadata.value !== undefined) {
|
||||||
|
writer.writeByte((0 << 5) | 16);
|
||||||
|
writer.writeByte(sizeMetadata.value & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entityInfo.type === 51) {
|
||||||
|
const typeMetadata = entityInfo.metadata
|
||||||
|
? entityInfo.metadata.find((m) => m.key === 13 && m.type === 0)
|
||||||
|
: null;
|
||||||
|
if (typeMetadata && typeMetadata.value !== undefined) {
|
||||||
|
writer.writeByte((0 << 5) | 13);
|
||||||
|
writer.writeByte(typeMetadata.value & 0xff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.writeByte(0x7f);
|
||||||
|
|
||||||
|
const payload = writer.toBuffer();
|
||||||
|
if (!payload || payload.length === 0 || payload.length > 1000) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
proxy.sendPacket(client, 0x18, payload);
|
||||||
|
} catch (err) {
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendAddEntityPacket(proxy, client, entityInfo) {
|
||||||
|
try {
|
||||||
|
if (!entityInfo || entityInfo.entityId === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Number.isFinite(entityInfo.x) || !Number.isFinite(entityInfo.y) || !Number.isFinite(entityInfo.z)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const posX = Math.floor(entityInfo.x * 32);
|
||||||
|
const posY = Math.floor(entityInfo.y * 32);
|
||||||
|
const posZ = Math.floor(entityInfo.z * 32);
|
||||||
|
|
||||||
|
if (!Number.isFinite(posX) || !Number.isFinite(posY) || !Number.isFinite(posZ)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeShort(entityInfo.entityId & 0xFFFF);
|
||||||
|
writer.writeByte(entityInfo.type & 0xFF);
|
||||||
|
|
||||||
|
writer.writeInt(posX);
|
||||||
|
writer.writeInt(posY);
|
||||||
|
writer.writeInt(posZ);
|
||||||
|
|
||||||
|
const yaw = Number.isFinite(entityInfo.yaw) ? entityInfo.yaw : 0;
|
||||||
|
const pitch = Number.isFinite(entityInfo.pitch) ? entityInfo.pitch : 0;
|
||||||
|
|
||||||
|
const yRotByte = Math.floor(((yaw % 360) / 360) * 256) & 0xff;
|
||||||
|
const xRotByte = Math.floor(((pitch % 360) / 360) * 256) & 0xff;
|
||||||
|
|
||||||
|
writer.writeByte(yRotByte);
|
||||||
|
writer.writeByte(xRotByte);
|
||||||
|
|
||||||
|
const data = entityInfo.data !== undefined && Number.isFinite(entityInfo.data) ? entityInfo.data : -1;
|
||||||
|
writer.writeInt(data);
|
||||||
|
|
||||||
|
if (data > -1) {
|
||||||
|
const velocityX = Number.isFinite(entityInfo.velocityX) ? entityInfo.velocityX : 0;
|
||||||
|
const velocityY = Number.isFinite(entityInfo.velocityY) ? entityInfo.velocityY : 0;
|
||||||
|
const velocityZ = Number.isFinite(entityInfo.velocityZ) ? entityInfo.velocityZ : 0;
|
||||||
|
|
||||||
|
writer.writeShort(Math.max(-32768, Math.min(32767, Math.floor(velocityX))));
|
||||||
|
writer.writeShort(Math.max(-32768, Math.min(32767, Math.floor(velocityY))));
|
||||||
|
writer.writeShort(Math.max(-32768, Math.min(32767, Math.floor(velocityZ))));
|
||||||
|
}
|
||||||
|
|
||||||
|
const buffer = writer.toBuffer();
|
||||||
|
if (!buffer || buffer.length === 0 || buffer.length > 1000) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x17, buffer);
|
||||||
|
} catch (err) {
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendMoveEntityPacketForEntity(
|
||||||
|
proxy,
|
||||||
|
client,
|
||||||
|
entity,
|
||||||
|
dX,
|
||||||
|
dY,
|
||||||
|
dZ,
|
||||||
|
includeRotation = false,
|
||||||
|
) {
|
||||||
|
if (Math.abs(dX) <= 127 && Math.abs(dY) <= 127 && Math.abs(dZ) <= 127) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeShort(entity.entityId);
|
||||||
|
writer.writeByte(dX & 0xff);
|
||||||
|
writer.writeByte(dY & 0xff);
|
||||||
|
writer.writeByte(dZ & 0xff);
|
||||||
|
|
||||||
|
if (includeRotation) {
|
||||||
|
const prevYaw =
|
||||||
|
entity.prevYaw !== undefined ? entity.prevYaw : entity.yaw;
|
||||||
|
const prevPitch =
|
||||||
|
entity.prevPitch !== undefined ? entity.prevPitch : entity.pitch;
|
||||||
|
|
||||||
|
let deltaYaw = entity.yaw - prevYaw;
|
||||||
|
let deltaPitch = entity.pitch - prevPitch;
|
||||||
|
|
||||||
|
while (deltaYaw > 180) deltaYaw -= 360;
|
||||||
|
while (deltaYaw < -180) deltaYaw += 360;
|
||||||
|
while (deltaPitch > 180) deltaPitch -= 360;
|
||||||
|
while (deltaPitch < -180) deltaPitch += 360;
|
||||||
|
|
||||||
|
const dYawByte = Math.floor((deltaYaw / 360) * 256) & 0xff;
|
||||||
|
const dPitchByte = Math.floor((deltaPitch / 360) * 256) & 0xff;
|
||||||
|
|
||||||
|
writer.writeByte(dYawByte);
|
||||||
|
writer.writeByte(dPitchByte);
|
||||||
|
|
||||||
|
entity.prevYaw = entity.yaw;
|
||||||
|
entity.prevPitch = entity.pitch;
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x21, writer.toBuffer());
|
||||||
|
} else {
|
||||||
|
proxy.sendPacket(client, 0x1f, writer.toBuffer());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sendTeleportEntityPacketForEntity(proxy, client, entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendTeleportEntityPacketForEntity(proxy, client, entity) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeShort(entity.entityId);
|
||||||
|
|
||||||
|
writer.writeInt(Math.floor(entity.x * 32));
|
||||||
|
writer.writeInt(Math.floor(entity.y * 32));
|
||||||
|
writer.writeInt(Math.floor(entity.z * 32));
|
||||||
|
|
||||||
|
const yRotByte = Math.floor(((entity.yaw % 360) / 360) * 256) & 0xff;
|
||||||
|
const xRotByte = Math.floor(((entity.pitch % 360) / 360) * 256) & 0xff;
|
||||||
|
writer.writeByte(yRotByte);
|
||||||
|
writer.writeByte(xRotByte);
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 34, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendRotateEntityPacketForEntity(proxy, client, entity) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeShort(entity.entityId);
|
||||||
|
|
||||||
|
const prevYaw = entity.prevYaw !== undefined ? entity.prevYaw : entity.yaw;
|
||||||
|
const prevPitch =
|
||||||
|
entity.prevPitch !== undefined ? entity.prevPitch : entity.pitch;
|
||||||
|
|
||||||
|
let deltaYaw = entity.yaw - prevYaw;
|
||||||
|
let deltaPitch = entity.pitch - prevPitch;
|
||||||
|
|
||||||
|
while (deltaYaw > 180) deltaYaw -= 360;
|
||||||
|
while (deltaYaw < -180) deltaYaw += 360;
|
||||||
|
while (deltaPitch > 180) deltaPitch -= 360;
|
||||||
|
while (deltaPitch < -180) deltaPitch += 360;
|
||||||
|
|
||||||
|
const dYawByte = Math.floor((deltaYaw / 360) * 256) & 0xff;
|
||||||
|
const dPitchByte = Math.floor((deltaPitch / 360) * 256) & 0xff;
|
||||||
|
|
||||||
|
writer.writeByte(dYawByte);
|
||||||
|
writer.writeByte(dPitchByte);
|
||||||
|
|
||||||
|
entity.prevYaw = entity.yaw;
|
||||||
|
entity.prevPitch = entity.pitch;
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x20, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendRotateHeadPacketForEntity(proxy, client, entity) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
|
||||||
|
const yHeadRotByte = Math.floor(((entity.headYaw % 360) / 360) * 256) & 0xff;
|
||||||
|
writer.writeByte(yHeadRotByte);
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 35, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendEntityMetadataPacket(proxy, client, entity, metadata) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
for (const item of metadata) {
|
||||||
|
if (item.key === 12 && item.type === 0) {
|
||||||
|
const ageableMobTypes = [
|
||||||
|
"Pig",
|
||||||
|
"Cow",
|
||||||
|
"Sheep",
|
||||||
|
"Chicken",
|
||||||
|
"Wolf",
|
||||||
|
"Ocelot",
|
||||||
|
"MushroomCow",
|
||||||
|
];
|
||||||
|
const isAgeableMob = ageableMobTypes.includes(entity.javaType);
|
||||||
|
|
||||||
|
if (isAgeableMob && item.value === -1) {
|
||||||
|
const header = (2 << 5) | 12;
|
||||||
|
writer.writeByte(header);
|
||||||
|
writer.writeInt(-24000);
|
||||||
|
continue;
|
||||||
|
} else if (isAgeableMob && item.value === 0) {
|
||||||
|
const header = (2 << 5) | 12;
|
||||||
|
writer.writeByte(header);
|
||||||
|
writer.writeInt(0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const header = (item.type << 5) | item.key;
|
||||||
|
writer.writeByte(header);
|
||||||
|
|
||||||
|
switch (item.type) {
|
||||||
|
case 0:
|
||||||
|
writer.writeByte(item.value & 0xff);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
writer.writeShort(item.value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
writer.writeInt(item.value);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
writer.writeFloat(item.value);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
writer.writeUtf(item.value);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
writer.writeByte(0x7f);
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x28, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendSetEntityMotionPacket(proxy, client, entity) {
|
||||||
|
if (!entity || entity.entityId === undefined || entity.entityId < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let xa = entity.velocityX || 0;
|
||||||
|
let ya = entity.velocityY || 0;
|
||||||
|
let za = entity.velocityZ || 0;
|
||||||
|
|
||||||
|
const maxVel = 31200;
|
||||||
|
xa = Math.max(-maxVel, Math.min(maxVel, xa));
|
||||||
|
ya = Math.max(-maxVel, Math.min(maxVel, ya));
|
||||||
|
za = Math.max(-maxVel, Math.min(maxVel, za));
|
||||||
|
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const useBytes =
|
||||||
|
xa >= -2048 &&
|
||||||
|
xa < 2048 &&
|
||||||
|
ya >= -2048 &&
|
||||||
|
ya < 2048 &&
|
||||||
|
za >= -2048 &&
|
||||||
|
za < 2048;
|
||||||
|
if (useBytes) {
|
||||||
|
writer.writeShort((entity.entityId & 0x07ff) | 0x800);
|
||||||
|
|
||||||
|
const xByte = Math.floor(xa / 16);
|
||||||
|
const yByte = Math.floor(ya / 16);
|
||||||
|
const zByte = Math.floor(za / 16);
|
||||||
|
|
||||||
|
writer.writeSignedByte(xByte);
|
||||||
|
writer.writeSignedByte(yByte);
|
||||||
|
writer.writeSignedByte(zByte);
|
||||||
|
} else {
|
||||||
|
writer.writeShort(entity.entityId & 0x07ff);
|
||||||
|
|
||||||
|
writer.writeShort(xa);
|
||||||
|
writer.writeShort(ya);
|
||||||
|
writer.writeShort(za);
|
||||||
|
}
|
||||||
|
const payload = writer.toBuffer();
|
||||||
|
proxy.sendPacket(client, 0x1c, payload);
|
||||||
|
} catch (err) {
|
||||||
|
/* do nothing */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendEntityEventPacket(proxy, client, entity, eventId) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
writer.writeByte(eventId & 0xff);
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x26, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendSetEquippedItemPacket(proxy, client, entity, slot, item) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
writer.writeShort(slot);
|
||||||
|
|
||||||
|
if (!item || item.blockId === undefined || item.blockId === -1) {
|
||||||
|
writer.writeShort(-1);
|
||||||
|
proxy.sendPacket(client, 0x05, writer.toBuffer());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const javaItemId = item.blockId;
|
||||||
|
const count = item.itemCount || 1;
|
||||||
|
let damage = item.itemDamage || 0;
|
||||||
|
|
||||||
|
const lceItemId = proxy.mapJavaItemToLCE(javaItemId);
|
||||||
|
|
||||||
|
if (lceItemId === 1 && javaItemId !== 1) {
|
||||||
|
damage = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lceItemId === -1 || lceItemId === 0) {
|
||||||
|
writer.writeShort(-1);
|
||||||
|
proxy.sendPacket(client, 0x05, writer.toBuffer());
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
(lceItemId >= 1 && lceItemId <= 174) ||
|
||||||
|
(lceItemId >= 256 && lceItemId <= 421) ||
|
||||||
|
(lceItemId >= 2256 && lceItemId <= 2267)
|
||||||
|
) {
|
||||||
|
writer.writeShort(lceItemId);
|
||||||
|
writer.writeByte(count);
|
||||||
|
writer.writeShort(damage);
|
||||||
|
} else {
|
||||||
|
writer.writeShort(-1);
|
||||||
|
proxy.sendPacket(client, 0x05, writer.toBuffer());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.writeShort(-1);
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x05, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendLevelParticlesPacket(
|
||||||
|
proxy,
|
||||||
|
client,
|
||||||
|
name,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
z,
|
||||||
|
xDist,
|
||||||
|
yDist,
|
||||||
|
zDist,
|
||||||
|
maxSpeed,
|
||||||
|
count,
|
||||||
|
) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
|
||||||
|
writer.writeString(name);
|
||||||
|
writer.writeFloat(x);
|
||||||
|
writer.writeFloat(y);
|
||||||
|
writer.writeFloat(z);
|
||||||
|
writer.writeFloat(xDist);
|
||||||
|
writer.writeFloat(yDist);
|
||||||
|
writer.writeFloat(zDist);
|
||||||
|
writer.writeFloat(maxSpeed);
|
||||||
|
writer.writeInt(count);
|
||||||
|
|
||||||
|
const buffer = writer.toBuffer();
|
||||||
|
proxy.sendPacket(client, 63, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendTileUpdatePacket(proxy, client, x, y, z, blockId, metadata) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
|
||||||
|
writer.writeInt(x);
|
||||||
|
writer.writeByte(y & 0xff);
|
||||||
|
writer.writeInt(z);
|
||||||
|
writer.writeShort(blockId & 0xffff);
|
||||||
|
|
||||||
|
const levelIdx =
|
||||||
|
client.javaDimension === -1 ? 1 : client.javaDimension === 1 ? 2 : 0;
|
||||||
|
const dataLevel = ((levelIdx & 0xf) << 4) | (metadata & 0xf);
|
||||||
|
writer.writeByte(dataLevel);
|
||||||
|
|
||||||
|
const buffer = writer.toBuffer();
|
||||||
|
proxy.sendPacket(client, 53, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendSetItemDataPacket(proxy, client, entity, itemData) {
|
||||||
|
const lceItemId = proxy.mapJavaItemToLCE(itemData.blockId);
|
||||||
|
|
||||||
|
if (lceItemId === -1 || lceItemId === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
|
||||||
|
writer.writeByte((5 << 5) | 10);
|
||||||
|
|
||||||
|
writer.writeShort(lceItemId);
|
||||||
|
writer.writeByte(itemData.itemCount);
|
||||||
|
writer.writeShort(itemData.itemDamage);
|
||||||
|
|
||||||
|
writer.writeShort(-1);
|
||||||
|
|
||||||
|
writer.writeByte(0x7f);
|
||||||
|
|
||||||
|
const payload = writer.toBuffer();
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x28, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendSetEntityDataPacket(proxy, client, entity) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
|
||||||
|
const sharedFlagsHeader = (0 << 5) | 0;
|
||||||
|
writer.writeByte(sharedFlagsHeader);
|
||||||
|
writer.writeByte(0);
|
||||||
|
|
||||||
|
writer.writeByte(0x7f);
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x27, writer.toBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendUpdateAttributesPacket(proxy, client, entity) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(entity.entityId);
|
||||||
|
|
||||||
|
const attributes = [];
|
||||||
|
|
||||||
|
attributes.push({ id: 0, base: 20.0, modifiers: [] });
|
||||||
|
|
||||||
|
if (entity.type !== 94) {
|
||||||
|
attributes.push({ id: 3, base: 0.25, modifiers: [] });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entity.type >= 50 && entity.type <= 66) {
|
||||||
|
attributes.push({ id: 1, base: 32.0, modifiers: [] });
|
||||||
|
attributes.push({ id: 4, base: 2.0, modifiers: [] });
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.writeInt(attributes.length);
|
||||||
|
|
||||||
|
for (const attr of attributes) {
|
||||||
|
writer.writeShort(attr.id);
|
||||||
|
writer.writeDouble(attr.base);
|
||||||
|
writer.writeShort(attr.modifiers.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
const payload = writer.toBuffer();
|
||||||
|
|
||||||
|
proxy.sendPacket(client, 0x2c, payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendSetEntityLinkPacket(proxy, client, sourceId, destId, linkType) {
|
||||||
|
const writer = new PacketWriter();
|
||||||
|
writer.writeInt(sourceId);
|
||||||
|
writer.writeInt(destId);
|
||||||
|
writer.writeByte(linkType);
|
||||||
|
const buffer = writer.toBuffer();
|
||||||
|
proxy.sendPacket(client, 0x27, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
sendAddMobPacket,
|
||||||
|
sendAddEntityPacket,
|
||||||
|
sendMoveEntityPacketForEntity,
|
||||||
|
sendTeleportEntityPacketForEntity,
|
||||||
|
sendRotateEntityPacketForEntity,
|
||||||
|
sendRotateHeadPacketForEntity,
|
||||||
|
sendEntityMetadataPacket,
|
||||||
|
sendSetEntityMotionPacket,
|
||||||
|
sendEntityEventPacket,
|
||||||
|
sendSetEquippedItemPacket,
|
||||||
|
sendSetItemDataPacket,
|
||||||
|
sendSetEntityDataPacket,
|
||||||
|
sendUpdateAttributesPacket,
|
||||||
|
sendSetEntityLinkPacket,
|
||||||
|
};
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
Reference in New Issue
Block a user