diff --git a/game/src/main/java/org/apollo/game/model/entity/Entity.java b/game/src/main/java/org/apollo/game/model/entity/Entity.java index 97e35349..3f5a955a 100644 --- a/game/src/main/java/org/apollo/game/model/entity/Entity.java +++ b/game/src/main/java/org/apollo/game/model/entity/Entity.java @@ -20,6 +20,11 @@ public abstract class Entity { */ protected final World world; + /** + * The EntityBounds for this Entity. + */ + private EntityBounds bounds; + /** * Creates the Entity. * @@ -34,6 +39,20 @@ public abstract class Entity { @Override public abstract boolean equals(Object obj); + /** + * Gets the {@link EntityBounds} for this Entity. + * + * @return The EntityBounds. + */ + public EntityBounds getBounds() { + + if(bounds == null) { + bounds = new EntityBounds(this); + } + + return bounds; + } + /** * Gets the {@link Position} of this Entity. * @@ -59,6 +78,20 @@ public abstract class Entity { */ public abstract EntityType getEntityType(); + /** + * Gets the length of this Entity. + * + * @return The length. + */ + public abstract int getLength(); + + /** + * Gets the width of this Entity. + * + * @return The width. + */ + public abstract int getWidth(); + @Override public abstract int hashCode(); diff --git a/game/src/main/java/org/apollo/game/model/entity/EntityBounds.java b/game/src/main/java/org/apollo/game/model/entity/EntityBounds.java new file mode 100644 index 00000000..3d4c3a9a --- /dev/null +++ b/game/src/main/java/org/apollo/game/model/entity/EntityBounds.java @@ -0,0 +1,48 @@ +package org.apollo.game.model.entity; + +import org.apollo.game.model.Position; + +/** + * The bounds of an {@link Entity}. + * + * @author Steve Soltys + */ +public class EntityBounds { + + /** + * The {@link Entity}. + */ + private final Entity entity; + + /** + * Creates an EntityBounds. + * + * @param entity The entity. + */ + EntityBounds(Entity entity) { + this.entity = entity; + } + + /** + * Checks whether the given position is within the Entity's bounds. + * + * @param position The position. + * @return A flag indicating whether or not the position exists within the Entity's bounds. + */ + public boolean contains(Position position) { + int positionX = position.getX(); + int positionY = position.getY(); + int positionHeight = position.getHeight(); + + int entityX = entity.getPosition().getX(); + int entityY = entity.getPosition().getY(); + int entityHeight = entity.getPosition().getHeight(); + + int width = entity.getWidth(); + int length = entity.getLength(); + + return positionX >= entityX && positionX < entityX + width && + positionY >= entityY && positionY < entityY + length && + positionHeight == entityHeight; + } +} diff --git a/game/src/main/java/org/apollo/game/model/entity/GroundItem.java b/game/src/main/java/org/apollo/game/model/entity/GroundItem.java index a81c612c..a338d414 100644 --- a/game/src/main/java/org/apollo/game/model/entity/GroundItem.java +++ b/game/src/main/java/org/apollo/game/model/entity/GroundItem.java @@ -80,6 +80,16 @@ public final class GroundItem extends Entity implements GroupableEntity { return EntityType.GROUND_ITEM; } + @Override + public int getLength() { + return 1; + } + + @Override + public int getWidth() { + return 1; + } + /** * Gets the {@link Item} displayed on the ground. * diff --git a/game/src/main/java/org/apollo/game/model/entity/Mob.java b/game/src/main/java/org/apollo/game/model/entity/Mob.java index 82cdba96..4e90d48f 100644 --- a/game/src/main/java/org/apollo/game/model/entity/Mob.java +++ b/game/src/main/java/org/apollo/game/model/entity/Mob.java @@ -327,6 +327,16 @@ public abstract class Mob extends Entity { return walkingQueue; } + @Override + public int getLength() { + return definition.map(NpcDefinition::getSize).orElse(1); + } + + @Override + public int getWidth() { + return definition.map(NpcDefinition::getSize).orElse(1); + } + /** * Returns whether or not this mob has an {@link NpcDefinition}. * diff --git a/game/src/main/java/org/apollo/game/model/entity/Projectile.java b/game/src/main/java/org/apollo/game/model/entity/Projectile.java index db5459d8..a05f218b 100644 --- a/game/src/main/java/org/apollo/game/model/entity/Projectile.java +++ b/game/src/main/java/org/apollo/game/model/entity/Projectile.java @@ -414,6 +414,16 @@ public final class Projectile extends Entity implements GroupableEntity { return EntityType.PROJECTILE; } + @Override + public int getLength() { + return 1; + } + + @Override + public int getWidth() { + return 1; + } + @Override public int hashCode() { return Objects.hashCode(position, destination, delay, lifetime, target, startHeight, diff --git a/game/src/main/java/org/apollo/game/model/entity/obj/GameObject.java b/game/src/main/java/org/apollo/game/model/entity/obj/GameObject.java index cdb0f749..0d8391bf 100644 --- a/game/src/main/java/org/apollo/game/model/entity/obj/GameObject.java +++ b/game/src/main/java/org/apollo/game/model/entity/obj/GameObject.java @@ -2,6 +2,7 @@ package org.apollo.game.model.entity.obj; import org.apollo.cache.def.ObjectDefinition; import org.apollo.game.model.Position; +import org.apollo.game.model.Direction; import org.apollo.game.model.World; import org.apollo.game.model.area.EntityUpdateType; import org.apollo.game.model.area.Region; @@ -85,6 +86,23 @@ public abstract class GameObject extends Entity implements GroupableEntity { return packed >> 2 & 0x3F; } + + @Override + public int getLength() { + Direction direction = Direction.WNES[getOrientation()]; + + return direction == Direction.WEST || direction == Direction.EAST ? + getDefinition().getWidth() : getDefinition().getLength(); + } + + @Override + public int getWidth() { + Direction direction = Direction.WNES[getOrientation()]; + + return direction == Direction.WEST || direction == Direction.EAST ? + getDefinition().getLength() : getDefinition().getWidth(); + } + @Override public int hashCode() { return packed; @@ -109,5 +127,4 @@ public abstract class GameObject extends Entity implements GroupableEntity { * @return {@code true} if the Player can see this GameObject, {@code false} if not. */ public abstract boolean viewableBy(Player player, World world); - } \ No newline at end of file