Added quad trees

This commit is contained in:
Obique
2014-11-30 20:38:27 -06:00
committed by Obique
parent 7985f98082
commit acfde92db6
+67 -19
View File
@@ -1,32 +1,68 @@
package services.objects;
import intents.swgobject_events.SWGObjectEventIntent;
import intents.swgobject_events.SWGObjectMovedIntent;
import java.util.HashMap;
import java.util.Map;
import resources.Location;
import resources.Terrain;
import resources.control.Intent;
import resources.control.Manager;
import resources.objects.SWGObject;
import resources.objects.intangible.IntangibleObject;
import resources.objects.quadtree.QuadTree;
import resources.objects.tangible.TangibleObject;
public class ObjectManager extends Manager {
private Map <Long, SWGObject> objects;
private Map <String, QuadTree <SWGObject>> quadTree;
private long maxObjectId;
public ObjectManager() {
objects = new HashMap<Long, SWGObject>();
quadTree = new HashMap<String, QuadTree<SWGObject>>();
maxObjectId = 0;
}
@Override
public boolean initialize() {
registerForIntent(SWGObjectEventIntent.TYPE);
for (Terrain t : Terrain.values()) {
quadTree.put(t.getFile(), new QuadTree<SWGObject>(-5000, -5000, 5000, 5000));
}
return super.initialize();
}
@Override
public void onIntentReceived(Intent i) {
if (i instanceof SWGObjectMovedIntent) {
Location oTerrain = ((SWGObjectMovedIntent) i).getOldLocation();
Location nTerrain = ((SWGObjectMovedIntent) i).getNewLocation();
SWGObject obj = ((SWGObjectMovedIntent) i).getObject();
if (oTerrain.getTerrain() == null || nTerrain.getTerrain() == null)
return;
double x = oTerrain.getX();
double y = oTerrain.getZ();
quadTree.get(oTerrain.getTerrain().getFile()).remove(oTerrain.getX(), y, obj);
x = nTerrain.getX();
y = nTerrain.getZ();
quadTree.get(nTerrain.getTerrain().getFile()).put(x, y, obj);
}
}
public SWGObject createObject(String template) {
return createObject(template, new Location());
}
public SWGObject createObject(String template, Location l) {
synchronized (objects) {
SWGObject obj = createObjectFromTemplate(template);
long objectId = getNextObjectId();
SWGObject obj = createObjectFromTemplate(objectId, template);
obj.setTemplate(template);
obj.setLocation(l);
return obj;
}
}
@@ -37,29 +73,41 @@ public class ObjectManager extends Manager {
}
}
private SWGObject createObjectFromTemplate(String template) {
synchronized (objects) {
String [] parts = template.split("/");
// Error checking
if (parts.length < 3 || !parts[0].equals("object") || !parts[parts.length-1].endsWith(".iff"))
return null;
switch (parts[1]) {
case "tangible": return createTangibleObject(template);
case "intangible": return createIntangibleObject(template);
case "weapon": break;
case "building": break;
case "cell": break;
}
private String getFirstTemplatePart(String template) {
int ind = template.indexOf('/');
if (ind == -1)
return "";
return template.substring(0, ind);
}
private SWGObject createObjectFromTemplate(long objectId, String template) {
if (!template.startsWith("object/"))
return null;
if (!template.endsWith(".iff"))
return null;
template = template.substring(7, template.length()-7-4);
switch (getFirstTemplatePart(template)) {
case "tangible": return createTangibleObject(objectId, template);
case "intangible": return createIntangibleObject(objectId, template);
case "weapon": break;
case "building": break;
case "cell": break;
}
return null;
}
private TangibleObject createTangibleObject(String template) {
return new TangibleObject();
private TangibleObject createTangibleObject(long objectId, String template) {
if (!template.startsWith("tangible/"))
return null;
template = template.substring(9);
switch (getFirstTemplatePart(template)) {
case "creature": break;
}
return new TangibleObject(objectId);
}
private IntangibleObject createIntangibleObject(String template) {
return new IntangibleObject();
private IntangibleObject createIntangibleObject(long objectId, String template) {
return new IntangibleObject(objectId);
}
}