diff --git a/src/main/java/me/danjono/inventoryrollback/inventory/SaveInventory.java b/src/main/java/me/danjono/inventoryrollback/inventory/SaveInventory.java index 4da41e2..b0ada69 100644 --- a/src/main/java/me/danjono/inventoryrollback/inventory/SaveInventory.java +++ b/src/main/java/me/danjono/inventoryrollback/inventory/SaveInventory.java @@ -14,7 +14,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.HashMap; @@ -44,13 +44,13 @@ public SaveInventory(Player player, LogType logType, DamageCause deathCause, Str public void snapshotAndSave(PlayerInventory mainInventory, Inventory enderChestInventory, boolean saveAsync) { PlayerDataSnapshot snapshot = createSnapshot(mainInventory, enderChestInventory); - if (snapshot == null) return; + if (snapshot.isEmptySnapshot()) return; save(snapshot, saveAsync); } public void save(PlayerDataSnapshot snapshot, boolean async) { - if (snapshot == null) return; + if (snapshot.isEmptySnapshot()) return; UUID uuid = player.getUniqueId(); // Rate limiter @@ -103,7 +103,7 @@ public void save(PlayerDataSnapshot snapshot, boolean async) { } - public @Nullable PlayerDataSnapshot createSnapshot(PlayerInventory mainInventory, Inventory enderChestInventory) { + public @NotNull PlayerDataSnapshot createSnapshot(PlayerInventory mainInventory, Inventory enderChestInventory) { ItemStack[] mainInvContents = null; ItemStack[] mainInvArmor = null; ItemStack[] enderInvContents = null; @@ -125,7 +125,7 @@ public void save(PlayerDataSnapshot snapshot, boolean async) { // Skip saving when inv is empty and config allows skipping empty invs if (emptyInvAndArmor && !ConfigData.isSaveEmptyInventories()) { - return null; + return PlayerDataSnapshot.EMPTY_SNAPSHOT; } ItemStack[] enderContents = enderChestInventory.getContents(); @@ -203,6 +203,24 @@ public PlayerDataSnapshot(float totalXp, double health, int foodLevel, float sat this.finalEnderInvContents = finalEnderInvContents; } + private static final PlayerDataSnapshot EMPTY_SNAPSHOT = new PlayerDataSnapshot( + -1, + -1, + -1, + -1, + null, + -1, + -1, + -1, + null, + null, + null + ); + + public boolean isEmptySnapshot() { + return this == EMPTY_SNAPSHOT; + } + @Override public boolean equals(Object obj) { if (this == obj) return true; diff --git a/src/main/java/me/danjono/inventoryrollback/listeners/EventLogs.java b/src/main/java/me/danjono/inventoryrollback/listeners/EventLogs.java index 170ddc2..f16ff49 100644 --- a/src/main/java/me/danjono/inventoryrollback/listeners/EventLogs.java +++ b/src/main/java/me/danjono/inventoryrollback/listeners/EventLogs.java @@ -208,11 +208,13 @@ public void playerDeathHandle(PlayerDeathEvent event) { if (preSnapshot == null) { saveInventory.snapshotAndSave(player.getInventory(), player.getEnderChest(), true); } else { + // Remove the snapshot from the cache + this.inventoryCache.remove(uuid); + // Ensure we don't save the empty snapshot + if (preSnapshot.isEmptySnapshot()) return; // Save the snapshot inventory instead of the current one. We apparently had an edit // during the damage event. saveInventory.save(preSnapshot, true); - // Remove the snapshot from the cache - this.inventoryCache.remove(uuid); } } }