From d0fe32d949a86234dd05145d2c8f3cb0d1196060 Mon Sep 17 00:00:00 2001 From: fullwall Date: Thu, 9 Jan 2014 17:58:43 +0800 Subject: [PATCH] Better BlockBreaker --- .../java/net/citizensnpcs/EventListen.java | 33 +++++++++++++++++++ .../net/citizensnpcs/npc/ai/BlockBreaker.java | 23 ++++++++++--- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/citizensnpcs/EventListen.java b/src/main/java/net/citizensnpcs/EventListen.java index 1a6a79174..0f3dfd2c0 100644 --- a/src/main/java/net/citizensnpcs/EventListen.java +++ b/src/main/java/net/citizensnpcs/EventListen.java @@ -5,6 +5,7 @@ import java.util.Map; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.ai.tree.BehaviorStatus; import net.citizensnpcs.api.event.CommandSenderCreateNPCEvent; import net.citizensnpcs.api.event.DespawnReason; import net.citizensnpcs.api.event.EntityTargetNPCEvent; @@ -25,6 +26,7 @@ import net.citizensnpcs.api.npc.NPCRegistry; import net.citizensnpcs.api.trait.trait.Owner; import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.editor.Editor; +import net.citizensnpcs.npc.ai.BlockBreaker; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.trait.Controllable; import net.citizensnpcs.trait.CurrentLocation; @@ -35,10 +37,12 @@ import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; 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.Action; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityCombustByBlockEvent; import org.bukkit.event.entity.EntityCombustByEntityEvent; @@ -50,6 +54,7 @@ import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.world.ChunkLoadEvent; @@ -254,6 +259,17 @@ public class EventListen implements Listener { checkCreationEvent(event); } + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getAction() != Action.LEFT_CLICK_BLOCK) + return; + NPC npc = ((Citizens) CitizensAPI.getPlugin()).getNPCSelector().getSelected(event.getPlayer()); + final BlockBreaker breaker = BlockBreaker.create((LivingEntity) npc.getEntity(), event.getClickedBlock()); + RunnableImplementation task = new RunnableImplementation(breaker); + int tid = Bukkit.getScheduler().scheduleSyncRepeatingTask(CitizensAPI.getPlugin(), task, 0, 1); + task.tid = tid; + } + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { NPC npc = npcRegistry.getNPC(event.getRightClicked()); @@ -394,4 +410,21 @@ public class EventListen implements Listener { return prime * result + z; } } + + private final class RunnableImplementation implements Runnable { + private final BlockBreaker breaker; + public int tid; + + private RunnableImplementation(BlockBreaker breaker) { + this.breaker = breaker; + } + + @Override + public void run() { + if (breaker.run() != BehaviorStatus.RUNNING) { + breaker.reset(); + Bukkit.getScheduler().cancelTask(tid); + } + } + } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/npc/ai/BlockBreaker.java b/src/main/java/net/citizensnpcs/npc/ai/BlockBreaker.java index d6bbbc05e..c6259cde5 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/BlockBreaker.java +++ b/src/main/java/net/citizensnpcs/npc/ai/BlockBreaker.java @@ -2,7 +2,9 @@ package net.citizensnpcs.npc.ai; import net.citizensnpcs.api.ai.tree.BehaviorGoalAdapter; import net.citizensnpcs.api.ai.tree.BehaviorStatus; +import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.util.PlayerAnimation; +import net.citizensnpcs.util.Util; import net.minecraft.server.v1_7_R1.Block; import net.minecraft.server.v1_7_R1.Blocks; import net.minecraft.server.v1_7_R1.Enchantment; @@ -13,6 +15,7 @@ import net.minecraft.server.v1_7_R1.ItemStack; import net.minecraft.server.v1_7_R1.Material; import net.minecraft.server.v1_7_R1.MobEffectList; +import org.bukkit.Location; import org.bukkit.craftbukkit.v1_7_R1.entity.CraftLivingEntity; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftItemStack; import org.bukkit.entity.LivingEntity; @@ -23,7 +26,8 @@ public class BlockBreaker extends BehaviorGoalAdapter { private int currentDamage; private int currentTick; private final EntityLiving entity; - private boolean isDigging; + private boolean isDigging = true; + private final Location location; private int startDigTick; private final int x, y, z; @@ -32,6 +36,7 @@ public class BlockBreaker extends BehaviorGoalAdapter { this.x = target.getX(); this.y = target.getY(); this.z = target.getZ(); + this.location = target.getLocation(); this.startDigTick = (int) (System.currentTimeMillis() / 50); this.configuration = config; } @@ -73,20 +78,30 @@ public class BlockBreaker extends BehaviorGoalAdapter { @Override public BehaviorStatus run() { + if (entity.dead) { + return BehaviorStatus.FAILURE; + } if (!isDigging) { - reset(); return BehaviorStatus.SUCCESS; } currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit if (configuration.radiusSquared() > 0 && distanceSquared() >= configuration.radiusSquared()) { startDigTick = currentTick; + if (entity instanceof NPCHolder) { + NPC npc = ((NPCHolder) entity).getNPC(); + if (!npc.getNavigator().isNavigating()) { + npc.getNavigator() + .setTarget(entity.world.getWorld().getBlockAt(x, y, z).getLocation().add(0, 1, 0)); + } + } return BehaviorStatus.RUNNING; } + Util.faceLocation(entity.getBukkitEntity(), location); if (entity instanceof EntityPlayer) { PlayerAnimation.ARM_SWING.play((Player) entity.getBukkitEntity()); } Block block = entity.world.getType(x, y, z); - if (block == null) { + if (block == null || block == Blocks.AIR) { return BehaviorStatus.SUCCESS; } else { int tickDifference = currentTick - startDigTick; @@ -147,7 +162,7 @@ public class BlockBreaker extends BehaviorGoalAdapter { private Runnable callback; private org.bukkit.inventory.ItemStack itemStack; private float modifier = 1; - private double radius = -1; + private double radius = 0; public float blockStrengthModifier() { return modifier;