mirror of
https://github.com/Minestom/Minestom.git
synced 2025-01-06 16:37:38 +01:00
Add Cancel and Finish digging events (#1846)
* Add Cancel and Finish digging events * Add a function for setting the block which was dug in PlayerFinishDiggingEvent.java
This commit is contained in:
parent
2c3e38b178
commit
01ffec6614
@ -0,0 +1,46 @@
|
|||||||
|
package net.minestom.server.event.player;
|
||||||
|
|
||||||
|
import net.minestom.server.coordinate.Point;
|
||||||
|
import net.minestom.server.entity.Player;
|
||||||
|
import net.minestom.server.event.trait.BlockEvent;
|
||||||
|
import net.minestom.server.event.trait.PlayerInstanceEvent;
|
||||||
|
import net.minestom.server.instance.block.Block;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a {@link Player} stops digging a block before it is broken
|
||||||
|
*/
|
||||||
|
public class PlayerCancelDiggingEvent implements PlayerInstanceEvent, BlockEvent {
|
||||||
|
private final Player player;
|
||||||
|
private final Block block;
|
||||||
|
private final Point blockPosition;
|
||||||
|
|
||||||
|
public PlayerCancelDiggingEvent(@NotNull Player player, @NotNull Block block, @NotNull Point blockPosition) {
|
||||||
|
this.player = player;
|
||||||
|
this.block = block;
|
||||||
|
this.blockPosition = blockPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the block which was being dug.
|
||||||
|
*
|
||||||
|
* @return the block
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public @NotNull Block getBlock() {
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the block position.
|
||||||
|
*
|
||||||
|
* @return the block position
|
||||||
|
*/
|
||||||
|
public @NotNull Point getBlockPosition() {
|
||||||
|
return blockPosition;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public @NotNull Player getPlayer() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
package net.minestom.server.event.player;
|
||||||
|
|
||||||
|
import net.minestom.server.coordinate.Point;
|
||||||
|
import net.minestom.server.entity.Player;
|
||||||
|
import net.minestom.server.event.trait.BlockEvent;
|
||||||
|
import net.minestom.server.event.trait.PlayerInstanceEvent;
|
||||||
|
import net.minestom.server.instance.block.Block;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a {@link Player} successfully finishes digging a block
|
||||||
|
*/
|
||||||
|
public class PlayerFinishDiggingEvent implements PlayerInstanceEvent, BlockEvent {
|
||||||
|
private final Player player;
|
||||||
|
private @NotNull Block block;
|
||||||
|
private final Point blockPosition;
|
||||||
|
|
||||||
|
public PlayerFinishDiggingEvent(@NotNull Player player, @NotNull Block block, @NotNull Point blockPosition) {
|
||||||
|
this.player = player;
|
||||||
|
this.block = block;
|
||||||
|
this.blockPosition = blockPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes which block was dug
|
||||||
|
* <p>
|
||||||
|
* This has somewhat odd behavior;
|
||||||
|
* If you set it from a previously solid block to a non-solid block
|
||||||
|
* then cancel the respective {@link PlayerBlockBreakEvent}
|
||||||
|
* it will allow the player to phase through the block and into the floor
|
||||||
|
* (only if the player is standing on top of the block)
|
||||||
|
*
|
||||||
|
* @param block the block to set the result to
|
||||||
|
*/
|
||||||
|
public void setBlock(@NotNull Block block) {
|
||||||
|
this.block = block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the block which was dug.
|
||||||
|
*
|
||||||
|
* @return the block
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public @NotNull Block getBlock() {
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the block position.
|
||||||
|
*
|
||||||
|
* @return the block position
|
||||||
|
*/
|
||||||
|
public @NotNull Point getBlockPosition() {
|
||||||
|
return blockPosition;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public @NotNull Player getPlayer() {
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,8 @@ import net.minestom.server.entity.Player;
|
|||||||
import net.minestom.server.entity.metadata.PlayerMeta;
|
import net.minestom.server.entity.metadata.PlayerMeta;
|
||||||
import net.minestom.server.event.EventDispatcher;
|
import net.minestom.server.event.EventDispatcher;
|
||||||
import net.minestom.server.event.item.ItemUpdateStateEvent;
|
import net.minestom.server.event.item.ItemUpdateStateEvent;
|
||||||
|
import net.minestom.server.event.player.PlayerCancelDiggingEvent;
|
||||||
|
import net.minestom.server.event.player.PlayerFinishDiggingEvent;
|
||||||
import net.minestom.server.event.player.PlayerStartDiggingEvent;
|
import net.minestom.server.event.player.PlayerStartDiggingEvent;
|
||||||
import net.minestom.server.event.player.PlayerSwapItemEvent;
|
import net.minestom.server.event.player.PlayerSwapItemEvent;
|
||||||
import net.minestom.server.instance.Instance;
|
import net.minestom.server.instance.Instance;
|
||||||
@ -33,7 +35,7 @@ public final class PlayerDiggingListener {
|
|||||||
diggingResult = startDigging(player, instance, blockPosition, packet.blockFace());
|
diggingResult = startDigging(player, instance, blockPosition, packet.blockFace());
|
||||||
} else if (status == ClientPlayerDiggingPacket.Status.CANCELLED_DIGGING) {
|
} else if (status == ClientPlayerDiggingPacket.Status.CANCELLED_DIGGING) {
|
||||||
if (!instance.isChunkLoaded(blockPosition)) return;
|
if (!instance.isChunkLoaded(blockPosition)) return;
|
||||||
diggingResult = cancelDigging(instance, blockPosition);
|
diggingResult = cancelDigging(player, instance, blockPosition);
|
||||||
} else if (status == ClientPlayerDiggingPacket.Status.FINISHED_DIGGING) {
|
} else if (status == ClientPlayerDiggingPacket.Status.FINISHED_DIGGING) {
|
||||||
if (!instance.isChunkLoaded(blockPosition)) return;
|
if (!instance.isChunkLoaded(blockPosition)) return;
|
||||||
diggingResult = finishDigging(player, instance, blockPosition, packet.blockFace());
|
diggingResult = finishDigging(player, instance, blockPosition, packet.blockFace());
|
||||||
@ -77,8 +79,10 @@ public final class PlayerDiggingListener {
|
|||||||
return breakBlock(instance, player, blockPosition, block, blockFace);
|
return breakBlock(instance, player, blockPosition, block, blockFace);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DiggingResult cancelDigging(Instance instance, Point blockPosition) {
|
private static DiggingResult cancelDigging(Player player, Instance instance, Point blockPosition) {
|
||||||
final Block block = instance.getBlock(blockPosition);
|
final Block block = instance.getBlock(blockPosition);
|
||||||
|
PlayerCancelDiggingEvent playerCancelDiggingEvent = new PlayerCancelDiggingEvent(player, block, blockPosition);
|
||||||
|
EventDispatcher.call(playerCancelDiggingEvent);
|
||||||
return new DiggingResult(block, true);
|
return new DiggingResult(block, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +93,10 @@ public final class PlayerDiggingListener {
|
|||||||
return new DiggingResult(block, false);
|
return new DiggingResult(block, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return breakBlock(instance, player, blockPosition, block, blockFace);
|
PlayerFinishDiggingEvent playerFinishDiggingEvent = new PlayerFinishDiggingEvent(player, block, blockPosition);
|
||||||
|
EventDispatcher.call(playerFinishDiggingEvent);
|
||||||
|
|
||||||
|
return breakBlock(instance, player, blockPosition, playerFinishDiggingEvent.getBlock(), blockFace);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean shouldPreventBreaking(@NotNull Player player, Block block) {
|
private static boolean shouldPreventBreaking(@NotNull Player player, Block block) {
|
||||||
|
Loading…
Reference in New Issue
Block a user