VulnerabilityPatcher/src/main/java/me/cooljwb/vulnerabilitypatcher/patches/Books.java
2019-01-20 01:33:46 +01:00

112 lines
3.9 KiB
Java

package me.cooljwb.vulnerabilitypatcher.patches;
import me.cooljwb.vulnerabilitypatcher.SMG;
import net.minecraft.server.v1_13_R2.ChatMessageException;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import java.util.logging.Level;
import java.util.logging.Logger;
/*
* Copyright 2019 CoolJWB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author CoolJWB
*/
public class Books extends Patches implements Listener {
private Logger log = Logger.getLogger("Minecraft");
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerInteractEvent(PlayerInteractEvent event) {
if (event.getItem() != null && (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) {
Player player = event.getPlayer();
ItemStack item = event.getItem();
EquipmentSlot hand = event.getHand();
switch (item.getType().toString()) {
case "WRITTEN_BOOK":
writtenBook(player, hand);
break;
case "KNOWLEDGE_BOOK":
knowledgeBook(player, hand);
break;
}
}
if(devmode)
log.log(Level.INFO, String.format("[%s] Event: %s", pluginName, ReflectionToStringBuilder.toString(event)));
}
public void writtenBook(Player player, EquipmentSlot hand) {
if(hand.name().equals("OFF_HAND")) {
ItemStack hand_item = player.getInventory().getItemInOffHand();
resetMeta(player, hand_item, false);
}
else if(hand.name().equals("HAND")) {
ItemStack hand_item = player.getInventory().getItemInMainHand();
resetMeta(player, hand_item, true);
}
}
public void knowledgeBook(Player player, EquipmentSlot hand) {
if(hand.name().equals("OFF_HAND")) {
ItemStack hand_item = player.getInventory().getItemInOffHand();
hand_item.setAmount(-1);
msg(player, SMG.ITEM.msg);
}
else if(hand.name().equals("HAND")) {
ItemStack hand_item = player.getInventory().getItemInMainHand();
hand_item.setAmount(-1);
msg(player, SMG.ITEM.msg);
}
}
public void resetMeta(Player player, ItemStack hand_item, boolean mainhand) {
net.minecraft.server.v1_13_R2.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(hand_item);
if(nmsItemStack.hasTag() && nmsItemStack.getTag().hasKey("pages")) {
if (nmsItemStack.getTag().getList("pages", 8).toString().contains("run_command")) {
BookMeta meta = (BookMeta) hand_item.getItemMeta();
ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
meta.setPages(meta.getPages());
book.setItemMeta(meta);
if (mainhand)
player.getInventory().setItemInMainHand(book);
else
player.getInventory().setItemInOffHand(book);
}
}
}
}