package org.redegs.crossplay; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.event.CitizensEnableEvent; import net.citizensnpcs.api.npc.NPC; import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpExchange; import net.citizensnpcs.api.npc.*; import org.bukkit.entity.*; import org.bukkit.*; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public final class Crossplay extends JavaPlugin implements Listener { boolean CitizensLoaded = false; @Override public void onEnable() { // Plugin startup logic getLogger().info("Hello from redegs plugin!"); try { getLogger().info("Attemping to send HTTP Request to Crossplay server!"); sendPlayerDataToServer("PlayersChangedModel", "crossplay_mc_server", "join", null, "mc"); try { startHttpServer(); getLogger().info("Starting internal HTTP server"); } catch (IOException e) { getLogger().warning("Internal HTTP server failed, plugin will not work as intended."); e.printStackTrace(); } } catch (IOException e) { getLogger().warning("Outgoing request failed, plugin will not work as intended."); e.printStackTrace(); } getServer().getPluginManager().registerEvents(this, this); this.getCommand("testnpc").setExecutor(new CommandTestNPC()); } @Override public void onDisable() { // Plugin shutdown logic } private void startHttpServer() throws IOException { HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); server.createContext("/endpoint", new MyHandler()); server.setExecutor(null); server.start(); } public static void sendPlayerDataToServer(String modelType, String username, String reqTypeOrPosition, String chatMsg, String platform) throws IOException { try { URL url = new URL("http://80.192.241.222:8085/webhook"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); // Construct the payload based on the model type String payload = null; switch (modelType) { case "UpdateModel": payload = String.format("{\"updatemodel\":{\"username\":\"%s\",\"position\":\"%s\",\"platform\":\"%s\"},\"playerschangedmodel\":null,\"chatmsgmodel\":null}", username, reqTypeOrPosition, platform); break; case "PlayersChangedModel": payload = String.format("{\"updatemodel\":null,\"playerschangedmodel\":{\"username\":\"%s\",\"req_type\":\"%s\",\"platform\":\"%s\"},\"chatmsgmodel\":null}", username, reqTypeOrPosition, platform); break; case "ChatMessageModel": payload = String.format("{\"updatemodel\":null,\"playerschangedmodel\":null,\"chatmsgmodel\":{\"username\":\"%s\",\"chat_msg\":\"%s\",\"platform\":\"%s\"}}", username, chatMsg, platform); break; default: throw new IllegalArgumentException("Invalid model type"); } byte[] out = payload.getBytes(StandardCharsets.UTF_8); OutputStream stream = connection.getOutputStream(); stream.write(out); stream.flush(); stream.close(); Bukkit.getConsoleSender().sendMessage(connection.getResponseCode() + " " + connection.getResponseMessage()); connection.disconnect(); } catch (Exception e) { Bukkit.getConsoleSender().sendMessage(String.valueOf(e)); Bukkit.getConsoleSender().sendMessage("Failed successfully"); } } static class MyHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { if ("POST".equals(exchange.getRequestMethod())) { String requestBody = new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8); exchange.sendResponseHeaders(200, 0); OutputStream os = exchange.getResponseBody(); os.write("Received".getBytes()); os.close(); // Parse the JSON request body JsonObject jsonObject = JsonParser.parseString(requestBody).getAsJsonObject(); String request_type = jsonObject.get("request_type").getAsString(); Bukkit.getConsoleSender().sendMessage(request_type); if (request_type.equals("msg")) { Bukkit.getConsoleSender().sendMessage("recv msg requesat"); String username = jsonObject.get("username").getAsString(); String chatMsg = jsonObject.get("chat_msg").getAsString(); Bukkit.getServer().broadcastMessage(username + ": " + chatMsg); } else if (request_type.equals("player_changed")) { Bukkit.getConsoleSender().sendMessage("recv player changed requesat"); String username = jsonObject.get("username").getAsString(); String req_type = jsonObject.get("req_type").getAsString(); if (req_type.equals("join")) { Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&e" + username + " joined the game")); Server server = Bukkit.getServer(); if (server.getOnlinePlayers().size() >= 1) { List player_list = new ArrayList(server.getOnlinePlayers()); Player nearest_player = (Player) player_list.get(0); Location loc = nearest_player.getLocation(); Bukkit.getServer().broadcastMessage("Attempting to spawn roblox npc at " + loc.toString()); NPC new_npc = CitizensAPI.getNPCRegistry().createNPC(EntityType.PLAYER, "Example " + username, loc); new_npc.spawn(loc); } } else { Bukkit.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('&', "&e" + username + " left the game")); } } } else { exchange.sendResponseHeaders(405, -1); // Method Not Allowed } } } @EventHandler public void onPlayerJoin(PlayerJoinEvent event) throws IOException { Player player = event.getPlayer(); String player_name = player.getName(); Bukkit.getConsoleSender().sendMessage("Fired player join event!"); sendPlayerDataToServer("PlayersChangedModel", player_name, "join", null, "mc"); } @EventHandler public void onPlayerLeave(PlayerQuitEvent event) throws IOException { Player player = event.getPlayer(); String player_name = player.getName(); Bukkit.getConsoleSender().sendMessage("Fired player leave event!"); sendPlayerDataToServer("PlayersChangedModel", player_name, "leave", null, "mc"); } @EventHandler public void onPlayerChat(AsyncPlayerChatEvent event) throws IOException { String message = event.getMessage(); Player player = event.getPlayer(); String player_name = player.getName(); Bukkit.getConsoleSender().sendMessage("Fired player chat event!"); sendPlayerDataToServer("ChatMessageModel", player_name, null, message, "mc"); } @EventHandler public void onCitizensEnable(CitizensEnableEvent event) throws IOException { this.CitizensLoaded = true; } }