diff --git a/README.md b/README.md
index 87fb875..6c4d080 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,69 @@
# cubicjs
-https://meex.lol/cubic/
\ No newline at end of file
+сайт: https://meex.lol/cubic/
+
+## протокол
+
+работает через вебсокеты \
+дефолтный порт 8000
+
+булевые значения пишутся как 0 и 1 \
+в нике не должны быть пробелы \
+установка - добавление / изменение
+
+чтобы подключиться к серверу, \
+нужно отправить пакет J, затем \
+все пакеты произвольные
+
+### формат пакетов
+первый символ - тип пакета \
+остальное - данные пакета, параметры через \n (перенос строки) \
+пример пакета отправки мира:
+```
+ "WB10,0,1,normal,#fff\nP1name,0,1,0,0,#d00"
+ 🠅└─┬───────────────┘ └┬────────────────┘
+тип параметр (блок) параметр (игрок)
+```
+
+### список пакетов
+{данные} - типа это какието данные так обозначаю, скобки не надо \
+[C] - айди пакета
+
+**клиент отправляет:**
+```
+заход игрока [J]: {ник_игрока}
+отправить velocity [V]: {vel_x}, {vel_y}
+установить блок [P]: {x}, {y}, {тип}
+сломать блок [D]: {x}, {y}
+нажатие кнопки (список кнопок ниже) [K]: {кнопка}, {нажата ли}
+отправить сообщение [M]: {сообщение}
+```
+
+**сервер отправляет:**
+```
+кикнуть игрока с ошибкой [K]: {ошибка}
+установить цвета игроку [C]: {цвет}
+установить ник игрока [N]: {ник}
+установить позицию игрока [P]: {x}, {y}
+установить velocity игрока [V]: {x}, {y}
+установить walk speed игрока [S]: "W", {скорость}
+установить jump speed игрока [S]: "J", {скорость}
+установить gravity speed игрока [S]: "G", {скорость}
+отправить мир [W]: {изм. мира}, {изм. мира}, ...
+отправить все типы блоков: [B]: {тип_1}, ..., {тип_9}
+отправить сообщение [M]: {сообщение}, {сообщение}, ...
+```
+
+**список кнопок которые может отправить игрок через отдельный пакет:**
+```
+["KeyR", "KeyW", "KeyE", "KeyQ", "KeyS", "KeyZ", "KeyX", "KeyC"
+"Numpad1", "Numpad2", "Numpad3", "Numpad4", "Numpad5",
+"Numpad6", "Numpad7", "Numpad8", "Numpad9", "Numpad0",
+"ShiftLeft", "ControlLeft", "Enter", "F1", "F2"]
+```
+
+**формат изменения мира:** \
+установка блока: "B1{x},{y},{collides},{type},{color}" \
+установка игрока: "P1{name},{x},{y},{vel_x},{vel_y},{color}"\
+удаление блока: "B0{x},{y}" \
+удаление игрока: "P0{name}"
\ No newline at end of file
diff --git a/index.html b/index.html
index 89b2dbb..d647c47 100644
--- a/index.html
+++ b/index.html
@@ -42,7 +42,6 @@
-
-работает через вебсокеты -дефолтный порт 8000 - -булевые значения пишутся как 0 и 1 -в нике не должны быть пробелы -установка - добавление / изменение - -формат пакетов: - первый символ - тип пакета - остальное - данные пакета, параметры через \n (перенос строки) - пример пакета отправки мира: - "WB10,0,1,normal,#fff\nP1name,0,1,0,0,#d00" - 🠅└─┬───────────────┘ └┬────────────────┘ - тип параметр (блок) параметр (игрок) - - -список пакетов: - {данные} - типа это какието данные так обозначаю, скобки не надо - [C] - айди пакета - - клиент отправляет: - заход игрока [J]: {ник_игрока} - прыжок выкл (controls_jump = false) [C]: "J", "0" - прыжок вкл (controls_jump = true) [C]: "J", "1" - идти выкл (controls_x = 0) [C]: "W", "0" - идти левее (controls_x = -1) [C]: "W", "1" - идти правее (controls_x = 1) [C]: "W", "2" - установить блок [P]: {x}, {y}, {тип} - сломать блок [D]: {x}, {y} - нажатие кнопки (список кнопок ниже) [K]: {кнопка}, {нажата ли} - отправить сообщение [M]: {сообщение} - корректировка движения [R]: {рандомное айди} - - сервер отправляет: - кикнуть игрока с ошибкой [K]: {ошибка} - установить цвета игроку [C]: {цвет} - установить ник игрока [N]: {ник} - установить позицию игрока [P]: {x}, {y} - установить velocity игрока [V]: {x}, {y} - установить walk speed игрока [S]: "W", {скорость} - установить jump speed игрока [S]: "J", {скорость} - установить gravity speed игрока [S]: "G", {скорость} - отправить мир [W]: {изм. мира}, {изм. мира}, ... - отправить все типы блоков: [B]: {тип_1}, ..., {тип_9} - отправить сообщение [M]: {сообщение}, {сообщение}, ... - корректировка движения [R]: {рандомное айди}, {время}, {vel_x}, {vel_y}, {x}, {y} - -список кнопок которые может отправить игрок через отдельный пакет: -["KeyR", "KeyW", "KeyE", "KeyQ", "KeyS", "KeyZ", "KeyX", "KeyC" -"Numpad1", "Numpad2", "Numpad3", "Numpad4", "Numpad5", -"Numpad6", "Numpad7", "Numpad8", "Numpad9", "Numpad0", -"ShiftLeft", "ControlLeft", "Enter", "F1", "F2"] - -формат изменения мира: - установка блока: "B1{x},{y},{collides},{type},{color}" - установка игрока: "P1{name},{x},{y},{vel_x},{vel_y},{color}" - удаление блока: "B0{x},{y}" - удаление игрока: "P0{name}" - -- + репозиторий гитхаб + протокол сервера готовая реализация сервера на Python diff --git a/script.js b/script.js index 9003345..97cf421 100644 --- a/script.js +++ b/script.js @@ -325,14 +325,11 @@ class MainPlayer extends Player { } } else { if (key == "KeyD") { - this.send_packet("C","W","2") - setTimeout(() => { this.controls_x = 1 }, this.ping) + this.controls_x = 1 } else if (key == "KeyA") { - this.send_packet("C","W","1") - setTimeout(() => { this.controls_x = -1 }, this.ping) + this.controls_x = -1 } else if (key == "Space") { - this.send_packet("C","J","1") - setTimeout(() => { this.controls_jump = true }, this.ping) + this.controls_jump = true e.preventDefault() return false } else if (key == "KeyR") { @@ -369,11 +366,9 @@ class MainPlayer extends Player { if ((key == "KeyD" && this.controls_x == 1) || (key == "KeyA" && this.controls_x == -1)) { - this.send_packet("C","W","0") - setTimeout(() => { this.controls_x = 0 }, this.ping) + this.controls_x = 0 } else if (key == "Space" && this.controls_jump) { - this.send_packet("C","J","0") - setTimeout(() => { this.controls_jump = false }, this.ping) + this.controls_jump = false } if (allowed_key_to_send.includes(key)) { @@ -435,16 +430,6 @@ class MainPlayer extends Player { chatMessages.unshift(...packet_data) } - if (packet_id == "R") { - let ping = parseFloat(packet_data[1]) - parseFloat(packet_data[0]) - if (player.ping == -1) player.ping = ping - else player.ping = (player.ping + ping) / 2 - player.velocity_x = parseFloat(packet_data[2]) - player.velocity_y = parseFloat(packet_data[3]) - player.x = parseFloat(packet_data[4]) - player.y = parseFloat(packet_data[5]) - } - if (packet_id == "P") { let x = parseFloat(packet_data[0]) let y = parseFloat(packet_data[1]) @@ -540,13 +525,22 @@ class MainPlayer extends Player { this.socket.send(id+params.join("\n")) } + send_velocity_packet(x, y) { + if (x != 0 || y != 0) return + this.send_packet("V", x, y) + } + tick() { super.tick(false) - this.velocity_x += this.controls_x * this.walk_speed + let vel_x = this.controls_x * this.walk_speed + let vel_y = 0 + + this.velocity_x += vel_x if (this.controls_jump && this.on_ground) { - this.velocity_y += this.jump_speed + vel_y = this.jump_speed + this.velocity_y += vel_y this.on_ground = false } else { this.velocity_y -= this.gravity_speed @@ -556,7 +550,7 @@ class MainPlayer extends Player { ticksAlive++ - this.send_packet("R",Date.now()) + this.send_velocity_packet(vel_x, vel_y) } render() { diff --git a/server.py b/server.py index b7aa4a6..fc82aed 100644 --- a/server.py +++ b/server.py @@ -121,12 +121,7 @@ class Player(Block): self.vel_x = round(self.vel_x * 100) / 100 self.vel_y = round(self.vel_y * 100) / 100 - self.vel_x += self.controls_x * self.walk_speed - - if self.controls_jump and self.on_ground: - self.vel_y += self.jump_speed - self.on_ground = False - else: + if not self.on_ground: self.vel_y -= self.gravity_speed await self.collide() @@ -169,12 +164,12 @@ class Player(Block): # pass async def render(self): - self.vel_x *= 0.5 - self.vel_y *= 0.5 - self.x += self.vel_x - self.y += self.vel_y - # await self.setVel(self.vel_x * 0.5, self.vel_y * 0.5) - # await self.setPos(self.x + self.vel_x, self.y + self.vel_y) + # self.vel_x *= 0.5 + # self.vel_y *= 0.5 + # self.x += self.vel_x + # self.y += self.vel_y + await self.setVel(self.vel_x * 0.5, self.vel_y * 0.5) + await self.setPos(self.x + self.vel_x, self.y + self.vel_y) return self.vel_x != 0 or self.vel_y != 0 def toStatement(self, add=True): @@ -236,19 +231,16 @@ async def handler(websocket: ServerConnection): while True: packet_id, packet_data = await readPacket(websocket) - if packet_id == "C": - if packet_data[0] == "W": - if packet_data[1] == "0": - player.controls_x = 0 - if packet_data[1] == "1": - player.controls_x = -1 - if packet_data[1] == "2": - player.controls_x = 1 - if packet_data[0] == "J": - if packet_data[1] == "0": - player.controls_jump = False - if packet_data[1] == "1": - player.controls_jump = True + if packet_id == "V": + vel_x, vel_y = float(packet_data[0]), float(packet_data[1]) + vel_x = max(min(vel_x, player.walk_speed), -player.walk_speed) + vel_y = max(min(vel_x, player.jump_speed), 0) + + player.vel_x += vel_x + + if player.on_ground: + player.vel_y += vel_y + player.on_ground = False if packet_id == "K": key,pressed = packet_data @@ -271,18 +263,6 @@ async def handler(websocket: ServerConnection): print(message) - if packet_id == "R": - rid = packet_data[0] - - await writePacket(websocket, "R", [ - rid, - str(current_milli_time()), - str(player.vel_x), - str(player.vel_y), - str(player.x), - str(player.y) - ]) - if packet_id == "D": x,y = packet_data x,y = int(x),int(y)