From 499d41dea09d310e9d1385cc025069314dd052f4 Mon Sep 17 00:00:00 2001 From: Driftay Date: Mon, 4 May 2020 20:27:39 -0400 Subject: [PATCH] Radius Claiming & Alt Limit Fix --- .../java/com/massivecraft/factions/Conf.java | 3 ++ .../massivecraft/factions/FactionsPlugin.java | 6 ++-- .../massivecraft/factions/cmd/CmdJoin.java | 2 +- .../factions/cmd/claim/CmdAutoClaim.java | 7 ++++- .../factions/cmd/claim/CmdClaim.java | 25 +++++++++++---- .../factions/cmd/claim/CmdClaimAt.java | 10 ++++++ .../factions/cmd/claim/CmdClaimLine.java | 15 ++++++--- .../listeners/FactionsBlockListener.java | 1 - .../listeners/FactionsEntityListener.java | 9 ------ .../listeners/FactionsPlayerListener.java | 8 +++-- .../factions/util/CornerTask.java | 5 ++- .../massivecraft/factions/zcore/MPlugin.java | 31 ++++++++----------- .../factions/zcore/persist/MemoryFPlayer.java | 12 ++++--- .../massivecraft/factions/zcore/util/TL.java | 1 + 14 files changed, 84 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java index 3579fe60..664c2bb8 100644 --- a/src/main/java/com/massivecraft/factions/Conf.java +++ b/src/main/java/com/massivecraft/factions/Conf.java @@ -103,6 +103,9 @@ public class Conf { public static boolean worldGuardChecking = false; public static boolean worldGuardBuildPriority = false; + //RADIUS CLAIMING + public static boolean useRadiusClaimSystem = true; + //FRIENDLY FIRE public static boolean friendlyFireFPlayersCommand = false; diff --git a/src/main/java/com/massivecraft/factions/FactionsPlugin.java b/src/main/java/com/massivecraft/factions/FactionsPlugin.java index ed2e27c8..b4701bf7 100755 --- a/src/main/java/com/massivecraft/factions/FactionsPlugin.java +++ b/src/main/java/com/massivecraft/factions/FactionsPlugin.java @@ -66,6 +66,7 @@ public class FactionsPlugin extends MPlugin { // Our single plugin instance. // Single 4 life. public static FactionsPlugin instance; + public static boolean cachedRadiusClaim; public static Permission perms = null; // This plugin sets the boolean true when fully enabled. // Plugins can check this boolean while hooking in have @@ -248,6 +249,8 @@ public class FactionsPlugin extends MPlugin { // start up task which runs the autoLeaveAfterDaysOfInactivity routine startAutoLeaveTask(false); + cachedRadiusClaim = Conf.useRadiusClaimSystem; + if (version > 8) { useNonPacketParticles = true; log("Minecraft Version 1.9 or higher found, using non packet based particle API"); @@ -452,7 +455,7 @@ public class FactionsPlugin extends MPlugin { @Override public void onDisable() { - // only save data if plugin actually completely loaded successfully + super.onDisable(); if (this.loadSuccessful) { Conf.load(); Conf.saveSync(); @@ -476,7 +479,6 @@ public class FactionsPlugin extends MPlugin { e.printStackTrace(); } } - this.getServer().getScheduler().cancelTasks(this); super.onDisable(); } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java b/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java index 2e8d4f3a..c69dc745 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java @@ -81,7 +81,7 @@ public class CmdJoin extends FCommand { int altLimit = Conf.factionAltMemberLimit; - if (altLimit > 0 && faction.getAltPlayers().size() >= altLimit && !faction.altInvited(context.fPlayer)) { + if (altLimit > 0 && faction.getAltPlayers().size() >= altLimit && faction.altInvited(context.fPlayer)) { context.msg(TL.COMMAND_JOIN_ATLIMIT, faction.getTag(context.fPlayer), altLimit, fplayer.describeTo(context.fPlayer, false)); return; } diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java index 1efcf286..7f1ad474 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java @@ -1,5 +1,6 @@ package com.massivecraft.factions.cmd.claim; +import com.massivecraft.factions.Board; import com.massivecraft.factions.FLocation; import com.massivecraft.factions.Faction; import com.massivecraft.factions.FactionsPlugin; @@ -62,10 +63,14 @@ public class CmdAutoClaim extends FCommand { return; } - + Faction at = Board.getInstance().getFactionAt(new FLocation(context.fPlayer.getPlayer().getLocation())); context.fPlayer.setAutoClaimFor(forFaction); FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", new FLocation(context.fPlayer.getPlayer().getLocation()).formatXAndZ(",")); context.msg(TL.COMMAND_AUTOCLAIM_ENABLED, forFaction.describeTo(context.fPlayer)); + if (FactionsPlugin.cachedRadiusClaim && context.fPlayer.attemptClaim(forFaction, context.player.getLocation(), true)) { + context.fPlayer.getFaction().getFPlayersWhereOnline(true).forEach(f -> f.msg(TL.CLAIM_CLAIMED, context.fPlayer.describeTo(f, true), context.fPlayer.getFaction().describeTo(f), at.describeTo(f))); + return; + } context.fPlayer.attemptClaim(forFaction, context.fPlayer.getPlayer().getLocation(), true); } diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java index 51e3c096..46b5060d 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java @@ -1,9 +1,6 @@ package com.massivecraft.factions.cmd.claim; -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.FLocation; -import com.massivecraft.factions.Faction; -import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.*; import com.massivecraft.factions.cmd.Aliases; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; @@ -59,8 +56,14 @@ public class CmdClaim extends FCommand { return; } + Faction at = Board.getInstance().getFactionAt(new FLocation(context.fPlayer.getPlayer().getLocation())); + if (radius < 2) { - // single chunk + if (FactionsPlugin.cachedRadiusClaim && context.fPlayer.attemptClaim(forFaction, context.player.getLocation(), true)) { + context.fPlayer.getFaction().getFPlayersWhereOnline(true).forEach(f -> f.msg(TL.CLAIM_CLAIMED, context.fPlayer.describeTo(f, true), context.fPlayer.getFaction().describeTo(f), at.describeTo(f))); + FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); + return; + } context.fPlayer.attemptClaim(forFaction, context.player.getLocation(), true); FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); } else { @@ -68,16 +71,17 @@ public class CmdClaim extends FCommand { if (!Permission.CLAIM_RADIUS.has(context.sender, true)) { return; } - new SpiralTask(new FLocation(context.player), radius) { private final int limit = Conf.radiusClaimFailureLimit - 1; private int failCount = 0; + private int successfulClaims = 0; @Override public boolean work() { boolean success = context.fPlayer.attemptClaim(forFaction, this.currentLocation(), true); if (success) { failCount = 0; + successfulClaims++; FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); } else if (failCount++ >= limit) { this.stop(); @@ -85,6 +89,15 @@ public class CmdClaim extends FCommand { } return true; } + + public void finish() { + if (FactionsPlugin.cachedRadiusClaim) { + if (successfulClaims > 0) { + context.fPlayer.getFaction().getFPlayersWhereOnline(true).forEach(f -> f.msg(TL.CLAIM_RADIUS_CLAIM, context.fPlayer.describeTo(f, true), String.valueOf(successfulClaims), context.fPlayer.getPlayer().getLocation().getChunk().getX(), context.fPlayer.getPlayer().getLocation().getChunk().getZ())); + stop(); + } + } + } }; } } diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java index 3e77a501..cd0fd2c4 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java @@ -2,6 +2,7 @@ package com.massivecraft.factions.cmd.claim; import com.massivecraft.factions.Board; import com.massivecraft.factions.FLocation; +import com.massivecraft.factions.Faction; import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.Aliases; import com.massivecraft.factions.cmd.CommandContext; @@ -39,6 +40,15 @@ public class CmdClaimAt extends FCommand { int x = context.argAsInt(1); int z = context.argAsInt(2); FLocation location = new FLocation(context.argAsString(0), x, z); + + Faction at = Board.getInstance().getFactionAt(new FLocation(context.fPlayer.getPlayer().getLocation())); + + if (FactionsPlugin.cachedRadiusClaim && context.fPlayer.attemptClaim(context.fPlayer.getFaction(), context.player.getLocation(), true)) { + context.fPlayer.getFaction().getFPlayersWhereOnline(true).forEach(f -> f.msg(TL.CLAIM_CLAIMED, context.fPlayer.describeTo(f, true), context.fPlayer.getFaction().describeTo(f), at.describeTo(f))); + FactionsPlugin.instance.logFactionEvent(context.fPlayer.getFaction(), FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); + showMap(context); + return; + } context.fPlayer.attemptClaim(context.faction, location, true); FactionsPlugin.instance.logFactionEvent(context.fPlayer.getFaction(), FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", (location).formatXAndZ(",")); showMap(context); diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java index 07f791b5..7453f3a2 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java @@ -1,9 +1,6 @@ package com.massivecraft.factions.cmd.claim; -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.FLocation; -import com.massivecraft.factions.Faction; -import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.*; import com.massivecraft.factions.cmd.Aliases; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; @@ -71,6 +68,7 @@ public class CmdClaimLine extends FCommand { } final Faction forFaction = context.argAsFaction(2, context.faction); + Faction at = Board.getInstance().getFactionAt(new FLocation(context.fPlayer.getPlayer().getLocation())); if (forFaction != context.fPlayer.getFaction()) { if (!context.fPlayer.isAdminBypassing()) { @@ -84,11 +82,18 @@ public class CmdClaimLine extends FCommand { Location location = context.player.getLocation(); // TODO: make this a task like claiming a radius? + int claims = 0; for (int i = 0; i < amount; i++) { - context.fPlayer.attemptClaim(forFaction, location, true); + if (FactionsPlugin.cachedRadiusClaim && context.fPlayer.attemptClaim(forFaction, context.player.getLocation(), true)) { + claims++; + } else { + context.fPlayer.attemptClaim(forFaction, location, true); + } location = location.add(blockFace.getModX() * 16, 0, blockFace.getModZ() * 16); FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", String.valueOf(i), new FLocation(context.player.getLocation()).formatXAndZ(",")); } + int cachedClaims = claims; + context.fPlayer.getFaction().getFPlayersWhereOnline(true).forEach(f -> f.msg(TL.CLAIM_RADIUS_CLAIM, context.fPlayer.describeTo(f, true), String.valueOf(cachedClaims), context.fPlayer.getPlayer().getLocation().getChunk().getX(), context.fPlayer.getPlayer().getLocation().getChunk().getZ())); } @Override diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java index 54dd479d..42178e29 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java @@ -27,7 +27,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java index 2a0ff3f1..cce2e784 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsEntityListener.java @@ -327,7 +327,6 @@ public class FactionsEntityListener implements Listener { public boolean isPlayerInSafeZone(Entity damagee) { if (!(damagee instanceof Player)) return false; - return Board.getInstance().getFactionAt(new FLocation(damagee.getLocation())).isSafeZone(); } @@ -338,12 +337,8 @@ public class FactionsEntityListener implements Listener { public boolean canDamagerHurtDamagee(EntityDamageByEntityEvent sub, boolean notify) { Entity damager = sub.getDamager(); Entity damagee = sub.getEntity(); - if (!(damagee instanceof Player)) return true; - FPlayer defender = FPlayers.getInstance().getByPlayer((Player) damagee); - - if (damager instanceof Player) { FPlayer attacker = FPlayers.getInstance().getByPlayer((Player) damager); if (defender == null || defender.getPlayer() == null) return true; @@ -358,12 +353,8 @@ public class FactionsEntityListener implements Listener { } } } - - Location defenderLoc = defender.getPlayer().getLocation(); Faction defLocFaction = Board.getInstance().getFactionAt(new FLocation(defenderLoc)); - - // for damage caused by projectiles, getDamager() returns the projectile... what we need to know is the source if (damager instanceof Projectile) { Projectile projectile = (Projectile) damager; diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 891c0cc4..61245eca 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -730,9 +730,13 @@ public class FactionsPlayerListener implements Listener { CmdFly.startParticles(); } - + Faction at = Board.getInstance().getFactionAt(new FLocation(me.getPlayer().getLocation())); if (me.getAutoClaimFor() != null) { - me.attemptClaim(me.getAutoClaimFor(), newLocation, true); + if (FactionsPlugin.cachedRadiusClaim && me.attemptClaim(me.getFaction(), me.getPlayer().getLocation(), true)) { + me.getFaction().getFPlayersWhereOnline(true).forEach(f -> f.msg(TL.CLAIM_CLAIMED, me.describeTo(f, true), me.getFaction().describeTo(f), at.describeTo(f))); + } else { + me.attemptClaim(me.getAutoClaimFor(), newLocation, true); + } FactionsPlugin.instance.logFactionEvent(me.getAutoClaimFor(), FLogType.CHUNK_CLAIMS, me.getName(), CC.GreenB + "CLAIMED", String.valueOf(1), (new FLocation(player.getLocation())).formatXAndZ(",")); if (Conf.disableFlightOnFactionClaimChange) CmdFly.disableFlight(me); } else if (me.isAutoSafeClaimEnabled()) { diff --git a/src/main/java/com/massivecraft/factions/util/CornerTask.java b/src/main/java/com/massivecraft/factions/util/CornerTask.java index e6122e0f..eed3c4b7 100644 --- a/src/main/java/com/massivecraft/factions/util/CornerTask.java +++ b/src/main/java/com/massivecraft/factions/util/CornerTask.java @@ -2,6 +2,7 @@ package com.massivecraft.factions.util; import com.massivecraft.factions.FLocation; import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.scheduler.BukkitRunnable; @@ -26,7 +27,9 @@ public class CornerTask extends BukkitRunnable { cancel(); } else { FLocation fLocation = surrounding.remove(0); - if (fPlayer.attemptClaim(fPlayer.getFaction(), fLocation, true)) { + if (FactionsPlugin.cachedRadiusClaim && fPlayer.attemptClaim(fPlayer.getFaction(), fLocation, true)) { + ++amount; + } else if (fPlayer.attemptClaim(fPlayer.getFaction(), fLocation, true)) { ++amount; } else { fPlayer.sendMessage(TL.COMMAND_CORNER_FAIL_WITH_FEEDBACK.toString().replace("&", "ยง") + amount); diff --git a/src/main/java/com/massivecraft/factions/zcore/MPlugin.java b/src/main/java/com/massivecraft/factions/zcore/MPlugin.java index 9f1a5855..86280454 100644 --- a/src/main/java/com/massivecraft/factions/zcore/MPlugin.java +++ b/src/main/java/com/massivecraft/factions/zcore/MPlugin.java @@ -3,10 +3,7 @@ package com.massivecraft.factions.zcore; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; -import com.massivecraft.factions.Board; -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.FPlayers; -import com.massivecraft.factions.Factions; +import com.massivecraft.factions.*; import com.massivecraft.factions.zcore.persist.SaveTask; import com.massivecraft.factions.zcore.util.PermUtil; import com.massivecraft.factions.zcore.util.Persist; @@ -15,7 +12,6 @@ import com.massivecraft.factions.zcore.util.TextUtil; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.IllegalPluginAccessException; import org.bukkit.plugin.java.JavaPlugin; import java.io.*; @@ -100,9 +96,7 @@ public abstract class MPlugin extends JavaPlugin { long saveTicks = (long) (20 * 60 * Conf.saveToFileEveryXMinutes); // Approximately every 30 min by default saveTask = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new SaveTask(this), saveTicks, saveTicks); } - loadLang(); - loadSuccessful = true; return true; } @@ -178,17 +172,18 @@ public abstract class MPlugin extends JavaPlugin { } public void onDisable() { - if (saveTask != null) { - this.getServer().getScheduler().cancelTask(saveTask); - saveTask = null; - } - // only save data if plugin actually loaded successfully - if (loadSuccessful) { - Factions.getInstance().forceSave(); - FPlayers.getInstance().forceSave(); - Board.getInstance().forceSave(); - } - log("Disabled"); + getServer().getScheduler().cancelTasks(this); + if (saveTask != null) { + this.getServer().getScheduler().cancelTask(saveTask); + saveTask = null; + } + // only save data if plugin actually loaded successfully + if (loadSuccessful) { + Factions.getInstance().forceSave(); + FPlayers.getInstance().forceSave(); + Board.getInstance().forceSave(); + } + log("Disabled"); } // -------------------------------------------- // diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java index d33beadc..ad1cc25b 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java @@ -1288,11 +1288,13 @@ public abstract class MemoryFPlayer implements FPlayer { // announce success - Set informTheseFPlayers = new HashSet<>(); - informTheseFPlayers.add(this); - informTheseFPlayers.addAll(forFaction.getFPlayersWhereOnline(true)); - for (FPlayer fp : informTheseFPlayers) { - fp.msg(TL.CLAIM_CLAIMED, this.describeTo(fp, true), forFaction.describeTo(fp), currentFaction.describeTo(fp)); + if(!FactionsPlugin.cachedRadiusClaim) { + Set informTheseFPlayers = new HashSet<>(); + informTheseFPlayers.add(this); + informTheseFPlayers.addAll(forFaction.getFPlayersWhereOnline(true)); + for (FPlayer fp : informTheseFPlayers) { + fp.msg(TL.CLAIM_CLAIMED, this.describeTo(fp, true), forFaction.describeTo(fp), currentFaction.describeTo(fp)); + } } Board.getInstance().setFactionAt(forFaction, flocation); diff --git a/src/main/java/com/massivecraft/factions/zcore/util/TL.java b/src/main/java/com/massivecraft/factions/zcore/util/TL.java index 36003de7..2af0eaa1 100644 --- a/src/main/java/com/massivecraft/factions/zcore/util/TL.java +++ b/src/main/java/com/massivecraft/factions/zcore/util/TL.java @@ -1067,6 +1067,7 @@ public enum TL { CLAIM_FORCLAIM("for claiming this land"), CLAIM_TOOVERCLAIM("to overclaim this land"), CLAIM_FOROVERCLAIM("for over claiming this land"), + CLAIM_RADIUS_CLAIM("%1$s &eclaimed %2$s chunks &astarting from &e(X: %3$s, Z: %4$s)"), CLAIM_CLAIMED("%s claimed land for %s from %s."), CLAIM_CLAIMEDLOG("%s claimed land at (%s) for the faction: %s"), CLAIM_OVERCLAIM_DISABLED("Over claiming is disabled on this server."),