diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7db6247..31e0af7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,6 @@ name: Build FarmControl -on: [push, pull_request] +on: [ push, pull_request ] jobs: build: diff --git a/README.md b/README.md index 1049c17..52eefd9 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,23 @@ **Plugin page**: [https://www.spigotmc.org/resources/86923/](https://www.spigotmc.org/resources/86923/) ## About -FarmControl is a Bukkit plugin that allows you to control certain properties of farms on your server. Among other things, you can limit the size of mob farms, remove the ability of mobs in farms to collide and perform random movements, or completely disable the AI of mobs in farms. + +FarmControl is a Bukkit plugin that allows you to control certain properties of farms on your server. Among other +things, you can limit the size of mob farms, remove the ability of mobs in farms to collide and perform random +movements, or completely disable the AI of mobs in farms. ## Building 1. Install dependency NabConfiguration to maven local + ```bash git clone https://github.com/froobynooby/nab-configuration cd nab-configuration ./gradlew clean install ``` + 2. Clone FarmControl and build + ```bash git clone https://github.com/froobynooby/FarmControl cd FarmControl diff --git a/build.gradle b/build.gradle index cc16ec4..0cf8a10 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'com.froobworld' -version '1.2.0' +version '1.2.1' jar.enabled = false; sourceCompatibility = 1.8 @@ -33,9 +33,9 @@ dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' compileOnly 'com.destroystokyo.paper:paper-api:1.15.2-R0.1-SNAPSHOT' compileOnly 'me.clip:placeholderapi:2.10.9' - compile 'org.jooq:joor-java-8:0.9.13' + compile 'org.jooq:joor-java-8:0.9.14' compile 'com.froobworld:nab-configuration:1.0.2' - compile 'org.bstats:bstats-bukkit:2.2.1' + compile 'org.bstats:bstats-bukkit:3.0.0' } processResources { @@ -47,7 +47,7 @@ shadowJar { relocate 'com.froobworld.nabconfiguration', 'com.froobworld.farmcontrol.lib.nabconfiguration' relocate 'org.joor', 'com.froobworld.farmcontrol.lib.joor' - relocate 'org.bstats','com.froobworld.farmcontrol.lib.bstats' + relocate 'org.bstats', 'com.froobworld.farmcontrol.lib.bstats' } artifacts { diff --git a/src/main/java/com/froobworld/farmcontrol/command/FarmControlCommand.java b/src/main/java/com/froobworld/farmcontrol/command/FarmControlCommand.java index 8c7a85c..1dffece 100644 --- a/src/main/java/com/froobworld/farmcontrol/command/FarmControlCommand.java +++ b/src/main/java/com/froobworld/farmcontrol/command/FarmControlCommand.java @@ -82,7 +82,7 @@ private void sendHelp(CommandSender sender, String cl) { sender.sendMessage("/" + cl + " reload"); } if (sender.hasPermission("farmcontrol.command.status")) { - sender.sendMessage("/" + cl + " status " + (sender instanceof Player ? "[world]" :"")); + sender.sendMessage("/" + cl + " status " + (sender instanceof Player ? "[world]" : "")); } if (sender.hasPermission("farmcontrol.command.history")) { sender.sendMessage("/" + cl + " history "); diff --git a/src/main/java/com/froobworld/farmcontrol/command/StatusCommand.java b/src/main/java/com/froobworld/farmcontrol/command/StatusCommand.java index 93f1eab..4c15379 100644 --- a/src/main/java/com/froobworld/farmcontrol/command/StatusCommand.java +++ b/src/main/java/com/froobworld/farmcontrol/command/StatusCommand.java @@ -1,7 +1,6 @@ package com.froobworld.farmcontrol.command; import com.froobworld.farmcontrol.FarmControl; -import com.froobworld.farmcontrol.controller.action.Action; import com.froobworld.farmcontrol.data.FcData; import org.bukkit.Bukkit; import org.bukkit.ChatColor; diff --git a/src/main/java/com/froobworld/farmcontrol/controller/FarmController.java b/src/main/java/com/froobworld/farmcontrol/controller/FarmController.java index b2242f0..24f40b3 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/FarmController.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/FarmController.java @@ -1,7 +1,9 @@ package com.froobworld.farmcontrol.controller; import com.froobworld.farmcontrol.FarmControl; -import com.froobworld.farmcontrol.controller.task.*; +import com.froobworld.farmcontrol.controller.task.ActionPerformTask; +import com.froobworld.farmcontrol.controller.task.TriggerCheckTask; +import com.froobworld.farmcontrol.controller.task.UntriggerPerformTask; import com.froobworld.farmcontrol.controller.tracker.CycleHistoryManager; import com.froobworld.farmcontrol.controller.trigger.Trigger; import com.froobworld.farmcontrol.utils.Actioner; @@ -9,7 +11,10 @@ import org.bukkit.World; import org.bukkit.entity.Entity; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; public class FarmController { private final FarmControl farmControl; diff --git a/src/main/java/com/froobworld/farmcontrol/controller/action/KillAction.java b/src/main/java/com/froobworld/farmcontrol/controller/action/KillAction.java index 213ed19..43039d8 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/action/KillAction.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/action/KillAction.java @@ -14,5 +14,6 @@ public void doAction(Mob mob) { } @Override - public void undoAction(Mob mob) {} + public void undoAction(Mob mob) { + } } diff --git a/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveAction.java b/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveAction.java index b9ae7ef..8f2d867 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveAction.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveAction.java @@ -14,5 +14,6 @@ public void doAction(Mob mob) { } @Override - public void undoAction(Mob mob) {} + public void undoAction(Mob mob) { + } } diff --git a/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveRandomMovementAction.java b/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveRandomMovementAction.java index 144b737..5cb99dc 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveRandomMovementAction.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/action/RemoveRandomMovementAction.java @@ -6,7 +6,7 @@ import java.util.*; -import static org.joor.Reflect.*; +import static org.joor.Reflect.on; public class RemoveRandomMovementAction extends Action { private final static Map> entityRemovedGoalsMap = new WeakHashMap<>(); @@ -14,10 +14,10 @@ public class RemoveRandomMovementAction extends Action { static { try { - randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomFly", "world.entity.ai.goal"))); - randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomStroll", "world.entity.ai.goal"))); - randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomStrollLand", "world.entity.ai.goal"))); - randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomSwim", "world.entity.ai.goal"))); + randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomFly", "world.entity.ai.goal"))); + randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomStroll", "world.entity.ai.goal"))); + randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomStrollLand", "world.entity.ai.goal"))); + randomMovementGoals.add(Class.forName(NmsUtils.getFullyQualifiedClassName("PathfinderGoalRandomSwim", "world.entity.ai.goal"))); } catch (ClassNotFoundException e) { e.printStackTrace(); } @@ -56,7 +56,7 @@ public void doAction(Mob mob) { @Override public void undoAction(Mob mob) { Object entityObject = on(mob).call("getHandle").get(); - Set wrappedGoals = on(entityObject) + Set wrappedGoals = on(entityObject) .field(NmsUtils.GoalSelectorHelper.getGoalSelectorFieldName()) .field("d") .as(Set.class); diff --git a/src/main/java/com/froobworld/farmcontrol/controller/task/ActionAllocationTask.java b/src/main/java/com/froobworld/farmcontrol/controller/task/ActionAllocationTask.java index 507d4d6..22c1b3a 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/task/ActionAllocationTask.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/task/ActionAllocationTask.java @@ -3,14 +3,14 @@ import com.froobworld.farmcontrol.controller.ActionProfile; import com.froobworld.farmcontrol.controller.FarmController; import com.froobworld.farmcontrol.controller.TriggerActionPair; +import com.froobworld.farmcontrol.controller.action.Action; +import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; import com.froobworld.farmcontrol.controller.tracker.CycleTracker; import com.froobworld.farmcontrol.controller.trigger.Trigger; import com.froobworld.farmcontrol.data.FcData; import com.froobworld.farmcontrol.group.EntityGrouper; import com.froobworld.farmcontrol.group.EntityGrouperResult; import com.froobworld.farmcontrol.group.Group; -import com.froobworld.farmcontrol.controller.action.Action; -import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; import com.froobworld.farmcontrol.utils.MixedEntitySet; import org.bukkit.World; diff --git a/src/main/java/com/froobworld/farmcontrol/controller/task/ActionPerformTask.java b/src/main/java/com/froobworld/farmcontrol/controller/task/ActionPerformTask.java index 3f0bb18..3428c00 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/task/ActionPerformTask.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/task/ActionPerformTask.java @@ -1,9 +1,9 @@ package com.froobworld.farmcontrol.controller.task; import com.froobworld.farmcontrol.controller.TriggerActionPair; +import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; import com.froobworld.farmcontrol.controller.tracker.CycleTracker; import com.froobworld.farmcontrol.data.FcData; -import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; import org.bukkit.World; import org.bukkit.entity.Mob; diff --git a/src/main/java/com/froobworld/farmcontrol/controller/tracker/CycleStats.java b/src/main/java/com/froobworld/farmcontrol/controller/tracker/CycleStats.java index 386f9e6..6a9fa67 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/tracker/CycleStats.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/tracker/CycleStats.java @@ -9,7 +9,6 @@ import org.bukkit.entity.EntityType; import java.util.*; -import java.util.List; import java.util.stream.Collectors; public class CycleStats { @@ -73,7 +72,8 @@ public static class Builder { private final Set removedEntities = new HashSet<>(); private final Map> actionCounts = new HashMap<>(); - private Builder() {} + private Builder() { + } public static Builder start(long startTime) { Builder builder = new Builder(); diff --git a/src/main/java/com/froobworld/farmcontrol/controller/tracker/NotificationCentre.java b/src/main/java/com/froobworld/farmcontrol/controller/tracker/NotificationCentre.java index d3f5133..511d602 100644 --- a/src/main/java/com/froobworld/farmcontrol/controller/tracker/NotificationCentre.java +++ b/src/main/java/com/froobworld/farmcontrol/controller/tracker/NotificationCentre.java @@ -90,7 +90,7 @@ public void load() { return; } try (BufferedReader reader = new BufferedReader(new FileReader(userFile))) { - for(String line; (line = reader.readLine()) != null; ) { + for (String line; (line = reader.readLine()) != null; ) { if (!line.isEmpty()) { notifiableUsers.add(UUID.fromString(line)); } diff --git a/src/main/java/com/froobworld/farmcontrol/data/FcData.java b/src/main/java/com/froobworld/farmcontrol/data/FcData.java index 3d694d8..f9155b2 100644 --- a/src/main/java/com/froobworld/farmcontrol/data/FcData.java +++ b/src/main/java/com/froobworld/farmcontrol/data/FcData.java @@ -12,7 +12,10 @@ import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; public class FcData { @@ -20,6 +23,7 @@ public class FcData { private static final NamespacedKey KEY = new NamespacedKey(FarmControl.getPlugin(FarmControl.class), "data"); private static final PersistentDataType TYPE = new PersistentDataType() { private final Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + @Override public @NotNull Class getPrimitiveType() { return String.class; @@ -54,7 +58,8 @@ public FcData fromPrimitive(@NotNull String s, @NotNull PersistentDataAdapterCon private final ConcurrentHashMap> triggerActionMap = new ConcurrentHashMap<>(); private boolean dirty = false; - private FcData() {} + private FcData() { + } public Set getActions(Trigger trigger) { return triggerActionMap.get(trigger.getName()); diff --git a/src/main/java/com/froobworld/farmcontrol/group/EntityGrouperResult.java b/src/main/java/com/froobworld/farmcontrol/group/EntityGrouperResult.java index 725700c..3535fb9 100644 --- a/src/main/java/com/froobworld/farmcontrol/group/EntityGrouperResult.java +++ b/src/main/java/com/froobworld/farmcontrol/group/EntityGrouperResult.java @@ -2,7 +2,9 @@ import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; import java.util.stream.Collectors; public class EntityGrouperResult { @@ -25,7 +27,7 @@ public static class Builder { } public void addEntity(SnapshotEntity entity) { - if (!groupDefinition.getTypePredicate().test(entity) || groupDefinition.getExcludeTypePredicate().test(entity)) { + if (!groupDefinition.getTypePredicate().test(entity) || groupDefinition.getExcludeTypePredicate().test(entity) || !groupDefinition.getNamePredicate().test(entity)) { return; } ListIterator iterator = protoGroups.listIterator(); diff --git a/src/main/java/com/froobworld/farmcontrol/group/GroupDefinition.java b/src/main/java/com/froobworld/farmcontrol/group/GroupDefinition.java index 2e68a3d..beabe6a 100644 --- a/src/main/java/com/froobworld/farmcontrol/group/GroupDefinition.java +++ b/src/main/java/com/froobworld/farmcontrol/group/GroupDefinition.java @@ -1,6 +1,7 @@ package com.froobworld.farmcontrol.group; import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; +import com.froobworld.farmcontrol.utils.EntityNameUtils; import com.froobworld.farmcontrol.utils.EntityTypeUtils; import org.bukkit.configuration.ConfigurationSection; @@ -9,6 +10,7 @@ public class GroupDefinition { private final Predicate typePredicate; private final Predicate excludeTypePredicate; + private final Predicate namePredicate; private final int size; private final double distance; private final double distanceSquared; @@ -16,9 +18,10 @@ public class GroupDefinition { private final boolean ignoreVerticalDistance; private final boolean pure; - public GroupDefinition(Predicate typePredicate, Predicate excludeTypePredicate, int size, double distance, boolean sameChunk, boolean ignoreVerticalDistance, boolean pure) { + public GroupDefinition(Predicate typePredicate, Predicate excludeTypePredicate, Predicate namePredicate, int size, double distance, boolean sameChunk, boolean ignoreVerticalDistance, boolean pure) { this.typePredicate = typePredicate; this.excludeTypePredicate = excludeTypePredicate; + this.namePredicate = namePredicate; this.size = size; this.distance = distance; this.distanceSquared = distance * distance; @@ -35,6 +38,10 @@ public Predicate getExcludeTypePredicate() { return excludeTypePredicate; } + public Predicate getNamePredicate() { + return namePredicate; + } + public int getSize() { return size; } @@ -68,13 +75,17 @@ public static GroupDefinition fromConfigurationSection(ConfigurationSection sect .map(EntityTypeUtils::fromString) .reduce(Predicate::or) .orElse(snapshotEntity -> false); + Predicate namePredicate = section.getStringList("names").stream() + .map(EntityNameUtils::fromString) + .reduce(Predicate::or) + .orElse(snapshotEntity -> true); int size = section.getInt("count"); boolean sameChunk = section.isString("distance") && "same-chunk".equalsIgnoreCase(section.getString("distance")); double distance = sameChunk ? 0 : section.getDouble("distance"); boolean ignoreVerticalDistance = section.getBoolean("ignore-vertical-distance"); boolean pure = section.getBoolean("pure"); - return new GroupDefinition(typePredicate, excludeTypePredicate, size, distance, sameChunk, ignoreVerticalDistance, pure); + return new GroupDefinition(typePredicate, excludeTypePredicate, namePredicate, size, distance, sameChunk, ignoreVerticalDistance, pure); } } diff --git a/src/main/java/com/froobworld/farmcontrol/hook/tick/SpigotTickHook.java b/src/main/java/com/froobworld/farmcontrol/hook/tick/SpigotTickHook.java index 722f9ad..3f8c96b 100644 --- a/src/main/java/com/froobworld/farmcontrol/hook/tick/SpigotTickHook.java +++ b/src/main/java/com/froobworld/farmcontrol/hook/tick/SpigotTickHook.java @@ -9,10 +9,11 @@ import java.util.Set; import java.util.function.Consumer; -import static org.joor.Reflect.*; +import static org.joor.Reflect.on; public class SpigotTickHook implements TickHook { private static final long[] tickTimes; + static { Class serverClass = null; try { diff --git a/src/main/java/com/froobworld/farmcontrol/listener/CompatibilityListener.java b/src/main/java/com/froobworld/farmcontrol/listener/CompatibilityListener.java index aaba52c..e87b17e 100644 --- a/src/main/java/com/froobworld/farmcontrol/listener/CompatibilityListener.java +++ b/src/main/java/com/froobworld/farmcontrol/listener/CompatibilityListener.java @@ -97,7 +97,8 @@ public void onEntityTempt(EntityTargetLivingEntityEvent event) { return; } for (Action action : farmControl.getActionManager().getActions()) { - if (action instanceof RemoveRandomMovementAction) continue; // Hacky solution for https://github.com/froobynooby/FarmControl/issues/4 + if (action instanceof RemoveRandomMovementAction) + continue; // Hacky solution for https://github.com/froobynooby/FarmControl/issues/4 if (farmControl.getFcConfig().worldSettings.of(entity.getWorld()).actionSettings.undoOn.of(action).tempt.get()) { if (fcData.removeAction(action)) { action.undoAction((Mob) entity); diff --git a/src/main/java/com/froobworld/farmcontrol/utils/Actioner.java b/src/main/java/com/froobworld/farmcontrol/utils/Actioner.java index 10e5b2e..d3023e0 100644 --- a/src/main/java/com/froobworld/farmcontrol/utils/Actioner.java +++ b/src/main/java/com/froobworld/farmcontrol/utils/Actioner.java @@ -8,7 +8,8 @@ public final class Actioner { - private Actioner() {} + private Actioner() { + } public static void undoAllActions(Entity entity, FarmControl farmControl) { if (!(entity instanceof Mob)) { diff --git a/src/main/java/com/froobworld/farmcontrol/utils/DurationDisplayer.java b/src/main/java/com/froobworld/farmcontrol/utils/DurationDisplayer.java index 6df5c46..1ca9c57 100644 --- a/src/main/java/com/froobworld/farmcontrol/utils/DurationDisplayer.java +++ b/src/main/java/com/froobworld/farmcontrol/utils/DurationDisplayer.java @@ -4,7 +4,8 @@ public final class DurationDisplayer { - private DurationDisplayer() {} + private DurationDisplayer() { + } private static String quantityText(int quantity, String singularSuffix, String pluralSuffix) { String quantityText = quantity + ""; diff --git a/src/main/java/com/froobworld/farmcontrol/utils/EntityNameUtils.java b/src/main/java/com/froobworld/farmcontrol/utils/EntityNameUtils.java new file mode 100644 index 0000000..446bcb0 --- /dev/null +++ b/src/main/java/com/froobworld/farmcontrol/utils/EntityNameUtils.java @@ -0,0 +1,20 @@ +package com.froobworld.farmcontrol.utils; + +import com.froobworld.farmcontrol.controller.entity.SnapshotEntity; + +import java.util.function.Predicate; + +public final class EntityNameUtils { + + public static Predicate fromString(String string) { + if (string.startsWith("*")) { + String name = string.split("\\*")[1]; + return entity -> entity.getEntity().getCustomName() != null && entity.getEntity().getCustomName().toLowerCase().endsWith(name.toLowerCase()); + } else if (string.endsWith("*")) { + String name = string.split("\\*")[0]; + return entity -> entity.getEntity().getCustomName() != null && entity.getEntity().getCustomName().toLowerCase().startsWith(name.toLowerCase()); + } + return entity -> entity.getEntity().getCustomName() != null && entity.getEntity().getCustomName().equalsIgnoreCase(string); + } + +} diff --git a/src/main/java/com/froobworld/farmcontrol/utils/EntityTypeUtils.java b/src/main/java/com/froobworld/farmcontrol/utils/EntityTypeUtils.java index 97e5819..190c929 100644 --- a/src/main/java/com/froobworld/farmcontrol/utils/EntityTypeUtils.java +++ b/src/main/java/com/froobworld/farmcontrol/utils/EntityTypeUtils.java @@ -7,8 +7,6 @@ public final class EntityTypeUtils { - private EntityTypeUtils(){} - public static Predicate fromString(String string) { if (string.toLowerCase().startsWith("category:")) { String category = string.split(":")[1]; diff --git a/src/main/java/com/froobworld/farmcontrol/utils/NmsUtils.java b/src/main/java/com/froobworld/farmcontrol/utils/NmsUtils.java index dddd2b6..d8145bb 100644 --- a/src/main/java/com/froobworld/farmcontrol/utils/NmsUtils.java +++ b/src/main/java/com/froobworld/farmcontrol/utils/NmsUtils.java @@ -4,7 +4,7 @@ import java.lang.reflect.Field; -import static org.joor.Reflect.*; +import static org.joor.Reflect.on; public class NmsUtils { private static final String NMS_PACKAGE_NAME = on(Bukkit.getServer()).call("getHandle") diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f035c79..d5b159c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,13 +2,13 @@ name: FarmControl version: ${version} main: com.froobworld.farmcontrol.FarmControl api-version: 1.15 -authors: [froobynooby] +authors: [ froobynooby ] description: A plugin for controlling the size and functions of farms. commands: farmcontrol: description: Base command for FarmControl. - aliases: [fc] + aliases: [ fc ] permissions: farmcontrol.command.*: