mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-28 22:47:41 +02:00
Added ItemUpdateStateEvent + batch file clean
This commit is contained in:
parent
90925b4967
commit
2f6205b577
@ -148,7 +148,7 @@ public class PlayerInit {
|
|||||||
});
|
});
|
||||||
|
|
||||||
player.setEventCallback(PlayerSpawnEvent.class, event -> {
|
player.setEventCallback(PlayerSpawnEvent.class, event -> {
|
||||||
player.setGameMode(GameMode.SURVIVAL);
|
player.setGameMode(GameMode.CREATIVE);
|
||||||
player.teleport(new Position(0, 75, 0));
|
player.teleport(new Position(0, 75, 0));
|
||||||
|
|
||||||
ItemStack item = new ItemStack((short) 1, (byte) 43);
|
ItemStack item = new ItemStack((short) 1, (byte) 43);
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package net.minestom.server.event;
|
||||||
|
|
||||||
|
import net.minestom.server.item.ItemStack;
|
||||||
|
|
||||||
|
public class ItemUpdateStateEvent extends Event {
|
||||||
|
|
||||||
|
private ItemStack itemStack;
|
||||||
|
private boolean handAnimation;
|
||||||
|
|
||||||
|
public ItemUpdateStateEvent(ItemStack itemStack) {
|
||||||
|
this.itemStack = itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack getItemStack() {
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHandAnimation(boolean handAnimation) {
|
||||||
|
this.handAnimation = handAnimation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasHandAnimation() {
|
||||||
|
return handAnimation;
|
||||||
|
}
|
||||||
|
}
|
@ -22,7 +22,6 @@ import java.io.File;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,7 +36,7 @@ public class InstanceContainer extends Instance {
|
|||||||
private ChunkGenerator chunkGenerator;
|
private ChunkGenerator chunkGenerator;
|
||||||
private Map<Long, Chunk> chunks = new ConcurrentHashMap<>();
|
private Map<Long, Chunk> chunks = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private AtomicBoolean autoChunkLoad = new AtomicBoolean(false);
|
private boolean autoChunkLoad;
|
||||||
|
|
||||||
protected InstanceContainer(UUID uniqueId, File folder) {
|
protected InstanceContainer(UUID uniqueId, File folder) {
|
||||||
super(uniqueId);
|
super(uniqueId);
|
||||||
@ -331,12 +330,12 @@ public class InstanceContainer extends Instance {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void enableAutoChunkLoad(boolean enable) {
|
public void enableAutoChunkLoad(boolean enable) {
|
||||||
this.autoChunkLoad.set(enable);
|
this.autoChunkLoad = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasEnabledAutoChunkLoad() {
|
public boolean hasEnabledAutoChunkLoad() {
|
||||||
return autoChunkLoad.get();
|
return autoChunkLoad;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void addSharedInstance(SharedInstance sharedInstance) {
|
protected void addSharedInstance(SharedInstance sharedInstance) {
|
||||||
|
@ -72,7 +72,6 @@ public class BlockBatch implements InstanceBatch {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (isLast) {
|
if (isLast) {
|
||||||
// data.clear();
|
|
||||||
if (callback != null)
|
if (callback != null)
|
||||||
callback.run();
|
callback.run();
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,10 @@ public class ChunkBatch implements InstanceBatch {
|
|||||||
private InstanceContainer instance;
|
private InstanceContainer instance;
|
||||||
private Chunk chunk;
|
private Chunk chunk;
|
||||||
|
|
||||||
private List<BlockData> dataList = Collections.synchronizedList(new ArrayList<>());
|
// Give it the max capacity by default (avoid resizing)
|
||||||
|
private List<BlockData> dataList =
|
||||||
|
Collections.synchronizedList(new ArrayList<>(
|
||||||
|
Chunk.CHUNK_SIZE_X * Chunk.CHUNK_SIZE_Y * Chunk.CHUNK_SIZE_Z));
|
||||||
|
|
||||||
public ChunkBatch(InstanceContainer instance, Chunk chunk) {
|
public ChunkBatch(InstanceContainer instance, Chunk chunk) {
|
||||||
this.instance = instance;
|
this.instance = instance;
|
||||||
|
@ -980,6 +980,18 @@ public enum Material {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasState() {
|
||||||
|
switch (this) {
|
||||||
|
case BOW:
|
||||||
|
case TRIDENT:
|
||||||
|
case CROSSBOW:
|
||||||
|
case SHIELD:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isFood();
|
||||||
|
}
|
||||||
|
|
||||||
public short getId() {
|
public short getId() {
|
||||||
return materialId;
|
return materialId;
|
||||||
}
|
}
|
||||||
|
@ -2,12 +2,14 @@ package net.minestom.server.listener;
|
|||||||
|
|
||||||
import net.minestom.server.entity.GameMode;
|
import net.minestom.server.entity.GameMode;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
|
import net.minestom.server.event.ItemUpdateStateEvent;
|
||||||
import net.minestom.server.event.PlayerStartDiggingEvent;
|
import net.minestom.server.event.PlayerStartDiggingEvent;
|
||||||
import net.minestom.server.event.PlayerSwapItemEvent;
|
import net.minestom.server.event.PlayerSwapItemEvent;
|
||||||
import net.minestom.server.instance.Instance;
|
import net.minestom.server.instance.Instance;
|
||||||
import net.minestom.server.instance.block.CustomBlock;
|
import net.minestom.server.instance.block.CustomBlock;
|
||||||
import net.minestom.server.inventory.PlayerInventory;
|
import net.minestom.server.inventory.PlayerInventory;
|
||||||
import net.minestom.server.item.ItemStack;
|
import net.minestom.server.item.ItemStack;
|
||||||
|
import net.minestom.server.item.Material;
|
||||||
import net.minestom.server.network.packet.client.play.ClientPlayerDiggingPacket;
|
import net.minestom.server.network.packet.client.play.ClientPlayerDiggingPacket;
|
||||||
import net.minestom.server.network.packet.server.play.AcknowledgePlayerDiggingPacket;
|
import net.minestom.server.network.packet.server.play.AcknowledgePlayerDiggingPacket;
|
||||||
import net.minestom.server.network.packet.server.play.EntityEffectPacket;
|
import net.minestom.server.network.packet.server.play.EntityEffectPacket;
|
||||||
@ -19,6 +21,10 @@ public class PlayerDiggingListener {
|
|||||||
public static void playerDiggingListener(ClientPlayerDiggingPacket packet, Player player) {
|
public static void playerDiggingListener(ClientPlayerDiggingPacket packet, Player player) {
|
||||||
ClientPlayerDiggingPacket.Status status = packet.status;
|
ClientPlayerDiggingPacket.Status status = packet.status;
|
||||||
BlockPosition blockPosition = packet.blockPosition;
|
BlockPosition blockPosition = packet.blockPosition;
|
||||||
|
|
||||||
|
PlayerInventory playerInventory = player.getInventory();
|
||||||
|
ItemStack mainHand = playerInventory.getItemInMainHand();
|
||||||
|
ItemStack offHand = playerInventory.getItemInOffHand();
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case STARTED_DIGGING:
|
case STARTED_DIGGING:
|
||||||
if (player.getGameMode() == GameMode.CREATIVE) {
|
if (player.getGameMode() == GameMode.CREATIVE) {
|
||||||
@ -79,14 +85,23 @@ public class PlayerDiggingListener {
|
|||||||
dropItem(player, droppedItemStack2, handItem);
|
dropItem(player, droppedItemStack2, handItem);
|
||||||
break;
|
break;
|
||||||
case UPDATE_ITEM_STATE:
|
case UPDATE_ITEM_STATE:
|
||||||
player.refreshActiveHand(false, false, false);
|
Material mainHandMat = Material.fromId(mainHand.getMaterialId());
|
||||||
|
Material offHandMat = Material.fromId(offHand.getMaterialId());
|
||||||
|
boolean isOffhand = offHandMat.hasState();
|
||||||
|
|
||||||
|
ItemStack updatedItem = isOffhand ? offHand :
|
||||||
|
mainHandMat.hasState() ? mainHand : null;
|
||||||
|
if (updatedItem == null) // No item with state, cancel
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemUpdateStateEvent itemUpdateStateEvent = new ItemUpdateStateEvent(updatedItem);
|
||||||
|
player.callEvent(ItemUpdateStateEvent.class, itemUpdateStateEvent);
|
||||||
|
|
||||||
|
player.refreshActiveHand(itemUpdateStateEvent.hasHandAnimation(), isOffhand, false);
|
||||||
player.sendPacketToViewers(player.getMetadataPacket());
|
player.sendPacketToViewers(player.getMetadataPacket());
|
||||||
break;
|
break;
|
||||||
case SWAP_ITEM_HAND:
|
case SWAP_ITEM_HAND:
|
||||||
PlayerInventory playerInventory = player.getInventory();
|
PlayerSwapItemEvent swapItemEvent = new PlayerSwapItemEvent(offHand.clone(), mainHand.clone());
|
||||||
ItemStack mainHand = playerInventory.getItemInMainHand().clone();
|
|
||||||
ItemStack offHand = playerInventory.getItemInOffHand().clone();
|
|
||||||
PlayerSwapItemEvent swapItemEvent = new PlayerSwapItemEvent(offHand, mainHand);
|
|
||||||
player.callCancellableEvent(PlayerSwapItemEvent.class, swapItemEvent, () -> {
|
player.callCancellableEvent(PlayerSwapItemEvent.class, swapItemEvent, () -> {
|
||||||
playerInventory.setItemInMainHand(swapItemEvent.getMainHandItem());
|
playerInventory.setItemInMainHand(swapItemEvent.getMainHandItem());
|
||||||
playerInventory.setItemInOffHand(swapItemEvent.getOffHandItem());
|
playerInventory.setItemInOffHand(swapItemEvent.getOffHandItem());
|
||||||
|
Loading…
Reference in New Issue
Block a user