1
0
Fork 0
mirror of https://github.com/demostf/demo.js synced 2026-06-04 09:04:13 +02:00

add encoder for tempEntities

This commit is contained in:
Robin Appelman 2017-09-06 00:05:44 +02:00
commit 450300c1b0
12 changed files with 667 additions and 68 deletions

View file

@ -2,47 +2,78 @@ import {BitStream} from 'bit-buffer';
import {Match} from '../../Data/Match';
import {TempEntitiesPacket} from '../../Data/Packet';
import {PacketEntity, PVS} from '../../Data/PacketEntity';
import {getEntityUpdate} from '../EntityDecoder';
import {readVarInt} from '../readBitVar';
import {encodeEntityUpdate, getEntityUpdate} from '../EntityDecoder';
import {readVarInt, writeVarInt} from '../readBitVar';
import {DynamicBitStream} from '../../DynamicBitStream';
export function ParseTempEntities(stream: BitStream, match: Match, skip: boolean = false): TempEntitiesPacket { // 10: classInfo
const entityCount = stream.readBits(8);
const entityCount = stream.readUint8();
const length = readVarInt(stream);
const end = stream.index + length;
const entityData = stream.readBitStream(length);
let entity: PacketEntity | null = null;
const entities: PacketEntity[] = [];
if (!skip) {
for (let i = 0; i < entityCount; i++) {
const delay = (stream.readBoolean()) ? stream.readUint8() / 100 : 0; // unused it seems
if (stream.readBoolean()) {
const classId = stream.readBits(match.classBits);
const delay = (entityData.readBoolean()) ? entityData.readUint8() / 100 : 0; // unused it seems
if (entityData.readBoolean()) {
const classId = entityData.readBits(match.classBits);
const serverClass = match.serverClasses[classId - 1];
if (!serverClass) {
throw new Error(`Unknown serverClass ${classId}`);
}
// no clue why the -1 but it works
// maybe because world (id=0) can never be temp
// but it's not like the -1 saves any space
const sendTable = match.getSendTable(serverClass.dataTable);
entity = new PacketEntity(serverClass, 0, PVS.ENTER);
entity.delay = delay;
entity.props = getEntityUpdate(sendTable, stream);
entity.props = getEntityUpdate(sendTable, entityData);
entities.push(entity);
} else {
if (entity) {
const updatedProps = getEntityUpdate(match.getSendTable(entity.serverClass.dataTable), stream);
const updatedProps = getEntityUpdate(match.getSendTable(entity.serverClass.dataTable), entityData);
entity.applyPropUpdate(updatedProps);
} else {
throw new Error('no entity set to update');
}
}
}
if (end - stream.index > 8) {
throw new Error('unexpected content after TempEntities');
if (entityData.bitsLeft > 8) {
throw new Error(`unexpected content after TempEntities ${entityData.bitsLeft} bits`);
}
}
stream.index = end;
return {
packetType: 'tempEntities',
entities,
};
}
export function EncodeTempEntities(packet: TempEntitiesPacket, stream: BitStream, match: Match) {
stream.writeUint8(packet.entities.length);
const entityStream = new DynamicBitStream();
for (const entity of packet.entities) {
if (entity.delay) {
entityStream.writeBoolean(true);
entityStream.writeUint8(Math.round(entity.delay * 100));
} else {
entityStream.writeBoolean(false);
}
entityStream.writeBoolean(true);
const classId = match.serverClasses.findIndex(serverClass => serverClass && serverClass.name === entity.serverClass.name) + 1;
entityStream.writeBits(classId, match.classBits);
const sendTable = match.getSendTable(entity.serverClass.dataTable);
encodeEntityUpdate(entity.props, sendTable, entityStream);
}
const entityDataLength = entityStream.index;
entityStream.index = 0;
writeVarInt(entityDataLength, stream);
stream.writeBitStream(entityStream, entityDataLength);
}