package net.scapeemulator.game.model.pathfinding;
import net.scapeemulator.cache.def.ObjectDefinition;
import net.scapeemulator.game.model.Position;
import net.scapeemulator.game.model.definition.ObjectDefinitions;
import net.scapeemulator.game.model.object.GroundObjectList.GroundObject;
import net.scapeemulator.game.model.object.GroundObjectListenerAdapter;
/**
* @author Hadyn Richard
*/
public final class ObjectDataListener extends GroundObjectListenerAdapter {
private final TraversalMap traversalMap;
public ObjectDataListener(TraversalMap traversalMap) {
this.traversalMap = traversalMap;
}
@Override
public void groundObjectAdded(GroundObject object) {
ObjectDefinition def = ObjectDefinitions.forId(object.getId());
if (!def.isSolid()) {
return;
}
Position position = object.getPosition();
if (!traversalMap.regionInitialized(position.getX(), position.getY())) {
traversalMap.initializeRegion(position.getX(), position.getY());
}
if (object.getType().isWall()) {
traversalMap.markWall(object.getRotation(), position.getHeight(), position.getX(), position.getY(), object.getType(), def.isImpenetrable());
}
if (object.getType().getId() >= 9 && object.getType().getId() <= 12) {
/* Flip the length and width if the object is rotated */
int width = def.getWidth();
int length = def.getLength();
if (object.getRotation() == 1 || object.getRotation() == 3) {
width = def.getLength();
length = def.getWidth();
}
traversalMap.markOccupant(position.getHeight(), position.getX(), position.getY(), width, length, def.isImpenetrable());
}
}
@Override
public void groundObjectIdUpdated(GroundObject object, int oldId) {
ObjectDefinition oldDef = ObjectDefinitions.forId(oldId);
ObjectDefinition newDef = ObjectDefinitions.forId(object.getId());
if (oldDef.getWidth() == newDef.getWidth() && oldDef.getLength() == newDef.getLength() && oldDef.isImpenetrable() == newDef.isImpenetrable()) {
return;
}
Position position = object.getPosition();
if (!traversalMap.regionInitialized(position.getX(), position.getY())) {
traversalMap.initializeRegion(position.getX(), position.getY());
}
if (oldDef.isSolid()) {
if (object.getType().isWall()) {
traversalMap.unmarkWall(object.getRotation(), position.getHeight(), position.getX(), position.getY(), object.getType(), oldDef.isImpenetrable());
}
if (object.getType().getId() >= 9 && object.getType().getId() <= 12) {
/* Flip the length and width if the object is rotated */
int width = oldDef.getWidth();
int length = oldDef.getLength();
if (object.getRotation() == 1 || object.getRotation() == 3) {
width = oldDef.getLength();
length = oldDef.getWidth();
}
traversalMap.unmarkOccupant(position.getHeight(), position.getX(), position.getY(), width, length, oldDef.isImpenetrable());
}
}
if (newDef.isSolid()) {
if (object.getType().isWall()) {
traversalMap.markWall(object.getRotation(), position.getHeight(), position.getX(), position.getY(), object.getType(), newDef.isImpenetrable());
}
if (object.getType().getId() >= 9 && object.getType().getId() <= 12) {
/* Flip the length and width if the object is rotated */
int width = newDef.getWidth();
int length = newDef.getLength();
if (object.getRotation() == 1 || object.getRotation() == 3) {
width = newDef.getLength();
length = newDef.getWidth();
}
traversalMap.markOccupant(position.getHeight(), position.getX(), position.getY(), width, length, newDef.isImpenetrable());
}
}
}
@Override
public void groundObjectRotationUpdated(GroundObject object, int oldRotation) {
ObjectDefinition def = ObjectDefinitions.forId(object.getId());
if (!def.isSolid()) {
return;
}
Position position = object.getPosition();
if (!traversalMap.regionInitialized(position.getX(), position.getY())) {
traversalMap.initializeRegion(position.getX(), position.getY());
}
if (object.getType().isWall()) {
traversalMap.unmarkWall(oldRotation, position.getHeight(), position.getX(), position.getY(), object.getType(), def.isImpenetrable());
traversalMap.markWall(object.getRotation(), position.getHeight(), position.getX(), position.getY(), object.getType(), def.isImpenetrable());
}
if (object.getType().getId() >= 9 && object.getType().getId() <= 12) {
if (oldRotation % 2 == object.getRotation() % 2) {
return;
}
int width = def.getWidth();
int length = def.getLength();
if (1 == oldRotation || oldRotation == 3) {
width = def.getLength();
length = def.getWidth();
}
traversalMap.unmarkOccupant(position.getHeight(), position.getX(), position.getY(), width, length, def.isImpenetrable());
traversalMap.markOccupant(position.getHeight(), position.getX(), position.getY(), length, width, def.isImpenetrable());
}
}
@Override
public void groundObjectRemoved(GroundObject object) {
ObjectDefinition def = ObjectDefinitions.forId(object.getId());
if (!def.isSolid()) {
return;
}
Position position = object.getPosition();
if (!traversalMap.regionInitialized(position.getX(), position.getY())) {
traversalMap.initializeRegion(position.getX(), position.getY());
}
if (object.getType().isWall()) {
traversalMap.unmarkWall(object.getRotation(), position.getHeight(), position.getX(), position.getY(), object.getType(), def.isImpenetrable());
}
if (object.getType().getId() >= 9 && object.getType().getId() <= 12) {
/* Flip the length and width if the object is rotated */
int width = def.getWidth();
int length = def.getLength();
if (1 == object.getRotation() || object.getRotation() == 3) {
width = def.getLength();
length = def.getWidth();
}
traversalMap.unmarkOccupant(position.getHeight(), position.getX(), position.getY(), width, length, def.isImpenetrable());
}
}
}