201 lines
4.1 KiB
Java
201 lines
4.1 KiB
Java
|
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<FlagRegion> regions = new ArrayList<FlagRegion>();
|
||
|
|
||
|
public FlagWorld(World world)
|
||
|
{
|
||
|
this.world = world;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void readFromNBT(NBTTagCompound nbt)
|
||
|
{
|
||
|
// A list containing all flags within it for this world.
|
||
|
Iterator<NBTTagCompound> 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<Flag> getFlagsInPosition(Vector3 position)
|
||
|
{
|
||
|
List<Flag> returnFlags = new ArrayList<Flag>();
|
||
|
|
||
|
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<String> getValues(String flagName, Vector3 position)
|
||
|
{
|
||
|
List<String> values = new ArrayList<String>();
|
||
|
|
||
|
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<FlagRegion> getRegions(Vector3 position)
|
||
|
{
|
||
|
List<FlagRegion> returnRegions = new ArrayList<FlagRegion>();
|
||
|
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<FlagRegion> getRegions()
|
||
|
{
|
||
|
Iterator<FlagRegion> 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;
|
||
|
}
|
||
|
}
|