package calclavia.lib.flag; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.vector.Region3; /** * Data structure for world protection. * * @author Calclavia * */ public class FlagWorld extends FlagBase { public static final String GLOBAL_REGION = "dimension"; public World world; private final List regions = new ArrayList(); public FlagWorld(World world) { this.world = world; } @Override public void readFromNBT(NBTTagCompound nbt) { // A list containing all flags within it for this world. Iterator childCompounds = nbt.getTags().iterator(); while (childCompounds.hasNext()) { NBTTagCompound childCompound = childCompounds.next(); try { FlagRegion flagRegion = new FlagRegion(this); flagRegion.readFromNBT(childCompound); this.regions.add(flagRegion); } catch (Exception e) { System.out.println("Mod Flag: Failed to read flag data: " + childCompound.getName()); e.printStackTrace(); } } } @Override public void writeToNBT(NBTTagCompound nbt) { for (FlagRegion region : this.regions) { try { NBTTagCompound flagCompound = new NBTTagCompound(); region.writeToNBT(flagCompound); nbt.setTag(region.name, flagCompound); } catch (Exception e) { System.out.println("Failed to save world flag data: " + region.name); e.printStackTrace(); } } } /** * Gets all the flags that have an effect in this position. * * @param position * @return */ public List getFlagsInPosition(Vector3 position) { List returnFlags = new ArrayList(); for (FlagRegion flagRegion : this.regions) { if (flagRegion.region.isIn(position) || flagRegion.name.equalsIgnoreCase(GLOBAL_REGION)) { for (Flag flag : flagRegion.getFlags()) { returnFlags.add(flag); } } } return returnFlags; } /** * Gets all the values of the flags in this position. */ public List getValues(String flagName, Vector3 position) { List values = new ArrayList(); for (Flag flag : this.getFlagsInPosition(position)) { values.add(flag.value); } return values; } /** * Checks if there is a flag in this position that has a specific value. */ public boolean containsValue(String flagName, String checkValue, Vector3 position) { for (Flag flag : this.getFlagsInPosition(position)) { if (flag.name.equalsIgnoreCase(flagName) && flag.value.equalsIgnoreCase(checkValue)) { return true; } } return false; } public boolean addRegion(String name, Vector3 position, int radius) { Vector3 minVec = new Vector3(position.intX() - radius, 0, position.intZ() - radius); Vector3 maxVec = new Vector3(position.intX() + radius, this.world.getHeight(), position.intZ() + radius); return this.regions.add(new FlagRegion(this, name, new Region3(minVec, maxVec))); } public FlagRegion getRegion(String name) { for (FlagRegion region : this.regions) { if (region.name.equals(name)) { return region; } } return null; } /** * Gets all regions that intersect this point. */ public List getRegions(Vector3 position) { List returnRegions = new ArrayList(); for (FlagRegion region : this.regions) { if (region.region.isIn(position)) { returnRegions.add(region); } } return returnRegions; } public boolean removeRegion(String name) { for (FlagRegion region : this.regions) { if (region.name.equals(name)) { this.regions.remove(region); return true; } } return false; } public List getRegions() { Iterator it = this.regions.iterator(); while (it.hasNext()) { FlagRegion region = it.next(); if (region == null) { it.remove(); continue; } if (region.name == null || region.name == "") { it.remove(); continue; } } return this.regions; } }