Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- This is a basic example of Paper's Mob Goal API. It simply adds a new goal
- to every villager when they are added to the world. The goal is a simple task
- of following the closest player holding an emerald (item, block, or ore).
- */
- import com.destroystokyo.paper.entity.ai.Goal;
- import com.destroystokyo.paper.entity.ai.GoalKey;
- import com.destroystokyo.paper.entity.ai.GoalType;
- import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent;
- import org.bukkit.Bukkit;
- import org.bukkit.GameMode;
- import org.bukkit.NamespacedKey;
- import org.bukkit.entity.EntityType;
- import org.bukkit.entity.Mob;
- import org.bukkit.entity.Player;
- import org.bukkit.entity.Villager;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.inventory.PlayerInventory;
- import org.bukkit.plugin.Plugin;
- import org.bukkit.plugin.java.JavaPlugin;
- import java.util.Collection;
- import java.util.EnumSet;
- public final class MyPlugin extends JavaPlugin {
- @Override
- public void onEnable() {
- getServer().getPluginManager().registerEvents(new Listener() {
- @EventHandler
- public void on(EntityAddToWorldEvent event) {
- if (event.getEntityType() == EntityType.VILLAGER) {
- Villager villager = (Villager) event.getEntity();
- FollowEmeraldsGoal goal = new FollowEmeraldsGoal(MyPlugin.this, villager);
- if (!Bukkit.getMobGoals().hasGoal(villager, goal.getKey())) {
- Bukkit.getMobGoals().addGoal(villager, 3, goal);
- }
- }
- }
- }, this);
- }
- public static class FollowEmeraldsGoal implements Goal<Villager> {
- private final GoalKey<Villager> key;
- private final Mob mob;
- private Player closestPlayer;
- private int cooldown;
- public FollowEmeraldsGoal(Plugin plugin, Mob mob) {
- this.key = GoalKey.of(Villager.class, new NamespacedKey(plugin, "follow_emeralds"));
- this.mob = mob;
- }
- @Override
- public boolean shouldActivate() {
- if (cooldown > 0) {
- --cooldown;
- return false;
- }
- closestPlayer = getClosestPlayer();
- if (closestPlayer == null) {
- return false;
- }
- return isHoldingEmerald(closestPlayer);
- }
- @Override
- public boolean shouldStayActive() {
- return shouldActivate();
- }
- @Override
- public void start() {
- }
- @Override
- public void stop() {
- mob.getPathfinder().stopPathfinding();
- mob.setTarget(null);
- cooldown = 100;
- }
- @Override
- public void tick() {
- mob.setTarget(closestPlayer);
- if (mob.getLocation().distanceSquared(closestPlayer.getLocation()) < 6.25) {
- mob.getPathfinder().stopPathfinding();
- } else {
- mob.getPathfinder().moveTo(closestPlayer, 1.0D);
- }
- }
- @Override
- public GoalKey<Villager> getKey() {
- return key;
- }
- @Override
- public EnumSet<GoalType> getTypes() {
- return EnumSet.of(GoalType.MOVE, GoalType.LOOK);
- }
- private Player getClosestPlayer() {
- Collection<Player> nearbyPlayers = mob.getWorld().getNearbyPlayers(mob.getLocation(), 10.0, player ->
- !player.isDead() && player.getGameMode() != GameMode.SPECTATOR && player.isValid());
- double closestDistance = -1.0;
- Player closestPlayer = null;
- for (Player player : nearbyPlayers) {
- double distance = player.getLocation().distanceSquared(mob.getLocation());
- if (closestDistance != -1.0 && !(distance < closestDistance)) {
- continue;
- }
- closestDistance = distance;
- closestPlayer = player;
- }
- return closestPlayer;
- }
- private boolean isHoldingEmerald(Player target) {
- PlayerInventory inv = target.getInventory();
- return isEmerald(inv.getItemInMainHand()) || isEmerald(inv.getItemInOffHand());
- }
- private boolean isEmerald(ItemStack stack) {
- switch (stack.getType()) {
- case EMERALD:
- case EMERALD_BLOCK:
- case EMERALD_ORE:
- return true;
- default:
- return false;
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment