Чат и список игроков

- Протокол: Chat (что сказал сервер), ChatSend (что сказал клиент) и PlayerList
  (весь список игроков с их режимами).
- Сервер: сообщения уходят всем, а имя отправителя ставит сервер, поэтому подделать
  его нельзя. Список игроков уходит всем целиком, когда он меняется. Команды
  сервера: /help и /players.
- Клиент: перевод наших пакетов в игровые (SPacketChat и SPacketPlayerListItem),
  уходящий чат перехватывается патчем, список игроков обновляется по разнице
  (ушедших убираем, пришедших добавляем).
- Тесты: два игрока, один пишет - второй слышит с правильным именем; список
  игроков приходит обоим и меняется, когда кто-то выходит.

Попутно: run-server.ps1 теперь знает про rsx-plugin-api, иначе сервер не
запускался (нет класса Hitboxes в classpath).

Тесты: протокол 34, сервер 87. Форк собирается чисто.
This commit is contained in:
sasheg dev
2026-10-21 23:10:21 +03:00
parent 7505ddd84e
commit fbd01df884
11 changed files with 477 additions and 6 deletions
@@ -326,6 +326,23 @@ public final class ItemTest {
near("the place of the hit survives", 2.5, attackBack.y);
eq("the hand survives", Integer.valueOf(Packets.Attack.HAND_MAIN),
Integer.valueOf(attackBack.hand));
Packets.Chat chat = new Packets.Chat("Player", "hello there");
Packets.Chat chatBack = Packets.Chat.read(new Buf(chat.write().toByteArray()));
eq("the sender survives", "Player", chatBack.from);
eq("the line survives", "hello there", chatBack.text);
Packets.ChatSend send = new Packets.ChatSend("hi");
Packets.ChatSend sendBack = Packets.ChatSend.read(new Buf(send.write().toByteArray()));
eq("the sent line survives", "hi", sendBack.text);
Packets.PlayerList list = new Packets.PlayerList(
new String[]{"One", "Two"}, new int[]{0, 1});
Packets.PlayerList listBack =
Packets.PlayerList.read(new Buf(list.write().toByteArray()));
eq("two names", Integer.valueOf(2), Integer.valueOf(listBack.names.length));
eq("the first name", "One", listBack.names[0]);
eq("the second mode", Integer.valueOf(1), Integer.valueOf(listBack.gameModes[1]));
}
private static void near(Object what, double expected, double actual) {
@@ -552,7 +552,7 @@ public final class ProtocolTest {
Packets.CONTAINER_OPEN, Packets.CONTAINER_TAKE,
Packets.LEARN_BLUEPRINT,
Packets.HITBOXES, Packets.HITBOX_INSTANCES, Packets.HITBOXES_RELOAD,
Packets.ATTACK,
Packets.ATTACK, Packets.CHAT, Packets.CHAT_SEND, Packets.PLAYER_LIST,
Packets.DISCONNECT,
};
for (int i = 0; i < ids.length; i++) {