From e933ccb59c7f032d2ffc5c5f7046317a06e85e14 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Tue, 17 Oct 2023 02:30:52 +0200 Subject: codec,codec-minecraft: Adding basic foundations needed for the minecraft protocol --- c++/codec-minecraft/minecraft.h | 116 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 c++/codec-minecraft/minecraft.h (limited to 'c++/codec-minecraft/minecraft.h') diff --git a/c++/codec-minecraft/minecraft.h b/c++/codec-minecraft/minecraft.h new file mode 100644 index 0000000..670b019 --- /dev/null +++ b/c++/codec-minecraft/minecraft.h @@ -0,0 +1,116 @@ +#pragma once + +#include +#include +#include + +namespace saw { +namespace encode { +struct Minecraft {}; +struct VarIntTransport {}; +} + +template +class data { +private: + ring_buffer buffer_; +public: + data() = default; + data(std::size_t size): + buffer_{size} + {} + + buffer& get_buffer(){ + return buffer_; + } +}; + +namespace mc { +namespace impl { +union minecraft_signed_four_conversion { + int32_t s; + uint32_t u; +}; + +union minecraft_signed_eight_conversion { + int64_t s; + uint64_t u; +}; + +template +class minecraft_encode { + static_assert(always_false, "This schema type is not being handled by the Minecraft encoding."); +}; + +template +class minecraft_encode{ + static error_or encode(const data& from, buffer& to){ + uint8_t encode_index = 0; + minecraft_signed_four_conversion value; + value.s = from.get(); + + /** + * VarInt max length is 5 bytes + */ + std::array encode_data; + + do { + uint8_t step = static_cast(value.u & 0x7F); + value.u = value.u >> 7; + if(value.u != 0){ + step |= 0x80; + } + encode_data[encode_index] = step; + ++encode_index; + }while(value.u != 0); + + auto err = buffer.push(encode_data[0], encode_index); + if (!err.template is_type()) { + return err; + } + + return no_error(); + } +}; + +template +class minecraft_decode { + static_assert(always_false, "This schema type is not being handled by the Minecraft encoding."); +}; + +template +class minecraft_decode{ + static error_or decode(buffer& from, data& to){ + uint8_t num_reads = 0; + + minecraft_signed_four_conversion value; + value.u = 0; + + uint8_t read{}; + do { + auto err = from.pop(read); + if( !err.template is_type() ){ + return err; + } + value.u |= ((read & 0x7F) << (7*num_reads)); + ++num_reads; + if(num_reads > 5){ + return make_error(); + } + } while( (read & 0x80) != 0); + + to.set(value.s); + + return no_error(); + } +}; + +} +} + + + +namespace mc { + +} +} -- cgit v1.2.3