修复领地设置不同步:添加即时推送触发器
问题:游戏内修改领地设置后,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:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
+ "®istered=" + (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"
|
||||
+ "®istered=" + (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) {
|
||||
|
||||
Reference in New Issue
Block a user