package mcjty.rftools.blocks.teleporter;
import mcjty.lib.entity.GenericEnergyReceiverTileEntity;
import mcjty.lib.network.Argument;
import mcjty.lib.varia.Coordinate;
import mcjty.lib.varia.GlobalCoordinate;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.*;
public class MatterReceiverTileEntity extends GenericEnergyReceiverTileEntity {
public static final String CMD_SETNAME = "setName";
public static final String CMD_ADDPLAYER = "addPlayer";
public static final String CMD_DELPLAYER = "delPlayer";
public static final String CMD_SETPRIVATE = "setAccess";
public static final String CMD_GETPLAYERS = "getPlayers";
public static final String CLIENTCMD_GETPLAYERS = "getPlayers";
private String name = null;
private boolean privateAccess = false;
private Set<String> allowedPlayers = new HashSet<String>();
private int id = -1;
private int cachedX;
private int cachedY;
private int cachedZ;
public MatterReceiverTileEntity() {
super(TeleportConfiguration.RECEIVER_MAXENERGY, TeleportConfiguration.RECEIVER_RECEIVEPERTICK);
}
public String getName() {
return name == null ? "" : name;
}
public int getOrCalculateID() {
if (id == -1) {
TeleportDestinations destinations = TeleportDestinations.getDestinations(worldObj);
GlobalCoordinate gc = new GlobalCoordinate(new Coordinate(xCoord, yCoord, zCoord), worldObj.provider.dimensionId);
id = destinations.getNewId(gc);
destinations.save(worldObj);
setId(id);
}
return id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
markDirty();
}
public void setName(String name) {
this.name = name;
TeleportDestinations destinations = TeleportDestinations.getDestinations(worldObj);
TeleportDestination destination = destinations.getDestination(new Coordinate(xCoord, yCoord, zCoord), worldObj.provider.dimensionId);
if (destination != null) {
destination.setName(name);
destinations.save(worldObj);
}
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
markDirty();
}
@Override
protected void checkStateServer() {
if (cachedX != xCoord || cachedY != yCoord || cachedZ != zCoord) {
TeleportDestinations destinations = TeleportDestinations.getDestinations(worldObj);
destinations.removeDestination(new Coordinate(cachedX, cachedY, cachedZ), worldObj.provider.dimensionId);
cachedX = xCoord;
cachedY = yCoord;
cachedZ = zCoord;
GlobalCoordinate gc = new GlobalCoordinate(new Coordinate(xCoord, yCoord, zCoord), worldObj.provider.dimensionId);
if (id == -1) {
id = destinations.getNewId(gc);
} else {
destinations.assignId(gc, id);
}
destinations.addDestination(gc);
destinations.save(worldObj);
markDirty();
}
}
/**
* This method is called after putting down a receiver that was earlier wrenched. We need to fix the data in
* the destination.
*/
public void updateDestination() {
TeleportDestinations destinations = TeleportDestinations.getDestinations(worldObj);
GlobalCoordinate gc = new GlobalCoordinate(new Coordinate(xCoord, yCoord, zCoord), worldObj.provider.dimensionId);
TeleportDestination destination = destinations.getDestination(gc.getCoordinate(), gc.getDimension());
if (destination != null) {
destination.setName(name);
if (id == -1) {
id = destinations.getNewId(gc);
markDirty();
} else {
destinations.assignId(gc, id);
}
destinations.save(worldObj);
}
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
public boolean isPrivateAccess() {
return privateAccess;
}
public void setPrivateAccess(boolean privateAccess) {
this.privateAccess = privateAccess;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
public boolean checkAccess(String player) {
if (!privateAccess) {
return true;
}
return allowedPlayers.contains(player);
}
public List<PlayerName> getAllowedPlayers() {
List<PlayerName> p = new ArrayList<PlayerName>();
for (String player : allowedPlayers) {
p.add(new PlayerName(player));
}
return p;
}
public void addPlayer(String player) {
if (!allowedPlayers.contains(player)) {
allowedPlayers.add(player);
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
markDirty();
}
}
public void delPlayer(String player) {
if (allowedPlayers.contains(player)) {
allowedPlayers.remove(player);
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
markDirty();
}
}
public int checkStatus() {
Block block = worldObj.getBlock(xCoord, yCoord+1, zCoord);
if (!block.isAir(worldObj, xCoord, yCoord+1, zCoord)) {
return DialingDeviceTileEntity.DIAL_RECEIVER_BLOCKED_MASK;
}
block = worldObj.getBlock(xCoord, yCoord+2, zCoord);
if (!block.isAir(worldObj, xCoord, yCoord+2, zCoord)) {
return DialingDeviceTileEntity.DIAL_RECEIVER_BLOCKED_MASK;
}
if (getEnergyStored(ForgeDirection.DOWN) < TeleportConfiguration.rfPerTeleportReceiver) {
return DialingDeviceTileEntity.DIAL_RECEIVER_POWER_LOW_MASK;
}
return DialingDeviceTileEntity.DIAL_OK;
}
@Override
public void readFromNBT(NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound);
cachedX = tagCompound.getInteger("cachedX");
cachedY = tagCompound.getInteger("cachedY");
cachedZ = tagCompound.getInteger("cachedZ");
}
@Override
public void readRestorableFromNBT(NBTTagCompound tagCompound) {
super.readRestorableFromNBT(tagCompound);
name = tagCompound.getString("tpName");
privateAccess = tagCompound.getBoolean("private");
allowedPlayers.clear();
NBTTagList playerList = tagCompound.getTagList("players", Constants.NBT.TAG_STRING);
if (playerList != null) {
for (int i = 0 ; i < playerList.tagCount() ; i++) {
String player = playerList.getStringTagAt(i);
allowedPlayers.add(player);
}
}
if (tagCompound.hasKey("destinationId")) {
id = tagCompound.getInteger("destinationId");
} else {
id = -1;
}
}
@Override
public void writeToNBT(NBTTagCompound tagCompound) {
super.writeToNBT(tagCompound);
tagCompound.setInteger("cachedX", cachedX);
tagCompound.setInteger("cachedY", cachedY);
tagCompound.setInteger("cachedZ", cachedZ);
}
@Override
public void writeRestorableToNBT(NBTTagCompound tagCompound) {
super.writeRestorableToNBT(tagCompound);
if (name != null && !name.isEmpty()) {
tagCompound.setString("tpName", name);
}
tagCompound.setBoolean("private", privateAccess);
NBTTagList playerTagList = new NBTTagList();
for (String player : allowedPlayers) {
playerTagList.appendTag(new NBTTagString(player));
}
tagCompound.setTag("players", playerTagList);
tagCompound.setInteger("destinationId", id);
}
@Override
public boolean execute(EntityPlayerMP playerMP, String command, Map<String, Argument> args) {
boolean rc = super.execute(playerMP, command, args);
if (rc) {
return true;
}
if (CMD_SETNAME.equals(command)) {
setName(args.get("name").getString());
return true;
} else if (CMD_SETPRIVATE.equals(command)) {
setPrivateAccess(args.get("private").getBoolean());
return true;
} else if (CMD_ADDPLAYER.equals(command)) {
addPlayer(args.get("player").getString());
return true;
} else if (CMD_DELPLAYER.equals(command)) {
delPlayer(args.get("player").getString());
return true;
}
return false;
}
@Override
public List executeWithResultList(String command, Map<String, Argument> args) {
List rc = super.executeWithResultList(command, args);
if (rc != null) {
return rc;
}
if (CMD_GETPLAYERS.equals(command)) {
return getAllowedPlayers();
}
return null;
}
@Override
public boolean execute(String command, List list) {
boolean rc = super.execute(command, list);
if (rc) {
return true;
}
if (CLIENTCMD_GETPLAYERS.equals(command)) {
GuiMatterReceiver.storeAllowedPlayersForClient(list);
return true;
}
return false;
}
}