mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-10-05 19:07:32 +02:00
Better BlockBreaker
This commit is contained in:
parent
0af5422368
commit
d0fe32d949
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user