Better BlockBreaker

This commit is contained in:
fullwall 2014-01-09 17:58:43 +08:00
parent 0af5422368
commit d0fe32d949
2 changed files with 52 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import java.util.Map;
import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.Settings.Setting;
import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.ai.tree.BehaviorStatus;
import net.citizensnpcs.api.event.CommandSenderCreateNPCEvent; import net.citizensnpcs.api.event.CommandSenderCreateNPCEvent;
import net.citizensnpcs.api.event.DespawnReason; import net.citizensnpcs.api.event.DespawnReason;
import net.citizensnpcs.api.event.EntityTargetNPCEvent; 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.trait.trait.Owner;
import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.editor.Editor; import net.citizensnpcs.editor.Editor;
import net.citizensnpcs.npc.ai.BlockBreaker;
import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.trait.Controllable; import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.CurrentLocation; import net.citizensnpcs.trait.CurrentLocation;
@ -35,10 +37,12 @@ import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityCombustByBlockEvent; import org.bukkit.event.entity.EntityCombustByBlockEvent;
import org.bukkit.event.entity.EntityCombustByEntityEvent; 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.entity.EntityTargetEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.vehicle.VehicleEnterEvent;
import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkLoadEvent;
@ -254,6 +259,17 @@ public class EventListen implements Listener {
checkCreationEvent(event); 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) @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
NPC npc = npcRegistry.getNPC(event.getRightClicked()); NPC npc = npcRegistry.getNPC(event.getRightClicked());
@ -394,4 +410,21 @@ public class EventListen implements Listener {
return prime * result + z; 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);
}
}
}
} }

View File

@ -2,7 +2,9 @@ package net.citizensnpcs.npc.ai;
import net.citizensnpcs.api.ai.tree.BehaviorGoalAdapter; import net.citizensnpcs.api.ai.tree.BehaviorGoalAdapter;
import net.citizensnpcs.api.ai.tree.BehaviorStatus; import net.citizensnpcs.api.ai.tree.BehaviorStatus;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.util.PlayerAnimation; 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.Block;
import net.minecraft.server.v1_7_R1.Blocks; import net.minecraft.server.v1_7_R1.Blocks;
import net.minecraft.server.v1_7_R1.Enchantment; 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.Material;
import net.minecraft.server.v1_7_R1.MobEffectList; 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.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftItemStack;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
@ -23,7 +26,8 @@ public class BlockBreaker extends BehaviorGoalAdapter {
private int currentDamage; private int currentDamage;
private int currentTick; private int currentTick;
private final EntityLiving entity; private final EntityLiving entity;
private boolean isDigging; private boolean isDigging = true;
private final Location location;
private int startDigTick; private int startDigTick;
private final int x, y, z; private final int x, y, z;
@ -32,6 +36,7 @@ public class BlockBreaker extends BehaviorGoalAdapter {
this.x = target.getX(); this.x = target.getX();
this.y = target.getY(); this.y = target.getY();
this.z = target.getZ(); this.z = target.getZ();
this.location = target.getLocation();
this.startDigTick = (int) (System.currentTimeMillis() / 50); this.startDigTick = (int) (System.currentTimeMillis() / 50);
this.configuration = config; this.configuration = config;
} }
@ -73,20 +78,30 @@ public class BlockBreaker extends BehaviorGoalAdapter {
@Override @Override
public BehaviorStatus run() { public BehaviorStatus run() {
if (entity.dead) {
return BehaviorStatus.FAILURE;
}
if (!isDigging) { if (!isDigging) {
reset();
return BehaviorStatus.SUCCESS; return BehaviorStatus.SUCCESS;
} }
currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
if (configuration.radiusSquared() > 0 && distanceSquared() >= configuration.radiusSquared()) { if (configuration.radiusSquared() > 0 && distanceSquared() >= configuration.radiusSquared()) {
startDigTick = currentTick; 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; return BehaviorStatus.RUNNING;
} }
Util.faceLocation(entity.getBukkitEntity(), location);
if (entity instanceof EntityPlayer) { if (entity instanceof EntityPlayer) {
PlayerAnimation.ARM_SWING.play((Player) entity.getBukkitEntity()); PlayerAnimation.ARM_SWING.play((Player) entity.getBukkitEntity());
} }
Block block = entity.world.getType(x, y, z); Block block = entity.world.getType(x, y, z);
if (block == null) { if (block == null || block == Blocks.AIR) {
return BehaviorStatus.SUCCESS; return BehaviorStatus.SUCCESS;
} else { } else {
int tickDifference = currentTick - startDigTick; int tickDifference = currentTick - startDigTick;
@ -147,7 +162,7 @@ public class BlockBreaker extends BehaviorGoalAdapter {
private Runnable callback; private Runnable callback;
private org.bukkit.inventory.ItemStack itemStack; private org.bukkit.inventory.ItemStack itemStack;
private float modifier = 1; private float modifier = 1;
private double radius = -1; private double radius = 0;
public float blockStrengthModifier() { public float blockStrengthModifier() {
return modifier; return modifier;