Skip to content

Instantly share code, notes, and snippets.

@joserobjr
Last active July 19, 2018 02:34
Show Gist options
  • Save joserobjr/a8410c7418681990b290750ff9b36f6b to your computer and use it in GitHub Desktop.
Save joserobjr/a8410c7418681990b290750ff9b36f6b to your computer and use it in GitHub Desktop.
Impedir que jogadores alterem baús
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.plugin.java.JavaPlugin;
public class NoChestForYouJavaPlugin extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}
/**
* Impede que o jogador altere baús clicando ou trocando com atalhos de teclado.
*/
@EventHandler(ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {
if (event.getView().getTopInventory().getType() != InventoryType.CHEST) {
return;
}
// Forma completa e mais segura em atualizações. Se uma action nova for adicionada ela é recusada.
switch (event.getAction()) {
// Nada foi alterado, clicou no vazio com nada no ponteiro.
case NOTHING:
break;
// Moveu de um inventário para outro, cancelar.
case MOVE_TO_OTHER_INVENTORY:
case HOTBAR_SWAP:
event.setCancelled(true);
break;
// Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
// Isso não altera o inventário de cima (baú no caso)
case CLONE_STACK:
case COLLECT_TO_CURSOR:
event.setCancelled(false);
break;
// Indefinido, melhor rejeitar
case UNKNOWN:
event.setCancelled(true);
break;
// Todos esses aqui são alterações com clique, verificar se o slot clicado faz parte do inventário de cima
// Se for o inventário de baixo então o jogador está mexendo no próprio inventário e não no baú
case PICKUP_ALL:
case PICKUP_SOME:
case PICKUP_HALF:
case PICKUP_ONE:
case PLACE_ALL:
case PLACE_SOME:
case PLACE_ONE:
case SWAP_WITH_CURSOR:
case DROP_ALL_CURSOR:
case DROP_ONE_CURSOR:
case DROP_ALL_SLOT:
case DROP_ONE_SLOT:
case HOTBAR_MOVE_AND_READD:
event.setCancelled(event.getClickedInventory().equals(event.getView().getTopInventory()));
break;
default:
event.setCancelled(true);
break;
}
// Forma resumida mas precisa ser revisada em novas versões Bukkit caso [InventoryAction] seja alterado.
/*switch (event.getAction()) {
// Moveu de um inventário para outro, cancelar.
case MOVE_TO_OTHER_INVENTORY:
case HOTBAR_SWAP:
event.setCancelled(true);
break;
// Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
// Isso não altera o inventário de cima (baú no caso)
case CLONE_STACK:
case COLLECT_TO_CURSOR:
case NOTHING:
event.setCancelled(false);
break;
// Indefinido, melhor rejeitar
case UNKNOWN:
event.setCancelled(true);
break;
default:
event.setCancelled(event.getClickedInventory().equals(event.getView().getTopInventory()));
break;
}*/
}
/**
* Impede que jogadores alterem baús arrastando o item na mão em no inventário.
*/
@EventHandler(ignoreCancelled = true)
public void onInventoryDrag(InventoryDragEvent event) {
// O número do primeiro slot (raw) do inventário de baixo é sempre o tamanho do inventário de cima.
int primeiroSlotInventorioDeBaixo = event.getView().getTopInventory().getSize();
// Cancelar se alterar algum slot do inventário de cima.
event.setCancelled(event.getRawSlots().stream().anyMatch(slot-> slot >= primeiroSlotInventorioDeBaixo));
}
}
package exemplo
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.inventory.InventoryAction
import org.bukkit.event.inventory.InventoryAction.*
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.inventory.InventoryDragEvent
import org.bukkit.event.inventory.InventoryType
import org.bukkit.plugin.java.JavaPlugin
class NoChestForYouPlugin: JavaPlugin(), Listener {
override fun onEnable() {
server.pluginManager.registerEvents(this, this)
}
/**
* Impede que o jogador altere baús clicando ou trocando com atalhos de teclado.
*/
@EventHandler(ignoreCancelled = true)
fun onInventoryClick(event: InventoryClickEvent) {
if (event.view.topInventory.type != InventoryType.CHEST) {
return
}
// Forma completa e mais segura em atualizações. Se uma action nova for adicionada ela é recusada.
event.isCancelled = when (checkNotNull(event.action)) {
// Nada foi alterado, clicou no vazio com nada no ponteiro.
NOTHING -> false
// Moveu de um inventário para outro, cancelar.
MOVE_TO_OTHER_INVENTORY, HOTBAR_SWAP -> true
// Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
// Isso não altera o inventário de cima (baú no caso)
CLONE_STACK, COLLECT_TO_CURSOR -> false
// Indefinido, melhor rejeitar
UNKNOWN -> true
// Todos esses aqui são alterações com clique, verificar se o slot clicado faz parte do inventário de cima
// Se for o inventário de baixo então o jogador está mexendo no próprio inventário e não no baú
PICKUP_ALL, PICKUP_SOME, PICKUP_HALF, PICKUP_ONE,
PLACE_ALL, PLACE_SOME, PLACE_ONE,
SWAP_WITH_CURSOR,
DROP_ALL_CURSOR, DROP_ONE_CURSOR,
DROP_ALL_SLOT, DROP_ONE_SLOT,
HOTBAR_MOVE_AND_READD -> event.clickedInventory == event.view.topInventory
// Em caso de
else -> true
}
// Forma resumida mas precisa ser revisada em novas versões Bukkit caso [InventoryAction] seja alterado.
/*event.isCancelled = when(checkNotNull(event.action)) {
// Moveu de um inventário para outro, cancelar.
MOVE_TO_OTHER_INVENTORY, HOTBAR_SWAP -> true
// Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
// Isso não altera o inventário de cima (baú no caso)
CLONE_STACK, COLLECT_TO_CURSOR, NOTHING -> false
// Indefinido, melhor rejeitar
UNKNOWN -> true
// Só sobrou as alterações com clique. Verificar se o slot clicado faz parte do inventário de cima
// Se for o inventário de baixo então o jogador está mexendo no próprio inventário e não no baú
else -> event.clickedInventory == event.view.topInventory
}*/
}
/**
* Impede que jogadores alterem baús arrastando o item na mão em no inventário.
*/
@EventHandler(ignoreCancelled = true)
fun onInventoryDrag(event: InventoryDragEvent) {
// O número do primeiro slot (raw) do inventário de baixo é sempre o tamanho do inventário de cima.
val primeiroSlotInventorioDeBaixo = event.view.topInventory.size
// Cancelar se alterar algum slot do inventário de cima.
event.isCancelled = event.rawSlots.any { slot-> slot >= primeiroSlotInventorioDeBaixo }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment