Skip to content

Commit

Permalink
Add simple /npc pausepathfinding command
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Feb 21, 2023
1 parent 224ffc7 commit 585df3f
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 0 deletions.
31 changes: 31 additions & 0 deletions main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
Expand Up @@ -125,6 +125,7 @@
import net.citizensnpcs.trait.MountTrait;
import net.citizensnpcs.trait.OcelotModifiers;
import net.citizensnpcs.trait.PacketNPC;
import net.citizensnpcs.trait.PausePathfindingTrait;
import net.citizensnpcs.trait.Poses;
import net.citizensnpcs.trait.Powered;
import net.citizensnpcs.trait.RabbitType;
Expand Down Expand Up @@ -1972,6 +1973,36 @@ public void pathto(CommandContext args, CommandSender sender, NPC npc,
npc.getNavigator().setTarget(loc);
}

@Command(
aliases = { "npc" },
usage = "pausepathfinding --onrightclick [true|false] --when_player_within [range in blocks] --pauseticks [ticks]",
desc = "Sets pathfinding pause",
modifiers = { "pausepathfinding" },
min = 1,
max = 1,
permission = "citizens.npc.pausepathfinding")
public void pausepathfinding(CommandContext args, CommandSender sender, NPC npc,
@Flag("onrightclick") Boolean rightclick, @Flag("when_player_within") Double playerRange,
@Flag("pauseticks") Integer ticks) throws CommandException {
PausePathfindingTrait trait = npc.getOrAddTrait(PausePathfindingTrait.class);
if (playerRange != null) {
if (playerRange <= 0)
throw new CommandException("Invalid range");
trait.setPlayerRangeBlocks(playerRange);
Messaging.sendTr(sender, Messages.PAUSEPATHFINDING_RANGE_SET, npc.getName(), playerRange);
}
if (rightclick != null) {
trait.setRightClick(rightclick);
Messaging.sendTr(sender,
rightclick ? Messages.PAUSEPATHFINDING_RIGHTCLICK_SET : Messages.PAUSEPATHFINDING_RIGHTCLICK_SET,
npc.getName());
}
if (ticks != null) {
trait.setPauseTicks(ticks);
Messaging.sendTr(sender, Messages.PAUSEPATHFINDING_TICKS_SET, npc.getName(), ticks);
}
}

@Command(
aliases = { "npc" },
usage = "pickupitems (--set [true|false])",
Expand Down
Expand Up @@ -40,6 +40,7 @@
import net.citizensnpcs.trait.MountTrait;
import net.citizensnpcs.trait.OcelotModifiers;
import net.citizensnpcs.trait.PacketNPC;
import net.citizensnpcs.trait.PausePathfindingTrait;
import net.citizensnpcs.trait.Poses;
import net.citizensnpcs.trait.Powered;
import net.citizensnpcs.trait.RabbitType;
Expand Down Expand Up @@ -92,6 +93,7 @@ public CitizensTraitFactory() {
registerTrait(TraitInfo.create(OcelotModifiers.class));
registerTrait(TraitInfo.create(Owner.class));
registerTrait(TraitInfo.create(PacketNPC.class));
registerTrait(TraitInfo.create(PausePathfindingTrait.class));
registerTrait(TraitInfo.create(Poses.class));
registerTrait(TraitInfo.create(Powered.class));
registerTrait(TraitInfo.create(RabbitType.class));
Expand Down
@@ -0,0 +1,66 @@
package net.citizensnpcs.trait;

import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;

import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.event.NPCRightClickEvent;
import net.citizensnpcs.api.persistence.Persist;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName;

@TraitName("pausepathfinding")
public class PausePathfindingTrait extends Trait {
@Persist("pauseticks")
private int pauseTicks;
@Persist("playerrange")
private double playerRange = -1;
@Persist("rightclick")
private boolean rightclick;
private int unpauseTaskId = -1;

public PausePathfindingTrait() {
super("pausepathfinding");
}

@EventHandler(ignoreCancelled = true)
public void onInteract(NPCRightClickEvent event) {
if (!rightclick || event.getNPC() != npc)
return;
pause();
}

private void pause() {
if (unpauseTaskId != -1) {
Bukkit.getScheduler().cancelTask(unpauseTaskId);
}
npc.getNavigator().cancelNavigation();
npc.getNavigator().setPaused(true);
unpauseTaskId = Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(),
() -> npc.getNavigator().setPaused(false), pauseTicks <= 0 ? 20 : pauseTicks);
}

@Override
public void run() {
if (playerRange == -1 || !npc.isSpawned())
return;
if (unpauseTaskId == -1 && !npc.getNavigator().isNavigating())
return;
if (CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getStoredLocation(), playerRange).iterator()
.hasNext()) {
pause();
}
}

public void setPauseTicks(int pauseTicks) {
this.pauseTicks = pauseTicks;
}

public void setPlayerRangeBlocks(double range) {
this.playerRange = range;
}

public void setRightClick(boolean rightclick) {
this.rightclick = rightclick;
}
}
4 changes: 4 additions & 0 deletions main/src/main/java/net/citizensnpcs/util/Messages.java
Expand Up @@ -305,6 +305,10 @@ public class Messages {
public static final String PATHFINDING_OPTIONS_STATIONARY_TICKS_SET = "citizens.commands.npc.pathopt.stationary-ticks-set";
public static final String PATHFINDING_OPTIONS_USE_NEW_FINDER = "citizens.commands.npc.pathopt.use-new-finder";
public static final String PATHFINDING_RANGE_SET = "citizens.commands.npc.pathfindingrange.set";
public static final String PAUSEPATHFINDING_RANGE_SET = "citizens.commands.npc.pausepathfinding.pause-range-set";
public static final String PAUSEPATHFINDING_RIGHTCLICK_SET = "citizens.commands.npc.pausepathfinding.rightclick-set";
public static final String PAUSEPATHFINDING_RIGHTCLICK_UNSET = "citizens.commands.npc.pausepathfinding.rightclick-unset";
public static final String PAUSEPATHFINDING_TICKS_SET = "citizens.commands.npc.pausepathfinding.pause-ticks-set";
public static final String PHANTOM_STATE_SET = "citizens.commands.npc.phantom.phantom-set";
public static final String PICKUP_ITEMS_SET = "citizens.commands.npc.pickupitems.set";
public static final String PICKUP_ITEMS_UNSET = "citizens.commands.npc.pickupitems.unset";
Expand Down
4 changes: 4 additions & 0 deletions main/src/main/resources/messages_en.properties
Expand Up @@ -211,6 +211,10 @@ citizens.commands.npc.pathopt.distance-margin-set=[[{0}]]''s pathfinding distanc
citizens.commands.npc.pathopt.path-distance-margin-set=[[{0}]]''s pathfinding path distance margin set to [[{1}]].
citizens.commands.npc.pathopt.attack-range-set=[[{0}]]''s attack range set to [[{1}]].
citizens.commands.npc.pathopt.use-new-finder=[[{0}]]''s use new finder set to [[{1}]].
citizens.commands.npc.pausepathfinding.pause-range-set=[{0}]] will now pause pathfinding when a player is within [[{1}]] blocks.
citizens.commands.npc.pausepathfinding.pause-ticks-set=[[{0}]] will now pause pathfinding for [[{1}]] ticks at a time.
citizens.commands.npc.pausepathfinding.rightclick-set=[[{0}]] will now pause pathfinding on right click.
citizens.commands.npc.pausepathfinding.rightclick-unset=[[{0}]] will no longer pause pathfinding on right click.
citizens.commands.npc.playerlist.added=Added [[{0}]] to the player list.
citizens.commands.npc.playerlist.removed=Removed [[{0}]] from the player list.
citizens.commands.npc.polarbear.rearing-set=[[{0}]] is now rearing.
Expand Down

0 comments on commit 585df3f

Please sign in to comment.