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.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);
}
}
}
}

View File

@ -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;