Recent posts

#11
Servers / Re: [PTB] - Plant the Bomb
Last post by (vG)DesTroYeR^ - Oct 21, 2025, 08:27 PM
# PTB v2.0

- Added:
MVP sprite for the TOP player of the current round as a tag which incessantly follow him as long as they move.
- Added:
Miscellaneous commands and fixed old ones.
- Updated:
Lobby Welcome sprite into a better appearance.
- Added:
Score message when round ends (Doesnt show when attackers win by planting).
- Changed:
IP address to **49.12.82.39:19156**.
- Fixed:
Voting timer redundancy, it now works systematically.
- Added:
New weapon UI as a packlist for weapons.
- Adjusted:
Pack system: you can now click on keys to claim the desired pack.
- Added:
New rules UI as a list of rules.
#12
Support / Re: Client side urgent help ne...
Last post by vitovc - Oct 21, 2025, 03:44 PM
there is no clientside player.Angle but you can 1) get it from server (with lag) with Stream function 2) or you can guess player's camera angle (it almost same as player.Angle when player is not looking back)

get_angle <- function(x, y, x2, y2){
  return ::atan2(y2 - y, x2 - x);
}
get_player_angle <- function(){
  local screen_size = ::GUI.GetScreenSize();
  local cam_from = ::GUI.ScreenPosToWorld(::Vector(screen_size.X * 0.5, screen_size.Y * 0.5, -1));
  local cam_to = ::GUI.ScreenPosToWorld(::Vector(screen_size.X * 0.5, screen_size.Y * 0.5, 1));
  return ::get_angle(cam_from.X, cam_from.Y, cam_to.X, cam_to.Y);
}
untested, I took code from Get player Camera zoom
local angle = ::get_player_angle();also maybe you will need to add some offset to result of angle to make it similar as serverside angle, to do it correctly use
normalize_angle <- function (a){
  return ::atan2(::sin(a), ::cos(a));
}

::normalize_angle(angle + 1.57079);
#13
Client Scripting / Re: Client for my script 🥈 (se...
Last post by PSL - Oct 21, 2025, 02:34 PM
The code uses `org.json.JSONObject` to handle JSON data, but the JSON dependency is not included in the Maven `pom.xml` (you named it `Depidence.xml`, the standard name should be `pom.xml`). Direct compilation will result in a `ClassNotFoundException`
#14
Script Showroom / Squirrel built-in math functi...
Last post by (vG)DesTroYeR^ - Oct 21, 2025, 02:24 PM
function ToLower(num) { // (Floor)
local fltdot = ".";
local numstr = num+"";
local checkflt = split(numstr, fltdot);
if(checkflt.len() > 2) return print("Wrong float value detected.");
if(checkflt.len() == 2){
local w = checkflt[0].tointeger(); \\ before the dot. like 34(.)5 - it will return 34
return w;
}
return print("Invalid input (ToLower)");
}

function ToGreater(num) { // (Ceil)
local fltdot = ".";
local numstr = num+"";
local checkflt = split(numstr, fltdot);
if(checkflt.len() > 2)return print("Invalid input - ToGreater()"); // must be 1 dot.
if(checkflt.len() <= 1)return print("Invalid input - ToGreater()"); // no integers. or (34.) so the dot in 34 is not a valid input
local floats = "0."+checkflt[1];
local integers = checkflt[0];
if (checkflt[1].tointeger() == 0) return integers.tointeger(); // if 34.0 return 34
local subTracT =  floats.tofloat() - 1;
local subT = abs(subTracT); // (+)

local result = num + subT; // 34.3 + 0.7 = 35
return result;
}

idk whats the purpose of these codes, but i like to know how built-in math funcs work - so are these funcs used above work correctly?
#15
Servers / Skull DM GTA V Minigames
Last post by Adrenaline - Oct 21, 2025, 05:01 AM

SKULL DM – Deathmatch & Events redefined


Mode: Skull DM GTA V Minigames v1.2 
Discord: Click here! 
IP Address: 51.38.237.230:8193



About us 
SKULL DM is a Vice City Multiplayer Deathmatch server designed to attract new players while keeping the traditional VC:MP mechanics that veteran fighters love. 
It combines the fast-paced combat of classic DM with creative minigames and new features that keep the experience fresh and competitive. 

Money is earned through duels and events — and can be used to buy vehicles or, soon, custom GTA Online-inspired skins (coming soon). 
Every event was built to deliver constant action, fun, and variety, whether you're a newcomer discovering VC:MP or a veteran returning to dominate the streets again.



Events list
 
1. SumoCars Event – Push your rivals off the platform in a chaotic vehicle sumo battle. 
2. GunGame Event – Win duels to progress through a weapon chain until only one stands. 
3. Hide & Seek Event – Hunters and hiders face off in a unique Vice City hideout challenge. 
4. Tanks vs Tanks – Face other players in heavy tank battles — explosive and unstoppable. 
5. Chainsaw Party – A deadly chase where runners must escape the hunters before it's too late. 
6. HeliBlades Event – Survive spinning helicopter blades in a brutal airborne challenge. 
7. Drive-by Event – Vehicle combat where only the best aim and control will keep you alive. 
8. Race Event – Competitive racing across Vice City; no arena, just pure speed and skill on the streets.



Main Areas
 
BattleZone – The heart of SKULL DM. Classic open duels where players fight freely using default VC:MP weapons — fast, simple, and pure skill. 
AimZone – A training area designed to improve your aim, reflexes, and weapon control before heading into real fights or events. 
StuntZone (Coming Soon) – A new space for stunts, tricks, and freestyle driving, arriving in a future update.



Join now and experience the return of true deathmatch — fast-paced, competitive, and made for those who never stop fighting.


🔥 Event Showcase 🔥
Take a look at some of the exclusive minigames that make SKULL DM unique.
Watch all the events in action on our YouTube Channel.


Credits
Adrenaline (Mapping & Original Idea) | Speed (Scripting)
#16
Servers / THE LEAGUE RETURNS! 100$$$$
Last post by NASCAR 2025 - Oct 20, 2025, 04:26 AM
[size=18]🚨 VC:MP ULTIMATE RACING LEAGUE – SIGNUPS OPEN 🚨[/size]

THE LEAGUE RETURNS! 
After a long hiatus and seeing the community slow down with no real competitive events happening, our team is officially returning with a PAID VC:MP racing tournament — and this time we're doing it bigger and better than before.

EVENT DETAILS & SIGNUP 
• There are only 7 main spots available in Season One. 
If all 7 spots fill, don't worry — still sign up. If someone drops out, is kicked or banned, the next player on the list slides in. 
SIGN UP LINK 👉 https://tally.so/r/3yWr4g 
• We're running this like a career-mode NASCAR league inside VC:MP — long-term, serious, structured.

RULES & RACING MODE 
• This server is strictly for racingno weapons, no trolls, no role-play chaos. 
• Once the league finishes, the server stays open forever for practice, open laps and future seasons. 
• Every participant gets their own NASCAR-style car to keep, upgrade and customise inside our server. 
  – Note: If you are kicked or banned from the server at any time, you forfeit your car ownership and all upgrades
• This event will be broadcast on YouTube, Twitch & TikTok, and all races may be clipped and publicly featured. 
  – If you do not want to appear on stream/recorded, do not join
• You must have PayPal (preferred) to receive payout; Steam payment may be considered in rare cases, but final approval is at our discretion. 
• Failure to show up, follow training procedures, obey race rules or respect sportsmanship will result in disqualification and forfeiture of prize money.

WHY WE'RE BACK 
• The VC:MP racing scene has been quiet — we're reviving it with a premium, competitive experience
• We're leaving the past behind. No grudges. No drama. We're giving the community a fresh start. 
• This isn't just a one-off: we want this to be the first season of many, with a server you can use beyond the league and a community you can stay in long term.

HOW TO JOIN 
1. Click the signup link above. 
2. Fill in your name + email + whatever we ask. 
3. Join our Discord for updates and scheduling: https://discord.gg/DYF56y89dM 
4. Get ready for training sessions, rules briefing, grid setup and prep for the first race. 
5. DO NOT sign up if you're looking for a casual drive with no effort or no commitment — this is serious.

LET'S MAKE VC:MP BUMP AGAIN 
This is your chance to be part of something epic — the revival of the VC:MP racing community, with real money on the line, real competition, and a server built just for you. 
Don't wait. Sign up now. 
Let's bring the heat, lock in those 7 spots and get ready to race!

[size=12]Posted on behalf of the [Your Team/Organisation Name] • Be there or be left behind![/size]
#17
Script Showroom / Script for my current client s...
Last post by QUITTED_VCMP - Oct 19, 2025, 04:46 PM
After a long fk*n days I made a script with client please tell me dose it work or not
 
SCRIPT MADE BY:=PK=NO






HERE IS IT






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);
            socket.setSoTimeout(30000); // 30 second timeout
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintWriter(socket.getOutputStream(), true);
            connected = true;
           
            startMessageListener();
            return true;
           
        } catch (Exception 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) {
                    System.out.println("Received: " + message);
                    processServerMessage(message);
                }
            } catch (SocketTimeoutException e) {
                System.err.println("Socket timeout");
            } 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 "welcome":
                    fireEvent(VCMPEventType.CONNECTED, json.getString("message"));
                    break;
                   
                case "login_success":
                    handleLoginSuccess(json);
                    break;
                   
                case "login_failed":
                    fireEvent(VCMPEventType.LOGIN_FAILED, json.getString("message"));
                    break;
                   
                case "player_stats":
                    updatePlayerStats(json);
                    break;
                   
                case "player_join":
                    fireEvent(VCMPEventType.PLAYER_JOIN, json.getString("param1"));
                    break;
                   
                case "player_leave":
                    fireEvent(VCMPEventType.PLAYER_LEAVE, json.getString("param1"));
                    break;
                   
                case "player_kill":
                    fireEvent(VCMPEventType.PLAYER_KILL,
                             json.getString("param1") + " killed " + json.getString("param2"));
                    break;
                   
                case "success":
                    fireEvent(VCMPEventType.ADMIN_MESSAGE, "Success: " + 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());
            fireEvent(VCMPEventType.ERROR, "Invalid message format: " + message);
        }
    }
   
    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 (ID: %d, Admin: %d, Money: $%d)",
                             playerName, playerId, adminLevel, money));
    }
   
    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 - 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) {
        // Note: Registration happens in-game, this is just for client connection
        fireEvent(VCMPEventType.ERROR, "Please register through the game client first");
    }
   
    // Chat methods
    public void sendChatMessage(String message) {
        JSONObject chatData = new JSONObject();
        chatData.put("type", "chat_message");
        chatData.put("message", message);
        sendMessage(chatData.toString());
    }
   
    // Admin commands
    public void kickPlayer(int targetId, String reason) {
        JSONObject kickData = new JSONObject();
        kickData.put("type", "admin_command");
        kickData.put("command", "kick");
        kickData.put("target_id", targetId);
        kickData.put("reason", reason);
        sendMessage(kickData.toString());
    }
   
    public void banPlayer(int targetId, String reason) {
        JSONObject banData = new JSONObject();
        banData.put("type", "admin_command");
        banData.put("command", "ban");
        banData.put("target_id", targetId);
        banData.put("reason", reason);
        sendMessage(banData.toString());
    }
   
    public void giveMoney(int targetId, int amount) {
        JSONObject moneyData = new JSONObject();
        moneyData.put("type", "admin_command");
        moneyData.put("command", "givemoney");
        moneyData.put("target_id", targetId);
        moneyData.put("amount", amount);
        sendMessage(moneyData.toString());
    }
   
    public void teleportToPlayer(int targetId) {
        JSONObject tpData = new JSONObject();
        tpData.put("type", "admin_command");
        tpData.put("command", "tp");
        tpData.put("target_id", targetId);
        sendMessage(tpData.toString());
    }
   
    public void setAdminLevel(int targetId, int level) {
        JSONObject adminData = new JSONObject();
        adminData.put("type", "admin_command");
        adminData.put("command", "setadmin");
        adminData.put("target_id", targetId);
        adminData.put("level", level);
        sendMessage(adminData.toString());
    }
   
    // Player actions
    public void requestStats() {
        JSONObject statsRequest = new JSONObject();
        statsRequest.put("type", "get_stats");
        sendMessage(statsRequest.toString());
    }
   
    private void sendMessage(String message) {
        if (connected && writer != null) {
            System.out.println("Sending: " + message);
            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; }
}
#18
Client Scripting / Client for my script 🥈 (second...
Last post by QUITTED_VCMP - Oct 19, 2025, 04:38 PM
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 😭
#19
Client Scripting / Client script for my server sc...
Last post by QUITTED_VCMP - 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


#20
Support / Client side urgent help needed...
Last post by (vG)DesTroYeR^ - Oct 19, 2025, 04:33 PM
does:
player.Angle
exist in client side? Simply, that was the question which I wanted to ask.