Latest packet handling, parsing, enums, generators, etc..
This commit is contained in:
@@ -318,7 +318,446 @@ messages.forEach((message) =>
|
||||
' }\n\n';
|
||||
}
|
||||
|
||||
classString+=' writeToBuffer(buf: Buffer, pos: number): number\n';
|
||||
classString+=' {\n';
|
||||
if (message.blocks.length > 0)
|
||||
{
|
||||
classString += ' const startPos = pos;\n';
|
||||
|
||||
let firstCount = true;
|
||||
|
||||
let letConst = 'const';
|
||||
let varBlockCount = 0;
|
||||
message.blocks.forEach((block) =>
|
||||
{
|
||||
if (block.type === 'Variable' || block.type === 'Multiple')
|
||||
{
|
||||
varBlockCount++;
|
||||
}
|
||||
});
|
||||
if (varBlockCount > 1)
|
||||
{
|
||||
letConst = 'let';
|
||||
}
|
||||
|
||||
message.blocks.forEach((block) =>
|
||||
{
|
||||
let single = false;
|
||||
let blockIndex = '';
|
||||
if (block.type === 'Variable')
|
||||
{
|
||||
let first = '';
|
||||
if (firstCount)
|
||||
{
|
||||
firstCount = false;
|
||||
first = letConst + ' ';
|
||||
}
|
||||
blockIndex = ' ' + first + 'count = this.' + block.name + '.length;\n';
|
||||
blockIndex += ' buf.writeUInt8(this.' + block.name + '.length, pos++);\n';
|
||||
}
|
||||
else if (block.type === 'Multiple')
|
||||
{
|
||||
let first = '';
|
||||
if (firstCount)
|
||||
{
|
||||
firstCount = false;
|
||||
first = letConst + ' ';
|
||||
}
|
||||
blockIndex = ' ' + first + 'count = ' + block.count + ';\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
single = true;
|
||||
}
|
||||
let spaces = '';
|
||||
if (!single)
|
||||
{
|
||||
spaces = ' ';
|
||||
classString += blockIndex;
|
||||
classString += ' for (let i = 0; i < count; i++)\n';
|
||||
classString += ' {\n';
|
||||
}
|
||||
block.params.forEach((param) =>
|
||||
{
|
||||
let val = '';
|
||||
if (!single)
|
||||
{
|
||||
val = 'this.' + block.name + '[i][\'' + param.name + '\']';
|
||||
}
|
||||
else
|
||||
{
|
||||
val = 'this.' + block.name + '[\'' + param.name + '\']';
|
||||
}
|
||||
switch (param.type)
|
||||
{
|
||||
case 'LLUUID':
|
||||
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
|
||||
classString += spaces + ' pos += 16;\n';
|
||||
break;
|
||||
case 'F32':
|
||||
classString += spaces + ' buf.writeFloatLE(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'S32':
|
||||
classString += spaces + ' buf.writeInt32LE(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'U32':
|
||||
classString += spaces + ' buf.writeUInt32LE(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'U16':
|
||||
case 'IPPORT':
|
||||
classString += spaces + ' buf.writeUInt16LE(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += 2;\n';
|
||||
break;
|
||||
case 'S16':
|
||||
classString += spaces + ' buf.writeInt16LE(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += 2;\n';
|
||||
break;
|
||||
case 'U64':
|
||||
case 'S64':
|
||||
classString += spaces + ' buf.writeInt32LE(' + val + '.low, pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
classString += spaces + ' buf.writeInt32LE(' + val + '.high, pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'F64':
|
||||
classString += spaces + ' buf.writeDoubleLE(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += 8;\n';
|
||||
break;
|
||||
case 'S8':
|
||||
classString += spaces + ' buf.writeInt8(' + val + ', pos++);\n';
|
||||
break;
|
||||
case 'U8':
|
||||
classString += spaces + ' buf.writeUInt8(' + val + ', pos++);\n';
|
||||
break;
|
||||
case 'BOOL':
|
||||
classString += spaces + ' buf.writeUInt8((' + val + ') ? 1 : 0, pos++);\n';
|
||||
break;
|
||||
case 'Variable':
|
||||
if (param.size === 1)
|
||||
{
|
||||
classString += spaces + ' buf.writeUInt8(' + val + '.length, pos++);\n';
|
||||
}
|
||||
if (param.size === 2)
|
||||
{
|
||||
classString += spaces + ' buf.writeUInt16BE(' + val + '.length, pos);\n';
|
||||
classString += spaces + ' pos += 2;\n';
|
||||
}
|
||||
classString += spaces + ' buf.write(' + val + ', pos);\n';
|
||||
classString += spaces + ' pos += ' + val + '.length;\n';
|
||||
break;
|
||||
case 'LLVector4':
|
||||
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
|
||||
classString += spaces + ' pos += 16;\n';
|
||||
break;
|
||||
case 'LLQuaternion':
|
||||
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
|
||||
classString += spaces + ' pos += 12;\n';
|
||||
break;
|
||||
case 'LLVector3d':
|
||||
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos, true);\n';
|
||||
classString += spaces + ' pos += 24;\n';
|
||||
break;
|
||||
case 'LLVector3':
|
||||
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos, false);\n';
|
||||
classString += spaces + ' pos += 12;\n';
|
||||
break;
|
||||
case 'IPADDR':
|
||||
classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'Fixed':
|
||||
classString += spaces + ' ' + val + '.copy(buf, pos);\n';
|
||||
classString += spaces + ' pos += ' + param.size + ';\n';
|
||||
break;
|
||||
default:
|
||||
console.log('Unknown type: ' + param.type);
|
||||
}
|
||||
});
|
||||
if (!single)
|
||||
{
|
||||
classString += ' }\n';
|
||||
}
|
||||
|
||||
});
|
||||
classString += ' return pos - startPos;\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
classString += ' return 0;\n';
|
||||
}
|
||||
classString +=' }\n';
|
||||
classString +='\n';
|
||||
classString+=' readFromBuffer(buf: Buffer, pos: number): number\n';
|
||||
classString+=' {\n';
|
||||
if (message.blocks.length > 0)
|
||||
{
|
||||
classString += ' const startPos = pos;\n';
|
||||
|
||||
let firstCount = true;
|
||||
|
||||
let letConst = 'const';
|
||||
let varBlockCount = 0;
|
||||
message.blocks.forEach((block) =>
|
||||
{
|
||||
if (block.type === 'Variable' || block.type === 'Multiple')
|
||||
{
|
||||
varBlockCount++;
|
||||
}
|
||||
});
|
||||
if (varBlockCount > 1)
|
||||
{
|
||||
letConst = 'let';
|
||||
}
|
||||
|
||||
let varBlockConst = 'const';
|
||||
if (message.blocks.count > 1)
|
||||
{
|
||||
varBlockConst = 'let';
|
||||
}
|
||||
let firstBlock = true;
|
||||
|
||||
message.blocks.forEach((block) =>
|
||||
{
|
||||
let single = false;
|
||||
let blockIndex = '';
|
||||
if (block.type === 'Variable')
|
||||
{
|
||||
let first = '';
|
||||
if (firstCount)
|
||||
{
|
||||
firstCount = false;
|
||||
first = letConst + ' ';
|
||||
}
|
||||
blockIndex = ' ' + first + 'count = buf.readUInt8(pos++);\n';
|
||||
blockIndex += ' this.' + block.name + ' = [];\n';
|
||||
}
|
||||
else if (block.type === 'Multiple')
|
||||
{
|
||||
let first = '';
|
||||
if (firstCount)
|
||||
{
|
||||
firstCount = false;
|
||||
first = letConst + ' ';
|
||||
}
|
||||
blockIndex = ' ' + first + 'count = ' + block.count + ';\n';
|
||||
blockIndex += ' this.' + block.name + ' = [];';
|
||||
}
|
||||
else
|
||||
{
|
||||
single = true;
|
||||
}
|
||||
let spaces = '';
|
||||
let decl = '';
|
||||
if (firstBlock)
|
||||
{
|
||||
firstBlock = false;
|
||||
decl = varBlockConst + ' ';
|
||||
}
|
||||
if (!single)
|
||||
{
|
||||
spaces = ' ';
|
||||
classString += blockIndex;
|
||||
classString += ' for (let i = 0; i < count; i++)\n';
|
||||
classString += ' {\n';
|
||||
classString += ' const newObj' + block.name + ': {\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
classString += ' const newObj' + block.name + ': {\n';
|
||||
}
|
||||
const paramTypes = [];
|
||||
const paramValues = [];
|
||||
block.params.forEach((param) =>
|
||||
{
|
||||
let jstype = 'string';
|
||||
let jsvalue = '\'\'';
|
||||
switch(param.type)
|
||||
{
|
||||
case 'LLUUID':
|
||||
jstype = 'UUID';
|
||||
jsvalue = 'UUID.zero()';
|
||||
break;
|
||||
case 'F32':
|
||||
case 'S32':
|
||||
case 'U32':
|
||||
jstype = 'number';
|
||||
jsvalue = '0';
|
||||
break;
|
||||
case 'IPPORT':
|
||||
case 'S16':
|
||||
case 'U16':
|
||||
jstype = 'number';
|
||||
jsvalue = '0';
|
||||
break;
|
||||
case 'U64':
|
||||
case 'S64':
|
||||
jstype = 'Long';
|
||||
jsvalue = 'Long.ZERO';
|
||||
break;
|
||||
case 'F64':
|
||||
jstype = 'number';
|
||||
jsvalue = '0';
|
||||
break;
|
||||
case 'S8':
|
||||
case 'U8':
|
||||
jstype = 'number';
|
||||
jsvalue = '0';
|
||||
break;
|
||||
case 'BOOL':
|
||||
jstype = 'boolean';
|
||||
jsvalue = 'false';
|
||||
break;
|
||||
case 'Variable':
|
||||
jstype = 'string';
|
||||
jsvalue = '\'\'';
|
||||
break;
|
||||
case 'LLVector4':
|
||||
jstype = 'Vector4';
|
||||
jsvalue = 'Vector4.getZero()';
|
||||
break;
|
||||
case 'LLQuaternion':
|
||||
jstype = 'Quaternion';
|
||||
jsvalue = 'Quaternion.getIdentity()';
|
||||
break;
|
||||
case 'LLVector3d':
|
||||
jstype = 'Vector3';
|
||||
jsvalue = 'Vector3.getZero()';
|
||||
break;
|
||||
case 'LLVector3':
|
||||
jstype = 'Vector3';
|
||||
jsvalue = 'Vector3.getZero()';
|
||||
break;
|
||||
case 'IPADDR':
|
||||
jstype = 'IPAddress';
|
||||
jsvalue = 'IPAddress.zero()';
|
||||
break;
|
||||
case 'Fixed':
|
||||
jstype = 'Buffer';
|
||||
jsvalue = 'Buffer.allocUnsafe(0)';
|
||||
break;
|
||||
default:
|
||||
console.log('Unknown type: '+param.type);
|
||||
}
|
||||
paramTypes.push(spaces + ' ' + param.name + ': '+jstype);
|
||||
paramValues.push(spaces + ' ' + param.name + ': '+jsvalue);
|
||||
});
|
||||
classString += paramTypes.join(',\n')+'\n';
|
||||
classString += spaces + ' } = {\n';
|
||||
classString += paramValues.join(',\n')+'\n';
|
||||
classString += spaces + ' };\n';
|
||||
block.params.forEach((param) =>
|
||||
{
|
||||
let val = '';
|
||||
switch (param.type)
|
||||
{
|
||||
case 'LLUUID':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new UUID(buf, pos);\n';
|
||||
classString += spaces + ' pos += 16;\n';
|
||||
break;
|
||||
case 'F32':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readFloatLE(pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'S32':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt32LE(pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'U32':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt32LE(pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'U16':
|
||||
case 'IPPORT':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt16LE(pos);\n';
|
||||
classString += spaces + ' pos += 2;\n';
|
||||
break;
|
||||
case 'S16':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt16LE(pos);\n';
|
||||
classString += spaces + ' pos += 2;\n';
|
||||
break;
|
||||
case 'U64':
|
||||
case 'S64':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4));\n';
|
||||
classString += spaces + ' pos += 8;\n';
|
||||
break;
|
||||
case 'F64':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readDoubleLE(pos);\n';
|
||||
classString += spaces + ' pos += 8;\n';
|
||||
break;
|
||||
case 'S8':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt8(pos++);\n';
|
||||
break;
|
||||
case 'U8':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt8(pos++);\n';
|
||||
break;
|
||||
case 'BOOL':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = (buf.readUInt8(pos++) === 1);\n';
|
||||
break;
|
||||
case 'Variable':
|
||||
if (param.size === 1)
|
||||
{
|
||||
classString += spaces + ' let length = buf.readUInt8(pos++);\n';
|
||||
}
|
||||
if (param.size === 2)
|
||||
{
|
||||
classString += spaces + ' let length = buf.readUInt16BE(pos);\n';
|
||||
classString += spaces + ' pos += 2;\n';
|
||||
}
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.toString(\'utf8\', pos, length);\n';
|
||||
classString += spaces + ' pos += length;\n';
|
||||
break;
|
||||
case 'LLVector4':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector4(buf, pos);\n';
|
||||
classString += spaces + ' pos += 16;\n';
|
||||
break;
|
||||
case 'LLQuaternion':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Quaternion(buf, pos);\n';
|
||||
classString += spaces + ' pos += 12;\n';
|
||||
break;
|
||||
case 'LLVector3d':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector3(buf, pos, true);\n';
|
||||
classString += spaces + ' pos += 24;\n';
|
||||
break;
|
||||
case 'LLVector3':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector3(buf, pos, false);\n';
|
||||
classString += spaces + ' pos += 12;\n';
|
||||
break;
|
||||
case 'IPADDR':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new IPAddress(buf, pos);\n';
|
||||
classString += spaces + ' pos += 4;\n';
|
||||
break;
|
||||
case 'Fixed':
|
||||
classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.slice(pos, pos + ' + param.size + ');\n';
|
||||
classString += spaces + ' pos += ' + param.size + ';\n';
|
||||
break;
|
||||
default:
|
||||
console.log('Unknown type: ' + param.type);
|
||||
}
|
||||
});
|
||||
if (!single)
|
||||
{
|
||||
classString += ' this.'+block.name+'.push(newObj' + block.name + ');\n';
|
||||
classString += ' }\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
classString += ' this.'+block.name+' = newObj' + block.name + ';\n';
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
classString += ' return pos - startPos;\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
classString += ' return 0;\n';
|
||||
}
|
||||
classString +=' }\n';
|
||||
classString += '}\n';
|
||||
classString +='\n';
|
||||
|
||||
const p = path.join(__dirname+'/../lib/classes/packets/'+message.name+'.ts');
|
||||
fs.writeFile(p, classString, (err) =>
|
||||
@@ -327,3 +766,60 @@ messages.forEach((message) =>
|
||||
});
|
||||
|
||||
});
|
||||
//Now write the Messages class
|
||||
let classString = '// This file has been automatically generated by writePacketClasses.js\n\n';
|
||||
messages.forEach((message) =>
|
||||
{
|
||||
const name = message.name;
|
||||
classString += 'export * from \'./packets/'+name+'\';\n';
|
||||
});
|
||||
classString += 'import {Message} from \'../enums/Message\';\n';
|
||||
classString += '\n';
|
||||
classString += 'const messages: {[index: number]: string} = {};\n';
|
||||
const msgs = [];
|
||||
messages.forEach((message) =>
|
||||
{
|
||||
msgs.push('messages[<number>Message.' + message.name + '] = \'' + message.name + 'Packet\'');
|
||||
});
|
||||
classString += msgs.join(';\n')+';\n';
|
||||
classString += '\n';
|
||||
classString += 'export function nameFromID(id: Message): string\n';
|
||||
classString += '{\n';
|
||||
classString += ' return messages[id];\n';
|
||||
classString += '}\n';
|
||||
const p = path.join(__dirname+'/../lib/classes/MessageClasses.ts');
|
||||
fs.writeFile(p, classString, (err) =>
|
||||
{
|
||||
|
||||
});
|
||||
|
||||
classString = 'export enum Message {\n';
|
||||
const msgArr = [];
|
||||
messages.forEach((message) =>
|
||||
{
|
||||
let id = parseInt(message.id);
|
||||
switch(message.frequency)
|
||||
{
|
||||
case 'Low':
|
||||
id += 4294901760;
|
||||
break;
|
||||
case 'Medium':
|
||||
id += 65280;
|
||||
break;
|
||||
case 'Fixed':
|
||||
break;
|
||||
case 'High':
|
||||
break;
|
||||
default:
|
||||
console.log("UNKNOWN FREQUENCY: "+message.frequency);
|
||||
break;
|
||||
}
|
||||
msgArr.push(' '+message.name+' = '+id);
|
||||
});
|
||||
classString += msgArr.join(',\n')+'\n';
|
||||
classString += '}\n';
|
||||
const e = path.join(__dirname+'/../lib/enums/Message.ts');
|
||||
fs.writeFile(e, classString, (err) =>
|
||||
{
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user