diff --git a/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java index c1fc4e5e3..8a00004bc 100644 --- a/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/TileEntitySavePacket.java @@ -13,10 +13,20 @@ import kamkeel.npcs.util.ByteBufUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.LogWriter; import noppes.npcs.NoppesUtilServer; +import noppes.npcs.blocks.tiles.ITilePermission; import java.io.IOException; +/** + * Convenience packet for saving extra data about Tile Entities.
+ *
+ * Any tile entity that uses this packet should implement {@link ITilePermission}
+ * Not implementing results in the packet treated as malformed and rejected. + */ public final class TileEntitySavePacket extends AbstractPacket { public static final String packetName = "Request|TileEntitySave"; @@ -50,9 +60,35 @@ public final class TileEntitySavePacket extends AbstractPacket { if (!(player instanceof EntityPlayerMP)) return; + NBTTagCompound incomingCompound = ByteBufUtils.readNBT(in); + + if (isCorrectPermission(incomingCompound, player)) + return; + if (!PacketUtil.verifyItemPacket(packetName, player, EnumItemPacketType.WAND, EnumItemPacketType.BLOCK)) return; - NoppesUtilServer.saveTileEntity((EntityPlayerMP) player, ByteBufUtils.readNBT(in)); + NoppesUtilServer.saveTileEntity((EntityPlayerMP) player, incomingCompound); + } + + private static boolean isCorrectPermission(NBTTagCompound incomingCompound, EntityPlayer player) { + int x = incomingCompound.getInteger("x"); + int y = incomingCompound.getInteger("y"); + int z = incomingCompound.getInteger("z"); + TileEntity tile = player.worldObj.getTileEntity(x, y, z); + + if (tile == null) + return true; + + boolean validatesPacket = tile instanceof ITilePermission; + if (!validatesPacket) { + LogWriter.error(String.format("%s tried to use TileEntitySavePacket on %s -- should this class implement ITileValidityChecker??", player.getCommandSenderName(), tile)); + return true; // Assume packet is not meant for this entity from the get-go as there is no checking process. + } + + ITilePermission validityChecker = (ITilePermission) tile; + CustomNpcsPermissions.Permission perm = validityChecker.getPermission(); + + return !CustomNpcsPermissions.hasPermission(player, perm); } } diff --git a/src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java b/src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java new file mode 100644 index 000000000..769658168 --- /dev/null +++ b/src/main/java/noppes/npcs/blocks/tiles/ITilePermission.java @@ -0,0 +1,8 @@ +package noppes.npcs.blocks.tiles; + +import noppes.npcs.CustomNpcsPermissions; + +public interface ITilePermission { + + CustomNpcsPermissions.Permission getPermission(); +} diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java b/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java index 2e3cafbea..3f18fd742 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileBorder.java @@ -12,11 +12,12 @@ import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentTranslation; +import noppes.npcs.CustomNpcsPermissions; import noppes.npcs.controllers.data.Availability; import java.util.List; -public class TileBorder extends TileEntity implements IEntitySelector { +public class TileBorder extends TileEntity implements IEntitySelector, ITilePermission { public Availability availability = new Availability(); public AxisAlignedBB boundingbox; public int rotation = 0; @@ -109,4 +110,9 @@ public class TileBorder extends TileEntity implements IEntitySelector { public boolean isEntityApplicable(Entity var1) { return var1 instanceof EntityPlayerMP || var1 instanceof EntityEnderPearl; } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.EDIT_BLOCKS; + } } diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java b/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java index 630e30143..1bf4161be 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileRedstoneBlock.java @@ -6,12 +6,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import noppes.npcs.CustomNpcs; +import noppes.npcs.CustomNpcsPermissions; import noppes.npcs.blocks.BlockNpcRedstone; import noppes.npcs.controllers.data.Availability; import java.util.List; -public class TileRedstoneBlock extends TileEntity { +public class TileRedstoneBlock extends TileEntity implements ITilePermission { public int onRange = 6; public int offRange = 10; @@ -138,4 +139,9 @@ public class TileRedstoneBlock extends TileEntity { public boolean canUpdate() { return true; } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.EDIT_REDSTONE; + } } diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java b/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java index b4f635d02..13413b9e3 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileWaypoint.java @@ -6,6 +6,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.StatCollector; +import noppes.npcs.CustomNpcsPermissions; import noppes.npcs.constants.EnumQuestType; import noppes.npcs.controllers.PartyController; import noppes.npcs.controllers.data.Party; @@ -18,7 +19,7 @@ import noppes.npcs.quests.QuestLocation; import java.util.ArrayList; import java.util.List; -public class TileWaypoint extends TileEntity { +public class TileWaypoint extends TileEntity implements ITilePermission { public String name = ""; @@ -102,4 +103,9 @@ public class TileWaypoint extends TileEntity { compound.setString("LocationName", name); compound.setInteger("LocationRange", range); } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.EDIT_WAYPOINT; + } }