diff --git a/libs/CMILib1.5.0.3.jar b/libs/CMILib1.5.0.3.jar
new file mode 100644
index 00000000..a4ab8790
Binary files /dev/null and b/libs/CMILib1.5.0.3.jar differ
diff --git a/pom.xml b/pom.xml
index 446ba74d..4e07283f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0
Jobs
jobs
- 5.2.3.0
+ 5.2.4.0
Jobs
http://maven.apache.org
@@ -150,11 +150,11 @@
-
- com.github.Zrips
- CMILib
- 1.4.7.4
-
+
+
+
+
+
com.bgsoftware
@@ -184,6 +184,14 @@
system
${basedir}/libs/PyroFishingPro-4.9.1.jar
+
+
+ net.Zrips
+ CMILib
+ 1.5.0.2
+ system
+ ${basedir}/libs/CMILib1.5.0.3.jar
+
@@ -248,18 +256,6 @@
1.8
-
- org.apache.maven.plugins
- maven-jar-plugin
- 2.3.1
-
- ${basedir}/build/jar
-
-
-
-
\ No newline at end of file
diff --git a/src/main/java/com/gamingmesh/jobs/Jobs.java b/src/main/java/com/gamingmesh/jobs/Jobs.java
index 1311c148..5aefd64f 100644
--- a/src/main/java/com/gamingmesh/jobs/Jobs.java
+++ b/src/main/java/com/gamingmesh/jobs/Jobs.java
@@ -49,7 +49,9 @@ import com.gamingmesh.jobs.api.JobsPrePaymentEvent;
import com.gamingmesh.jobs.commands.JobsCommands;
import com.gamingmesh.jobs.config.BlockProtectionManager;
import com.gamingmesh.jobs.config.BossBarManager;
+import com.gamingmesh.jobs.config.ChunkExplorationManager;
import com.gamingmesh.jobs.config.ConfigManager;
+import com.gamingmesh.jobs.config.ExploitProtectionManager;
import com.gamingmesh.jobs.config.ExploreManager;
import com.gamingmesh.jobs.config.GeneralConfigManager;
import com.gamingmesh.jobs.config.LanguageManager;
@@ -96,6 +98,7 @@ import com.gamingmesh.jobs.i18n.Language;
import com.gamingmesh.jobs.listeners.JobsListener;
import com.gamingmesh.jobs.listeners.JobsPayment1_14Listener;
import com.gamingmesh.jobs.listeners.JobsPayment1_16Listener;
+import com.gamingmesh.jobs.listeners.JobsPayment1_20Listener;
import com.gamingmesh.jobs.listeners.JobsPayment1_9Listener;
import com.gamingmesh.jobs.listeners.JobsPaymentListener;
import com.gamingmesh.jobs.listeners.PistonProtectionListener;
@@ -131,14 +134,18 @@ public final class Jobs extends JavaPlugin {
private static SignUtil signManager;
private static ScheduleManager scheduleManager;
private static NameTranslatorManager nameTranslatorManager;
+ @Deprecated
private static ExploreManager exploreManager;
+ private static ChunkExplorationManager chunkExplorationManager;
private static TitleManager titleManager;
private static RestrictedBlockManager rbManager;
private static RestrictedAreaManager raManager;
private static BossBarManager bbManager;
private static ShopManager shopManager;
private static Loging loging;
+ @Deprecated
private static BlockProtectionManager bpManager;
+ private static ExploitProtectionManager exploitManager;
private static JobsManager dbManager;
private static ConfigManager configManager;
private static GeneralConfigManager gConfigManager;
@@ -288,12 +295,19 @@ public final class Jobs extends JavaPlugin {
return loging;
}
+ @Deprecated
public static BlockProtectionManager getBpManager() {
if (bpManager == null)
bpManager = new BlockProtectionManager();
return bpManager;
}
+ public static ExploitProtectionManager getExploitManager() {
+ if (exploitManager == null)
+ exploitManager = new ExploitProtectionManager();
+ return exploitManager;
+ }
+
public static JobsManager getDBManager() {
if (dbManager == null)
dbManager = new JobsManager(getInstance());
@@ -396,12 +410,19 @@ public final class Jobs extends JavaPlugin {
return getExploreManager();
}
+ @Deprecated
public static ExploreManager getExploreManager() {
if (exploreManager == null)
exploreManager = new ExploreManager();
return exploreManager;
}
+ public static ChunkExplorationManager getChunkExplorationManager() {
+ if (chunkExplorationManager == null)
+ chunkExplorationManager = new ChunkExplorationManager();
+ return chunkExplorationManager;
+ }
+
/**
* @return returns this class object instance
*/
@@ -777,7 +798,8 @@ public final class Jobs extends JavaPlugin {
}
dao.loadBlockProtection();
- getExploreManager().load();
+ if (!getGCManager().useNewExploration)
+ getExploreManager().load();
getCommandManager().fillCommands();
getDBManager().getDB().triggerTableIdUpdate();
@@ -809,8 +831,10 @@ public final class Jobs extends JavaPlugin {
if (Version.isCurrentEqualOrHigher(Version.v1_16_R3))
pm.registerEvents(new JobsPayment1_16Listener(), getInstance());
- if (Version.isCurrentEqualOrHigher(Version.v1_20_R1))
+ if (Version.isCurrentEqualOrHigher(Version.v1_20_R1)) {
pm.registerEvents(new PlayerSignEdit1_20Listeners(), getInstance());
+ pm.registerEvents(new JobsPayment1_20Listener(), getInstance());
+ }
if (getGCManager().useBlockProtection) {
pm.registerEvents(new PistonProtectionListener(), getInstance());
@@ -818,6 +842,9 @@ public final class Jobs extends JavaPlugin {
pm.registerEvents(new JobsChatEvent(getInstance()), getInstance());
+ if(HookManager.checkPyroFishingPro()) {
+ HookManager.getPyroFishingProManager().registerListener();
+ }
if (HookManager.getMcMMOManager().CheckmcMMO()) {
HookManager.setMcMMOlistener();
}
@@ -1020,8 +1047,9 @@ public final class Jobs extends JavaPlugin {
List progression = jPlayer.getJobProgression();
int numjobs = progression.size();
- if (!Jobs.getGCManager().useBlockProtectionBlockTracker && !isBpOk(jPlayer, info, block, true))
+ if (!Jobs.getGCManager().useBlockProtectionBlockTracker && !Jobs.getExploitManager().isProtectionValidAddIfNotExists(jPlayer, info, block, true)) {
return;
+ }
// no job
if (numjobs == 0) {
@@ -1100,8 +1128,12 @@ public final class Jobs extends JavaPlugin {
if (income == 0D && pointAmount == 0D)
return;
- if (info.getType() == ActionType.BREAK && block != null)
- getBpManager().remove(block);
+ if (info.getType() == ActionType.BREAK && block != null) {
+ if (getGCManager().useNewBlockProtection)
+ getExploitManager().remove(block);
+ else
+ getBpManager().remove(block);
+ }
if (pointAmount != 0D) {
jPlayer.setSaved(false);
@@ -1309,7 +1341,11 @@ public final class Jobs extends JavaPlugin {
//need to update bp
if (block != null && !Jobs.getGCManager().useBlockProtectionBlockTracker) {
- BlockProtection bp = getBpManager().getBp(block.getLocation());
+ BlockProtection bp = null;
+ if (Jobs.getGCManager().useNewBlockProtection) {
+ getExploitManager().setPaid(block, true);
+ } else
+ bp = getBpManager().getBp(block.getLocation());
if (bp != null)
bp.setPaid(true);
}
@@ -1318,84 +1354,6 @@ public final class Jobs extends JavaPlugin {
}
}
- private static boolean isBpOk(JobsPlayer player, ActionInfo info, Block block, boolean inform) {
- if (block == null || !gConfigManager.useBlockProtection)
- return true;
-
- if (info.getType() == ActionType.BREAK) {
- if (block.hasMetadata("JobsExploit")) {
- //player.sendMessage("This block is protected using Rukes' system!");
- return false;
- }
-
- BlockProtection bp = getBpManager().getBp(block.getLocation());
- if (bp != null) {
- long time = bp.getTime();
- Integer cd = getBpManager().getBlockDelayTime(block);
-
- if (time == -1L) {
- getBpManager().remove(block);
- return false;
- }
-
- if (time < System.currentTimeMillis() && bp.getAction() != DBAction.DELETE) {
- getBpManager().remove(block);
- return true;
- }
-
- if ((time > System.currentTimeMillis() || bp.isPaid()) && bp.getAction() != DBAction.DELETE) {
- if (inform && player.canGetPaid(info)) {
- int sec = Math.round((time - System.currentTimeMillis()) / 1000L);
- CMIActionBar.send(player.getPlayer(), lManager.getMessage("message.blocktimer", "[time]", sec));
- }
-
- return false;
- }
-
- getBpManager().add(block, cd);
-
- if ((cd == null || cd == 0) && gConfigManager.useGlobalTimer) {
- getBpManager().add(block, gConfigManager.globalblocktimer);
- }
-
- } else if (gConfigManager.useGlobalTimer) {
- getBpManager().add(block, gConfigManager.globalblocktimer);
- }
- } else if (info.getType() == ActionType.PLACE) {
- BlockProtection bp = getBpManager().getBp(block.getLocation());
- if (bp != null) {
- Long time = bp.getTime();
- Integer cd = getBpManager().getBlockDelayTime(block);
- if (time != -1L) {
- if (time < System.currentTimeMillis() && bp.getAction() != DBAction.DELETE) {
- getBpManager().add(block, cd);
- return true;
- }
-
- if ((time > System.currentTimeMillis() || bp.isPaid()) && bp.getAction() != DBAction.DELETE) {
- if (inform && player.canGetPaid(info)) {
- int sec = Math.round((time - System.currentTimeMillis()) / 1000L);
- CMIActionBar.send(player.getPlayer(), lManager.getMessage("message.blocktimer", "[time]", sec));
- }
-
- getBpManager().add(block, cd);
- return false;
- }
-
- // Lets add protection in any case
- getBpManager().add(block, cd);
- } else if (bp.isPaid() && bp.getTime() == -1L && cd != null && cd == -1) {
- getBpManager().add(block, cd);
- return false;
- } else
- getBpManager().add(block, cd);
- } else
- getBpManager().add(block, getBpManager().getBlockDelayTime(block));
- }
-
- return true;
- }
-
private static int getPlayerExperience(Player player) {
return (expToLevel(player.getLevel()) + Math.round(deltaLevelToExp(player.getLevel()) * player.getExp()));
}
diff --git a/src/main/java/com/gamingmesh/jobs/PlayerManager.java b/src/main/java/com/gamingmesh/jobs/PlayerManager.java
index bfebcc0c..1cc9a422 100644
--- a/src/main/java/com/gamingmesh/jobs/PlayerManager.java
+++ b/src/main/java/com/gamingmesh/jobs/PlayerManager.java
@@ -327,7 +327,8 @@ public class PlayerManager {
playersUUID.values().removeIf(jPlayer -> jPlayer.isSaved() && !jPlayer.isOnline());
- Jobs.getBpManager().saveCache();
+ if (!Jobs.getGCManager().useNewBlockProtection)
+ Jobs.getBpManager().saveCache();
}
/**
diff --git a/src/main/java/com/gamingmesh/jobs/Signs/SignUtil.java b/src/main/java/com/gamingmesh/jobs/Signs/SignUtil.java
index 8f2965d1..1c1f5ddc 100644
--- a/src/main/java/com/gamingmesh/jobs/Signs/SignUtil.java
+++ b/src/main/java/com/gamingmesh/jobs/Signs/SignUtil.java
@@ -6,9 +6,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.stream.Collectors;
-import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@@ -18,7 +16,6 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import com.gamingmesh.jobs.Jobs;
-import com.gamingmesh.jobs.commands.list.gtop;
import com.gamingmesh.jobs.container.Job;
import com.gamingmesh.jobs.container.TopList;
@@ -50,7 +47,7 @@ public class SignUtil {
Map sub = signsByType.get(jSign.getIdentifier().toLowerCase());
if (sub != null) {
sub.remove(jSign.locToBlockString());
- }
+ }
return true;
}
diff --git a/src/main/java/com/gamingmesh/jobs/commands/list/bp.java b/src/main/java/com/gamingmesh/jobs/commands/list/bp.java
index a8217b30..e42be54b 100644
--- a/src/main/java/com/gamingmesh/jobs/commands/list/bp.java
+++ b/src/main/java/com/gamingmesh/jobs/commands/list/bp.java
@@ -3,7 +3,6 @@ package com.gamingmesh.jobs.commands.list;
import java.util.ArrayList;
import java.util.List;
-import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
@@ -15,8 +14,10 @@ import com.gamingmesh.jobs.container.BlockProtection;
import com.gamingmesh.jobs.container.DBAction;
import com.gamingmesh.jobs.i18n.Language;
+import net.Zrips.CMILib.Container.CMINumber;
import net.Zrips.CMILib.Items.CMIMaterial;
import net.Zrips.CMILib.Locale.LC;
+import net.Zrips.CMILib.Logs.CMIDebug;
import net.Zrips.CMILib.Messages.CMIMessages;
import net.Zrips.CMILib.Version.Version;
import net.Zrips.CMILib.Version.Schedulers.CMIScheduler;
@@ -41,30 +42,26 @@ public class bp implements Cmd {
final List changedBlocks = new ArrayList<>();
- for (int x = -10; x < 10; x++) {
- for (int y = -10; y < 10; y++) {
- for (int z = -10; z < 10; z++) {
- Location l = loc.clone().add(x, y, z);
- BlockProtection bp = Jobs.getBpManager().getBp(l);
- if (bp != null) {
- long time = bp.getTime();
- if (!all) {
- if (bp.getAction() == DBAction.DELETE)
- continue;
- if (time != -1 && time < System.currentTimeMillis()) {
- Jobs.getBpManager().remove(l);
- continue;
- }
+ if (Jobs.getGCManager().useNewBlockProtection) {
+ for (int x = -10; x < 10; x++) {
+ for (int y = -10; y < 10; y++) {
+ for (int z = -10; z < 10; z++) {
+ Location l = loc.clone().add(x, y, z);
+ Long time = Jobs.getExploitManager().getTime(l.getBlock());
+ if (time == null)
+ continue;
+
+ if (!all && time != -1 && time < System.currentTimeMillis()) {
+ Jobs.getExploitManager().remove(l.getBlock());
+ continue;
}
+
changedBlocks.add(l.getBlock());
if (Version.isCurrentEqualOrHigher(Version.v1_15_R1)) {
- player.sendBlockChange(l, (bp.getAction() == DBAction.DELETE ? CMIMaterial.RED_STAINED_GLASS : time == -1 ? CMIMaterial.BLACK_STAINED_GLASS : CMIMaterial.WHITE_STAINED_GLASS)
- .getMaterial().createBlockData());
+ player.sendBlockChange(l, (time == -1 ? CMIMaterial.BLACK_STAINED_GLASS : CMIMaterial.WHITE_STAINED_GLASS).getMaterial().createBlockData());
} else {
- if (bp.getAction() == DBAction.DELETE)
- player.sendBlockChange(l, CMIMaterial.RED_STAINED_GLASS.getMaterial(), (byte) 14);
- else if (time == -1)
+ if (time == -1)
player.sendBlockChange(l, CMIMaterial.RED_STAINED_GLASS.getMaterial(), (byte) 15);
else
player.sendBlockChange(l, CMIMaterial.RED_STAINED_GLASS.getMaterial(), (byte) 0);
@@ -72,7 +69,40 @@ public class bp implements Cmd {
}
}
}
- }
+ } else
+ for (int x = -10; x < 10; x++) {
+ for (int y = -10; y < 10; y++) {
+ for (int z = -10; z < 10; z++) {
+ Location l = loc.clone().add(x, y, z);
+ BlockProtection bp = Jobs.getBpManager().getBp(l);
+ if (bp != null) {
+ long time = bp.getTime();
+ if (!all) {
+ if (bp.getAction() == DBAction.DELETE)
+ continue;
+ if (time != -1 && time < System.currentTimeMillis()) {
+ Jobs.getBpManager().remove(l);
+ continue;
+ }
+ }
+ changedBlocks.add(l.getBlock());
+
+ if (Version.isCurrentEqualOrHigher(Version.v1_15_R1)) {
+ player.sendBlockChange(l, (bp.getAction() == DBAction.DELETE ? CMIMaterial.RED_STAINED_GLASS : time == -1 ? CMIMaterial.BLACK_STAINED_GLASS
+ : CMIMaterial.WHITE_STAINED_GLASS)
+ .getMaterial().createBlockData());
+ } else {
+ if (bp.getAction() == DBAction.DELETE)
+ player.sendBlockChange(l, CMIMaterial.RED_STAINED_GLASS.getMaterial(), (byte) 14);
+ else if (time == -1)
+ player.sendBlockChange(l, CMIMaterial.RED_STAINED_GLASS.getMaterial(), (byte) 15);
+ else
+ player.sendBlockChange(l, CMIMaterial.RED_STAINED_GLASS.getMaterial(), (byte) 0);
+ }
+ }
+ }
+ }
+ }
if (changedBlocks.isEmpty())
Language.sendMessage(sender, "command.bp.output.notFound");
diff --git a/src/main/java/com/gamingmesh/jobs/commands/list/explored.java b/src/main/java/com/gamingmesh/jobs/commands/list/explored.java
index aaa046aa..ab678c8c 100644
--- a/src/main/java/com/gamingmesh/jobs/commands/list/explored.java
+++ b/src/main/java/com/gamingmesh/jobs/commands/list/explored.java
@@ -1,14 +1,12 @@
package com.gamingmesh.jobs.commands.list;
-import java.util.Map;
+import java.util.List;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.commands.Cmd;
-import com.gamingmesh.jobs.container.ExploreChunk;
-import com.gamingmesh.jobs.container.ExploreRegion;
import com.gamingmesh.jobs.container.PlayerInfo;
import com.gamingmesh.jobs.i18n.Language;
@@ -24,35 +22,25 @@ public class explored implements Cmd {
}
Player player = (Player) sender;
- Map exploreRegion = Jobs.getExploreManager().getWorlds().get(player.getWorld().getName());
- if (exploreRegion == null) {
+ List players = null;
+
+ if (Jobs.getGCManager().useNewExploration) {
+ players = Jobs.getChunkExplorationManager().getVisitors(player.getLocation().getChunk());
+ } else {
+ players = Jobs.getExploreManager().getVisitors(player.getLocation().getChunk());
+ }
+
+ if (players == null) {
Language.sendMessage(sender, "command.explored.error.noexplore");
return true;
}
- int RegionX = (int) Math.floor(player.getLocation().getChunk().getX() / 32D);
- int RegionZ = (int) Math.floor(player.getLocation().getChunk().getZ() / 32D);
- ExploreRegion region = exploreRegion.get(RegionX + ":" + RegionZ);
- if (region == null) {
+ if (players.isEmpty()) {
Language.sendMessage(sender, "command.explored.error.noexplore");
return true;
}
- ExploreChunk chunk = region.getChunk(player.getLocation().getChunk());
-
- if (chunk == null) {
- Language.sendMessage(sender, "command.explored.error.noexplore");
- return true;
- }
-
- if (Jobs.getGCManager().ExploreCompact && chunk.isFullyExplored()) {
- Language.sendMessage(sender, "command.explored.fullExplore");
- return true;
- }
-
- java.util.List players = chunk.getPlayers();
-
for (int i = 0; i < players.size(); i++) {
PlayerInfo ji = Jobs.getPlayerManager().getPlayerInfo(players.get(i));
if (ji != null)
diff --git a/src/main/java/com/gamingmesh/jobs/commands/list/recalculatepermissions.java b/src/main/java/com/gamingmesh/jobs/commands/list/recalculatepermissions.java
new file mode 100644
index 00000000..1cd574b2
--- /dev/null
+++ b/src/main/java/com/gamingmesh/jobs/commands/list/recalculatepermissions.java
@@ -0,0 +1,37 @@
+package com.gamingmesh.jobs.commands.list;
+
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+import com.gamingmesh.jobs.Jobs;
+import com.gamingmesh.jobs.commands.Cmd;
+import com.gamingmesh.jobs.container.ActionType;
+import com.gamingmesh.jobs.container.Job;
+import com.gamingmesh.jobs.container.JobsPlayer;
+import com.gamingmesh.jobs.i18n.Language;
+
+import net.Zrips.CMILib.Locale.LC;
+import net.Zrips.CMILib.Messages.CMIMessages;
+
+public class recalculatepermissions implements Cmd {
+
+ @Override
+ public Boolean perform(Jobs plugin, final CommandSender sender, final String[] args) {
+
+ JobsPlayer jPlayer = null;
+ if (args.length >= 1) {
+ jPlayer = Jobs.getPlayerManager().getJobsPlayer(args[0]);
+ } else if (sender instanceof Player)
+ jPlayer = Jobs.getPlayerManager().getJobsPlayer((Player) sender);
+
+ if (jPlayer == null) {
+ LC.info_NoPlayer.sendMessage(sender, "[name]", args.length >= 1 ? args[0] : sender.getName());
+ return true;
+ }
+
+ jPlayer.getPermissionsCache().clear();
+
+ return true;
+ }
+
+}
diff --git a/src/main/java/com/gamingmesh/jobs/commands/list/resetexploreregion.java b/src/main/java/com/gamingmesh/jobs/commands/list/resetexploreregion.java
index 1d08d370..ad326f4a 100644
--- a/src/main/java/com/gamingmesh/jobs/commands/list/resetexploreregion.java
+++ b/src/main/java/com/gamingmesh/jobs/commands/list/resetexploreregion.java
@@ -28,7 +28,10 @@ public class resetexploreregion implements Cmd {
return true;
}
- Jobs.getExploreManager().resetRegion(worldName);
+ if (Jobs.getGCManager().useNewExploration) {
+ Jobs.getChunkExplorationManager().resetRegion(worldName);
+ } else
+ Jobs.getExploreManager().resetRegion(worldName);
Language.sendMessage(sender, "command.resetexploreregion.output.reseted", "%worldname%", worldName);
return true;
}
diff --git a/src/main/java/com/gamingmesh/jobs/config/BlockProtectionManager.java b/src/main/java/com/gamingmesh/jobs/config/BlockProtectionManager.java
index 75321afd..a7a0a44d 100644
--- a/src/main/java/com/gamingmesh/jobs/config/BlockProtectionManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/BlockProtectionManager.java
@@ -9,9 +9,13 @@ import org.bukkit.World;
import org.bukkit.block.Block;
import com.gamingmesh.jobs.Jobs;
+import com.gamingmesh.jobs.container.ActionInfo;
+import com.gamingmesh.jobs.container.ActionType;
import com.gamingmesh.jobs.container.BlockProtection;
import com.gamingmesh.jobs.container.DBAction;
+import com.gamingmesh.jobs.container.JobsPlayer;
+import net.Zrips.CMILib.ActionBar.CMIActionBar;
import net.Zrips.CMILib.Container.CMIBlock;
import net.Zrips.CMILib.Container.CMIBlock.Bisect;
import net.Zrips.CMILib.Items.CMIMaterial;
@@ -22,7 +26,7 @@ public class BlockProtectionManager {
private final HashMap>>> map = new HashMap<>();
private final ConcurrentHashMap> tempCache = new ConcurrentHashMap<>();
- public HashMap>>> getMap() {
+ public HashMap>>> getMap2() {
return map;
}
@@ -104,11 +108,9 @@ public class BlockProtectionManager {
Bp.setPaid(paid);
Bp.setTime(time);
- // If timer is under 2 hours, we can run scheduler to remove it when time comes
- if (time > -1 && (time - System.currentTimeMillis()) / 1000 < 60 * 60 * 2)
- Bp.setScheduler(CMIScheduler.get().runAtLocationLater(loc, () -> {
- remove(loc);
- }, (time - System.currentTimeMillis()) / 50));
+ // If timer is under 5 min, we can run scheduler to remove it when time comes
+ if (time > -1 && (time - System.currentTimeMillis()) / 1000 < 60 * 5)
+ Bp.setScheduler(CMIScheduler.runAtLocationLater(loc, () -> remove(loc), (time - System.currentTimeMillis()) / 50));
Bpm.put(v, Bp);
chunks.put(chunk, Bpm);
@@ -220,15 +222,87 @@ public class BlockProtectionManager {
return (int) Math.floor(x / 32D) + ":" + (int) Math.floor(z / 32D);
}
+ @Deprecated
public Integer getBlockDelayTime(Block block) {
- Integer time = Jobs.getRestrictedBlockManager().restrictedBlocksTimer.get(CMIMaterial.get(block));
- if (time == null && Jobs.getGCManager().useGlobalTimer) {
- time = Jobs.getGCManager().globalblocktimer;
- }
- return time;
+ return Jobs.getExploitManager().getBlockProtectionTime(block);
}
+ @Deprecated
public boolean isInBp(Block block) {
return Jobs.getRestrictedBlockManager().restrictedBlocksTimer.containsKey(CMIMaterial.get(block));
}
+
+ public boolean isBpOk(JobsPlayer player, ActionInfo info, Block block, boolean inform) {
+ if (block == null || !Jobs.getGCManager().useBlockProtection)
+ return true;
+
+ if (info.getType() == ActionType.BREAK) {
+ if (block.hasMetadata("JobsExploit")) {
+ //player.sendMessage("This block is protected using Rukes' system!");
+ return false;
+ }
+
+ BlockProtection bp = getBp(block.getLocation());
+ if (bp != null) {
+ long time = bp.getTime();
+ Integer cd = Jobs.getExploitManager().getBlockProtectionTime(info.getType(), block);
+
+ if (time == -1L) {
+ remove(block);
+ return false;
+ }
+
+ if (time < System.currentTimeMillis() && bp.getAction() != DBAction.DELETE) {
+ remove(block);
+ return true;
+ }
+
+ if ((time > System.currentTimeMillis() || bp.isPaid()) && bp.getAction() != DBAction.DELETE) {
+ if (inform && player.canGetPaid(info)) {
+ int sec = Math.round((time - System.currentTimeMillis()) / 1000L);
+ CMIActionBar.send(player.getPlayer(), Jobs.getLanguage().getMessage("message.blocktimer", "[time]", sec));
+ }
+
+ return false;
+ }
+
+ add(block, cd);
+
+ } else
+ add(block, Jobs.getExploitManager().getBlockProtectionTime(info.getType(), block));
+
+ } else if (info.getType() == ActionType.PLACE) {
+ BlockProtection bp = getBp(block.getLocation());
+ if (bp != null) {
+ Long time = bp.getTime();
+ Integer cd = Jobs.getExploitManager().getBlockProtectionTime(info.getType(), block);
+ if (time != -1L) {
+ if (time < System.currentTimeMillis() && bp.getAction() != DBAction.DELETE) {
+ add(block, cd);
+ return true;
+ }
+
+ if ((time > System.currentTimeMillis() || bp.isPaid()) && bp.getAction() != DBAction.DELETE) {
+ if (inform && player.canGetPaid(info)) {
+ int sec = Math.round((time - System.currentTimeMillis()) / 1000L);
+ CMIActionBar.send(player.getPlayer(), Jobs.getLanguage().getMessage("message.blocktimer", "[time]", sec));
+ }
+
+ add(block, cd);
+ return false;
+ }
+
+ // Lets add protection in any case
+ add(block, cd);
+ } else if (bp.isPaid() && bp.getTime() == -1L && cd != null && cd == -1) {
+ add(block, cd);
+ return false;
+ } else
+ add(block, cd);
+ } else
+ add(block, Jobs.getExploitManager().getBlockProtectionTime(info.getType(), block));
+ }
+
+ return true;
+ }
}
diff --git a/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java b/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java
index 619cbb52..6274810b 100644
--- a/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/BossBarManager.java
@@ -140,20 +140,17 @@ public class BossBarManager {
bar.setVisible(true);
if (oldOne != null)
- oldOne.setScheduler(CMIScheduler.get().runTaskLater(new Runnable() {
- @Override
- public void run() {
- for (BossBarInfo one : player.getBossBarInfo()) {
- if (!one.getPlayerName().equalsIgnoreCase(player.getName()))
- continue;
+ oldOne.setScheduler(CMIScheduler.runTaskLater(() -> {
+ for (BossBarInfo one : player.getBossBarInfo()) {
+ if (!one.getPlayerName().equalsIgnoreCase(player.getName()))
+ continue;
- if (!one.getJobName().equalsIgnoreCase(jobProg.getJob().getName()))
- continue;
+ if (!one.getJobName().equalsIgnoreCase(jobProg.getJob().getName()))
+ continue;
- BossBar tempBar = one.getBar();
- tempBar.setVisible(false);
- break;
- }
+ BossBar tempBar = one.getBar();
+ tempBar.setVisible(false);
+ break;
}
}, Jobs.getGCManager().BossBarTimer * 20L));
diff --git a/src/main/java/com/gamingmesh/jobs/config/ChunkExplorationManager.java b/src/main/java/com/gamingmesh/jobs/config/ChunkExplorationManager.java
new file mode 100644
index 00000000..e148f61b
--- /dev/null
+++ b/src/main/java/com/gamingmesh/jobs/config/ChunkExplorationManager.java
@@ -0,0 +1,79 @@
+package com.gamingmesh.jobs.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.bukkit.Chunk;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+import com.gamingmesh.jobs.Jobs;
+import com.gamingmesh.jobs.container.ExploreRespond;
+
+import net.Zrips.CMILib.Messages.CMIMessages;
+import net.Zrips.CMILib.PersistentData.CMIChunkPersistentDataContainer;
+
+public class ChunkExplorationManager {
+
+ private static final String NAME = "JobsExplore";
+ private static final String SUBNAME = "Explorers";
+
+ private boolean exploreEnabled = false;
+ private int playerAmount = 1;
+
+ public int getPlayerAmount() {
+ return playerAmount;
+ }
+
+ public void setPlayerAmount(int amount) {
+ if (playerAmount < amount)
+ playerAmount = amount;
+ }
+
+ public boolean isExploreEnabled() {
+ return exploreEnabled;
+ }
+
+ public void setExploreEnabled() {
+ exploreEnabled = true;
+ }
+
+ public List getVisitors(Chunk chunk) {
+ return new CMIChunkPersistentDataContainer(NAME, chunk).getListInt(SUBNAME);
+ }
+
+ public ExploreRespond chunkRespond(Player player, Chunk chunk) {
+ return chunkRespond(Jobs.getPlayerManager().getJobsPlayer(player).getUserId(), chunk);
+ }
+
+ public ExploreRespond chunkRespond(int playerId, Chunk chunk) {
+
+ CMIChunkPersistentDataContainer container = new CMIChunkPersistentDataContainer(NAME, chunk);
+
+ @Nullable
+ List list = container.getListInt(SUBNAME);
+
+ ExploreRespond response = new ExploreRespond();
+
+ if (list == null || !list.contains(playerId)) {
+ if (list == null)
+ list = new ArrayList();
+ else
+ list = new ArrayList(list);
+ list.add(playerId);
+ container.setIntList(SUBNAME, list);
+ container.save();
+ response.setNewChunk(true);
+ }
+
+ response.setCount(list.size());
+
+ return response;
+ }
+
+ public void resetRegion(String worldname) {
+ CMIMessages.consoleMessage("&eReseting explorer data. World: " + worldname);
+// Needs to pick new way of tracking data
+ CMIMessages.consoleMessage("&eCompleted to reset explorer data.");
+ }
+}
diff --git a/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java b/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java
index 6b52c895..26642062 100644
--- a/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java
@@ -410,6 +410,11 @@ public class ConfigManager {
cfg.addComment(pt + ".Brew", "Brewing miscellaneous items");
generate(cfg, pt + ".Brew.nether_stalk");
generate(cfg, pt + ".Brew.redstone");
+
+ cfg.addComment(pt + ".Brush", "Brushing blocks and getting items from them");
+ generate(cfg, pt + ".Brush.suspicious_sand");
+ generate(cfg, pt + ".Brush.suspicious_gravel");
+ generate(cfg, pt + ".Brush.coal");
cfg.addComment(pt + ".Explore", "Explore options. Each number represents players number in exploring that chunk",
"1 means that player is first in this chunk, 2 is second and so on",
@@ -614,6 +619,7 @@ public class ConfigManager {
case STRIPLOGS:
case BUCKET:
case COLLECT:
+ case BRUSH:
material = CMIMaterial.get(myKey + (subType));
if (material == CMIMaterial.NONE)
@@ -807,6 +813,10 @@ public class ConfigManager {
Jobs.getExploreManager().setExploreEnabled();
Jobs.getExploreManager().setPlayerAmount(amount);
+
+ Jobs.getChunkExplorationManager().setExploreEnabled();
+ Jobs.getChunkExplorationManager().setPlayerAmount(amount);
+
} else if (actionType == ActionType.CRAFT) {
if (myKey.startsWith("!")) {
type = myKey.substring(1, myKey.length());
@@ -833,6 +843,12 @@ public class ConfigManager {
meta = "ALL";
// case for ":all" identifier
type = (actionType == ActionType.SHEAR && myKey.startsWith("color")) ? "color" : CMIMaterial.getGeneralMaterialName(type);
+
+ CMIEntityType entity = CMIEntityType.get(type);
+ if (entity != null) {
+ type = entity.toString();
+ }
+
}
if (actionType == ActionType.TNTBREAK)
diff --git a/src/main/java/com/gamingmesh/jobs/config/ExploitProtectionManager.java b/src/main/java/com/gamingmesh/jobs/config/ExploitProtectionManager.java
new file mode 100644
index 00000000..ffb954fb
--- /dev/null
+++ b/src/main/java/com/gamingmesh/jobs/config/ExploitProtectionManager.java
@@ -0,0 +1,365 @@
+package com.gamingmesh.jobs.config;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import org.bukkit.Chunk;
+import org.bukkit.Location;
+import org.bukkit.NamespacedKey;
+import org.bukkit.block.Block;
+import org.bukkit.util.Vector;
+
+import com.gamingmesh.jobs.Jobs;
+import com.gamingmesh.jobs.container.ActionInfo;
+import com.gamingmesh.jobs.container.ActionType;
+import com.gamingmesh.jobs.container.BlockProtection;
+import com.gamingmesh.jobs.container.ExploitProtection;
+import com.gamingmesh.jobs.container.JobsPlayer;
+
+import net.Zrips.CMILib.ActionBar.CMIActionBar;
+import net.Zrips.CMILib.Container.CMIBlock;
+import net.Zrips.CMILib.Container.CMIBlock.Bisect;
+import net.Zrips.CMILib.Items.CMIMaterial;
+import net.Zrips.CMILib.PersistentData.CMIChunkPersistentDataContainer;
+
+public class ExploitProtectionManager {
+
+ private static final String NAMEGENERAL = "JobsExploitProtection";
+ private static final String NAMETIME = "Time";
+ private static final String NAMEPAID = "Paid";
+
+ private HashMap> map = new HashMap<>();
+
+ class chunkData {
+ private CMIChunkPersistentDataContainer container;
+ private long lastClean = 0;
+
+ chunkData(CMIChunkPersistentDataContainer container) {
+ this.container = container;
+ lastClean = System.currentTimeMillis();
+ }
+
+ public long getLastClean() {
+ return lastClean;
+ }
+
+ public void setLastClean(long lastClean) {
+ this.lastClean = lastClean;
+ }
+
+ public CMIChunkPersistentDataContainer getContainer() {
+ return container;
+ }
+ }
+
+ private CMIChunkPersistentDataContainer getPDC(Block block) {
+ if (block == null)
+ return null;
+ return getPDC(block.getChunk());
+ }
+
+ private CMIChunkPersistentDataContainer getPDC(Chunk chunk) {
+ if (chunk == null)
+ return null;
+ chunkData data = getChunkData(chunk);
+ return data == null ? null : data.getContainer();
+ }
+
+ private chunkData getChunkData(Chunk chunk) {
+ if (chunk == null)
+ return null;
+ HashMap world = map.computeIfAbsent(chunk.getWorld().getName(), x -> new HashMap<>());
+ return world.computeIfAbsent(chunk.getX() + ":" + chunk.getZ(), x -> new chunkData(new CMIChunkPersistentDataContainer(NAMEGENERAL, chunk)));
+ }
+
+ public void removePDC(Chunk chunk) {
+ if (!Jobs.getGCManager().useNewBlockProtection)
+ return;
+ HashMap world = map.get(chunk.getWorld().getName());
+ if (world == null)
+ return;
+ world.remove(chunk.getX() + ":" + chunk.getZ());
+ }
+
+ public void addProtection(Block block, Integer cd) {
+
+ if (cd == null || cd == 0)
+ return;
+
+ // Assuming that block is bottom part of flower we will add top part to the record too
+ switch (CMIMaterial.get(block)) {
+ case LILAC:
+ case SUNFLOWER:
+ case ROSE_BUSH:
+ case PEONY:
+ CMIBlock cmb = new CMIBlock(block);
+ // We are only interested in this being bottom block as this should never trigger for top part of placed block
+ if (cmb.getBisect().equals(Bisect.BOTTOM))
+ addProtection(block.getLocation().clone().add(0, 1, 0).getBlock(), cd, true);
+ break;
+ }
+
+ addProtection(block, cd, true);
+ }
+
+ public void addProtection(Block block, Integer cd, boolean paid) {
+ if (cd == null || cd == 0)
+ return;
+
+ addProtection(block, cd != -1 ? System.currentTimeMillis() + (cd * 1000) : -1, paid);
+ }
+
+ private String convertLoc(Location loc) {
+ return convertLoc(loc.toVector());
+ }
+
+ private String convertLoc(Vector loc) {
+ return loc.getBlockX() + "." + loc.getBlockY() + "." + loc.getBlockZ();
+ }
+
+ private int shortenLong(long value) {
+ if (value == -1)
+ return -1;
+ return (int) (value / 1000) - 2147483647;
+ }
+
+ private Long deconvertLong(Integer value) {
+ if (value == null)
+ return null;
+ if (value == -1)
+ return -1L;
+ return (value + 2147483647L) * 1000L;
+ }
+
+ public ExploitProtection addProtection(Block block, Long protectedUntil, boolean paid) {
+ if (!Jobs.getGCManager().useNewBlockProtection) {
+ BlockProtection protection = Jobs.getBpManager().addP(block.getLocation(), protectedUntil, paid, true);
+
+ ExploitProtection ep = new ExploitProtection(block.getLocation().toVector());
+ ep.setPaid(protection.isPaid());
+ ep.setProtectedUntil(protection.getTime());
+ return ep;
+ }
+
+ if (protectedUntil == null || protectedUntil == 0)
+ return null;
+
+ if (block == null)
+ return null;
+
+ CMIChunkPersistentDataContainer pdc = getPDC(block);
+
+ if (pdc == null)
+ return null;
+
+ String locString = convertLoc(block.getLocation());
+
+ pdc.set(locString, NAMETIME, shortenLong(protectedUntil));
+ if (!paid)
+ pdc.set(locString, NAMEPAID, paid);
+ else
+ pdc.remove(locString, NAMEPAID);
+ pdc.save();
+
+ ExploitProtection ep = new ExploitProtection(block.getLocation().toVector());
+ ep.setPaid(paid);
+ ep.setProtectedUntil(protectedUntil);
+
+ return ep;
+ }
+
+ public void remove(Block block) {
+ if (!Jobs.getGCManager().useNewBlockProtection) {
+ Jobs.getBpManager().remove(block);
+ return;
+ }
+
+ // In case double plant was destroyed we should remove both blocks from records
+ CMIMaterial cmat = CMIMaterial.get(block);
+ switch (cmat) {
+ case LILAC:
+ case SUNFLOWER:
+ case ROSE_BUSH:
+ case PEONY:
+ CMIBlock cmb = new CMIBlock(block);
+ if (cmb.getBisect().equals(Bisect.BOTTOM)) {
+ block = block.getLocation().clone().add(0, 1, 0).getBlock();
+ } else {
+ block = block.getLocation().clone().add(0, -1, 0).getBlock();
+ }
+ return;
+ }
+
+ CMIChunkPersistentDataContainer pdc = getPDC(block);
+ String locString = convertLoc(block.getLocation());
+ pdc.remove(locString);
+ pdc.save();
+ }
+
+ public Long getTime(Block block) {
+
+ if (!Jobs.getGCManager().useNewBlockProtection)
+ return Jobs.getBpManager().getTime(block);
+
+ CMIChunkPersistentDataContainer pdc = getPDC(block);
+ String locString = convertLoc(block.getLocation());
+ return deconvertLong(pdc.getInt(locString, NAMETIME));
+ }
+
+ public Long getTime(Location loc) {
+ return getTime(loc.getBlock());
+ }
+
+ @Deprecated
+ public Integer getBlockProtectionTime(Block block) {
+ return getBlockProtectionTime(ActionType.PLACE, block);
+ }
+
+ public Integer getBlockProtectionTime(ActionType action, Block block) {
+
+ switch (action) {
+ case BREAK:
+ if (Jobs.getGCManager().useGlobalBreakTimer)
+ return Jobs.getGCManager().globalBlockBreakTimer;
+ break;
+ case PLACE:
+ Integer time = Jobs.getRestrictedBlockManager().restrictedBlocksTimer.get(CMIMaterial.get(block));
+ if (time == null && Jobs.getGCManager().useGlobalTimer)
+ return Jobs.getGCManager().globalblocktimer;
+ return time == null ? 0 : time;
+ }
+
+ return 0;
+ }
+
+ public boolean isInProtection(Block block) {
+ return Jobs.getRestrictedBlockManager().restrictedBlocksTimer.containsKey(CMIMaterial.get(block));
+ }
+
+ public void setPaid(Block block, boolean paid) {
+ CMIChunkPersistentDataContainer pdc = getPDC(block);
+ String locString = convertLoc(block.getLocation());
+ if (!paid)
+ pdc.set(locString, NAMEPAID, paid);
+ else
+ pdc.remove(locString, NAMEPAID);
+ pdc.save();
+ }
+
+ private ExploitProtection getProtection(Block block) {
+
+ ExploitProtection ep = new ExploitProtection(block.getLocation().toVector());
+
+ CMIChunkPersistentDataContainer pdc = getPDC(block);
+
+ String locString = convertLoc(block.getLocation());
+ Boolean paidValue = pdc.getBoolean(locString, NAMEPAID);
+ ep.setPaid(paidValue == null ? true : paidValue);
+ ep.setProtectedUntil(deconvertLong(pdc.getInt(locString, NAMETIME)));
+ return ep;
+ }
+
+ public boolean isProtectionValidAddIfNotExists(JobsPlayer player, ActionInfo info, Block block, boolean inform) {
+ if (!Jobs.getGCManager().useNewBlockProtection)
+ return Jobs.getBpManager().isBpOk(player, info, block, inform);
+
+ if (block == null || !Jobs.getGCManager().useBlockProtection)
+ return true;
+
+ if (info.getType() == ActionType.BREAK) {
+ if (block.hasMetadata("JobsExploit")) {
+ //player.sendMessage("This block is protected using Rukes' system!");
+ return false;
+ }
+
+ ExploitProtection exploitProtection = getProtection(block);
+ if (exploitProtection.getProtectedUntil() != 0) {
+ long time = exploitProtection.getProtectedUntil();
+
+ if (time == -1L) {
+ remove(block);
+ return false;
+ }
+
+ if (time < System.currentTimeMillis()) {
+ remove(block);
+ return true;
+ }
+
+ if (time > System.currentTimeMillis() || exploitProtection.isPaid()) {
+ if (inform && player.canGetPaid(info))
+ CMIActionBar.send(player.getPlayer(), Jobs.getLanguage().getMessage("message.blocktimer", "[time]", Math.round((time - System.currentTimeMillis()) / 1000L)));
+ return false;
+ }
+
+ addProtection(block, getBlockProtectionTime(info.getType(), block));
+
+ } else {
+ addProtection(block, getBlockProtectionTime(info.getType(), block));
+ }
+ } else if (info.getType() == ActionType.PLACE) {
+ ExploitProtection exploitProtection = getProtection(block);
+ if (exploitProtection.getProtectedUntil() != 0) {
+
+ long time = exploitProtection.getProtectedUntil();
+
+ Integer cd = getBlockProtectionTime(info.getType(), block);
+ if (time != -1L) {
+ if (time < System.currentTimeMillis()) {
+ addProtection(block, cd);
+ return true;
+ }
+
+ if ((time > System.currentTimeMillis() || exploitProtection.isPaid())) {
+ if (inform && player.canGetPaid(info))
+ CMIActionBar.send(player.getPlayer(), Jobs.getLanguage().getMessage("message.blocktimer", "[time]", Math.round((time - System.currentTimeMillis()) / 1000L)));
+ addProtection(block, cd);
+ return false;
+ }
+
+ // Lets add protection in any case
+ addProtection(block, cd);
+ } else if (exploitProtection.isPaid() && exploitProtection.getProtectedUntil() == -1L && cd != null && cd == -1) {
+ addProtection(block, cd);
+ return false;
+ } else
+ addProtection(block, cd);
+ } else
+ addProtection(block, getBlockProtectionTime(info.getType(), block));
+ }
+
+ return true;
+ }
+
+ public void cleanChunk(Chunk chunk) {
+
+ if (!Jobs.getGCManager().useNewBlockProtection)
+ return;
+
+ try {
+
+ chunkData pdc = getChunkData(chunk);
+
+ if (pdc == null)
+ return;
+
+ // Delay to clean it up once more to prevent rapid updates of same chunk
+ if (pdc.getLastClean() + (30 * 1000L) > System.currentTimeMillis())
+ return;
+
+ Set keys = pdc.getContainer().getKeys();
+
+ for (NamespacedKey one : keys) {
+ Long time = deconvertLong(pdc.getContainer().getInt(one.getKey(), NAMETIME));
+ if (time != null && time < System.currentTimeMillis()) {
+ pdc.getContainer().remove(one.getKey());
+ }
+ }
+ pdc.getContainer().save();
+ pdc.setLastClean(System.currentTimeMillis());
+
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/gamingmesh/jobs/config/ExploreManager.java b/src/main/java/com/gamingmesh/jobs/config/ExploreManager.java
index 1b0d62fd..3cff6fb0 100644
--- a/src/main/java/com/gamingmesh/jobs/config/ExploreManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/ExploreManager.java
@@ -2,12 +2,16 @@ package com.gamingmesh.jobs.config;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Chunk;
import org.bukkit.entity.Player;
+import org.bukkit.persistence.PersistentDataType;
+import org.jetbrains.annotations.Nullable;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.container.ExploreChunk;
@@ -15,10 +19,13 @@ import com.gamingmesh.jobs.container.ExploreRegion;
import com.gamingmesh.jobs.container.ExploreRespond;
import com.gamingmesh.jobs.container.JobsWorld;
import com.gamingmesh.jobs.dao.JobsDAO.ExploreDataTableFields;
+import com.gamingmesh.jobs.i18n.Language;
import com.gamingmesh.jobs.stuff.Util;
import net.Zrips.CMILib.Messages.CMIMessages;
+import net.Zrips.CMILib.PersistentData.CMIChunkPersistentDataContainer;
+@Deprecated
public class ExploreManager {
private final Map> worlds = new HashMap<>();
@@ -42,6 +49,31 @@ public class ExploreManager {
exploreEnabled = true;
}
+ public List getVisitors(Chunk chunk) {
+
+ Map exploreRegion = worlds.get(chunk.getWorld().getName());
+
+ if (exploreRegion == null)
+ return null;
+
+ int RegionX = (int) Math.floor(chunk.getX() / 32D);
+ int RegionZ = (int) Math.floor(chunk.getZ() / 32D);
+ ExploreRegion region = exploreRegion.get(RegionX + ":" + RegionZ);
+ if (region == null)
+ return null;
+
+ ExploreChunk echunk = region.getChunk(chunk);
+
+ if (echunk == null)
+ return null;
+
+ if (Jobs.getGCManager().ExploreCompact && echunk.isFullyExplored()) {
+ return Collections.emptyList();
+ }
+
+ return echunk.getPlayers();
+ }
+
public void load() {
if (!exploreEnabled)
return;
diff --git a/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java b/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java
index b0c91d4b..aec20635 100644
--- a/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/GeneralConfigManager.java
@@ -73,7 +73,7 @@ public class GeneralConfigManager {
private String getSelectionTool, DecimalPlacesMoney, DecimalPlacesExp, DecimalPlacesPoints;
public int jobExpiryTime, BlockProtectionDays, FireworkPower, ShootTime, blockOwnershipRange,
- globalblocktimer, CowMilkingTimer, InfoUpdateInterval, JobsTopAmount, PlaceholdersPage, ConfirmExpiryTime,
+ globalblocktimer, globalBlockBreakTimer, CowMilkingTimer, InfoUpdateInterval, JobsTopAmount, PlaceholdersPage, ConfirmExpiryTime,
SegmentCount, BossBarTimer, AutoJobJoinDelay, DBCleaningJobsLvl, DBCleaningUsersDays, BlastFurnacesMaxDefault, SmokersMaxDefault,
levelLossPercentageFromMax, levelLossPercentage, SoundLevelupVolume, SoundLevelupPitch, SoundTitleChangeVolume,
SoundTitleChangePitch, ToplistInScoreboardInterval;
@@ -92,8 +92,9 @@ public class GeneralConfigManager {
private FireworkEffect fireworkEffect;
- public boolean ignoreOreGenerators, useBlockProtection, useBlockProtectionBlockTracker, enableSchedule, PayForRenaming, PayForEnchantingOnAnvil, PayForEachCraft, SignsEnabled,
- SignsColorizeJobName, ShowToplistInScoreboard, useGlobalTimer, useSilkTouchProtection, UseCustomNames,
+ public boolean ignoreOreGenerators, useBlockProtection, useNewBlockProtection, useNewExploration, useBlockProtectionBlockTracker, enableSchedule, PayForRenaming, PayForEnchantingOnAnvil,
+ PayForEachCraft, SignsEnabled,
+ SignsColorizeJobName, ShowToplistInScoreboard, useGlobalTimer, useGlobalBreakTimer, useSilkTouchProtection, UseCustomNames,
PreventSlimeSplit, PreventMagmaCubeSplit, PreventHopperFillUps, PreventBrewingStandFillUps, informOnPaymentDisable,
BrowseUseNewLook, payExploringWhenGliding = false, resetExploringData = false, disablePaymentIfMaxLevelReached, disablePaymentIfRiding,
boostedItemsInOffHand = false, boostedItemsInMainHand, boostedArmorItems, boostedItemsSlotSpecific, multiplyBoostedExtraValues, addPermissionBoost,
@@ -423,6 +424,12 @@ public class GeneralConfigManager {
DisabledWorldsList = c.get("Optimizations.DisabledWorlds.List", Arrays.asList("Example", "Worlds"));
CMIList.toLowerCase(DisabledWorldsList);
+ if (Version.isCurrentEqualOrHigher(Version.v1_14_R1)) {
+ c.addComment("Optimizations.Explore.NewMethod",
+ "Do you want to use new exploration tracking method. Only for 1.14+ servers");
+ useNewExploration = c.get("Optimizations.Explore.NewMethod", true);
+ }
+
c.addComment("Optimizations.Explore.Compact",
"By setting this to true when there is max amount of players explored a chunk then it will be marked as fully explored and exact players who explored it will not be saved to save some memory");
ExploreCompact = c.get("Optimizations.Explore.Compact", true);
@@ -883,16 +890,24 @@ public class GeneralConfigManager {
"Enable blocks protection, like ore, from exploiting by placing and destroying same block again and again.",
"Modify restrictedBlocks.yml for blocks you want to protect");
useBlockProtection = c.get("ExploitProtections.General.PlaceAndBreak.Enabled", c.getC().getBoolean("ExploitProtections.General.PlaceAndBreakProtection", true));
-
+
+ if (Version.isCurrentEqualOrHigher(Version.v1_14_R1)) {
+ c.addComment("ExploitProtections.General.PlaceAndBreak.NewMethod",
+ "Should we use new block protection method", "In most cases this is more efficient way to check for break/place protection and doesn't involve any cache or data saving into database",
+ "Only works with 1.14+ servers");
+ useNewBlockProtection = c.get("ExploitProtections.General.PlaceAndBreak.NewMethod", true);
+ }
+
c.addComment("ExploitProtections.General.PlaceAndBreak.BlockTracker.Enabled",
"Should we use BlockTracker plugin instead of built in block tracker");
useBlockProtectionBlockTracker = c.get("ExploitProtections.General.PlaceAndBreak.BlockTracker.Enabled", false);
-
+
c.addComment("ExploitProtections.General.PlaceAndBreak.IgnoreOreGenerators",
"Enabling this we will ignore blocks generated in ore generators, liko stone, coublestone and obsidian. You can still use timer on player placed obsidian block");
ignoreOreGenerators = c.get("ExploitProtections.General.PlaceAndBreak.IgnoreOreGenerators", true);
c.addComment("ExploitProtections.General.PlaceAndBreak.KeepDataFor",
+ "Only applies when old method is used",
"For how long in days to keep block protection data in data base", "This will clean block data which ones have -1 as cooldown value",
"Data base cleanup will be performed on each server startup", "This cant be more then 14 days");
BlockProtectionDays = c.get("ExploitProtections.General.PlaceAndBreak.KeepDataFor", c.getC().getInt("ExploitProtections.General.KeepDataFor", 14));
@@ -902,15 +917,23 @@ public class GeneralConfigManager {
+ " once you have broken the block in one place.");
allowBreakPaymentForOreGenerators = c.get("ExploitProtections.General.AllowBreakPaymentForOreGenerators", false);*/
- c.addComment("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer", "All blocks will be protected X sec after player places it on ground.");
- useGlobalTimer = c.get("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Use", c.getC().getBoolean("ExploitProtections.General.GlobalBlockTimer.use", true));
- c.addComment("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Timer", "Time in seconds. This can only be positive number");
- globalblocktimer = c.get("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Timer", c.getC().getInt("ExploitProtections.General.GlobalBlockTimer.timer", 3));
- globalblocktimer = CMINumber.clamp(globalblocktimer, 1, 99999);
+ c.addComment("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Place", "All blocks will be protected X seconds after player places it");
+ useGlobalTimer = c.get("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Place.Use", c.getC().getBoolean("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Use", true));
+ c.addComment("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Place.Timer",
+ "Time in seconds. This can only be positive number and no higher than 900",
+ "If higher timers are needed then it can be defined in restrictedBlocks.yml file for each specific block");
+ globalblocktimer = c.get("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Place.Timer", c.getC().getInt("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Timer", 3));
+ globalblocktimer = CMINumber.clamp(globalblocktimer, 1, 900);
+ useGlobalBreakTimer = c.get("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Break.Use", true);
+ c.addComment("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Break.Timer",
+ "Time in seconds. This can only be positive number and no higher than 60",
+ "This is only to prevent player from placing blocks into same place and getting paid once more");
+ globalBlockBreakTimer = c.get("ExploitProtections.General.PlaceAndBreak.GlobalBlockTimer.Break.Timer", 3);
+ globalBlockBreakTimer = CMINumber.clamp(globalBlockBreakTimer, 1, 60);
c.addComment("ExploitProtections.General.PlaceAndBreak.SilkTouchProtection", "Enable silk touch protection.",
"With this enabled players wont get paid for broken blocks from restrictedblocks list with silk touch tool.");
- useSilkTouchProtection = c.get("ExploitProtections.General.PlaceAndBreak.SilkTouchProtection", c.getC().getBoolean("ExploitProtections.General.SilkTouchProtection", false));
+ useSilkTouchProtection = c.get("ExploitProtections.General.PlaceAndBreak.SilkTouchProtection", false);
c.addComment("ExploitProtections.General.MonsterDamage.Use", "This section controls how much damage player should do to monster for player to get paid",
"This prevents from killing monsters in one hit when they suffer in example fall damage");
diff --git a/src/main/java/com/gamingmesh/jobs/config/LanguageManager.java b/src/main/java/com/gamingmesh/jobs/config/LanguageManager.java
index 573ad547..6ce76cb8 100644
--- a/src/main/java/com/gamingmesh/jobs/config/LanguageManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/LanguageManager.java
@@ -292,6 +292,9 @@ public class LanguageManager {
c.get("command.entitylist.help.info", "Shows all possible entities that can be used with the plugin.");
c.get("command.entitylist.help.args", "");
+ c.get("command.recalculatepermissions.help.info", "Reset players permission cache");
+ c.get("command.recalculatepermissions.help.args", "(playername)");
+
c.get("command.stats.help.info", "Show the level you are in each job you are part of.");
c.get("command.stats.help.args", "[playername]");
Jobs.getGCManager().getCommandArgs().put("stats", Arrays.asList("[playername]"));
@@ -420,6 +423,8 @@ public class LanguageManager {
c.get("command.info.output.bake.none", "%jobname% does not get money for cooking foods.");
c.get("command.info.output.bucket.info", "&eBucket");
c.get("command.info.output.bucket.none", "%jobname% does not get money for bucketing.");
+ c.get("command.info.output.brush.info", "&eBrush");
+ c.get("command.info.output.brush.none", "%jobname% does not get money for brushing blocks.");
c.get("command.playerinfo.help.info", "Show how much each job is getting paid and for what on another player.");
c.get("command.playerinfo.help.args", "[playername] [jobname] [action]");
diff --git a/src/main/java/com/gamingmesh/jobs/config/NameTranslatorManager.java b/src/main/java/com/gamingmesh/jobs/config/NameTranslatorManager.java
index 1f7c3a03..f5ecf00f 100644
--- a/src/main/java/com/gamingmesh/jobs/config/NameTranslatorManager.java
+++ b/src/main/java/com/gamingmesh/jobs/config/NameTranslatorManager.java
@@ -125,25 +125,9 @@ public class NameTranslatorManager {
case KILL:
case MILK:
case TAME:
- for (NameList one : listOfEntities) {
- String ids = one.getId() + ":" + one.getMeta();
-
- if (!one.getMeta().isEmpty() && !one.getId().equals("0") && ids.equalsIgnoreCase(id + ":" + meta)) {
- return one.getName();
- }
-
- ids = one.getId();
-
- if (!one.getId().equals("0") && ids.equalsIgnoreCase(Integer.toString(id))) {
- return one.getName();
- }
-
- ids = one.getMinecraftName();
-
- if (ids.equalsIgnoreCase(name)) {
- return one.getName();
- }
- }
+ String entityName = getEntityName(id, meta, name);
+ if (entityName != null)
+ return entityName;
break;
case ENCHANT:
String mName = materialName;
@@ -186,6 +170,10 @@ public class NameTranslatorManager {
}
}
+ entityName = getEntityName(id, meta, name);
+ if (entityName != null)
+ return entityName;
+
return name == null ? "nocolor" : Arrays.stream(name.split("\\s|:|-"))
.map(word -> word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase())
.collect(Collectors.joining(" ")); // returns capitalized word (from this -> To This)
@@ -203,6 +191,29 @@ public class NameTranslatorManager {
return materialName;
}
+ private String getEntityName(int id, String meta, String name) {
+ for (NameList one : listOfEntities) {
+ String ids = one.getId() + ":" + one.getMeta();
+
+ if (!one.getMeta().isEmpty() && !one.getId().equals("0") && ids.equalsIgnoreCase(id + ":" + meta)) {
+ return one.getName();
+ }
+
+ ids = one.getId();
+
+ if (!one.getId().equals("0") && ids.equalsIgnoreCase(Integer.toString(id))) {
+ return one.getName();
+ }
+
+ ids = one.getMinecraftName();
+
+ if (ids.equalsIgnoreCase(name)) {
+ return one.getName();
+ }
+ }
+ return null;
+ }
+
public void readFile() {
YmlMaker itemFile = new YmlMaker(Jobs.getFolder(), "TranslatableWords" + File.separator + "Words_"
+ Jobs.getGCManager().localeString + ".yml");
diff --git a/src/main/java/com/gamingmesh/jobs/container/ActionType.java b/src/main/java/com/gamingmesh/jobs/container/ActionType.java
index 453a37a9..a33e8d42 100644
--- a/src/main/java/com/gamingmesh/jobs/container/ActionType.java
+++ b/src/main/java/com/gamingmesh/jobs/container/ActionType.java
@@ -45,7 +45,8 @@ public enum ActionType {
CUSTOMKILL("custom-kill"),
COLLECT(),
BAKE(),
- BUCKET();
+ BUCKET(),
+ BRUSH();
private String name;
diff --git a/src/main/java/com/gamingmesh/jobs/container/ExploitProtection.java b/src/main/java/com/gamingmesh/jobs/container/ExploitProtection.java
new file mode 100644
index 00000000..1c341aae
--- /dev/null
+++ b/src/main/java/com/gamingmesh/jobs/container/ExploitProtection.java
@@ -0,0 +1,56 @@
+package com.gamingmesh.jobs.container;
+
+import org.bukkit.util.Vector;
+
+public class ExploitProtection {
+
+ private long protectedUntil = -1;
+ private boolean paid = false;
+ private int x = 0;
+ private short y = 0;
+ private int z = 0;
+
+ public ExploitProtection(Vector pos) {
+ this(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ());
+ }
+
+ public ExploitProtection(Vector pos, boolean paid, long protectedUntil) {
+ this(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ());
+ this.paid = paid;
+ this.protectedUntil = protectedUntil;
+ }
+
+ public ExploitProtection(int x, int y, int z) {
+ this.x = x;
+ this.y = (short) y;
+ this.z = z;
+ }
+
+ public long getProtectedUntil() {
+ return protectedUntil;
+ }
+
+ public void setProtectedUntil(Long time) {
+ this.protectedUntil = time == null ? 0 : time < 0 ? -1 : time;
+ }
+
+ public boolean isPaid() {
+ return paid;
+ }
+
+ public void setPaid(Boolean paid) {
+ this.paid = paid == null ? false : paid;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+}
diff --git a/src/main/java/com/gamingmesh/jobs/container/ExploreChunk.java b/src/main/java/com/gamingmesh/jobs/container/ExploreChunk.java
index d0df0e49..76fe6f1f 100644
--- a/src/main/java/com/gamingmesh/jobs/container/ExploreChunk.java
+++ b/src/main/java/com/gamingmesh/jobs/container/ExploreChunk.java
@@ -5,6 +5,7 @@ import java.util.List;
import com.gamingmesh.jobs.Jobs;
+@Deprecated
public class ExploreChunk {
private List playerIds = new ArrayList<>();
diff --git a/src/main/java/com/gamingmesh/jobs/container/ExploreRespond.java b/src/main/java/com/gamingmesh/jobs/container/ExploreRespond.java
index b55c642c..70104923 100644
--- a/src/main/java/com/gamingmesh/jobs/container/ExploreRespond.java
+++ b/src/main/java/com/gamingmesh/jobs/container/ExploreRespond.java
@@ -2,9 +2,12 @@ package com.gamingmesh.jobs.container;
public class ExploreRespond {
- private int count;
+ private int count = 0;
private boolean newChunk = false;
+ public ExploreRespond() {
+ }
+
public ExploreRespond(int count, boolean newChunk) {
this.count = count;
this.newChunk = newChunk;
@@ -17,4 +20,12 @@ public class ExploreRespond {
public boolean isNewChunk() {
return newChunk;
}
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public void setNewChunk(boolean newChunk) {
+ this.newChunk = newChunk;
+ }
}
diff --git a/src/main/java/com/gamingmesh/jobs/dao/JobsDAO.java b/src/main/java/com/gamingmesh/jobs/dao/JobsDAO.java
index b75b401a..bcfea717 100644
--- a/src/main/java/com/gamingmesh/jobs/dao/JobsDAO.java
+++ b/src/main/java/com/gamingmesh/jobs/dao/JobsDAO.java
@@ -2465,6 +2465,9 @@ public abstract class JobsDAO {
* @param jobBlockProtection - the information getting saved
*/
public void loadBlockProtection() {
+ if (Jobs.getGCManager().useNewBlockProtection)
+ return;
+
JobsConnection conn = getConnection();
if (conn == null)
return;
@@ -2552,6 +2555,9 @@ public abstract class JobsDAO {
if (!Jobs.getExploreManager().isExploreEnabled())
return;
+ if (Jobs.getGCManager().useNewExploration)
+ return;
+
JobsConnection conn = getConnection();
if (conn == null)
return;
@@ -2577,7 +2583,7 @@ public abstract class JobsDAO {
int id = jobsWorld == null ? 0 : jobsWorld.getId();
if (id == 0)
continue;
-
+
for (Entry region : worlds.getValue().entrySet()) {
for (Entry oneChunk : region.getValue().getChunks().entrySet()) {
ExploreChunk chunk = oneChunk.getValue();
@@ -2617,6 +2623,9 @@ public abstract class JobsDAO {
if (!Jobs.getExploreManager().isExploreEnabled())
return;
+ if (Jobs.getGCManager().useNewExploration)
+ return;
+
JobsConnection conn = getConnection();
if (conn == null)
return;
@@ -2669,6 +2678,9 @@ public abstract class JobsDAO {
if (!Jobs.getExploreManager().isExploreEnabled())
return;
+ if (Jobs.getGCManager().useNewExploration)
+ return;
+
JobsConnection conn = getConnection();
if (conn == null)
return;
@@ -2720,6 +2732,9 @@ public abstract class JobsDAO {
if (!Jobs.getExploreManager().isExploreEnabled())
return false;
+ if (Jobs.getGCManager().useNewExploration)
+ return false;
+
JobsConnection conn = getConnection();
if (conn == null)
return false;
diff --git a/src/main/java/com/gamingmesh/jobs/hooks/HookManager.java b/src/main/java/com/gamingmesh/jobs/hooks/HookManager.java
index f2ab3f15..323e0376 100644
--- a/src/main/java/com/gamingmesh/jobs/hooks/HookManager.java
+++ b/src/main/java/com/gamingmesh/jobs/hooks/HookManager.java
@@ -17,6 +17,7 @@ import com.gamingmesh.jobs.hooks.stackMob.StackMobHandler;
import com.gamingmesh.jobs.hooks.wildStacker.WildStackerHandler;
import net.Zrips.CMILib.Messages.CMIMessages;
+import net.Zrips.CMILib.Version.Schedulers.CMIScheduler;
public class HookManager {
@@ -36,13 +37,15 @@ public class HookManager {
public static void loadHooks() {
pm = PLUGIN.getServer().getPluginManager();
- setMyPetManager();
- setWorldGuard();
- setMythicManager();
- setStackMobHandler();
- setWildStackerHandler();
- setBlockTrackerManager();
- setPyroFishingProManager();
+ CMIScheduler.runTask(() -> {
+ setMyPetManager();
+ setWorldGuard();
+ setMythicManager();
+ setStackMobHandler();
+ setWildStackerHandler();
+ setBlockTrackerManager();
+ setPyroFishingProManager();
+ });
}
public static StackMobHandler getStackMobHandler() {
@@ -99,6 +102,10 @@ public class HookManager {
return Jobs.getGCManager().MythicMobsEnabled && MythicManager != null && MythicManager.check();
}
+ public static boolean checkPyroFishingPro() {
+ return pyroFishingProManager != null;
+ }
+
public static BlockTrackerManager getBlockTrackerManager() {
if (blockTrackerManager == null) {
blockTrackerManager = new BlockTrackerManager();
@@ -110,7 +117,7 @@ public class HookManager {
private static boolean setWorldGuard() {
if (JobsHook.WorldGuard.isEnabled()) {
worldGuardManager = new WorldGuardManager();
- CMIMessages.consoleMessage("&eWorldGuard detected.");
+ CMIMessages.consoleMessage("&e" + JobsHook.WorldGuard + " detected.");
return true;
}
@@ -144,31 +151,35 @@ public class HookManager {
private static void setMyPetManager() {
if (JobsHook.MyPet.isEnabled()) {
myPetManager = new MyPetManager();
- CMIMessages.consoleMessage("&eMyPet detected.");
+ CMIMessages.consoleMessage("&e" + JobsHook.MyPet + " detected.");
}
}
private static void setStackMobHandler() {
if (JobsHook.StackMob.isEnabled()) {
stackMobHandler = new StackMobHandler();
+ CMIMessages.consoleMessage("&e" + JobsHook.StackMob + " detected.");
}
}
private static void setWildStackerHandler() {
if (JobsHook.WildStacker.isEnabled()) {
wildStackerHandler = new WildStackerHandler();
+ CMIMessages.consoleMessage("&e" + JobsHook.WildStacker + " detected.");
}
}
private static void setBlockTrackerManager() {
if (JobsHook.BlockTracker.isEnabled()) {
blockTrackerManager = new BlockTrackerManager();
+ CMIMessages.consoleMessage("&e" + JobsHook.BlockTracker + " detected.");
}
}
private static void setPyroFishingProManager() {
if (JobsHook.PyroFishingPro.isEnabled()) {
pyroFishingProManager = new PyroFishingProManager();
+ CMIMessages.consoleMessage("&e" + JobsHook.PyroFishingPro + " detected.");
}
}
}
diff --git a/src/main/java/com/gamingmesh/jobs/hooks/JobsHook.java b/src/main/java/com/gamingmesh/jobs/hooks/JobsHook.java
index 0bb594ea..9f039953 100644
--- a/src/main/java/com/gamingmesh/jobs/hooks/JobsHook.java
+++ b/src/main/java/com/gamingmesh/jobs/hooks/JobsHook.java
@@ -18,18 +18,14 @@ public enum JobsHook {
private Boolean present;
public boolean isEnabled() {
- if (enabled == null) {
- enabled = JavaPlugin.getPlugin(Jobs.class).getServer().getPluginManager().isPluginEnabled(name());
- }
-
+ if (enabled == null)
+ enabled = JavaPlugin.getPlugin(Jobs.class).getServer().getPluginManager().isPluginEnabled(name());
return enabled;
}
public boolean isPresent() {
- if (present == null) {
- present = JavaPlugin.getPlugin(Jobs.class).getServer().getPluginManager().getPlugin(name()) != null;
- }
-
+ if (present == null)
+ present = JavaPlugin.getPlugin(Jobs.class).getServer().getPluginManager().getPlugin(name()) != null;
return present;
}
}
diff --git a/src/main/java/com/gamingmesh/jobs/hooks/pyroFishingPro/PyroFishingProManager.java b/src/main/java/com/gamingmesh/jobs/hooks/pyroFishingPro/PyroFishingProManager.java
index 2f1b3cfa..300509df 100644
--- a/src/main/java/com/gamingmesh/jobs/hooks/pyroFishingPro/PyroFishingProManager.java
+++ b/src/main/java/com/gamingmesh/jobs/hooks/pyroFishingPro/PyroFishingProManager.java
@@ -15,7 +15,7 @@ public class PyroFishingProManager implements Listener {
public PyroFishingProManager() {
this.jobs = Jobs.getInstance();
- jobs.getServer().getPluginManager().registerEvents(this, jobs);
+ registerListener();
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
@@ -29,4 +29,8 @@ public class PyroFishingProManager implements Listener {
return null;
return lastFish;
}
+
+ public void registerListener() {
+ jobs.getServer().getPluginManager().registerEvents(this, jobs);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java b/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java
index a541d2b4..7c7a766a 100644
--- a/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java
+++ b/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java
@@ -58,6 +58,7 @@ import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.inventory.EquipmentSlot;
@@ -118,16 +119,36 @@ public class JobsListener implements Listener {
return time > 100;
}
+ @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
+ public void onChunkUnload(ChunkUnloadEvent event) {
+ Jobs.getExploitManager().removePDC(event.getChunk());
+ }
+
+ @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
+ public void onChunkUnload(JobsChunkChangeEvent event) {
+ Jobs.getExploitManager().cleanChunk(event.getOldChunk());
+ }
+
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockFromToEvent(BlockFromToEvent event) {
if (!Jobs.getGCManager().useBlockProtection)
return;
+
if (!Jobs.getGCManager().ignoreOreGenerators)
return;
+
if (!Jobs.getGCManager().canPerformActionInWorld(event.getBlock().getWorld()))
return;
- Jobs.getBpManager().remove(event.getToBlock());
+
+ // Ignoring air blocks
+ if (CMIMaterial.isAir(event.getToBlock().getType()))
+ return;
+
+ if (CMIMaterial.isWater(event.getBlock().getType()))
+ return;
+
+ Jobs.getExploitManager().remove(event.getToBlock());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
@@ -401,14 +422,24 @@ public class JobsListener implements Listener {
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onCropGrown(final BlockGrowEvent event) {
if (Jobs.getGCManager().canPerformActionInWorld(event.getBlock().getWorld())) {
- CMIScheduler.get().runAtLocationLater(event.getBlock().getLocation(), () -> Jobs.getBpManager().remove(event.getBlock()), 1L);
+ CMIScheduler.runAtLocationLater(event.getBlock().getLocation(), () -> {
+ if (Jobs.getGCManager().useNewBlockProtection)
+ Jobs.getExploitManager().remove(event.getBlock());
+ else
+ Jobs.getBpManager().remove(event.getBlock());
+ }, 1L);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onTreeGrown(final StructureGrowEvent event) {
if (!event.getBlocks().isEmpty() && Jobs.getGCManager().canPerformActionInWorld(event.getBlocks().get(0).getWorld())) {
- CMIScheduler.get().runAtLocationLater(event.getBlocks().get(0).getLocation(), () -> event.getBlocks().forEach(blockState -> Jobs.getBpManager().remove(blockState.getBlock())), 1L);
+ CMIScheduler.runAtLocationLater(event.getBlocks().get(0).getLocation(), () -> event.getBlocks().forEach(blockState -> {
+ if (Jobs.getGCManager().useNewBlockProtection)
+ Jobs.getExploitManager().remove(blockState.getBlock());
+ else
+ Jobs.getBpManager().remove(blockState.getBlock());
+ }), 1L);
}
}
diff --git a/src/main/java/com/gamingmesh/jobs/listeners/JobsPayment1_20Listener.java b/src/main/java/com/gamingmesh/jobs/listeners/JobsPayment1_20Listener.java
new file mode 100644
index 00000000..a375e9cb
--- /dev/null
+++ b/src/main/java/com/gamingmesh/jobs/listeners/JobsPayment1_20Listener.java
@@ -0,0 +1,55 @@
+package com.gamingmesh.jobs.listeners;
+
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Item;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockDropItemEvent;
+
+import com.gamingmesh.jobs.Jobs;
+import com.gamingmesh.jobs.actions.BlockActionInfo;
+import com.gamingmesh.jobs.actions.ItemActionInfo;
+import com.gamingmesh.jobs.container.ActionType;
+import com.gamingmesh.jobs.container.JobsPlayer;
+
+public class JobsPayment1_20Listener implements Listener {
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onEntityBucketed(BlockDropItemEvent event) {
+
+ Player player = event.getPlayer();
+
+ if (!Jobs.getGCManager().canPerformActionInWorld(player.getWorld())) {
+ return;
+ }
+
+ // check if in creative
+ if (!JobsPaymentListener.payIfCreative(player)) {
+ return;
+ }
+
+ if (!event.getBlock().getType().toString().contains("SUSPICIOUS_")) {
+ return;
+ }
+
+ if (!Jobs.getPermissionHandler().hasWorldPermission(player, player.getLocation().getWorld().getName())) {
+ return;
+ }
+
+ // check if player is riding
+ if (Jobs.getGCManager().disablePaymentIfRiding && player.isInsideVehicle() && !player.getVehicle().getType().equals(EntityType.BOAT)) {
+ return;
+ }
+
+ JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
+ if (jPlayer == null)
+ return;
+
+ Jobs.action(jPlayer, new BlockActionInfo(event.getBlock(), ActionType.BRUSH));
+
+ for (Item item : event.getItems()) {
+ Jobs.action(jPlayer, new ItemActionInfo(item.getItemStack(), ActionType.BRUSH));
+ }
+ }
+}
diff --git a/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java b/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java
index ee92739d..1095c3ca 100644
--- a/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java
+++ b/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java
@@ -41,6 +41,7 @@ import org.bukkit.entity.EntityType;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.MushroomCow;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Sheep;
@@ -313,16 +314,20 @@ public final class JobsPaymentListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityShear(PlayerShearEntityEvent event) {
+
Player player = event.getPlayer();
- if (!(event.getEntity() instanceof Sheep) || !Jobs.getGCManager().canPerformActionInWorld(player.getWorld()))
+ if (!(event.getEntity() instanceof Sheep) && !(event.getEntity() instanceof MushroomCow) || !Jobs.getGCManager().canPerformActionInWorld(player.getWorld()))
return;
- Sheep sheep = (Sheep) event.getEntity();
+ Entity entity = event.getEntity();
+
+ if (!(entity instanceof LivingEntity))
+ return;
// mob spawner, no payment or experience
- if (!Jobs.getGCManager().payNearSpawner() && sheep.hasMetadata(Jobs.getPlayerManager().getMobSpawnerMetadata())) {
- sheep.removeMetadata(Jobs.getPlayerManager().getMobSpawnerMetadata(), plugin);
+ if (!Jobs.getGCManager().payNearSpawner() && entity.hasMetadata(Jobs.getPlayerManager().getMobSpawnerMetadata())) {
+ entity.removeMetadata(Jobs.getPlayerManager().getMobSpawnerMetadata(), plugin);
return;
}
@@ -342,25 +347,36 @@ public final class JobsPaymentListener implements Listener {
// pay
JobsPlayer jDamager = Jobs.getPlayerManager().getJobsPlayer(player);
- if (jDamager == null || sheep.getColor() == null)
+ if (jDamager == null)
return;
+ String typeString = null;
+
+ if (event.getEntity() instanceof Sheep) {
+ Sheep sheep = (Sheep) event.getEntity();
+ if (sheep.getColor() == null)
+ return;
+ typeString = sheep.getColor().name();
+ } else if (event.getEntity() instanceof MushroomCow) {
+ typeString = CMIEntityType.get(entity).toString();
+ }
+
if (Jobs.getGCManager().payForStackedEntities) {
if (JobsHook.WildStacker.isEnabled() && !StackSplit.SHEEP_SHEAR.isEnabled()) {
- for (int i = 0; i < HookManager.getWildStackerHandler().getEntityAmount(sheep) - 1; i++) {
- Jobs.action(jDamager, new CustomKillInfo(sheep.getColor().name(), ActionType.SHEAR));
+ for (int i = 0; i < HookManager.getWildStackerHandler().getEntityAmount((LivingEntity) entity) - 1; i++) {
+ Jobs.action(jDamager, new CustomKillInfo(typeString, ActionType.SHEAR));
}
- } else if (JobsHook.StackMob.isEnabled() && HookManager.getStackMobHandler().isStacked(sheep)) {
-
- StackEntity stack = HookManager.getStackMobHandler().getStackEntity(sheep);
+ } else if (JobsHook.StackMob.isEnabled() && HookManager.getStackMobHandler().isStacked((LivingEntity) entity)) {
+ StackEntity stack = HookManager.getStackMobHandler().getStackEntity((LivingEntity) entity);
if (stack != null) {
- Jobs.action(jDamager, new CustomKillInfo(sheep.getColor().name(), ActionType.SHEAR));
+ Jobs.action(jDamager, new CustomKillInfo(typeString, ActionType.SHEAR));
return;
}
}
}
- Jobs.action(jDamager, new CustomKillInfo(sheep.getColor().name(), ActionType.SHEAR));
+ Jobs.action(jDamager, new CustomKillInfo(typeString, ActionType.SHEAR));
+
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
@@ -473,7 +489,7 @@ public final class JobsPaymentListener implements Listener {
if (Jobs.getGCManager().useSilkTouchProtection) {
ItemStack item = CMIItemStack.getItemInMainHand(player);
- if (item.getType() != Material.AIR && Jobs.getBpManager().isInBp(block)) {
+ if (item.getType() != Material.AIR && Jobs.getExploitManager().isInProtection(block)) {
for (Enchantment one : item.getEnchantments().keySet()) {
CMIEnchantment enchant = CMIEnchantment.get(one);
if (enchant != null && enchant.equalEnum(CMIEnchantEnum.SILK_TOUCH)) {
@@ -557,7 +573,6 @@ public final class JobsPaymentListener implements Listener {
// check is mcMMO enabled
if (JobsHook.mcMMO.isEnabled()) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
-
// check is the fishing being exploited. If yes, prevent payment.
if (mcMMOPlayer != null && ExperienceConfig.getInstance().isFishingExploitingPrevented()
&& mcMMOPlayer.getFishingManager().isExploitingFishing(event.getHook().getLocation().toVector())) {
@@ -1861,7 +1876,7 @@ public final class JobsPaymentListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onExplore(JobsChunkChangeEvent event) {
- if (!Jobs.getExploreManager().isExploreEnabled())
+ if (!Jobs.getChunkExplorationManager().isExploreEnabled())
return;
Player player = event.getPlayer();
@@ -1896,7 +1911,12 @@ public final class JobsPaymentListener implements Listener {
if (jPlayer == null)
return;
- ExploreRespond respond = Jobs.getExploreManager().chunkRespond(jPlayer.getUserId(), event.getNewChunk());
+ ExploreRespond respond = null;
+
+ if (Jobs.getGCManager().useNewExploration)
+ respond = Jobs.getChunkExplorationManager().chunkRespond(jPlayer.getUserId(), event.getNewChunk());
+ else
+ respond = Jobs.getExploreManager().chunkRespond(jPlayer.getUserId(), event.getNewChunk());
if (!respond.isNewChunk())
return;
diff --git a/src/main/java/com/gamingmesh/jobs/listeners/PistonProtectionListener.java b/src/main/java/com/gamingmesh/jobs/listeners/PistonProtectionListener.java
index 8c433974..970f3dc9 100644
--- a/src/main/java/com/gamingmesh/jobs/listeners/PistonProtectionListener.java
+++ b/src/main/java/com/gamingmesh/jobs/listeners/PistonProtectionListener.java
@@ -26,11 +26,11 @@ public class PistonProtectionListener implements Listener {
for (int i = event.getBlocks().size() - 1; i >= 0; i--) {
Location oldLoc = event.getBlocks().get(i).getLocation();
Location newLoc = oldLoc.clone().add(dir.getModX(), dir.getModY(), dir.getModZ());
- Long bp = Jobs.getBpManager().getTime(oldLoc);
+ Long bp = Jobs.getExploitManager().getTime(event.getBlocks().get(i));
if (bp == null)
continue;
- Jobs.getBpManager().addP(newLoc, bp, false, true);
+ Jobs.getExploitManager().addProtection(newLoc.getBlock(), bp, false);
}
}
@@ -45,10 +45,10 @@ public class PistonProtectionListener implements Listener {
for (int i = blocks.size() - 1; i >= 0; i--) {
Location oldLoc = blocks.get(i).getLocation();
Location newLoc = oldLoc.clone().add(dir.getModX(), dir.getModY(), dir.getModZ());
- Long bp = Jobs.getBpManager().getTime(oldLoc);
+ Long bp = Jobs.getExploitManager().getTime(blocks.get(i));
if (bp == null)
continue;
- Jobs.getBpManager().addP(newLoc, bp, false, true);
+ Jobs.getExploitManager().addProtection(newLoc.getBlock(), bp, false);
}
}
}
diff --git a/src/main/resources/jobs/explorer.yml b/src/main/resources/jobs/explorer.yml
index fb9cc356..2d47147f 100644
--- a/src/main/resources/jobs/explorer.yml
+++ b/src/main/resources/jobs/explorer.yml
@@ -47,7 +47,20 @@ Explorer:
'5':
income: 0.1
points: 0.1
- experience: 0.1
+ experience: 0.1
+ Brush:
+ 'suspicious_sand':
+ income: 5
+ points: 5
+ experience: 5
+ 'suspicious_gravel':
+ income: 6
+ points: 6
+ experience: 6
+ coal:
+ income: 10
+ points: 10
+ experience: 10
Kill:
Player:
income: 7.5
diff --git a/src/main/resources/jobs/farmer.yml b/src/main/resources/jobs/farmer.yml
index a70bfadb..cd5669bd 100644
--- a/src/main/resources/jobs/farmer.yml
+++ b/src/main/resources/jobs/farmer.yml
@@ -160,6 +160,10 @@ Farmer:
income: 4.0
points: 4.0
experience: 5.0
+ mushroom_cow:
+ income: 4.0
+ points: 4.0
+ experience: 5.0
Milk:
Cow:
income: 5.0