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.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user