From 709bb55e9852696b54d37bdb460f2b5a1cfd80f0 Mon Sep 17 00:00:00 2001 From: ryanhamshire Date: Wed, 16 Dec 2015 14:44:34 -0800 Subject: [PATCH] Release pets on claim delete. Except for owner-initiated deletes (/AbandonClaim). --- .../CleanupUnusedClaimsTask.java | 4 +-- .../GriefPrevention/DataStore.java | 32 +++++++++++++++++-- .../GriefPrevention/GriefPrevention.java | 4 +-- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimsTask.java b/src/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimsTask.java index bc4a210..780e855 100644 --- a/src/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimsTask.java +++ b/src/me/ryanhamshire/GriefPrevention/CleanupUnusedClaimsTask.java @@ -89,7 +89,7 @@ class CleanupUnusedClaimsTask implements Runnable if(newPlayerClaimsExpired && playerData.getClaims().size() == 1) { claim.removeSurfaceFluids(null); - GriefPrevention.instance.dataStore.deleteClaim(claim, true); + GriefPrevention.instance.dataStore.deleteClaim(claim, true, true); cleanupChunks = true; //if configured to do so, restore the land to natural @@ -155,7 +155,7 @@ class CleanupUnusedClaimsTask implements Runnable boolean claimExpired = sevenDaysAgo.getTime().after(playerData.getLastLogin()); if(claimExpired) { - GriefPrevention.instance.dataStore.deleteClaim(claim, true); + GriefPrevention.instance.dataStore.deleteClaim(claim, true, true); GriefPrevention.AddLogEntry("Removed " + claim.getOwnerName() + "'s unused claim @ " + GriefPrevention.getfriendlyLocationString(claim.getLesserBoundaryCorner()), CustomLogEntryTypes.AdminActivity); //restore the claim area to natural state diff --git a/src/me/ryanhamshire/GriefPrevention/DataStore.java b/src/me/ryanhamshire/GriefPrevention/DataStore.java index 9c7912e..11f355b 100644 --- a/src/me/ryanhamshire/GriefPrevention/DataStore.java +++ b/src/me/ryanhamshire/GriefPrevention/DataStore.java @@ -29,7 +29,9 @@ import me.ryanhamshire.GriefPrevention.events.ClaimDeletedEvent; import org.bukkit.*; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Tameable; import org.bukkit.inventory.ItemStack; import com.google.common.io.Files; @@ -537,10 +539,16 @@ public abstract class DataStore //deletes a claim or subdivision synchronized public void deleteClaim(Claim claim) { - this.deleteClaim(claim, true); + this.deleteClaim(claim, true, false); + } + + //deletes a claim or subdivision + synchronized public void deleteClaim(Claim claim, boolean releasePets) + { + this.deleteClaim(claim, true, releasePets); } - synchronized void deleteClaim(Claim claim, boolean fireEvent) + synchronized void deleteClaim(Claim claim, boolean fireEvent, boolean releasePets) { //delete any children for(int j = 0; j < claim.children.size(); j++) @@ -605,6 +613,26 @@ public abstract class DataStore ClaimDeletedEvent ev = new ClaimDeletedEvent(claim); Bukkit.getPluginManager().callEvent(ev); } + + //optionally set any pets free which belong to the claim owner + if(releasePets && claim.ownerID != null && claim.parent == null) + { + for(Chunk chunk : claim.getChunks()) + { + Entity [] entities = chunk.getEntities(); + for(Entity entity : entities) + { + if(entity instanceof Tameable) + { + Tameable pet = (Tameable)entity; + if(pet.isTamed() && pet.getOwner().getUniqueId().equals(claim.ownerID)) + { + pet.setTamed(false); + } + } + } + } + } } abstract void deleteClaimFromSecondaryStorage(Claim claim); diff --git a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java index ba3f13f..8f92e44 100644 --- a/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java +++ b/src/me/ryanhamshire/GriefPrevention/GriefPrevention.java @@ -1561,7 +1561,7 @@ public class GriefPrevention extends JavaPlugin else { claim.removeSurfaceFluids(null); - this.dataStore.deleteClaim(claim, true); + this.dataStore.deleteClaim(claim, true, true); //if in a creative mode world, /restorenature the claim if(GriefPrevention.instance.creativeRulesApply(claim.getLesserBoundaryCorner())) @@ -2354,7 +2354,7 @@ public class GriefPrevention extends JavaPlugin { //delete it claim.removeSurfaceFluids(null); - this.dataStore.deleteClaim(claim, true); + this.dataStore.deleteClaim(claim, true, false); //if in a creative mode world, restore the claim area if(GriefPrevention.instance.creativeRulesApply(claim.getLesserBoundaryCorner()))