From 5c1f1ea34607f9d93ac6669d5e222c77679dd93a Mon Sep 17 00:00:00 2001 From: mezz Date: Mon, 7 Nov 2016 02:02:14 -0800 Subject: [PATCH] Close #470 Automatically disable cheat mode if it is not permitted --- src/main/java/mezz/jei/JustEnoughItems.java | 7 --- src/main/java/mezz/jei/ProxyCommon.java | 18 +++++- src/main/java/mezz/jei/ProxyCommonClient.java | 3 +- src/main/java/mezz/jei/config/Config.java | 16 ++++- .../java/mezz/jei/config/JEIModConfigGui.java | 12 ++++ .../java/mezz/jei/network/PacketHandler.java | 36 +++++++++++ .../java/mezz/jei/network/PacketIdClient.java | 2 +- .../java/mezz/jei/network/PacketIdServer.java | 3 +- .../packets/PacketCheatPermission.java | 42 +++++++++++++ .../network/packets/PacketGiveItemStack.java | 62 ++----------------- .../packets/PacketRequestCheatPermission.java | 40 ++++++++++++ src/main/java/mezz/jei/util/CommandUtil.java | 62 +++++++++++++++++++ src/main/resources/assets/jei/lang/en_US.lang | 2 + 13 files changed, 235 insertions(+), 70 deletions(-) create mode 100644 src/main/java/mezz/jei/network/packets/PacketCheatPermission.java create mode 100644 src/main/java/mezz/jei/network/packets/PacketRequestCheatPermission.java diff --git a/src/main/java/mezz/jei/JustEnoughItems.java b/src/main/java/mezz/jei/JustEnoughItems.java index cc5a7ca95..5775eb606 100644 --- a/src/main/java/mezz/jei/JustEnoughItems.java +++ b/src/main/java/mezz/jei/JustEnoughItems.java @@ -4,15 +4,12 @@ import mezz.jei.config.Constants; import mezz.jei.config.SessionData; -import mezz.jei.network.PacketHandler; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.network.FMLEventChannel; import net.minecraftforge.fml.common.network.NetworkCheckHandler; -import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.relauncher.Side; @Mod(modid = Constants.MOD_ID, @@ -43,10 +40,6 @@ public boolean checkModLists(Map modList, Side side) { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { - PacketHandler packetHandler = new PacketHandler(); - FMLEventChannel channel = NetworkRegistry.INSTANCE.newEventDrivenChannel(PacketHandler.CHANNEL_ID); - channel.register(packetHandler); - proxy.preInit(event); } diff --git a/src/main/java/mezz/jei/ProxyCommon.java b/src/main/java/mezz/jei/ProxyCommon.java index e87feb863..6e6628e69 100644 --- a/src/main/java/mezz/jei/ProxyCommon.java +++ b/src/main/java/mezz/jei/ProxyCommon.java @@ -1,15 +1,25 @@ package mezz.jei; +import javax.annotation.Nullable; + +import mezz.jei.network.PacketHandler; import mezz.jei.network.packets.PacketJei; import mezz.jei.util.Log; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.network.FMLEventChannel; +import net.minecraftforge.fml.common.network.NetworkRegistry; public class ProxyCommon { + @Nullable + private FMLEventChannel channel; public void preInit(FMLPreInitializationEvent event) { - + PacketHandler packetHandler = new PacketHandler(); + channel = NetworkRegistry.INSTANCE.newEventDrivenChannel(PacketHandler.CHANNEL_ID); + channel.register(packetHandler); } public void init(FMLInitializationEvent event) { @@ -27,4 +37,10 @@ public void restartJEI() { public void sendPacketToServer(PacketJei packet) { Log.error("Tried to send packet to the server from the server: {}", packet); } + + public void sendPacketToClient(PacketJei packet, EntityPlayerMP player) { + if (channel != null) { + channel.sendTo(packet.getPacket(), player); + } + } } diff --git a/src/main/java/mezz/jei/ProxyCommonClient.java b/src/main/java/mezz/jei/ProxyCommonClient.java index b32db0d5a..d7d88383c 100644 --- a/src/main/java/mezz/jei/ProxyCommonClient.java +++ b/src/main/java/mezz/jei/ProxyCommonClient.java @@ -47,6 +47,7 @@ private static void initVersionChecker() { @Override public void preInit(FMLPreInitializationEvent event) { + super.preInit(event); Config.preInit(event); initVersionChecker(); @@ -141,7 +142,7 @@ private static void reloadItemList() { @Override public void sendPacketToServer(PacketJei packet) { NetHandlerPlayClient netHandler = FMLClientHandler.instance().getClient().getConnection(); - if (netHandler != null) { + if (netHandler != null && SessionData.isJeiOnServer()) { netHandler.sendPacket(packet.getPacket()); } } diff --git a/src/main/java/mezz/jei/config/Config.java b/src/main/java/mezz/jei/config/Config.java index 6634b9bbf..dad0c4d15 100644 --- a/src/main/java/mezz/jei/config/Config.java +++ b/src/main/java/mezz/jei/config/Config.java @@ -9,7 +9,9 @@ import com.google.common.collect.ImmutableMap; import mezz.jei.Internal; +import mezz.jei.JustEnoughItems; import mezz.jei.api.ingredients.IIngredientHelper; +import mezz.jei.network.packets.PacketRequestCheatPermission; import mezz.jei.util.Log; import mezz.jei.util.Translator; import mezz.jei.util.color.ColorGetter; @@ -92,7 +94,19 @@ public static boolean isCheatItemsEnabled() { } public static void toggleCheatItemsEnabled() { - cheatItemsEnabled = !cheatItemsEnabled; + setCheatItemsEnabled(!cheatItemsEnabled); + } + + public static void setCheatItemsEnabled(boolean value) { + if (cheatItemsEnabled != value) { + cheatItemsEnabled = value; + if (worldConfig != null) { + worldConfig.save(); + } + if (cheatItemsEnabled && SessionData.isJeiOnServer()) { + JustEnoughItems.getProxy().sendPacketToServer(new PacketRequestCheatPermission()); + } + } } public static boolean isEditModeEnabled() { diff --git a/src/main/java/mezz/jei/config/JEIModConfigGui.java b/src/main/java/mezz/jei/config/JEIModConfigGui.java index 7cc812c6a..4423209e9 100644 --- a/src/main/java/mezz/jei/config/JEIModConfigGui.java +++ b/src/main/java/mezz/jei/config/JEIModConfigGui.java @@ -3,9 +3,12 @@ import java.util.ArrayList; import java.util.List; +import mezz.jei.JustEnoughItems; import mezz.jei.gui.recipes.RecipesGui; +import mezz.jei.network.packets.PacketRequestCheatPermission; import mezz.jei.util.Translator; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiInventory; import net.minecraftforge.common.config.ConfigCategory; @@ -68,4 +71,13 @@ private static String getTitle(GuiScreen parent) { } return Translator.translateToLocal("config.jei.title").replace("%MODNAME", Constants.NAME); } + + @Override + protected void actionPerformed(GuiButton button) { + super.actionPerformed(button); + + if (Config.isCheatItemsEnabled() && SessionData.isJeiOnServer()) { + JustEnoughItems.getProxy().sendPacketToServer(new PacketRequestCheatPermission()); + } + } } diff --git a/src/main/java/mezz/jei/network/PacketHandler.java b/src/main/java/mezz/jei/network/PacketHandler.java index 4a2349baf..c71f40a56 100644 --- a/src/main/java/mezz/jei/network/PacketHandler.java +++ b/src/main/java/mezz/jei/network/PacketHandler.java @@ -4,10 +4,13 @@ import java.io.IOException; import mezz.jei.network.packets.IPacketJeiHandler; +import mezz.jei.network.packets.PacketCheatPermission; import mezz.jei.network.packets.PacketDeletePlayerItem; import mezz.jei.network.packets.PacketGiveItemStack; import mezz.jei.network.packets.PacketRecipeTransfer; +import mezz.jei.network.packets.PacketRequestCheatPermission; import mezz.jei.util.Log; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; @@ -15,6 +18,8 @@ import net.minecraft.util.IThreadListener; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.FMLNetworkEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; public class PacketHandler { public static final String CHANNEL_ID = "JEI"; @@ -42,6 +47,10 @@ public void onPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { packetHandler = new PacketGiveItemStack.Handler(); break; } + case CHEAT_PERMISSION_REQUEST: { + packetHandler = new PacketRequestCheatPermission.Handler(); + break; + } default: { return; } @@ -53,6 +62,33 @@ public void onPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { } } + @SubscribeEvent + @SideOnly(Side.CLIENT) + public void onPacket(FMLNetworkEvent.ClientCustomPacketEvent event) { + PacketBuffer packetBuffer = new PacketBuffer(event.getPacket().payload()); + Minecraft minecraft = Minecraft.getMinecraft(); + EntityPlayer player = minecraft.thePlayer; + IPacketJeiHandler packetHandler; + + try { + byte packetIdOrdinal = packetBuffer.readByte(); + PacketIdClient packetId = PacketIdClient.VALUES[packetIdOrdinal]; + switch (packetId) { + case CHEAT_PERMISSION: { + packetHandler = new PacketCheatPermission.Handler(); + break; + } + default: { + return; + } + } + + checkThreadAndEnqueue(packetHandler, packetBuffer, player, minecraft); + } catch (Exception ex) { + Log.error("Packet error", ex); + } + } + private static void checkThreadAndEnqueue(final IPacketJeiHandler packetHandler, final PacketBuffer packetBuffer, final EntityPlayer player, @Nullable IThreadListener threadListener) { if (threadListener != null && !threadListener.isCallingFromMinecraftThread()) { threadListener.addScheduledTask(new Runnable() { diff --git a/src/main/java/mezz/jei/network/PacketIdClient.java b/src/main/java/mezz/jei/network/PacketIdClient.java index 0b1c3fb9b..5696aa72e 100644 --- a/src/main/java/mezz/jei/network/PacketIdClient.java +++ b/src/main/java/mezz/jei/network/PacketIdClient.java @@ -1,7 +1,7 @@ package mezz.jei.network; public enum PacketIdClient implements IPacketId { - INVALID; + CHEAT_PERMISSION; public static final PacketIdClient[] VALUES = values(); } diff --git a/src/main/java/mezz/jei/network/PacketIdServer.java b/src/main/java/mezz/jei/network/PacketIdServer.java index a3a517df8..35b22224d 100644 --- a/src/main/java/mezz/jei/network/PacketIdServer.java +++ b/src/main/java/mezz/jei/network/PacketIdServer.java @@ -3,7 +3,8 @@ public enum PacketIdServer implements IPacketId { RECIPE_TRANSFER, DELETE_ITEM, - GIVE_BIG; + GIVE_BIG, + CHEAT_PERMISSION_REQUEST; public static final PacketIdServer[] VALUES = values(); } diff --git a/src/main/java/mezz/jei/network/packets/PacketCheatPermission.java b/src/main/java/mezz/jei/network/packets/PacketCheatPermission.java new file mode 100644 index 000000000..3e2d5e99d --- /dev/null +++ b/src/main/java/mezz/jei/network/packets/PacketCheatPermission.java @@ -0,0 +1,42 @@ +package mezz.jei.network.packets; + +import java.io.IOException; + +import mezz.jei.config.Config; +import mezz.jei.network.IPacketId; +import mezz.jei.network.PacketIdClient; +import mezz.jei.util.CommandUtil; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.text.TextFormatting; + +public class PacketCheatPermission extends PacketJei { + private final boolean hasPermission; + + public PacketCheatPermission(boolean hasPermission) { + this.hasPermission = hasPermission; + } + + @Override + public IPacketId getPacketId() { + return PacketIdClient.CHEAT_PERMISSION; + } + + @Override + public void writePacketData(PacketBuffer buf) { + buf.writeBoolean(hasPermission); + } + + public static class Handler implements IPacketJeiHandler { + @Override + public void readPacketData(PacketBuffer buf, EntityPlayer player) throws IOException { + boolean hasPermission = buf.readBoolean(); + if (!hasPermission && Config.isCheatItemsEnabled()) { + CommandUtil.writeChatMessage(player, "jei.chat.error.no.cheat.permission.1", TextFormatting.RED); + CommandUtil.writeChatMessage(player, "jei.chat.error.no.cheat.permission.2", TextFormatting.RED); + Config.setCheatItemsEnabled(false); + player.closeScreen(); + } + } + } +} diff --git a/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java b/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java index 9f6702263..ae0d624bd 100644 --- a/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java +++ b/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java @@ -1,27 +1,16 @@ package mezz.jei.network.packets; import java.io.IOException; -import java.util.Map; -import com.google.common.base.Throwables; +import mezz.jei.JustEnoughItems; import mezz.jei.network.IPacketId; import mezz.jei.network.PacketIdServer; import mezz.jei.util.CommandUtil; -import net.minecraft.command.ICommand; -import net.minecraft.command.ICommandManager; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.SoundCategory; -import net.minecraft.util.text.TextComponentTranslation; -import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.CommandEvent; public class PacketGiveItemStack extends PacketJei { private final ItemStack itemStack; @@ -51,58 +40,15 @@ public void readPacketData(PacketBuffer buf, EntityPlayer player) throws IOExcep if (itemStackSerialized != null) { ItemStack itemStack = ItemStack.loadItemStackFromNBT(itemStackSerialized); if (itemStack != null) { - if (hasPermission(sender, itemStack)) { - executeGive(sender, itemStack); + if (CommandUtil.hasPermission(sender, itemStack)) { + CommandUtil.executeGive(sender, itemStack); } else { - TextComponentTranslation textcomponenttranslation1 = new TextComponentTranslation("commands.generic.permission"); - textcomponenttranslation1.getStyle().setColor(TextFormatting.RED); - sender.addChatMessage(textcomponenttranslation1); + JustEnoughItems.getProxy().sendPacketToClient(new PacketCheatPermission(false), sender); } } } } } - private static boolean hasPermission(EntityPlayerMP sender, ItemStack itemStack) { - if (sender.isCreative()) { - return true; - } - - MinecraftServer minecraftServer = sender.mcServer; - ICommandManager commandManager = minecraftServer.getCommandManager(); - Map commands = commandManager.getCommands(); - ICommand giveCommand = commands.get("give"); - if (giveCommand != null && giveCommand.checkPermission(minecraftServer, sender)) { - String[] commandParameters = CommandUtil.getGiveCommandParameters(sender, itemStack, itemStack.stackSize); - CommandEvent event = new CommandEvent(giveCommand, sender, commandParameters); - if (MinecraftForge.EVENT_BUS.post(event)) { - Throwable exception = event.getException(); - if (exception != null) { - Throwables.propagateIfPossible(exception); - } - return false; - } - return true; - } else { - return sender.canCommandSenderUseCommand(minecraftServer.getOpPermissionLevel(), "give"); - } - } - - private static void executeGive(EntityPlayer entityplayer, ItemStack itemStack) { - boolean addedToInventory = entityplayer.inventory.addItemStackToInventory(itemStack); - - if (addedToInventory) { - entityplayer.worldObj.playSound(null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 0.2F, ((entityplayer.getRNG().nextFloat() - entityplayer.getRNG().nextFloat()) * 0.7F + 1.0F) * 2.0F); - entityplayer.inventoryContainer.detectAndSendChanges(); - } - - if (!addedToInventory || itemStack.stackSize > 0) { - EntityItem entityitem = entityplayer.dropItem(itemStack, false); - if (entityitem != null) { - entityitem.setNoPickupDelay(); - entityitem.setOwner(entityplayer.getName()); - } - } - } } } diff --git a/src/main/java/mezz/jei/network/packets/PacketRequestCheatPermission.java b/src/main/java/mezz/jei/network/packets/PacketRequestCheatPermission.java new file mode 100644 index 000000000..de26eaa82 --- /dev/null +++ b/src/main/java/mezz/jei/network/packets/PacketRequestCheatPermission.java @@ -0,0 +1,40 @@ +package mezz.jei.network.packets; + +import java.io.IOException; + +import mezz.jei.JustEnoughItems; +import mezz.jei.ProxyCommon; +import mezz.jei.network.IPacketId; +import mezz.jei.network.PacketIdServer; +import mezz.jei.util.CommandUtil; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; + +public class PacketRequestCheatPermission extends PacketJei { + @Override + public IPacketId getPacketId() { + return PacketIdServer.CHEAT_PERMISSION_REQUEST; + } + + @Override + public void writePacketData(PacketBuffer buf) { + + } + + public static class Handler implements IPacketJeiHandler { + @Override + public void readPacketData(PacketBuffer buf, EntityPlayer player) throws IOException { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP sender = (EntityPlayerMP) player; + boolean hasPermission = CommandUtil.hasPermission(sender, new ItemStack(Items.NETHER_STAR, 64)); + PacketCheatPermission packetCheatPermission = new PacketCheatPermission(hasPermission); + + ProxyCommon proxy = JustEnoughItems.getProxy(); + proxy.sendPacketToClient(packetCheatPermission, sender); + } + } + } +} diff --git a/src/main/java/mezz/jei/util/CommandUtil.java b/src/main/java/mezz/jei/util/CommandUtil.java index 3801c104d..907b95e9f 100644 --- a/src/main/java/mezz/jei/util/CommandUtil.java +++ b/src/main/java/mezz/jei/util/CommandUtil.java @@ -2,12 +2,26 @@ import java.util.ArrayList; import java.util.List; +import java.util.Map; +import com.google.common.base.Throwables; +import mezz.jei.config.Config; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandManager; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.CommandEvent; /** * Server-side-safe utilities for commands. @@ -35,4 +49,52 @@ public static String[] getGiveCommandParameters(EntityPlayer sender, ItemStack i return commandStrings.toArray(new String[commandStrings.size()]); } + + public static void writeChatMessage(EntityPlayer player, String translationKey, TextFormatting color) { + TextComponentTranslation component = new TextComponentTranslation(translationKey); + component.getStyle().setColor(color); + player.addChatMessage(component); + } + + public static boolean hasPermission(EntityPlayerMP sender, ItemStack itemStack) { + if (sender.isCreative()) { + return true; + } + + MinecraftServer minecraftServer = sender.mcServer; + ICommandManager commandManager = minecraftServer.getCommandManager(); + Map commands = commandManager.getCommands(); + ICommand giveCommand = commands.get("give"); + if (giveCommand != null && giveCommand.checkPermission(minecraftServer, sender)) { + String[] commandParameters = getGiveCommandParameters(sender, itemStack, itemStack.stackSize); + CommandEvent event = new CommandEvent(giveCommand, sender, commandParameters); + if (MinecraftForge.EVENT_BUS.post(event)) { + Throwable exception = event.getException(); + if (exception != null) { + Throwables.propagateIfPossible(exception); + } + return false; + } + return true; + } else { + return sender.canCommandSenderUseCommand(minecraftServer.getOpPermissionLevel(), "give"); + } + } + + public static void executeGive(EntityPlayer entityplayer, ItemStack itemStack) { + boolean addedToInventory = entityplayer.inventory.addItemStackToInventory(itemStack); + + if (addedToInventory) { + entityplayer.worldObj.playSound(null, entityplayer.posX, entityplayer.posY, entityplayer.posZ, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.PLAYERS, 0.2F, ((entityplayer.getRNG().nextFloat() - entityplayer.getRNG().nextFloat()) * 0.7F + 1.0F) * 2.0F); + entityplayer.inventoryContainer.detectAndSendChanges(); + } + + if (!addedToInventory || itemStack.stackSize > 0) { + EntityItem entityitem = entityplayer.dropItem(itemStack, false); + if (entityitem != null) { + entityitem.setNoPickupDelay(); + entityitem.setOwner(entityplayer.getName()); + } + } + } } diff --git a/src/main/resources/assets/jei/lang/en_US.lang b/src/main/resources/assets/jei/lang/en_US.lang index 8ae9535d2..4c9c53c26 100644 --- a/src/main/resources/assets/jei/lang/en_US.lang +++ b/src/main/resources/assets/jei/lang/en_US.lang @@ -21,6 +21,8 @@ jei.tooltip.error.crash=Tooltip error, see log # Error Messages jei.chat.error.command.too.long=JEI must be on the server to handle this Chat Command, it is too long for Minecraft to send. +jei.chat.error.no.cheat.permission.1=You do not have permission to use JEI's Cheat Mode. +jei.chat.error.no.cheat.permission.2=Permission is given to players who can /give items or are in Creative Mode. # Key Bindings key.jei.toggleOverlay=Toggle Item List Overlay