Vice City: Multiplayer

Server Development => Scripting and Server Management => Client Scripting => Topic started by: QUITTED_VCMP on Oct 19, 2025, 04:34 PM

Title: Client script for my server script 🥇 (first)
Post by: QUITTED_VCMP on Oct 19, 2025, 04:34 PM
Am back with a great work for client idk it will work or not any one if you free just check it please








Main class client


package vcmp.client;

import java.io.*;
import java.net.*;
import java.util.*;
import org.json.JSONObject;

public class VCMPClient {
    private Socket socket;
    private BufferedReader reader;
    private PrintWriter writer;
    private String serverHost;
    private int serverPort;
    private boolean connected;
    private String playerName;
    private boolean loggedIn;
    private int playerId;
    private int adminLevel;
    private int money;
    private int kills;
    private int deaths;
   
    private List<VCMPEventListener> listeners;
   
    public VCMPClient(String host, int port, String playerName) {
        this.serverHost = host;
        this.serverPort = port;
        this.playerName = playerName;
        this.connected = false;
        this.loggedIn = false;
        this.adminLevel = 0;
        this.money = 0;
        this.kills = 0;
        this.deaths = 0;
        this.listeners = new ArrayList<>();
    }
   
    public boolean connect() {
        try {
            socket = new Socket(serverHost, serverPort);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(socket.getOutputStream(), true);
            connected = true;
           
            startMessageListener();
            fireEvent(VCMPEventType.CONNECTED, "Connected to VCMP server successfully");
            return true;
           
        } catch (IOException e) {
            System.err.println("Connection failed: " + e.getMessage());
            fireEvent(VCMPEventType.ERROR, "Connection failed: " + e.getMessage());
            return false;
        }
    }
   
    private void startMessageListener() {
        Thread listenerThread = new Thread(() -> {
            try {
                String message;
                while (connected && (message = reader.readLine()) != null) {
                    processServerMessage(message);
                }
            } catch (IOException e) {
                if (connected) {
                    System.err.println("Connection lost: " + e.getMessage());
                    fireEvent(VCMPEventType.DISCONNECTED, "Connection lost");
                    disconnect();
                }
            }
        });
        listenerThread.setDaemon(true);
        listenerThread.start();
    }
   
    private void processServerMessage(String message) {
        try {
            JSONObject json = new JSONObject(message);
            String messageType = json.getString("type");
           
            switch (messageType) {
                case "dialog_request":
                    handleDialogRequest(json);
                    break;
                   
                case "login_success":
                    handleLoginSuccess(json);
                    break;
                   
                case "login_failed":
                    fireEvent(VCMPEventType.LOGIN_FAILED, json.getString("reason"));
                    break;
                   
                case "registration_success":
                    fireEvent(VCMPEventType.REGISTRATION_SUCCESS, "Registration successful");
                    this.loggedIn = true;
                    break;
                   
                case "chat_message":
                    fireEvent(VCMPEventType.CHAT_MESSAGE,
                            json.getString("player") + ": " + json.getString("message"));
                    break;
                   
                case "player_join":
                    fireEvent(VCMPEventType.PLAYER_JOIN, json.getString("player"));
                    break;
                   
                case "player_leave":
                    fireEvent(VCMPEventType.PLAYER_LEAVE, json.getString("player"));
                    break;
                   
                case "player_death":
                    handlePlayerDeath(json);
                    break;
                   
                case "player_stats":
                    updatePlayerStats(json);
                    break;
                   
                case "admin_message":
                    fireEvent(VCMPEventType.ADMIN_MESSAGE, json.getString("message"));
                    break;
                   
                case "error":
                    fireEvent(VCMPEventType.ERROR, json.getString("message"));
                    break;
                   
                default:
                    fireEvent(VCMPEventType.UNKNOWN, message);
                    break;
            }
        } catch (Exception e) {
            System.err.println("Error processing message: " + e.getMessage());
        }
    }
   
    private void handleDialogRequest(JSONObject json) {
        int dialogId = json.getInt("dialog_id");
        String caption = json.getString("caption");
        String content = json.getString("content");
        String style = json.getString("style");
       
        fireEvent(VCMPEventType.DIALOG_REQUEST,
                String.format("Dialog %d: %s - %s", dialogId, caption, content));
    }
   
    private void handleLoginSuccess(JSONObject json) {
        this.loggedIn = true;
        this.playerId = json.getInt("player_id");
        this.adminLevel = json.getInt("admin_level");
        this.money = json.getInt("money");
        this.kills = json.getInt("kills");
        this.deaths = json.getInt("deaths");
       
        fireEvent(VCMPEventType.LOGIN_SUCCESS,
                String.format("Logged in as %s (Admin Level: %d, Money: $%d)",
                            playerName, adminLevel, money));
    }
   
    private void handlePlayerDeath(JSONObject json) {
        String killer = json.getString("killer");
        String victim = json.getString("victim");
        int reason = json.getInt("reason");
       
        if (victim.equals(playerName)) {
            this.deaths++;
            fireEvent(VCMPEventType.PLAYER_DEATH,
                    String.format("You were killed by %s", killer));
        } else if (killer.equals(playerName)) {
            this.kills++;
            this.money += 100;
            fireEvent(VCMPEventType.PLAYER_KILL,
                    String.format("You killed %s! +$100", victim));
        }
    }
   
    private void updatePlayerStats(JSONObject json) {
        this.money = json.getInt("money");
        this.kills = json.getInt("kills");
        this.deaths = json.getInt("deaths");
        this.adminLevel = json.getInt("admin_level");
       
        fireEvent(VCMPEventType.STATS_UPDATE,
                String.format("Stats updated - Kills: %d, Deaths: %d, Money: $%d, Admin: %d",
                            kills, deaths, money, adminLevel));
    }
   
    // Authentication methods
    public void login(String password) {
        JSONObject loginData = new JSONObject();
        loginData.put("type", "player_login");
        loginData.put("player_name", playerName);
        loginData.put("password", password);
        sendMessage(loginData.toString());
    }
   
    public void register(String password) {
        JSONObject registerData = new JSONObject();
        registerData.put("type", "player_register");
        registerData.put("player_name", playerName);
        registerData.put("password", password);
        sendMessage(registerData.toString());
    }
   
    // Chat methods
    public void sendChatMessage(String message) {
        JSONObject chatData = new JSONObject();
        chatData.put("type", "chat_message");
        chatData.put("message", message);
        chatData.put("player", playerName);
        sendMessage(chatData.toString());
    }
   
    // Admin commands
    public void kickPlayer(int targetId, String reason) {
        if (adminLevel < 1) {
            fireEvent(VCMPEventType.ERROR, "Insufficient admin level for kick command");
            return;
        }
       
        JSONObject kickData = new JSONObject();
        kickData.put("type", "admin_command");
        kickData.put("command", "kick");
        kickData.put("target_id", targetId);
        kickData.put("reason", reason);
        kickData.put("admin_id", playerId);
        sendMessage(kickData.toString());
    }
   
    public void banPlayer(int targetId, String reason) {
        if (adminLevel < 2) {
            fireEvent(VCMPEventType.ERROR, "Insufficient admin level for ban command");
            return;
        }
       
        JSONObject banData = new JSONObject();
        banData.put("type", "admin_command");
        banData.put("command", "ban");
        banData.put("target_id", targetId);
        banData.put("reason", reason);
        banData.put("admin_id", playerId);
        sendMessage(banData.toString());
    }
   
    public void giveMoney(int targetId, int amount) {
        if (adminLevel < 3) {
            fireEvent(VCMPEventType.ERROR, "Insufficient admin level for givemoney command");
            return;
        }
       
        JSONObject moneyData = new JSONObject();
        moneyData.put("type", "admin_command");
        moneyData.put("command", "givemoney");
        moneyData.put("target_id", targetId);
        moneyData.put("amount", amount);
        moneyData.put("admin_id", playerId);
        sendMessage(moneyData.toString());
    }
   
    public void teleportToPlayer(int targetId) {
        if (adminLevel < 1) {
            fireEvent(VCMPEventType.ERROR, "Insufficient admin level for teleport command");
            return;
        }
       
        JSONObject tpData = new JSONObject();
        tpData.put("type", "admin_command");
        tpData.put("command", "tp");
        tpData.put("target_id", targetId);
        tpData.put("admin_id", playerId);
        sendMessage(tpData.toString());
    }
   
    public void setAdminLevel(int targetId, int level) {
        if (adminLevel < 3) {
            fireEvent(VCMPEventType.ERROR, "Insufficient admin level for setadmin command");
            return;
        }
       
        JSONObject adminData = new JSONObject();
        adminData.put("type", "admin_command");
        adminData.put("command", "setadmin");
        adminData.put("target_id", targetId);
        adminData.put("level", level);
        adminData.put("admin_id", playerId);
        sendMessage(adminData.toString());
    }
   
    // Player actions
    public void requestStats() {
        JSONObject statsRequest = new JSONObject();
        statsRequest.put("type", "get_stats");
        statsRequest.put("player_id", playerId);
        sendMessage(statsRequest.toString());
    }
   
    public void sendPlayerPosition(float x, float y, float z, float angle) {
        JSONObject posData = new JSONObject();
        posData.put("type", "player_position");
        posData.put("player_id", playerId);
        posData.put("x", x);
        posData.put("y", y);
        posData.put("z", z);
        posData.put("angle", angle);
        sendMessage(posData.toString());
    }
   
    private void sendMessage(String message) {
        if (connected && writer != null) {
            writer.println(message);
            writer.flush();
        }
    }
   
    public void disconnect() {
        connected = false;
        loggedIn = false;
        try {
            if (writer != null) writer.close();
            if (reader != null) reader.close();
            if (socket != null) socket.close();
        } catch (IOException e) {
            System.err.println("Error during disconnect: " + e.getMessage());
        }
        fireEvent(VCMPEventType.DISCONNECTED, "Disconnected from server");
    }
   
    // Event handling
    public void addEventListener(VCMPEventListener listener) {
        listeners.add(listener);
    }
   
    public void removeEventListener(VCMPEventListener listener) {
        listeners.remove(listener);
    }
   
    private void fireEvent(VCMPEventType type, String data) {
        for (VCMPEventListener listener : listeners) {
            listener.onVCMPEvent(type, data);
        }
    }
   
    // Getters
    public boolean isConnected() { return connected; }
    public boolean isLoggedIn() { return loggedIn; }
    public String getPlayerName() { return playerName; }
    public int getPlayerId() { return playerId; }
    public int getAdminLevel() { return adminLevel; }
    public int getMoney() { return money; }
    public int getKills() { return kills; }
    public int getDeaths() { return deaths; }
}















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);
}









More on second topic