65 lines
2.0 KiB
Java
65 lines
2.0 KiB
Java
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();
|
|
event.setDelayedCancellation(true);
|
|
}
|
|
|
|
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() || unpauseTaskId == -1 && !npc.getNavigator().isNavigating())
|
|
return;
|
|
if (CitizensAPI.getLocationLookup()
|
|
.getNearbyVisiblePlayers(npc.getEntity(), npc.getStoredLocation(), playerRange).iterator().hasNext()) {
|
|
pause();
|
|
}
|
|
}
|
|
|
|
public void setPauseTicks(int pauseTicks) {
|
|
this.pauseTicks = pauseTicks;
|
|
}
|
|
|
|
public void setPlayerRangeBlocks(double range) {
|
|
playerRange = range;
|
|
}
|
|
|
|
public void setRightClick(boolean rightclick) {
|
|
this.rightclick = rightclick;
|
|
}
|
|
} |