From 237d865245a67d2c50275c31f3db1fc8f3598842 Mon Sep 17 00:00:00 2001 From: mezz Date: Wed, 1 Jun 2016 18:11:32 -0700 Subject: [PATCH] Fix #177 Fix #277 Use custom give command when installed on the server --- gradle.properties | 2 +- .../java/mezz/jei/network/PacketHandler.java | 4 +- .../packets/PacketGiveItemMessageBig.java | 77 ------------------ .../network/packets/PacketGiveItemStack.java | 81 +++++++++++++++++++ src/main/java/mezz/jei/util/Commands.java | 47 ++++++----- 5 files changed, 113 insertions(+), 98 deletions(-) delete mode 100644 src/main/java/mezz/jei/network/packets/PacketGiveItemMessageBig.java create mode 100644 src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java diff --git a/gradle.properties b/gradle.properties index ef2fb1cfd..cbf3f87b7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,4 +5,4 @@ curse_project_id=238222 version_major=3 version_minor=4 -version_patch=2 +version_patch=3 diff --git a/src/main/java/mezz/jei/network/PacketHandler.java b/src/main/java/mezz/jei/network/PacketHandler.java index 1358dd9df..60172282f 100644 --- a/src/main/java/mezz/jei/network/PacketHandler.java +++ b/src/main/java/mezz/jei/network/PacketHandler.java @@ -15,7 +15,7 @@ import net.minecraftforge.fml.common.network.internal.FMLProxyPacket; import mezz.jei.network.packets.PacketDeletePlayerItem; -import mezz.jei.network.packets.PacketGiveItemMessageBig; +import mezz.jei.network.packets.PacketGiveItemStack; import mezz.jei.network.packets.PacketJEI; import mezz.jei.network.packets.PacketRecipeTransfer; import mezz.jei.util.Log; @@ -49,7 +49,7 @@ public void onPacket(FMLNetworkEvent.ServerCustomPacketEvent event) { break; } case GIVE_BIG: { - packet = new PacketGiveItemMessageBig(); + packet = new PacketGiveItemStack(); break; } default: { diff --git a/src/main/java/mezz/jei/network/packets/PacketGiveItemMessageBig.java b/src/main/java/mezz/jei/network/packets/PacketGiveItemMessageBig.java deleted file mode 100644 index 77ee5f398..000000000 --- a/src/main/java/mezz/jei/network/packets/PacketGiveItemMessageBig.java +++ /dev/null @@ -1,77 +0,0 @@ -package mezz.jei.network.packets; - -import mezz.jei.network.IPacketId; -import mezz.jei.network.PacketIdServer; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.network.PacketBuffer; -import net.minecraft.network.play.INetHandlerPlayServer; -import net.minecraft.network.play.client.CPacketChatMessage; - -import javax.annotation.Nonnull; -import java.io.IOException; - -public class PacketGiveItemMessageBig extends PacketJEI { - private String message; - - public PacketGiveItemMessageBig() { - - } - - public PacketGiveItemMessageBig(@Nonnull String message) { - this.message = message; - } - - @Override - public IPacketId getPacketId() { - return PacketIdServer.GIVE_BIG; - } - - @Override - public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeString(message); - } - - @Override - public void readPacketData(PacketBuffer buf, EntityPlayer player) throws IOException { - if (player instanceof EntityPlayerMP) { - String message = buf.readStringFromBuffer(32767); - CPacketChatMessageBig packet = new CPacketChatMessageBig(message); - EntityPlayerMP playerMP = (EntityPlayerMP) player; - playerMP.connection.processChatMessage(packet); - } - } - - /** Get around the 100 character limit on chat messages */ - private static class CPacketChatMessageBig extends CPacketChatMessage { - private String message; - - @SuppressWarnings("unused") - public CPacketChatMessageBig() { - } - - public CPacketChatMessageBig(String messageIn) { - this.message = messageIn; - } - - @Override - public void readPacketData(PacketBuffer buf) throws IOException { - this.message = buf.readStringFromBuffer(1000); - } - - @Override - public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeString(this.message); - } - - @Override - public void processPacket(INetHandlerPlayServer handler) { - handler.processChatMessage(this); - } - - @Override - public String getMessage() { - return this.message; - } - } -} diff --git a/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java b/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java new file mode 100644 index 000000000..690e462f9 --- /dev/null +++ b/src/main/java/mezz/jei/network/packets/PacketGiveItemStack.java @@ -0,0 +1,81 @@ +package mezz.jei.network.packets; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.Map; + +import mezz.jei.network.IPacketId; +import mezz.jei.network.PacketIdServer; +import net.minecraft.command.CommandGive; +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.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.fml.server.FMLServerHandler; + +public class PacketGiveItemStack extends PacketJEI { + private ItemStack itemStack; + + public PacketGiveItemStack() { + + } + + public PacketGiveItemStack(@Nonnull ItemStack itemStack) { + this.itemStack = itemStack; + } + + @Override + public IPacketId getPacketId() { + return PacketIdServer.GIVE_BIG; + } + + @Override + public void writePacketData(PacketBuffer buf) throws IOException { + buf.writeItemStackToBuffer(itemStack); + } + + @Override + public void readPacketData(PacketBuffer buf, EntityPlayer player) throws IOException { + if (player instanceof EntityPlayerMP) { + EntityPlayerMP sender = (EntityPlayerMP) player; + + MinecraftServer minecraftServer = sender.mcServer; + ICommandManager commandManager = minecraftServer.getCommandManager(); + Map commands = commandManager.getCommands(); + ICommand giveCommand = commands.get("give"); + if (giveCommand != null && giveCommand.checkPermission(minecraftServer, sender)) { + ItemStack itemStack = buf.readItemStackFromBuffer(); + executeGive(sender, itemStack); + } else { + TextComponentTranslation textcomponenttranslation1 = new TextComponentTranslation("commands.generic.permission"); + textcomponenttranslation1.getStyle().setColor(TextFormatting.RED); + sender.addChatMessage(textcomponenttranslation1); + } + } + } + + public 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/util/Commands.java b/src/main/java/mezz/jei/util/Commands.java index ec6e470ec..3e2ae542e 100644 --- a/src/main/java/mezz/jei/util/Commands.java +++ b/src/main/java/mezz/jei/util/Commands.java @@ -1,22 +1,23 @@ package mezz.jei.util; +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; + import mezz.jei.JustEnoughItems; import mezz.jei.config.SessionData; -import mezz.jei.network.packets.PacketGiveItemMessageBig; +import mezz.jei.network.packets.PacketGiveItemStack; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; import org.apache.commons.lang3.StringUtils; -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - public class Commands { public static void giveFullStack(@Nonnull ItemStack itemstack) { @@ -31,6 +32,20 @@ public static void giveOneFromStack(@Nonnull ItemStack itemstack) { * /give [amount] [data] [dataTag] */ public static void giveStack(@Nonnull ItemStack itemStack, int amount) { + if (SessionData.isJeiOnServer()) { + ItemStack sendStack = itemStack.copy(); + sendStack.stackSize = amount; + PacketGiveItemStack packet = new PacketGiveItemStack(sendStack); + JustEnoughItems.getProxy().sendPacketToServer(packet); + } else { + giveStackVanilla(itemStack, amount); + } + } + + /** + * Fallback for when JEI is not on the server, tries to use the /give command. + */ + private static void giveStackVanilla(@Nonnull ItemStack itemStack, int amount) { EntityPlayerSP sender = Minecraft.getMinecraft().thePlayer; String senderName = sender.getName(); @@ -41,8 +56,9 @@ public static void giveStack(@Nonnull ItemStack itemStack, int amount) { commandStrings.add(String.valueOf(amount)); commandStrings.add(String.valueOf(itemStack.getMetadata())); - if (itemStack.hasTagCompound()) { - commandStrings.add(itemStack.getTagCompound().toString()); + NBTTagCompound tagCompound = itemStack.getTagCompound(); + if (tagCompound != null) { + commandStrings.add(tagCompound.toString()); } String fullCommand = StringUtils.join(commandStrings, " "); @@ -53,18 +69,13 @@ private static void sendChatMessage(EntityPlayerSP sender, String chatMessage) { if (chatMessage.length() <= 100) { sender.sendChatMessage(chatMessage); } else { - if (SessionData.isJeiOnServer()) { - PacketGiveItemMessageBig packet = new PacketGiveItemMessageBig(chatMessage); - JustEnoughItems.getProxy().sendPacketToServer(packet); - } else { - ITextComponent errorMessage = new TextComponentTranslation("jei.chat.error.command.too.long"); - errorMessage.getStyle().setColor(TextFormatting.RED); - sender.addChatComponentMessage(errorMessage); + ITextComponent errorMessage = new TextComponentTranslation("jei.chat.error.command.too.long"); + errorMessage.getStyle().setColor(TextFormatting.RED); + sender.addChatComponentMessage(errorMessage); - ITextComponent chatMessageComponent = new TextComponentString(chatMessage); - chatMessageComponent.getStyle().setColor(TextFormatting.RED); - sender.addChatComponentMessage(chatMessageComponent); - } + ITextComponent chatMessageComponent = new TextComponentString(chatMessage); + chatMessageComponent.getStyle().setColor(TextFormatting.RED); + sender.addChatComponentMessage(chatMessageComponent); } } }