Added PlayerChangeHeldSlotEvent

This commit is contained in:
Felix Cravic 2020-06-23 17:50:43 +02:00
parent 9dfb9b657b
commit b47efa35ca
2 changed files with 71 additions and 2 deletions

View File

@ -0,0 +1,49 @@
package net.minestom.server.event.player;
import net.minestom.server.entity.Player;
import net.minestom.server.event.CancellableEvent;
import net.minestom.server.utils.MathUtils;
import net.minestom.server.utils.validate.Check;
/**
* Called when a player change his held slot (by pressing 1-9 keys)
*/
public class PlayerChangeHeldSlotEvent extends CancellableEvent {
private Player player;
private short slot;
public PlayerChangeHeldSlotEvent(Player player, short slot) {
this.player = player;
this.slot = slot;
}
/**
* Get the player who changed his held slot
*
* @return the player
*/
public Player getPlayer() {
return player;
}
/**
* Get the slot which the player will held
*
* @return the held slot
*/
public short getSlot() {
return slot;
}
/**
* Change the final held slot of the player
*
* @param slot the new held slot
* @throws IllegalArgumentException if {@param slot} is not between 0 and 8
*/
public void setSlot(short slot) {
Check.argCondition(!MathUtils.isBetween(slot, 0, 8), "The held slot needs to be between 0 and 8");
this.slot = slot;
}
}

View File

@ -1,18 +1,38 @@
package net.minestom.server.listener;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerChangeHeldSlotEvent;
import net.minestom.server.network.packet.client.play.ClientHeldItemChangePacket;
import net.minestom.server.utils.MathUtils;
public class PlayerHeldListener {
public static void heldListener(ClientHeldItemChangePacket packet, Player player) {
short slot = packet.slot;
final short slot = packet.slot;
if (!MathUtils.isBetween(slot, 0, 8)) {
// Incorrect packet, ignore
return;
}
player.refreshHeldSlot(slot);
PlayerChangeHeldSlotEvent changeHeldSlotEvent = new PlayerChangeHeldSlotEvent(player, slot);
player.callEvent(PlayerChangeHeldSlotEvent.class, changeHeldSlotEvent);
if (!changeHeldSlotEvent.isCancelled()) {
// Event hasn't been canceled, process it
final short resultSlot = changeHeldSlotEvent.getSlot();
// If the held slot has been changed by the event, send the change to the player
if (resultSlot != slot) {
player.setHeldItemSlot(resultSlot);
} else {
// Otherwise, simply refresh the player field
player.refreshHeldSlot(resultSlot);
}
} else {
// Event has been canceled, send the last held slot to refresh the client
player.setHeldItemSlot(player.getHeldSlot());
}
}
}