package com.bioxx.jmapgen.graph; import java.util.EnumSet; import java.util.Vector; import net.minecraft.nbt.NBTTagCompound; import com.bioxx.jmapgen.IslandMap; import com.bioxx.jmapgen.Point; import com.bioxx.jmapgen.graph.Center.Marker; public class Corner { public int index = 0; public Point point; // location private EnumSet<Marker> flags = EnumSet.noneOf(Marker.class); public double elevation; // 0.0-1.0 public double moisture; // 0.0-1.0 public Vector<Center> touches; public Vector<Edge> protrudes; public Vector<Corner> adjacent; public Corner() { elevation = Double.MAX_VALUE; touches = new Vector<Center>(); protrudes = new Vector<Edge>(); adjacent = new Vector<Corner>(); } public Corner(int i) { this(); index = i; } public void setMarkers(Marker... m) { for(Marker mk : m) flags.add(mk); } public boolean hasMarker(Marker m) { return flags.contains(m); } public void removeMarkers(Marker... m) { for(Marker mk : m) flags.remove(mk); } /** * Should only be used by the mapgen when tossing a bad map. */ public void resetMarkers() { flags.clear(); } public Edge getTouchingEdge(Corner c) { for (int i = 0; i < protrudes.size(); i++) { if(protrudes.get(i).vCorner0 == c || protrudes.get(i).vCorner1 == c) return protrudes.get(i); } return null; } public Center getClosestCenter(Point p) { Center closest = null; double distance = 1000000; for (Center c : touches) { double newDist = p.distanceSq(c.point); if(newDist < distance) { distance = newDist; closest = c; } } return closest; } public boolean isShoreline() { if(this.hasMarker(Marker.Water)) { for(Center c : touches) { if(!c.hasMarker(Marker.Water)) return true; } } return false; } public void writeToNBT(NBTTagCompound nbt) { nbt.setInteger("index", index); nbt.setDouble("xCoord", point.x); nbt.setDouble("yCoord", point.y); int f = 0; for(Marker ff : flags) { f += ff.getFlag(); } nbt.setInteger("flags", f); nbt.setDouble("elevation", elevation); nbt.setDouble("moisture", moisture); int[] nArray = new int[touches.size()]; for(int i = 0; i < nArray.length; i++) { nArray[i] = touches.get(i).index; } nbt.setIntArray("touches", nArray); nArray = new int[protrudes.size()]; for(int i = 0; i < nArray.length; i++) { nArray[i] = protrudes.get(i).index; } nbt.setIntArray("protrudes", nArray); nArray = new int[adjacent.size()]; for(int i = 0; i < nArray.length; i++) { nArray[i] = adjacent.get(i).index; } nbt.setIntArray("adjacent", nArray); } public void readFromNBT(NBTTagCompound nbt, IslandMap m) { this.point = new Point(nbt.getDouble("xCoord"), nbt.getDouble("yCoord")); setMarkers(nbt.getInteger("flags")); elevation = nbt.getDouble("elevation"); moisture = nbt.getDouble("moisture"); int[] nArray = nbt.getIntArray("touches"); for(int i = 0; i < nArray.length; i++) { this.touches.add(m.centers.get(nArray[i])); } nArray = nbt.getIntArray("adjacent"); for(int i = 0; i < nArray.length; i++) { this.adjacent.add(m.corners.get(nArray[i])); } nArray = nbt.getIntArray("protrudes"); for(int i = 0; i < nArray.length; i++) { this.protrudes.add(m.edges.get(nArray[i])); } } /** * Used for reading stored nbt information */ private void setMarkers(int i) { for(Marker f : Marker.values()) { if((i & f.getFlag()) > 0) { flags.add(f); } } } }