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