export interface ProtoTransform { x: number; y: number; rot: number; } export enum PlanetType { Earth = "Earth", Moon = "Moon", Mars = "Mars", } export enum PartType { Hearty = "Hearty", Cargo = "Cargo", Hub = "Hub", } export enum ButtonType { Left = "Left", Middle = "Middle", Right = "Right", } export interface Planet { planet_type: PlanetType; transform: ProtoTransform; radius: number; } export interface Part { part_type: PartType; transform: ProtoTransform; } export interface ClientLoginPacket { username: string; jwt: string | null; } export interface SpawnPlayerPacket { id: number; username: string; } export interface PlanetPositionsPacket { planets: [number, Planet][]; } export interface PartPositionsPacket { parts: [number, Part][]; } export interface SpawnPartPacket { id: number; part: Part; } export interface DespawnPartPacket { id: number; } export interface PlayerInputPacket { up: boolean; down: boolean; left: boolean; right: boolean; } export interface PlayerMouseInputPacket { x: number; y: number; released: boolean; button: ButtonType; } export interface PlayerListPacket { players: [number, string][]; } export interface PlayerLeavePacket { id: number; } export interface SendMessagePacket { target: string | null; content: string; } export enum MessageType { Server = "Server", Error = "Error", Chat = "Chat", Direct = "Direct", } export interface MessagePacket { message_type: MessageType; actor: string; content: string; } export enum PacketType { // serverbound ClientLogin = "ClientLogin", SendMessage = "SendMessage", PlayerInput = "PlayerInput", PlayerMouseInput = "PlayerMouseInput", // clientbound SpawnPlayer = "SpawnPlayer", PlayerList = "PlayerList", PlanetPositions = "PlanetPositions", PartPositions = "PartPositions", SpawnPart = "SpawnPart", DespawnPart = "DespawnPart", PlayerLeave = "PlayerLeave", Message = "Message", } export interface Packet { t: PacketType; c: | ClientLoginPacket | SpawnPlayerPacket | PlayerListPacket | PlanetPositionsPacket | PartPositionsPacket | SpawnPartPacket | DespawnPartPacket | PlayerLeavePacket | SendMessagePacket | MessagePacket | PlayerInputPacket | PlayerMouseInputPacket; } export const SERVERBOUND = [ PacketType.ClientLogin, PacketType.SendMessage, PacketType.PlayerInput, PacketType.PlayerMouseInput, ]; export const CLIENTBOUND = [ PacketType.SpawnPlayer, PacketType.PlayerList, PacketType.PlanetPositions, PacketType.PartPositions, PacketType.SpawnPart, PacketType.DespawnPart, PacketType.PlayerLeave, PacketType.Message, ]; export enum Direction { Serverbound = "Serverbound", Clientbound = "Clientbound", InvalidType = "InvalidType", } export function type_direction(type: PacketType): Direction { if (SERVERBOUND.includes(type)) { return Direction.Serverbound; } else if (CLIENTBOUND.includes(type)) { return Direction.Clientbound; } else { return Direction.InvalidType; } }