diff --git a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java index f2eb2d0..4244e21 100644 --- a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java +++ b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/beacon/util/ConvexResponseParser.java @@ -113,6 +113,19 @@ public static ArrayResult error(String error) { * @return ObjectResult containing the parsed data or error */ public static ObjectResult parseObject(String responseBody, String context) { + // Handle null or empty response + if (responseBody == null || responseBody.trim().isEmpty()) { + LOGGER.warning(context + " - Response body is empty or null"); + return ObjectResult.error("Empty response from server"); + } + + // Check for HTML responses (common error pages) + String trimmed = responseBody.trim(); + if (trimmed.startsWith("<") || trimmed.startsWith(" 200 + ? responseBody.substring(0, 200) + "..." + : responseBody; + LOGGER.warning(context + " - Response body: " + preview); return ObjectResult.error(error); } } @@ -163,6 +181,19 @@ public static ObjectResult parseObject(String responseBody, String context) { * @return ArrayResult containing the parsed array or error */ public static ArrayResult parseArray(String responseBody, String context) { + // Handle null or empty response + if (responseBody == null || responseBody.trim().isEmpty()) { + LOGGER.warning(context + " - Response body is empty or null"); + return ArrayResult.error("Empty response from server"); + } + + // Check for HTML responses (common error pages) + String trimmed = responseBody.trim(); + if (trimmed.startsWith("<") || trimmed.startsWith(" 200 + ? responseBody.substring(0, 200) + "..." + : responseBody; + LOGGER.warning(context + " - Response body: " + preview); return ArrayResult.error(error); } } diff --git a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java index 39760df..3bc7416 100644 --- a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java +++ b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/commands/debug/CreateMatchCommand.java @@ -34,6 +34,9 @@ public static String createMatch(Player player1, Player player2) { WorldCreator creator = new WorldCreator(worldName); creator.type(WorldType.FLAT); creator.generateStructures(false); // No structures like villages + // Specify flat world generator settings to avoid "No key layers" warning + // Format: minecraft:bedrock,2*minecraft:dirt,minecraft:grass_block;minecraft:plains + creator.generatorSettings("{\"layers\":[{\"block\":\"minecraft:bedrock\",\"height\":1},{\"block\":\"minecraft:stone\",\"height\":2},{\"block\":\"minecraft:grass_block\",\"height\":1}],\"biome\":\"minecraft:plains\"}"); World world = creator.createWorld(); diff --git a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java index 448858e..cdba3f8 100644 --- a/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java +++ b/apps/blockwarriors-beacon/src/main/java/ai/blockwarriors/events/PlayerEventListener.java @@ -210,11 +210,9 @@ private void clearPlayerToken(Plugin plugin, String playerId, String matchId) { JSONObject data = result.optJSONObject("data"); if (data != null && data.optBoolean("success", false)) { LOGGER.info("Cleared token for player " + playerId + " in match " + matchId); - } else { - // Token not cleared (likely match not in "Waiting" status) - this is expected - String error = data != null ? data.optString("error", "") : ""; - LOGGER.info("Token not cleared for player " + playerId + ": " + error); } + // If token wasn't cleared, it's expected (match not in "Waiting" status) + // No need to log - this is normal for finished/playing matches } } else { LOGGER.warning("Failed to clear token: HTTP " + responseCode);