修复领地设置不同步:添加即时推送触发器

问题:游戏内修改领地设置后,PHP端超过180秒仍未同步
根因:syncLandData()在doActiveSyncBatch()第9个任务位,每任务间隔6-8秒,加上60-90秒批处理等待,总计116-146秒
修复:
1. WebManager新增requestImmediateLandSync()方法,防抖10秒
2. AreaProtection.saveAreaToDb()调用后立即触发PHP同步
3. deleteAreaFromDb()同样触发即时同步
4. 同步时强制清空hash确保一定推送
This commit is contained in:
2026-06-27 13:32:05 +08:00
parent ce0052cdfb
commit b83202c08e
2 changed files with 52 additions and 2 deletions
@@ -7086,6 +7086,12 @@ public class AreaProtection implements Listener {
stmt.setInt(63, ac.denyMobAttack ? 1 : 0);
stmt.executeUpdate();
stmt.close();
// ★ 领地设置变更:立即触发PHP同步(防抖10秒)
try {
if (plugin.webManager != null) {
plugin.webManager.requestImmediateLandSync();
}
} catch (Exception ignored) {}
} catch (SQLException e) {
plugin.getLogger().warning("[防护] 保存到DB失败: " + ac.name + " - " + e.getMessage());
}
@@ -7101,6 +7107,12 @@ public class AreaProtection implements Listener {
stmt.setString(1, name);
stmt.executeUpdate();
stmt.close();
// ★ 领地删除:立即触发PHP同步
try {
if (plugin.webManager != null) {
plugin.webManager.requestImmediateLandSync();
}
} catch (Exception ignored) {}
} catch (SQLException e) {
plugin.getLogger().warning("[防护] 从DB删除领地失败: " + name + " - " + e.getMessage());
}
+40 -2
View File
@@ -1189,6 +1189,42 @@ public class WebManager {
submitNormalDbTask("即时拉取-交易", () -> pullPendingTransactions());
}
// ★ 领地即时同步触发器:领地设置变更后立即推送数据到PHP
private volatile long lastImmediateLandSyncTime = 0;
private static final long MIN_IMMEDIATE_LAND_SYNC_MS = 10000; // 最小间隔10秒,防抖
private volatile boolean pendingImmediateLandSync = false;
/**
* 领地设置变更后调用:立即推送领地数据到PHP
* 防抖:10秒内多次调用只执行一次
*/
public void requestImmediateLandSync() {
long now = System.currentTimeMillis();
if (now - lastImmediateLandSyncTime < MIN_IMMEDIATE_LAND_SYNC_MS) {
pendingImmediateLandSync = true;
return;
}
lastImmediateLandSyncTime = now;
pendingImmediateLandSync = false;
submitNormalDbTask("即时同步-领地", () -> {
try {
lastLandDataHash = ""; // ★ 强制刷新hash,确保一定推送
syncLandData();
} catch (Exception e) {
plugin.getLogger().warning("[领地即时同步] 异常: " + e.getMessage());
}
if (pendingImmediateLandSync) {
pendingImmediateLandSync = false;
submitNormalDbTask("即时同步-领地(延迟)", () -> {
try {
lastLandDataHash = "";
syncLandData();
} catch (Exception e) {}
});
}
});
}
// ★ 交易即时推送触发器:交易发生后立即推送交易记录到PHP
private volatile long lastImmediateTxSyncTime = 0;
private static final long MIN_IMMEDIATE_TX_SYNC_MS = 3000; // 最小间隔3秒,防止频繁推送
@@ -3784,7 +3820,8 @@ public class WebManager {
+ "&expire_seconds=" + tokenExpireSeconds
+ "&online=1"
+ "&registered=" + (isRegistered ? "1" : "0")
+ "&ip=" + java.net.URLEncoder.encode(playerIp, "UTF-8");
+ "&ip=" + java.net.URLEncoder.encode(playerIp, "UTF-8")
+ "&login_verified=1"; // ★ 玩家在游戏里已认证,直接告诉PHP放行
String response = doGet(urlStr);
if (response != null) {
@@ -3855,7 +3892,8 @@ public class WebManager {
+ "&expire_seconds=" + tokenExpireSeconds
+ "&online=1"
+ "&registered=" + (isRegistered ? "1" : "0")
+ "&ip=" + java.net.URLEncoder.encode(playerIp, "UTF-8");
+ "&ip=" + java.net.URLEncoder.encode(playerIp, "UTF-8")
+ "&login_verified=1"; // ★ 玩家刚登录游戏已认证,直接告诉PHP放行
String response = doGet(urlStr);
if (response != null) {