mirror of
https://github.com/StarWishsama/Slimefun4.git
synced 2024-09-20 03:35:51 +00:00
Refactor MiddleClickListener
This commit is contained in:
parent
4e92102a38
commit
4792124224
@ -15,6 +15,7 @@ import org.bukkit.event.inventory.InventoryType.SlotType;
|
||||
|
||||
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
|
||||
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
|
||||
import me.mrCookieSlime.Slimefun.api.BlockStorage;
|
||||
|
||||
/**
|
||||
* The {@link MiddleClickListener} is responsible for listening to the {@link InventoryCreativeEvent}.
|
||||
@ -37,44 +38,26 @@ public class MiddleClickListener implements Listener {
|
||||
/*
|
||||
* When clicking outside of an inventory with middle click,
|
||||
* ClickType is not MIDDLE but CREATIVE (because this ClickType covers
|
||||
* multiple cases, we have to filter out more)
|
||||
* multiple cases, we have to filter out more later on)
|
||||
*/
|
||||
if (e.getClick() == ClickType.CREATIVE && e.getSlotType() == SlotType.QUICKBAR) {
|
||||
HumanEntity player = e.getWhoClicked();
|
||||
// get the block the player is looking at for later
|
||||
Block b = player.getTargetBlockExact(5);
|
||||
|
||||
/*
|
||||
* In the case on a middle click outside the user inventory, cursor will be set
|
||||
* to the actual block that is middle clicked, while currentItem will be AIR.
|
||||
*
|
||||
* This check is really weird due to the weird nature of this event's behaviour.
|
||||
* It checks if the block the player is looking at is of the same type as the cursor;
|
||||
* after this we can make sure that it is a middle click outside of the inventory
|
||||
* currentItem should also be air, otherwise it is not outside of the inventory
|
||||
*/
|
||||
boolean isOutsideInventoryClick = e.getCursor().getType() == b.getType() && e.getCurrentItem().getType() == Material.AIR;
|
||||
if (isActualMiddleClick(e, b)) {
|
||||
// find the actual slimefun item the user is looking at
|
||||
String id = BlockStorage.checkID(b);
|
||||
SlimefunItem sfItem = SlimefunItem.getById(id);
|
||||
|
||||
/*
|
||||
* This is an edge case where the player is looking at a WALL_HEAD (eg. cargo)
|
||||
* and then the boolean above wont match because WALL_HEAD != PLAYER_HEAD.
|
||||
* This check makes up for that lack.
|
||||
*/
|
||||
boolean isPlayerWallhead = b.getType() == Material.PLAYER_WALL_HEAD && e.getCursor().getType() == Material.PLAYER_HEAD;
|
||||
|
||||
if (isOutsideInventoryClick || isPlayerWallhead) {
|
||||
Optional<String> blockId = Slimefun.getBlockDataService().getBlockData(b);
|
||||
|
||||
if (!blockId.isPresent()) {
|
||||
// vanilla block -> ignore
|
||||
if (sfItem == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// find the actual slimefun item the user is looking at
|
||||
SlimefunItem sfItem = SlimefunItem.getById(blockId.get());
|
||||
|
||||
/*
|
||||
* Before giving the item to the user, check if you can swap
|
||||
* to the item instead (user already has item in inventory).
|
||||
* to the item instead (user already has item in hotbar).
|
||||
* This is sometimes bypassed by the client itself (not fixable though).
|
||||
*/
|
||||
for (int i = 0; i < 9; i++) {
|
||||
@ -92,4 +75,26 @@ public class MiddleClickListener implements Listener {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isActualMiddleClick(InventoryCreativeEvent e, Block b) {
|
||||
/*
|
||||
* On a middle click outside the user inventory, cursor will be set
|
||||
* to the actual block that is middle clicked, while currentItem will be AIR.
|
||||
*
|
||||
* This check is really weird due to the weird nature of this event's behaviour.
|
||||
* It checks if the block the player is looking at is of the same type as the cursor;
|
||||
* after this we can make sure that it is a middle click outside of the inventory
|
||||
* currentItem should also be air, otherwise it is not outside of the inventory
|
||||
*/
|
||||
boolean isOutsideInventoryClick = e.getCursor().getType() == b.getType() && e.getCurrentItem().getType() == Material.AIR;
|
||||
|
||||
/*
|
||||
* This is an edge case where the player is looking at a WALL_HEAD (eg. cargo)
|
||||
* and then the boolean above wont match because WALL_HEAD != PLAYER_HEAD.
|
||||
* This check makes up for that lack.
|
||||
*/
|
||||
boolean isPlayerWallhead = b.getType() == Material.PLAYER_WALL_HEAD && e.getCursor().getType() == Material.PLAYER_HEAD;
|
||||
|
||||
return isOutsideInventoryClick || isPlayerWallhead;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user