~starkingdoms/starkingdoms

68d7af692cb7855fe7b23dc50faa42a58bc2375f — ghostlyzsh 2 years ago b5af7e4
basic module protocol finished?
M client/src/gateway.ts => client/src/gateway.ts +2 -2
@@ 74,7 74,7 @@ export async function gateway_connect(gateway_url: string, username: string): Pr
    let handshake_start_msg;
    if (global.can_beam_out) {
        handshake_start_msg = MessageC2SHello.encode({
            version: 4,
            version: 5,
            requestedUsername: username,
            nextState: State.Play,
            user: window.localStorage.getItem("user")!,


@@ 82,7 82,7 @@ export async function gateway_connect(gateway_url: string, username: string): Pr
        }).finish();
    } else {
        handshake_start_msg = MessageC2SHello.encode({
            version: 4,
            version: 5,
            requestedUsername: username,
            nextState: State.Play,
            // @ts-ignore

M client/src/protocol/message_c2s.ts => client/src/protocol/message_c2s.ts +246 -0
@@ 286,6 286,84 @@ export function messageC2SMouseInput_packetInfoToJSON(object: MessageC2SMouseInp
  }
}

export interface MessageC2SModuleGrabBegin {
  moduleId: number;
  worldposX: number;
  worldposY: number;
}

export enum MessageC2SModuleGrabBegin_packetInfo {
  unknown = 0,
  type = 14,
  UNRECOGNIZED = -1,
}

export function messageC2SModuleGrabBegin_packetInfoFromJSON(object: any): MessageC2SModuleGrabBegin_packetInfo {
  switch (object) {
    case 0:
    case "unknown":
      return MessageC2SModuleGrabBegin_packetInfo.unknown;
    case 14:
    case "type":
      return MessageC2SModuleGrabBegin_packetInfo.type;
    case -1:
    case "UNRECOGNIZED":
    default:
      return MessageC2SModuleGrabBegin_packetInfo.UNRECOGNIZED;
  }
}

export function messageC2SModuleGrabBegin_packetInfoToJSON(object: MessageC2SModuleGrabBegin_packetInfo): string {
  switch (object) {
    case MessageC2SModuleGrabBegin_packetInfo.unknown:
      return "unknown";
    case MessageC2SModuleGrabBegin_packetInfo.type:
      return "type";
    case MessageC2SModuleGrabBegin_packetInfo.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

export interface MessageC2SModuleGrabEnd {
  moduleId: number;
  parentId: number;
  slot: number;
}

export enum MessageC2SModuleGrabEnd_packetInfo {
  unknown = 0,
  type = 16,
  UNRECOGNIZED = -1,
}

export function messageC2SModuleGrabEnd_packetInfoFromJSON(object: any): MessageC2SModuleGrabEnd_packetInfo {
  switch (object) {
    case 0:
    case "unknown":
      return MessageC2SModuleGrabEnd_packetInfo.unknown;
    case 16:
    case "type":
      return MessageC2SModuleGrabEnd_packetInfo.type;
    case -1:
    case "UNRECOGNIZED":
    default:
      return MessageC2SModuleGrabEnd_packetInfo.UNRECOGNIZED;
  }
}

export function messageC2SModuleGrabEnd_packetInfoToJSON(object: MessageC2SModuleGrabEnd_packetInfo): string {
  switch (object) {
    case MessageC2SModuleGrabEnd_packetInfo.unknown:
      return "unknown";
    case MessageC2SModuleGrabEnd_packetInfo.type:
      return "type";
    case MessageC2SModuleGrabEnd_packetInfo.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

function createBaseMessageC2SHello(): MessageC2SHello {
  return { version: 0, requestedUsername: "", nextState: 0, token: "", user: "" };
}


@@ 821,6 899,174 @@ export const MessageC2SMouseInput = {
  },
};

function createBaseMessageC2SModuleGrabBegin(): MessageC2SModuleGrabBegin {
  return { moduleId: 0, worldposX: 0, worldposY: 0 };
}

export const MessageC2SModuleGrabBegin = {
  encode(message: MessageC2SModuleGrabBegin, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.moduleId !== 0) {
      writer.uint32(8).uint32(message.moduleId);
    }
    if (message.worldposX !== 0) {
      writer.uint32(17).double(message.worldposX);
    }
    if (message.worldposY !== 0) {
      writer.uint32(25).double(message.worldposY);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): MessageC2SModuleGrabBegin {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseMessageC2SModuleGrabBegin();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 8) {
            break;
          }

          message.moduleId = reader.uint32();
          continue;
        case 2:
          if (tag != 17) {
            break;
          }

          message.worldposX = reader.double();
          continue;
        case 3:
          if (tag != 25) {
            break;
          }

          message.worldposY = reader.double();
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): MessageC2SModuleGrabBegin {
    return {
      moduleId: isSet(object.moduleId) ? Number(object.moduleId) : 0,
      worldposX: isSet(object.worldposX) ? Number(object.worldposX) : 0,
      worldposY: isSet(object.worldposY) ? Number(object.worldposY) : 0,
    };
  },

  toJSON(message: MessageC2SModuleGrabBegin): unknown {
    const obj: any = {};
    message.moduleId !== undefined && (obj.moduleId = Math.round(message.moduleId));
    message.worldposX !== undefined && (obj.worldposX = message.worldposX);
    message.worldposY !== undefined && (obj.worldposY = message.worldposY);
    return obj;
  },

  create<I extends Exact<DeepPartial<MessageC2SModuleGrabBegin>, I>>(base?: I): MessageC2SModuleGrabBegin {
    return MessageC2SModuleGrabBegin.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<MessageC2SModuleGrabBegin>, I>>(object: I): MessageC2SModuleGrabBegin {
    const message = createBaseMessageC2SModuleGrabBegin();
    message.moduleId = object.moduleId ?? 0;
    message.worldposX = object.worldposX ?? 0;
    message.worldposY = object.worldposY ?? 0;
    return message;
  },
};

function createBaseMessageC2SModuleGrabEnd(): MessageC2SModuleGrabEnd {
  return { moduleId: 0, parentId: 0, slot: 0 };
}

export const MessageC2SModuleGrabEnd = {
  encode(message: MessageC2SModuleGrabEnd, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.moduleId !== 0) {
      writer.uint32(8).uint32(message.moduleId);
    }
    if (message.parentId !== 0) {
      writer.uint32(16).uint32(message.parentId);
    }
    if (message.slot !== 0) {
      writer.uint32(24).uint32(message.slot);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): MessageC2SModuleGrabEnd {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseMessageC2SModuleGrabEnd();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 8) {
            break;
          }

          message.moduleId = reader.uint32();
          continue;
        case 2:
          if (tag != 16) {
            break;
          }

          message.parentId = reader.uint32();
          continue;
        case 3:
          if (tag != 24) {
            break;
          }

          message.slot = reader.uint32();
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): MessageC2SModuleGrabEnd {
    return {
      moduleId: isSet(object.moduleId) ? Number(object.moduleId) : 0,
      parentId: isSet(object.parentId) ? Number(object.parentId) : 0,
      slot: isSet(object.slot) ? Number(object.slot) : 0,
    };
  },

  toJSON(message: MessageC2SModuleGrabEnd): unknown {
    const obj: any = {};
    message.moduleId !== undefined && (obj.moduleId = Math.round(message.moduleId));
    message.parentId !== undefined && (obj.parentId = Math.round(message.parentId));
    message.slot !== undefined && (obj.slot = Math.round(message.slot));
    return obj;
  },

  create<I extends Exact<DeepPartial<MessageC2SModuleGrabEnd>, I>>(base?: I): MessageC2SModuleGrabEnd {
    return MessageC2SModuleGrabEnd.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<MessageC2SModuleGrabEnd>, I>>(object: I): MessageC2SModuleGrabEnd {
    const message = createBaseMessageC2SModuleGrabEnd();
    message.moduleId = object.moduleId ?? 0;
    message.parentId = object.parentId ?? 0;
    message.slot = object.slot ?? 0;
    return message;
  },
};

type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;

export type DeepPartial<T> = T extends Builtin ? T

M client/src/protocol/message_s2c.ts => client/src/protocol/message_s2c.ts +288 -1
@@ 1,7 1,7 @@
//@ts-nocheck
import * as _m0 from "protobufjs/minimal";
import { GoodbyeReason, goodbyeReasonFromJSON, goodbyeReasonToJSON } from "./goodbye_reason";
import { Module } from "./module";
import { AttachedModule, Module } from "./module";
import { Planet } from "./planet";
import { Player } from "./player";
import { State, stateFromJSON, stateToJSON } from "./state";


@@ 277,6 277,117 @@ export function messageS2CModulesUpdate_packetInfoToJSON(object: MessageS2CModul
  }
}

export interface MessageS2CModuleTreeUpdate {
  tree: AttachedModule[];
}

export enum MessageS2CModuleTreeUpdate_packetInfo {
  unknown = 0,
  type = 12,
  UNRECOGNIZED = -1,
}

export function messageS2CModuleTreeUpdate_packetInfoFromJSON(object: any): MessageS2CModuleTreeUpdate_packetInfo {
  switch (object) {
    case 0:
    case "unknown":
      return MessageS2CModuleTreeUpdate_packetInfo.unknown;
    case 12:
    case "type":
      return MessageS2CModuleTreeUpdate_packetInfo.type;
    case -1:
    case "UNRECOGNIZED":
    default:
      return MessageS2CModuleTreeUpdate_packetInfo.UNRECOGNIZED;
  }
}

export function messageS2CModuleTreeUpdate_packetInfoToJSON(object: MessageS2CModuleTreeUpdate_packetInfo): string {
  switch (object) {
    case MessageS2CModuleTreeUpdate_packetInfo.unknown:
      return "unknown";
    case MessageS2CModuleTreeUpdate_packetInfo.type:
      return "type";
    case MessageS2CModuleTreeUpdate_packetInfo.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

export interface MessageS2CModuleAdd {
  module: AttachedModule | undefined;
}

export enum MessageS2CModuleAdd_packetInfo {
  unknown = 0,
  type = 13,
  UNRECOGNIZED = -1,
}

export function messageS2CModuleAdd_packetInfoFromJSON(object: any): MessageS2CModuleAdd_packetInfo {
  switch (object) {
    case 0:
    case "unknown":
      return MessageS2CModuleAdd_packetInfo.unknown;
    case 13:
    case "type":
      return MessageS2CModuleAdd_packetInfo.type;
    case -1:
    case "UNRECOGNIZED":
    default:
      return MessageS2CModuleAdd_packetInfo.UNRECOGNIZED;
  }
}

export function messageS2CModuleAdd_packetInfoToJSON(object: MessageS2CModuleAdd_packetInfo): string {
  switch (object) {
    case MessageS2CModuleAdd_packetInfo.unknown:
      return "unknown";
    case MessageS2CModuleAdd_packetInfo.type:
      return "type";
    case MessageS2CModuleAdd_packetInfo.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

export interface MessageS2CModuleRemove {
  module: AttachedModule | undefined;
}

export enum MessageS2CModuleRemove_packetInfo {
  unknown = 0,
  type = 14,
  UNRECOGNIZED = -1,
}

export function messageS2CModuleRemove_packetInfoFromJSON(object: any): MessageS2CModuleRemove_packetInfo {
  switch (object) {
    case 0:
    case "unknown":
      return MessageS2CModuleRemove_packetInfo.unknown;
    case 14:
    case "type":
      return MessageS2CModuleRemove_packetInfo.type;
    case -1:
    case "UNRECOGNIZED":
    default:
      return MessageS2CModuleRemove_packetInfo.UNRECOGNIZED;
  }
}

export function messageS2CModuleRemove_packetInfoToJSON(object: MessageS2CModuleRemove_packetInfo): string {
  switch (object) {
    case MessageS2CModuleRemove_packetInfo.unknown:
      return "unknown";
    case MessageS2CModuleRemove_packetInfo.type:
      return "type";
    case MessageS2CModuleRemove_packetInfo.UNRECOGNIZED:
    default:
      return "UNRECOGNIZED";
  }
}

function createBaseMessageS2CHello(): MessageS2CHello {
  return { version: 0, givenUsername: "", nextState: 0 };
}


@@ 712,6 823,182 @@ export const MessageS2CModulesUpdate = {
  },
};

function createBaseMessageS2CModuleTreeUpdate(): MessageS2CModuleTreeUpdate {
  return { tree: [] };
}

export const MessageS2CModuleTreeUpdate = {
  encode(message: MessageS2CModuleTreeUpdate, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    for (const v of message.tree) {
      AttachedModule.encode(v!, writer.uint32(10).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): MessageS2CModuleTreeUpdate {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseMessageS2CModuleTreeUpdate();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 10) {
            break;
          }

          message.tree.push(AttachedModule.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): MessageS2CModuleTreeUpdate {
    return { tree: Array.isArray(object?.tree) ? object.tree.map((e: any) => AttachedModule.fromJSON(e)) : [] };
  },

  toJSON(message: MessageS2CModuleTreeUpdate): unknown {
    const obj: any = {};
    if (message.tree) {
      obj.tree = message.tree.map((e) => e ? AttachedModule.toJSON(e) : undefined);
    } else {
      obj.tree = [];
    }
    return obj;
  },

  create<I extends Exact<DeepPartial<MessageS2CModuleTreeUpdate>, I>>(base?: I): MessageS2CModuleTreeUpdate {
    return MessageS2CModuleTreeUpdate.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<MessageS2CModuleTreeUpdate>, I>>(object: I): MessageS2CModuleTreeUpdate {
    const message = createBaseMessageS2CModuleTreeUpdate();
    message.tree = object.tree?.map((e) => AttachedModule.fromPartial(e)) || [];
    return message;
  },
};

function createBaseMessageS2CModuleAdd(): MessageS2CModuleAdd {
  return { module: undefined };
}

export const MessageS2CModuleAdd = {
  encode(message: MessageS2CModuleAdd, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.module !== undefined) {
      AttachedModule.encode(message.module, writer.uint32(10).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): MessageS2CModuleAdd {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseMessageS2CModuleAdd();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 10) {
            break;
          }

          message.module = AttachedModule.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): MessageS2CModuleAdd {
    return { module: isSet(object.module) ? AttachedModule.fromJSON(object.module) : undefined };
  },

  toJSON(message: MessageS2CModuleAdd): unknown {
    const obj: any = {};
    message.module !== undefined && (obj.module = message.module ? AttachedModule.toJSON(message.module) : undefined);
    return obj;
  },

  create<I extends Exact<DeepPartial<MessageS2CModuleAdd>, I>>(base?: I): MessageS2CModuleAdd {
    return MessageS2CModuleAdd.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<MessageS2CModuleAdd>, I>>(object: I): MessageS2CModuleAdd {
    const message = createBaseMessageS2CModuleAdd();
    message.module = (object.module !== undefined && object.module !== null)
      ? AttachedModule.fromPartial(object.module)
      : undefined;
    return message;
  },
};

function createBaseMessageS2CModuleRemove(): MessageS2CModuleRemove {
  return { module: undefined };
}

export const MessageS2CModuleRemove = {
  encode(message: MessageS2CModuleRemove, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.module !== undefined) {
      AttachedModule.encode(message.module, writer.uint32(10).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): MessageS2CModuleRemove {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseMessageS2CModuleRemove();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 10) {
            break;
          }

          message.module = AttachedModule.decode(reader, reader.uint32());
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): MessageS2CModuleRemove {
    return { module: isSet(object.module) ? AttachedModule.fromJSON(object.module) : undefined };
  },

  toJSON(message: MessageS2CModuleRemove): unknown {
    const obj: any = {};
    message.module !== undefined && (obj.module = message.module ? AttachedModule.toJSON(message.module) : undefined);
    return obj;
  },

  create<I extends Exact<DeepPartial<MessageS2CModuleRemove>, I>>(base?: I): MessageS2CModuleRemove {
    return MessageS2CModuleRemove.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<MessageS2CModuleRemove>, I>>(object: I): MessageS2CModuleRemove {
    const message = createBaseMessageS2CModuleRemove();
    message.module = (object.module !== undefined && object.module !== null)
      ? AttachedModule.fromPartial(object.module)
      : undefined;
    return message;
  },
};

type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;

export type DeepPartial<T> = T extends Builtin ? T

M client/src/protocol/module.ts => client/src/protocol/module.ts +224 -1
@@ 53,10 53,25 @@ export interface Module {
  rotation: number;
  x: number;
  y: number;
  isOn: boolean;
}

export interface AttachedModule {
  moduleType: ModuleType;
  rotation: number;
  x: number;
  y: number;
  id: number;
  children: Attachment[];
}

export interface Attachment {
  id: number;
  slot: number;
}

function createBaseModule(): Module {
  return { moduleType: 0, rotation: 0, x: 0, y: 0 };
  return { moduleType: 0, rotation: 0, x: 0, y: 0, isOn: false };
}

export const Module = {


@@ 73,6 88,9 @@ export const Module = {
    if (message.y !== 0) {
      writer.uint32(33).double(message.y);
    }
    if (message.isOn === true) {
      writer.uint32(40).bool(message.isOn);
    }
    return writer;
  },



@@ 111,6 129,13 @@ export const Module = {

          message.y = reader.double();
          continue;
        case 5:
          if (tag != 40) {
            break;
          }

          message.isOn = reader.bool();
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;


@@ 126,6 151,7 @@ export const Module = {
      rotation: isSet(object.rotation) ? Number(object.rotation) : 0,
      x: isSet(object.x) ? Number(object.x) : 0,
      y: isSet(object.y) ? Number(object.y) : 0,
      isOn: isSet(object.isOn) ? Boolean(object.isOn) : false,
    };
  },



@@ 135,6 161,7 @@ export const Module = {
    message.rotation !== undefined && (obj.rotation = message.rotation);
    message.x !== undefined && (obj.x = message.x);
    message.y !== undefined && (obj.y = message.y);
    message.isOn !== undefined && (obj.isOn = message.isOn);
    return obj;
  },



@@ 148,6 175,202 @@ export const Module = {
    message.rotation = object.rotation ?? 0;
    message.x = object.x ?? 0;
    message.y = object.y ?? 0;
    message.isOn = object.isOn ?? false;
    return message;
  },
};

function createBaseAttachedModule(): AttachedModule {
  return { moduleType: 0, rotation: 0, x: 0, y: 0, id: 0, children: [] };
}

export const AttachedModule = {
  encode(message: AttachedModule, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.moduleType !== 0) {
      writer.uint32(8).int32(message.moduleType);
    }
    if (message.rotation !== 0) {
      writer.uint32(17).double(message.rotation);
    }
    if (message.x !== 0) {
      writer.uint32(25).double(message.x);
    }
    if (message.y !== 0) {
      writer.uint32(33).double(message.y);
    }
    if (message.id !== 0) {
      writer.uint32(40).uint32(message.id);
    }
    for (const v of message.children) {
      Attachment.encode(v!, writer.uint32(50).fork()).ldelim();
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): AttachedModule {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseAttachedModule();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 8) {
            break;
          }

          message.moduleType = reader.int32() as any;
          continue;
        case 2:
          if (tag != 17) {
            break;
          }

          message.rotation = reader.double();
          continue;
        case 3:
          if (tag != 25) {
            break;
          }

          message.x = reader.double();
          continue;
        case 4:
          if (tag != 33) {
            break;
          }

          message.y = reader.double();
          continue;
        case 5:
          if (tag != 40) {
            break;
          }

          message.id = reader.uint32();
          continue;
        case 6:
          if (tag != 50) {
            break;
          }

          message.children.push(Attachment.decode(reader, reader.uint32()));
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): AttachedModule {
    return {
      moduleType: isSet(object.moduleType) ? moduleTypeFromJSON(object.moduleType) : 0,
      rotation: isSet(object.rotation) ? Number(object.rotation) : 0,
      x: isSet(object.x) ? Number(object.x) : 0,
      y: isSet(object.y) ? Number(object.y) : 0,
      id: isSet(object.id) ? Number(object.id) : 0,
      children: Array.isArray(object?.children) ? object.children.map((e: any) => Attachment.fromJSON(e)) : [],
    };
  },

  toJSON(message: AttachedModule): unknown {
    const obj: any = {};
    message.moduleType !== undefined && (obj.moduleType = moduleTypeToJSON(message.moduleType));
    message.rotation !== undefined && (obj.rotation = message.rotation);
    message.x !== undefined && (obj.x = message.x);
    message.y !== undefined && (obj.y = message.y);
    message.id !== undefined && (obj.id = Math.round(message.id));
    if (message.children) {
      obj.children = message.children.map((e) => e ? Attachment.toJSON(e) : undefined);
    } else {
      obj.children = [];
    }
    return obj;
  },

  create<I extends Exact<DeepPartial<AttachedModule>, I>>(base?: I): AttachedModule {
    return AttachedModule.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<AttachedModule>, I>>(object: I): AttachedModule {
    const message = createBaseAttachedModule();
    message.moduleType = object.moduleType ?? 0;
    message.rotation = object.rotation ?? 0;
    message.x = object.x ?? 0;
    message.y = object.y ?? 0;
    message.id = object.id ?? 0;
    message.children = object.children?.map((e) => Attachment.fromPartial(e)) || [];
    return message;
  },
};

function createBaseAttachment(): Attachment {
  return { id: 0, slot: 0 };
}

export const Attachment = {
  encode(message: Attachment, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
    if (message.id !== 0) {
      writer.uint32(8).uint32(message.id);
    }
    if (message.slot !== 0) {
      writer.uint32(16).uint32(message.slot);
    }
    return writer;
  },

  decode(input: _m0.Reader | Uint8Array, length?: number): Attachment {
    const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
    let end = length === undefined ? reader.len : reader.pos + length;
    const message = createBaseAttachment();
    while (reader.pos < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          if (tag != 8) {
            break;
          }

          message.id = reader.uint32();
          continue;
        case 2:
          if (tag != 16) {
            break;
          }

          message.slot = reader.uint32();
          continue;
      }
      if ((tag & 7) == 4 || tag == 0) {
        break;
      }
      reader.skipType(tag & 7);
    }
    return message;
  },

  fromJSON(object: any): Attachment {
    return { id: isSet(object.id) ? Number(object.id) : 0, slot: isSet(object.slot) ? Number(object.slot) : 0 };
  },

  toJSON(message: Attachment): unknown {
    const obj: any = {};
    message.id !== undefined && (obj.id = Math.round(message.id));
    message.slot !== undefined && (obj.slot = Math.round(message.slot));
    return obj;
  },

  create<I extends Exact<DeepPartial<Attachment>, I>>(base?: I): Attachment {
    return Attachment.fromPartial(base ?? {});
  },

  fromPartial<I extends Exact<DeepPartial<Attachment>, I>>(object: I): Attachment {
    const message = createBaseAttachment();
    message.id = object.id ?? 0;
    message.slot = object.slot ?? 0;
    return message;
  },
};

M protocol/src/lib.rs => protocol/src/lib.rs +59 -2
@@ 1,9 1,10 @@
use crate::message_c2s::{
    MessageC2SAuthenticateAndBeamOut, MessageC2SChat, MessageC2SGoodbye, MessageC2SHello,
    MessageC2SInput, MessageC2SMouseInput, MessageC2SPing,
    MessageC2SInput, MessageC2SModuleGrabBegin, MessageC2SModuleGrabEnd, MessageC2SMouseInput, MessageC2SPing,
};
use crate::message_s2c::{
    MessageS2CChat, MessageS2CGoodbye, MessageS2CHello, MessageS2CModulesUpdate,
    MessageS2CModuleAdd, MessageS2CModuleRemove, MessageS2CModuleTreeUpdate,
    MessageS2CPlanetData, MessageS2CPlayersUpdate, MessageS2CPong,
};
use crate::planet::PlanetType;


@@ 12,7 13,7 @@ use protobuf::{Enum, Message};
use std::error::Error;
include!(concat!(env!("OUT_DIR"), "/protos/mod.rs"));

pub const PROTOCOL_VERSION: u32 = 4;
pub const PROTOCOL_VERSION: u32 = 5;

pub mod api;



@@ 25,6 26,8 @@ pub enum MessageC2S {
    Input(MessageC2SInput),
    AuthenticateAndBeamOut(MessageC2SAuthenticateAndBeamOut),
    MouseInput(MessageC2SMouseInput),
    ModuleGrabBegin(MessageC2SModuleGrabBegin),
    ModuleGrabEnd(MessageC2SModuleGrabEnd),
}

#[derive(Debug)]


@@ 36,6 39,9 @@ pub enum MessageS2C {
    PlayersUpdate(MessageS2CPlayersUpdate),
    PlanetData(MessageS2CPlanetData),
    ModulesUpdate(MessageS2CModulesUpdate),
    ModuleTreeUpdate(MessageS2CModuleTreeUpdate),
    ModuleAdd(MessageS2CModuleAdd),
    ModuleRemove(MessageS2CModuleRemove),
}

impl TryFrom<&[u8]> for MessageC2S {


@@ 73,6 79,16 @@ impl TryFrom<&[u8]> for MessageC2S {
            {
                MessageC2S::MouseInput(MessageC2SMouseInput::parse_from_bytes(&pkt.packet_data)?)
            }
            _id if _id
                == message_c2s::message_c2smodule_grab_begin::Packet_info::type_.value() as i64 =>
            {
                MessageC2S::ModuleGrabBegin(MessageC2SModuleGrabBegin::parse_from_bytes(&pkt.packet_data)?)
            }
            _id if _id
                == message_c2s::message_c2smodule_grab_end::Packet_info::type_.value() as i64 =>
            {
                MessageC2S::ModuleGrabEnd(MessageC2SModuleGrabEnd::parse_from_bytes(&pkt.packet_data)?)
            }
            _id => {
                return Err(format!("Unrecognized C2S packet {}", _id).into());
            }


@@ 115,6 131,14 @@ impl TryInto<Vec<u8>> for MessageC2S {
                message_c2s::message_c2smouse_input::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
            MessageC2S::ModuleGrabBegin(p) => (
                message_c2s::message_c2smodule_grab_begin::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
            MessageC2S::ModuleGrabEnd(p) => (
                message_c2s::message_c2smodule_grab_end::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
        };

        let pkt = PacketWrapper {


@@ 165,6 189,27 @@ impl TryFrom<&[u8]> for MessageS2C {
                    &pkt.packet_data,
                )?)
            }
            _id if _id
                == message_s2c::message_s2cmodule_tree_update::Packet_info::type_.value() as i64 =>
            {
                MessageS2C::ModuleTreeUpdate(MessageS2CModuleTreeUpdate::parse_from_bytes(
                    &pkt.packet_data,
                )?)
            }
            _id if _id
                == message_s2c::message_s2cmodule_add::Packet_info::type_.value() as i64 =>
            {
                MessageS2C::ModuleAdd(MessageS2CModuleAdd::parse_from_bytes(
                    &pkt.packet_data,
                )?)
            }
            _id if _id
                == message_s2c::message_s2cmodule_remove::Packet_info::type_.value() as i64 =>
            {
                MessageS2C::ModuleRemove(MessageS2CModuleRemove::parse_from_bytes(
                    &pkt.packet_data,
                )?)
            }
            _ => {
                return Err("Not a S2C packet".into());
            }


@@ 207,6 252,18 @@ impl TryInto<Vec<u8>> for MessageS2C {
                message_s2c::message_s2cmodules_update::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
            MessageS2C::ModuleTreeUpdate(p) => (
                message_s2c::message_s2cmodule_tree_update::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
            MessageS2C::ModuleAdd(p) => (
                message_s2c::message_s2cmodule_add::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
            MessageS2C::ModuleRemove(p) => (
                message_s2c::message_s2cmodule_remove::Packet_info::type_.value(),
                p.write_to_bytes()?,
            ),
        };

        let pkt = PacketWrapper {

M protocol/src/pbuf/message_s2c.proto => protocol/src/pbuf/message_s2c.proto +14 -2
@@ 50,8 50,20 @@ message MessageS2CModulesUpdate {
  repeated protocol.module.Module modules = 1;
}

message MessageS2CUpdateModuleTree {
message MessageS2CModuleTreeUpdate {
  enum packet_info { unknown = 0; type = 0x0c; }

  // tree
  repeated protocol.module.AttachedModule tree = 1;
}

message MessageS2CModuleAdd {
  enum packet_info { unknown = 0; type = 0x0d; }

  protocol.module.AttachedModule module = 1;
}

message MessageS2CModuleRemove {
  enum packet_info { unknown = 0; type = 0x0e; }

  protocol.module.AttachedModule module = 1;
}

M protocol/src/pbuf/module.proto => protocol/src/pbuf/module.proto +2 -1
@@ 6,6 6,7 @@ message Module {
    double rotation = 2;
    double x = 3;
    double y = 4;
    bool is_on = 5;
}
message AttachedModule {
    ModuleType module_type = 1;


@@ 13,7 14,7 @@ message AttachedModule {
    double x = 3;
    double y = 4;
    uint32 id = 5;
    repeated Attachment children
    repeated Attachment children = 6;
}
message Attachment {
    uint32 id = 1;