修复滚动备份日志追踪+告示牌编辑权限控制
This commit is contained in:
@@ -19,6 +19,7 @@ import org.bukkit.event.block.BlockBurnEvent;
|
|||||||
import org.bukkit.event.block.BlockIgniteEvent;
|
import org.bukkit.event.block.BlockIgniteEvent;
|
||||||
import org.bukkit.event.block.BlockSpreadEvent;
|
import org.bukkit.event.block.BlockSpreadEvent;
|
||||||
import org.bukkit.event.block.BlockGrowEvent;
|
import org.bukkit.event.block.BlockGrowEvent;
|
||||||
|
import org.bukkit.event.block.SignChangeEvent;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Animals;
|
import org.bukkit.entity.Animals;
|
||||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
||||||
@@ -4986,6 +4987,25 @@ public class AreaProtection implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onSignChange(SignChangeEvent e) {
|
||||||
|
Player p = e.getPlayer();
|
||||||
|
if (p.hasPermission("sdf1.admin")) return; // 管理员跳过
|
||||||
|
AreaConfig ac = getArea(
|
||||||
|
p.getWorld().getName(),
|
||||||
|
e.getBlock().getX(),
|
||||||
|
e.getBlock().getY(),
|
||||||
|
e.getBlock().getZ());
|
||||||
|
if (ac == null) return;
|
||||||
|
if (p.getName().equalsIgnoreCase(ac.owner)) return; // 领地主免检
|
||||||
|
if (isAreaAdmin(p)) return; // 插件管理员免检
|
||||||
|
|
||||||
|
if (getEffectiveDeny(p, ac, "denyBlockPlace")) {
|
||||||
|
e.setCancelled(true);
|
||||||
|
p.sendMessage("§c§l[区域防护] §f禁止编辑告示牌");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onDamage(EntityDamageEvent e) {
|
public void onDamage(EntityDamageEvent e) {
|
||||||
|
|||||||
@@ -2327,17 +2327,11 @@ public class DatabaseManager {
|
|||||||
String extra, int level,
|
String extra, int level,
|
||||||
double experience) {
|
double experience) {
|
||||||
try {
|
try {
|
||||||
PreparedStatement ps =
|
try (PreparedStatement ps = db.prepareStatement(
|
||||||
db.prepareStatement(
|
"INSERT INTO inv_backup_auto "
|
||||||
"INSERT INTO inv_backup_auto"
|
+ "(player_name, contents_b64, armor_b64, "
|
||||||
+ " (player_name, "
|
+ "extra_b64, level, experience, save_time) "
|
||||||
+ "contents_b64, "
|
+ "VALUES (?,?,?,?,?,?,?)")) {
|
||||||
+ "armor_b64, "
|
|
||||||
+ "extra_b64, "
|
|
||||||
+ "level, "
|
|
||||||
+ "experience, "
|
|
||||||
+ "save_time) "
|
|
||||||
+ "VALUES (?,?,?,?,?,?,?)");
|
|
||||||
ps.setString(1, name);
|
ps.setString(1, name);
|
||||||
ps.setString(2, contents);
|
ps.setString(2, contents);
|
||||||
ps.setString(3, armor);
|
ps.setString(3, armor);
|
||||||
@@ -2346,23 +2340,19 @@ public class DatabaseManager {
|
|||||||
ps.setDouble(6, experience);
|
ps.setDouble(6, experience);
|
||||||
ps.setLong(7, System.currentTimeMillis());
|
ps.setLong(7, System.currentTimeMillis());
|
||||||
ps.executeUpdate();
|
ps.executeUpdate();
|
||||||
ps.close();
|
}
|
||||||
|
|
||||||
// 仅保留最近 3 份,删除该玩家更早的备份(先查后删,避免 LIMIT 子查询被优化)
|
// 保留最近 3 份 —— 先查最新 3 个 ID,再删其余
|
||||||
try {
|
List<Integer> keep = new ArrayList<>();
|
||||||
PreparedStatement sel =
|
try (PreparedStatement sel = db.prepareStatement(
|
||||||
db.prepareStatement(
|
|
||||||
"SELECT id FROM inv_backup_auto "
|
"SELECT id FROM inv_backup_auto "
|
||||||
+ "WHERE player_name=? "
|
+ "WHERE player_name=? "
|
||||||
+ "ORDER BY save_time DESC LIMIT 3");
|
+ "ORDER BY save_time DESC LIMIT 3")) {
|
||||||
sel.setString(1, name);
|
sel.setString(1, name);
|
||||||
ResultSet rs = sel.executeQuery();
|
try (ResultSet rs = sel.executeQuery()) {
|
||||||
List<Integer> keep = new ArrayList<>();
|
while (rs.next()) keep.add(rs.getInt("id"));
|
||||||
while (rs.next()) {
|
}
|
||||||
keep.add(rs.getInt("id"));
|
|
||||||
}
|
}
|
||||||
rs.close();
|
|
||||||
sel.close();
|
|
||||||
|
|
||||||
if (keep.size() == 3) {
|
if (keep.size() == 3) {
|
||||||
StringBuilder in = new StringBuilder();
|
StringBuilder in = new StringBuilder();
|
||||||
@@ -2370,19 +2360,19 @@ public class DatabaseManager {
|
|||||||
if (i > 0) in.append(",");
|
if (i > 0) in.append(",");
|
||||||
in.append(keep.get(i));
|
in.append(keep.get(i));
|
||||||
}
|
}
|
||||||
PreparedStatement del = db.prepareStatement(
|
try (PreparedStatement del = db.prepareStatement(
|
||||||
"DELETE FROM inv_backup_auto "
|
"DELETE FROM inv_backup_auto "
|
||||||
+ "WHERE player_name=? AND id NOT IN ("
|
+ "WHERE player_name=? AND id NOT IN ("
|
||||||
+ in.toString() + ")");
|
+ in + ")")) {
|
||||||
del.setString(1, name);
|
del.setString(1, name);
|
||||||
del.executeUpdate();
|
int removed = del.executeUpdate();
|
||||||
del.close();
|
if (removed > 0) {
|
||||||
|
logger.info("[自动备份] " + name + " 滚动清理 " + removed + " 份旧备份");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
logger.warning("[自动备份] 保存/清理失败 (" + name + "): " + e.getMessage());
|
||||||
}
|
|
||||||
} catch (SQLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,5 +75,6 @@ public class InventoryAutoBackup {
|
|||||||
plugin.getDb().saveAutoBackup(
|
plugin.getDb().saveAutoBackup(
|
||||||
name, contentsB64, armorB64, extraB64,
|
name, contentsB64, armorB64, extraB64,
|
||||||
level, experience);
|
level, experience);
|
||||||
|
plugin.getLogger().info("[自动备份] " + name + " 背包已备份");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user