From d3060a1f280927aca9a5e83aeea2fd1569d738ef Mon Sep 17 00:00:00 2001 From: MeexReay Date: Mon, 16 Dec 2024 19:51:53 +0300 Subject: [PATCH] velocity packet --- README.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++- index.html | 68 ++---------------------------------------------------- script.js | 40 ++++++++++++++------------------ server.py | 54 ++++++++++++++----------------------------- 4 files changed, 103 insertions(+), 127 deletions(-) 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 @@

-
@@ -69,75 +68,12 @@ меню отладки на F3 ресетнуться на кнопку R открыть чат кнопка T -
-

протокол сервачный:

- -
-работает через вебсокеты
-дефолтный порт 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)