Skip to content

Commit

Permalink
Close #470 Automatically disable cheat mode if it is not permitted
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Nov 7, 2016
1 parent 9c0da42 commit 5c1f1ea
Show file tree
Hide file tree
Showing 13 changed files with 235 additions and 70 deletions.
7 changes: 0 additions & 7 deletions src/main/java/mezz/jei/JustEnoughItems.java
Expand Up @@ -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,
Expand Down Expand Up @@ -43,10 +40,6 @@ public boolean checkModLists(Map<String, String> 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);
}

Expand Down
18 changes: 17 additions & 1 deletion 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) {
Expand All @@ -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);
}
}
}
3 changes: 2 additions & 1 deletion src/main/java/mezz/jei/ProxyCommonClient.java
Expand Up @@ -47,6 +47,7 @@ private static void initVersionChecker() {

@Override
public void preInit(FMLPreInitializationEvent event) {
super.preInit(event);
Config.preInit(event);
initVersionChecker();

Expand Down Expand Up @@ -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());
}
}
Expand Down
16 changes: 15 additions & 1 deletion src/main/java/mezz/jei/config/Config.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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() {
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/mezz/jei/config/JEIModConfigGui.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
}
36 changes: 36 additions & 0 deletions src/main/java/mezz/jei/network/PacketHandler.java
Expand Up @@ -4,17 +4,22 @@
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;
import net.minecraft.network.PacketBuffer;
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";
Expand Down Expand Up @@ -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;
}
Expand All @@ -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() {
Expand Down
2 changes: 1 addition & 1 deletion 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();
}
3 changes: 2 additions & 1 deletion src/main/java/mezz/jei/network/PacketIdServer.java
Expand Up @@ -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();
}
42 changes: 42 additions & 0 deletions 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();
}
}
}
}
62 changes: 4 additions & 58 deletions 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;
Expand Down Expand Up @@ -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<String, ICommand> 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());
}
}
}
}
}

0 comments on commit 5c1f1ea

Please sign in to comment.