Event types
package vcmp.client;
public enum VCMPEventType {
CONNECTED,
DISCONNECTED,
DIALOG_REQUEST,
LOGIN_SUCCESS,
LOGIN_FAILED,
REGISTRATION_SUCCESS,
CHAT_MESSAGE,
PLAYER_JOIN,
PLAYER_LEAVE,
PLAYER_DEATH,
PLAYER_KILL,
STATS_UPDATE,
ADMIN_MESSAGE,
ERROR,
UNKNOWN
}
Event listner
package vcmp.client;
public interface VCMPEventListener {
void onVCMPEvent(VCMPEventType eventType, String data);
}
Gui client
package vcmp.client;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class VCMPClientGUI extends JFrame {
private VCMPClient client;
// GUI Components
private JTextArea chatArea;
private JTextField messageField;
private JTextField hostField, portField, nameField, passwordField;
private JButton connectButton, disconnectButton, sendButton;
private JButton loginButton, registerButton;
private JLabel statsLabel;
// Admin panel components
private JPanel adminPanel;
private JTextField adminTargetField, adminParamField;
private JButton kickButton, banButton, moneyButton, tpButton, adminButton;
public VCMPClientGUI() {
initializeGUI();
}
private void initializeGUI() {
setTitle("VCMP Java Client - GTA Vice City Multiplayer");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// Connection panel
JPanel connectionPanel = createConnectionPanel();
// Chat area
chatArea = new JTextArea(20, 50);
chatArea.setEditable(false);
chatArea.setBackground(new Color(240, 240, 240));
JScrollPane scrollPane = new JScrollPane(chatArea);
// Message panel
JPanel messagePanel = createMessagePanel();
// Stats panel
JPanel statsPanel = createStatsPanel();
// Admin panel
adminPanel = createAdminPanel();
adminPanel.setVisible(false); // Hidden until admin logs in
// Main layout
JPanel topPanel = new JPanel(new BorderLayout());
topPanel.add(connectionPanel, BorderLayout.NORTH);
topPanel.add(statsPanel, BorderLayout.SOUTH);
add(topPanel, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
add(messagePanel, BorderLayout.SOUTH);
add(adminPanel, BorderLayout.EAST);
setupEventListeners();
pack();
setLocationRelativeTo(null);
}
private JPanel createConnectionPanel() {
JPanel panel = new JPanel(new FlowLayout());
hostField = new JTextField("localhost", 10);
portField = new JTextField("8192", 5);
nameField = new JTextField("Player", 10);
passwordField = new JTextField("", 10);
passwordField.setToolTipText("Enter password for login/register");
connectButton = new JButton("Connect");
disconnectButton = new JButton("Disconnect");
loginButton = new JButton("Login");
registerButton = new JButton("Register");
disconnectButton.setEnabled(false);
loginButton.setEnabled(false);
registerButton.setEnabled(false);
panel.add(new JLabel("Host:"));
panel.add(hostField);
panel.add(new JLabel("Port:"));
panel.add(portField);
panel.add(new JLabel("Name:"));
panel.add(nameField);
panel.add(new JLabel("Pass:"));
panel.add(passwordField);
panel.add(connectButton);
panel.add(disconnectButton);
panel.add(loginButton);
panel.add(registerButton);
return panel;
}
private JPanel createStatsPanel() {
JPanel panel = new JPanel(new FlowLayout());
statsLabel = new JLabel("Not connected");
panel.add(statsLabel);
return panel;
}
private JPanel createMessagePanel() {
JPanel panel = new JPanel(new BorderLayout());
messageField = new JTextField();
sendButton = new JButton("Send");
messageField.setEnabled(false);
sendButton.setEnabled(false);
panel.add(messageField, BorderLayout.CENTER);
panel.add(sendButton, BorderLayout.EAST);
return panel;
}
private JPanel createAdminPanel() {
JPanel panel = new JPanel(new GridLayout(6, 2, 5, 5));
panel.setBorder(BorderFactory.createTitledBorder("Admin Commands"));
adminTargetField = new JTextField();
adminParamField = new JTextField();
kickButton = new JButton("Kick Player");
banButton = new JButton("Ban Player");
moneyButton = new JButton("Give Money");
tpButton = new JButton("Teleport To");
adminButton = new JButton("Set Admin Level");
panel.add(new JLabel("Target ID:"));
panel.add(adminTargetField);
panel.add(new JLabel("Param/Reason:"));
panel.add(adminParamField);
panel.add(kickButton);
panel.add(banButton);
panel.add(moneyButton);
panel.add(tpButton);
panel.add(adminButton);
return panel;
}
private void setupEventListeners() {
connectButton.addActionListener(e -> connectToServer());
disconnectButton.addActionListener(e -> disconnectFromServer());
loginButton.addActionListener(e -> loginToServer());
registerButton.addActionListener(e -> registerToServer());
sendButton.addActionListener(e -> sendChatMessage());
messageField.addActionListener(e -> sendChatMessage());
// Admin command listeners
kickButton.addActionListener(e -> executeAdminCommand("kick"));
banButton.addActionListener(e -> executeAdminCommand("ban"));
moneyButton.addActionListener(e -> executeAdminCommand("givemoney"));
tpButton.addActionListener(e -> executeAdminCommand("tp"));
adminButton.addActionListener(e -> executeAdminCommand("setadmin"));
}
private void connectToServer() {
String host = hostField.getText();
int port = Integer.parseInt(portField.getText());
String name = nameField.getText();
if (name.isEmpty()) {
showError("Player name cannot be empty!");
return;
}
client = new VCMPClient(host, port, name);
client.addEventListener(new VCMPEventListener() {
@Override
public void onVCMPEvent(VCMPEventType eventType, String data) {
SwingUtilities.invokeLater(() -> handleClientEvent(eventType, data));
}
});
if (client.connect()) {
connectButton.setEnabled(false);
disconnectButton.setEnabled(true);
loginButton.setEnabled(true);
registerButton.setEnabled(true);
hostField.setEnabled(false);
portField.setEnabled(false);
nameField.setEnabled(false);
}
}
private void handleClientEvent(VCMPEventType eventType, String data) {
String timestamp = java.time.LocalTime.now().format(java.time.format.DateTimeFormatter.ofPattern("HH:mm:ss"));
switch (eventType) {
case CONNECTED:
appendToChat("[" + timestamp + "] ✓ " + data);
break;
case DISCONNECTED:
appendToChat("[" + timestamp + "] ✗ " + data);
resetUI();
break;
case LOGIN_SUCCESS:
appendToChat("[" + timestamp + "] 🔑 " + data);
handleLoginSuccess();
break;
case LOGIN_FAILED:
appendToChat("[" + timestamp + "] ❌ " + data);
break;
case REGISTRATION_SUCCESS:
appendToChat("[" + timestamp + "] ✅ " + data);
handleLoginSuccess();
break;
case CHAT_MESSAGE:
appendToChat("[" + timestamp + "] " + data);
break;
case PLAYER_JOIN:
appendToChat("[" + timestamp + "] 🎮 " + data + " joined the game");
break;
case PLAYER_LEAVE:
appendToChat("[" + timestamp + "] 🚪 " + data + " left the game");
break;
case PLAYER_DEATH:
appendToChat("[" + timestamp + "] 💀 " + data);
break;
case PLAYER_KILL:
appendToChat("[" + timestamp + "] 🔫 " + data);
break;
case STATS_UPDATE:
updateStatsDisplay();
break;
case ERROR:
appendToChat("[" + timestamp + "] ⚠ " + data);
break;
default:
appendToChat("[" + timestamp + "] ? " + data);
break;
}
}
private void handleLoginSuccess() {
messageField.setEnabled(true);
sendButton.setEnabled(true);
loginButton.setEnabled(false);
registerButton.setEnabled(false);
passwordField.setEnabled(false);
// Show admin panel if user has admin privileges
if (client.getAdminLevel() > 0) {
adminPanel.setVisible(true);
pack(); // Resize window to fit admin panel
}
updateStatsDisplay();
}
private void updateStatsDisplay() {
String stats = String.format("Kills: %d | Deaths: %d | Money: $%d | Admin: %d",
client.getKills(), client.getDeaths(),
client.getMoney(), client.getAdminLevel());
statsLabel.setText(stats);
}
private void loginToServer() {
String password = passwordField.getText();
if (password.isEmpty()) {
showError("Password cannot be empty!");
return;
}
client.login(password);
}
private void registerToServer() {
String password = passwordField.getText();
if (password.length() < 6) {
showError("Password must be at least 6 characters!");
return;
}
client.register(password);
}
private void sendChatMessage() {
String message = messageField.getText().trim();
if (!message.isEmpty() && client != null && client.isLoggedIn()) {
client.sendChatMessage(message);
messageField.setText("");
}
}
private void executeAdminCommand(String command) {
try {
int targetId = Integer.parseInt(adminTargetField.getText());
String param = adminParamField.getText();
switch (command) {
case "kick":
if (param.isEmpty()) {
showError("Please enter a kick reason!");
return;
}
client.kickPlayer(targetId, param);
break;
case "ban":
if (param.isEmpty()) {
showError("Please enter a ban reason!");
return;
}
client.banPlayer(targetId, param);
break;
case "givemoney":
int amount = Integer.parseInt(param);
client.giveMoney(targetId, amount);
break;
case "tp":
client.teleportToPlayer(targetId);
break;
case "setadmin":
int level = Integer.parseInt(param);
client.setAdminLevel(targetId, level);
break;
}
adminTargetField.setText("");
adminParamField.setText("");
} catch (NumberFormatException e) {
showError("Invalid number format!");
}
}
private void disconnectFromServer() {
if (client != null) {
client.disconnect();
}
resetUI();
}
private void resetUI() {
connectButton.setEnabled(true);
disconnectButton.setEnabled(false);
loginButton.setEnabled(false);
registerButton.setEnabled(false);
messageField.setEnabled(false);
sendButton.setEnabled(false);
hostField.setEnabled(true);
portField.setEnabled(true);
nameField.setEnabled(true);
passwordField.setEnabled(true);
adminPanel.setVisible(false);
statsLabel.setText("Not connected");
}
private void appendToChat(String message) {
chatArea.append(message + "\n");
chatArea.setCaretPosition(chatArea.getDocument().getLength());
}
private void showError(String message) {
JOptionPane.showMessageDialog(this, message, "Error", JOptionPane.ERROR_MESSAGE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new VCMPClientGUI().setVisible(true);
});
}
}
Depidence.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.vcmp</groupId>
<artifactId>vcmp-client</artifactId>
<version>1.0.0</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Can u tell me it's work or not pls 😭