From a3c2bc8299f4405c3f2f3e4995b0b9b03a6641ae Mon Sep 17 00:00:00 2001 From: Robert Seifert Date: Sun, 21 Apr 2013 07:33:50 -0400 Subject: [PATCH] added new prefab --- .../prefab/TileEntityElectricLockable.java | 280 ++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 src/minecraft/dark/library/locking/prefab/TileEntityElectricLockable.java diff --git a/src/minecraft/dark/library/locking/prefab/TileEntityElectricLockable.java b/src/minecraft/dark/library/locking/prefab/TileEntityElectricLockable.java new file mode 100644 index 00000000..19a78224 --- /dev/null +++ b/src/minecraft/dark/library/locking/prefab/TileEntityElectricLockable.java @@ -0,0 +1,280 @@ +package dark.library.locking.prefab; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.Packet250CustomPayload; +import universalelectricity.core.vector.Vector3; +import universalelectricity.prefab.network.IPacketReceiver; +import universalelectricity.prefab.network.PacketManager; +import universalelectricity.prefab.tile.TileEntityElectricityRunnable; + +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.network.PacketDispatcher; +import dark.library.locking.AccessLevel; +import dark.library.locking.ISpecialAccess; +import dark.library.locking.UserAccess; + +public abstract class TileEntityElectricLockable extends TileEntityElectricityRunnable implements ISpecialAccess, IPacketReceiver +{ + public enum PacketType + { + DESCR_DATA, LIST_EDIT, SETTING_EDIT, OTHER; + } + + /** + * A list of user access data. + */ + private final List users = new ArrayList(); + + /** + * The amount of players using the console. + */ + public int playersUsing = 0; + /** + * was the access list changed, used to trigger a packet update early + */ + public boolean listUpdate = false; + + @Override + public void updateEntity() + { + super.updateEntity(); + + if (!this.worldObj.isRemote) + { + // // update lit when changes are made or every 2 seconds if a player is near + if (listUpdate || (this.worldObj.getClosestPlayer(xCoord, yCoord, zCoord, 20) != null && this.ticks % 40 == 0)) + { + listUpdate = false; + PacketManager.sendPacketToClients(this.getDescriptionPacket(), this.worldObj, new Vector3(this), 20); + } + } + } + + /** + * Channel to be used to send packets on + */ + public abstract String getChannel(); + + /** + * Sends all NBT data. Server -> Client + */ + @Override + public Packet getDescriptionPacket() + { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return PacketManager.getPacket(this.getChannel(), this, PacketType.DESCR_DATA.ordinal(), nbt); + } + + /** + * send a packet the server with info on an access list change + * + * @param player - player's access + * @param remove - is the change a remove order + */ + public void sendEditToServer(UserAccess player, boolean remove) + { + if (this.worldObj.isRemote && player != null) + { + Packet packet = PacketManager.getPacket(this.getChannel(), this, PacketType.LIST_EDIT.ordinal(), player.username, player.level.ordinal(), player.shouldSave, remove); + PacketDispatcher.sendPacketToServer(packet); + } + } + + @Override + public void handlePacketData(INetworkManager network, int packetID, Packet250CustomPayload packet, EntityPlayer player, ByteArrayDataInput dataStream) + { + try + { + PacketType packetType = PacketType.values()[dataStream.readInt()]; + + switch (packetType) + { + case DESCR_DATA: + { + if (this.worldObj.isRemote) + { + short size = dataStream.readShort(); + + if (size > 0) + { + byte[] byteCode = new byte[size]; + dataStream.readFully(byteCode); + this.readFromNBT(CompressedStreamTools.decompress(byteCode)); + } + } + + break; + } + case LIST_EDIT: + { + if (!this.worldObj.isRemote) + { + String name = dataStream.readUTF(); + AccessLevel level = AccessLevel.get(dataStream.readInt()); + Boolean shouldSave = dataStream.readBoolean(); + Boolean remove = dataStream.readBoolean(); + if (remove) + { + this.removeUserAccess(name, true); + } + else + { + this.addUserAccess(new UserAccess(name, level, shouldSave), true); + } + + } + break; + } + case SETTING_EDIT: + { + // TODO add settings packet handler when settings are added + break; + } + // // PacketType.Other is treated as a default call // + default: + break; + } + + } + catch (Exception e) + { + FMLLog.severe("GS: Failed to handle packet for locked door."); + e.printStackTrace(); + } + } + + @Override + public AccessLevel getUserAccess(String username) + { + for (int i = 0; i < this.users.size(); i++) + { + if (this.users.get(i).username.equalsIgnoreCase(username)) + { + return this.users.get(i).level; + } + } + return AccessLevel.NONE; + } + + @Override + public List getUsers() + { + return this.users; + } + + @Override + public List getUsersWithAcess(AccessLevel level) + { + List players = new ArrayList(); + + for (int i = 0; i < this.users.size(); i++) + { + UserAccess ref = this.users.get(i); + + if (ref.level == level) + { + players.add(ref); + } + } + return players; + + } + + /** + * checks to see if a user is on the access list regardless of access + */ + public boolean isOnList(String username) + { + for (UserAccess user : this.getUsers()) + { + if (user.username.equalsIgnoreCase(username)) + { + return true; + } + } + return false; + } + + @Override + public boolean addUserAccess(UserAccess user, boolean isServer) + { + if (!isServer) + { + this.sendEditToServer(user, false); + } + else + { + this.removeUserAccess(user.username, isServer); + this.listUpdate = true; + return this.users.add(user); + } + return false; + + } + + @Override + public boolean removeUserAccess(String player, boolean isServer) + { + + if (!isServer) + { + UserAccess access = new UserAccess(player, AccessLevel.BASIC, false); + this.sendEditToServer(access, true); + } + else + { + + List list = UserAccess.removeUserAccess(player, this.users); + if (list.size() < this.users.size()) + { + this.users.clear(); + this.users.addAll(list); + this.listUpdate = true; + return true; + } + } + return false; + } + + /** + * can the player access this tileEntity in any way + */ + public boolean canAccess(EntityPlayer player) + { + if (this.users.size() <= 0) + { + return true; + } + return this.getUserAccess(player.username).ordinal() >= AccessLevel.USER.ordinal(); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + + // Read user list + this.users.clear(); + this.users.addAll(UserAccess.readListFromNBT(nbt, "Users")); + this.listUpdate = true; + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + + // Write user list + UserAccess.writeListToNBT(nbt, this.users); + } +}