/
ledart
/
RRP_LedNik
Обзор
Документация
Войти
/
ledart
/
RRP_LedNik
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
client/UI/LobbyScreen.java
430 строк
17 KB
Darya
обновлены комментарии
18 дек 2025, 14:46
18 дек 2025, 14:46
95c0a7f
Код
Авторство
О чём код?
package client.UI; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import client.Network; import client.model.ChatHistoryManager; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class LobbyScreen { private Network network; private Stage stage; private ObservableList<String> rooms; private Map<String, Integer> roomPlayerCount = new HashMap<>(); private ListView<String> roomListView; private Label statusLabel; private TextArea chatArea; private TextField chatInput; private ChatHistoryManager chatHistory; public LobbyScreen(Network network, Stage stage) { this.network = network; this.stage = stage; this.rooms = FXCollections.observableArrayList(); this.roomPlayerCount = new HashMap<>(); this.chatHistory = new ChatHistoryManager(); setupNetworkCallbacks(); } private void setupNetworkCallbacks() { network.setOnMessageCallback(msg -> { System.out.println("[LobbyScreen-Callback] Raw: " + msg); Platform.runLater(() -> { try { if (msg.startsWith("NEW_ROOM:")) { String roomName = msg.substring(9); System.out.println("[LobbyScreen] Processing NEW_ROOM: " + roomName); if (!rooms.contains(roomName)) { rooms.add(roomName); roomPlayerCount.put(roomName, 0); updateListView(); System.out.println("[LobbyScreen] Added room: " + roomName); } } else if (msg.startsWith("ROOM_REMOVED:")) { String roomName = msg.substring(13); System.out.println("[LobbyScreen] Removing room: " + roomName); rooms.remove(roomName); roomPlayerCount.remove(roomName); updateListView(); } else if (msg.startsWith("ROOM_INFO:")) { String[] parts = msg.substring(10).split(":"); if (parts.length >= 2) { String roomName = parts[0]; int playerCount; try { playerCount = Integer.parseInt(parts[1]); } catch (NumberFormatException e) { playerCount = 0; } System.out.println("[LobbyScreen] Room info: " + roomName + " = " + playerCount + " players"); roomPlayerCount.put(roomName, playerCount); updateListView(); } } else if (msg.startsWith("LOBBY_CHAT_MSG:")) { String message = msg.substring(15); addChatMessage(message); // Сохраняем в историю chatHistory.saveLobbyMessage(message); } else if (msg.startsWith("ERROR:")) { String error = msg.substring(6); addSystemMessage("Error: " + error); showError(error); // Сохраняем ошибки в историю chatHistory.saveLobbyMessage("[SYSTEM] Error: " + error); } else if (msg.equals("CONNECTION_LOST")) { String message = "Connection to server lost!"; addSystemMessage(message); showError(message); chatHistory.saveLobbyMessage("[SYSTEM] " + message); } else if (msg.equals("REFRESH_COMPLETE")) { System.out.println("[LobbyScreen] Room refresh complete"); statusLabel.setText("Refresh complete!"); updateStatus(); } else if (msg.startsWith("LOGIN_OK")) { String message = "Logged in successfully"; addSystemMessage(message); chatHistory.saveLobbyMessage("[SYSTEM] " + message); } else if (msg.startsWith("PLAYER_JOINED:")) { String player = msg.substring(14); String message = player + " joined the lobby"; addSystemMessage(message); chatHistory.saveLobbyMessage("[SYSTEM] " + message); } else if (msg.startsWith("PLAYER_LEFT:")) { String player = msg.substring(12); String message = player + " left the lobby"; addSystemMessage(message); chatHistory.saveLobbyMessage("[SYSTEM] " + message); } } catch (Exception e) { System.err.println("[LobbyScreen] Error in callback: " + e.getMessage()); e.printStackTrace(); } }); }); } public void start() { System.out.println("[LobbyScreen] Starting lobby screen"); System.out.println("[LobbyScreen] Current rooms: " + rooms.size()); network.setCurrentScreen("LOBBY"); setupNetworkCallbacks(); network.sendMessage("REFRESH_ROOMS"); BorderPane root = new BorderPane(); root.setPadding(new Insets(10)); // ЛЕВАЯ ПАНЕЛЬ: Список комнат и управление VBox leftPanel = new VBox(10); leftPanel.setPadding(new Insets(5)); leftPanel.setPrefWidth(250); Label titleLabel = new Label("Lobby - Select a Room"); titleLabel.setStyle("-fx-font-size: 14px; -fx-font-weight: bold;"); statusLabel = new Label("Loading rooms..."); roomListView = new ListView<>(rooms); roomListView.setPrefHeight(200); roomListView.setCellFactory(lv -> new ListCell<String>() { @Override protected void updateItem(String roomName, boolean empty) { super.updateItem(roomName, empty); if (empty || roomName == null) { setText(null); } else { int players = roomPlayerCount.getOrDefault(roomName, 0); String playerText = players + "/2 players"; setText(roomName + " (" + playerText + ")"); if (players >= 2) { setStyle("-fx-text-fill: gray; -fx-font-style: italic;"); setDisable(true); } else { setStyle("-fx-text-fill: black; -fx-font-style: normal;"); setDisable(false); } } } }); // Основные кнопки управления Button joinButton = new Button("Join Room"); joinButton.setOnAction(e -> { String selectedRoom = roomListView.getSelectionModel().getSelectedItem(); if (selectedRoom != null) { int players = roomPlayerCount.getOrDefault(selectedRoom, 0); if (players >= 2) { showError("Room is full! (" + players + "/2 players)"); return; } statusLabel.setText("Joining " + selectedRoom + "..."); network.sendMessage("JOIN_ROOM:" + selectedRoom); RoomScreen roomScreen = new RoomScreen(network, stage, selectedRoom, this); roomScreen.start(); } else { showError("Please select a room!"); } }); Button createButton = new Button("Create New Room"); createButton.setOnAction(e -> { CreateRoomScreen createRoom = new CreateRoomScreen(network, stage, this); createRoom.start(); }); Button botButton = new Button("Play vs Bot"); botButton.setOnAction(e -> { String botRoomName = "BotRoom_" + System.currentTimeMillis(); System.out.println("[LobbyScreen] Creating bot room: " + botRoomName); network.setOnMessageCallback(msg -> { Platform.runLater(() -> { System.out.println("[LobbyScreen-Bot] Received: " + msg); if (msg.startsWith("CREATE_ROOM_OK:")) { String roomName = msg.substring(15); System.out.println("[LobbyScreen-Bot] Room created: " + roomName); network.sendMessage("START_GAME:BOT"); network.sendMessage("JOIN_ROOM:" + roomName); RoomScreen roomScreen = new RoomScreen(network, stage, roomName, this); roomScreen.startBotGame(); roomScreen.start(); } }); }); network.sendMessage("CREATE_ROOM:" + botRoomName); }); Button refreshButton = new Button("Refresh Rooms"); refreshButton.setOnAction(e -> { System.out.println("[LobbyScreen] User requested room refresh"); statusLabel.setText("Refreshing room list..."); refreshButton.setDisable(true); network.sendMessage("REFRESH_ROOMS"); new Thread(() -> { try { Thread.sleep(3000); } catch (InterruptedException ignored) {} Platform.runLater(() -> { refreshButton.setDisable(false); if (statusLabel.getText().contains("Refreshing")) { statusLabel.setText("Refresh complete!"); updateStatus(); } }); }).start(); }); Button leaderboardButton = new Button("Top Scores"); leaderboardButton.setOnAction(e -> { LeaderboardScreen leaderboard = new LeaderboardScreen(network, stage, this); leaderboard.start(); }); Button backButton = new Button("Back to Login"); backButton.setOnAction(e -> { LoginScreen login = new LoginScreen(network, stage); login.start(); }); VBox buttonBox = new VBox(5, joinButton, createButton, botButton, refreshButton, leaderboardButton, backButton); buttonBox.setPadding(new Insets(10, 0, 0, 0)); leftPanel.getChildren().addAll(titleLabel, statusLabel, roomListView, buttonBox); // ПРАВАЯ ПАНЕЛЬ: Чат и быстрые сообщения VBox rightPanel = new VBox(10); rightPanel.setPadding(new Insets(5)); rightPanel.setPrefWidth(300); Label chatLabel = new Label("Lobby Chat"); chatLabel.setStyle("-fx-font-size: 14px; -fx-font-weight: bold;"); // Область чата chatArea = new TextArea(); chatArea.setEditable(false); chatArea.setWrapText(true); chatArea.setPrefHeight(250); chatArea.setStyle("-fx-font-family: monospace; -fx-font-size: 12px;"); // Загружаем историю чата loadChatHistory(); // Панель ввода сообщения HBox chatInputBox = new HBox(5); chatInput = new TextField(); chatInput.setPromptText("Type your message here..."); chatInput.setOnAction(e -> sendChatMessage()); Button sendButton = new Button("Send"); sendButton.setOnAction(e -> sendChatMessage()); chatInputBox.getChildren().addAll(chatInput, sendButton); // Кнопки быстрых сообщений HBox quickChatBox = new HBox(5); Button helloBtn = new Button("Hello!"); Button readyBtn = new Button("Ready?"); Button goodLuckBtn = new Button("Good Luck!"); helloBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:HELLO")); readyBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:READY")); goodLuckBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:GOOD_LUCK")); quickChatBox.getChildren().addAll(helloBtn, readyBtn, goodLuckBtn); rightPanel.getChildren().addAll(chatLabel, chatArea, chatInputBox, quickChatBox); // Размещаем панели root.setLeft(leftPanel); root.setRight(rightPanel); Scene scene = new Scene(root, 600, 500); stage.setScene(scene); stage.setTitle("Chase Snake - Lobby"); stage.show(); updateStatus(); addSystemMessage("Welcome to the lobby!"); } private void sendChatMessage() { String text = chatInput.getText().trim(); if (!text.isEmpty()) { network.sendMessage("CHAT:" + text); chatInput.clear(); } } private void loadChatHistory() { List<String> history = chatHistory.loadLobbyHistory(); for (String message : history) { chatArea.appendText(message + "\n"); } scrollChatToBottom(); System.out.println("[LobbyScreen] Loaded " + history.size() + " messages from chat history"); } private void updateListView() { rooms.sort((a, b) -> { boolean aIsDefault = a.startsWith("Room "); boolean bIsDefault = b.startsWith("Room "); if (aIsDefault && !bIsDefault) return -1; if (!aIsDefault && bIsDefault) return 1; return a.compareTo(b); }); roomListView.refresh(); updateStatus(); } private void updateStatus() { int totalRooms = rooms.size(); int availableRooms = 0; int totalPlayers = 0; for (String room : rooms) { int players = roomPlayerCount.getOrDefault(room, 0); totalPlayers += players; if (players < 2) { availableRooms++; } } String status = String.format("%d rooms, %d available, %d total players", totalRooms, availableRooms, totalPlayers); statusLabel.setText(status); } public void addRoom(String roomName) { Platform.runLater(() -> { if (!rooms.contains(roomName)) { rooms.add(roomName); roomPlayerCount.put(roomName, 1); updateListView(); System.out.println("[LobbyScreen] Room added locally: " + roomName); addSystemMessage("Room created: " + roomName); chatHistory.saveLobbyMessage("[SYSTEM] Room created: " + roomName); } }); } public void removeRoom(String roomName) { Platform.runLater(() -> { rooms.remove(roomName); roomPlayerCount.remove(roomName); updateListView(); addSystemMessage("Room removed: " + roomName); chatHistory.saveLobbyMessage("[SYSTEM] Room removed: " + roomName); }); } public void updateRoomPlayers(String roomName, int playerCount) { Platform.runLater(() -> { roomPlayerCount.put(roomName, playerCount); updateListView(); }); } private void addChatMessage(String message) { String time = new SimpleDateFormat("HH:mm").format(new Date()); String formattedMessage = "[" + time + "] " + message; chatArea.appendText(formattedMessage + "\n"); scrollChatToBottom(); } private void addSystemMessage(String message) { String time = new SimpleDateFormat("HH:mm").format(new Date()); String formattedMessage = "[" + time + "] [SYSTEM] " + message; chatArea.appendText(formattedMessage + "\n"); scrollChatToBottom(); } private void scrollChatToBottom() { chatArea.setScrollTop(Double.MAX_VALUE); } private void showError(String message) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle("Error"); alert.setHeaderText("Operation failed"); alert.setContentText(message); alert.show(); } }