Skip to content

Commit

Permalink
Add dEntity "bounding_box" tag and mech
Browse files Browse the repository at this point in the history
Hurray collisioning
  • Loading branch information
Morphan1 committed Oct 3, 2016
1 parent f880cc2 commit 58a41a8
Show file tree
Hide file tree
Showing 9 changed files with 213 additions and 1 deletion.
@@ -1,5 +1,6 @@
package net.aufdemrand.denizen.nms.interfaces;

import net.aufdemrand.denizen.nms.util.BoundingBox;
import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
import org.bukkit.Location;
import org.bukkit.World;
Expand Down Expand Up @@ -194,4 +195,8 @@ class MapTraceResult {
String getCardinal(float yaw);

void move(Entity entity, Vector vector);

BoundingBox getBoundingBox(Entity entity);

void setBoundingBox(Entity entity, BoundingBox boundingBox);
}
@@ -0,0 +1,22 @@
package net.aufdemrand.denizen.nms.util;

import org.bukkit.util.Vector;

public class BoundingBox {

private Vector position;
private Vector size;

public BoundingBox(Vector location, Vector size) {
this.position = location;
this.size = size;
}

public Vector getPosition() {
return position;
}

public Vector getSize() {
return size;
}
}
1 change: 1 addition & 0 deletions plugin/src/main/java/net/aufdemrand/denizen/Denizen.java
Expand Up @@ -791,6 +791,7 @@ public void onEnable() {
propertyParser.registerProperty(EntityArmorPose.class, dEntity.class);
propertyParser.registerProperty(EntityArms.class, dEntity.class);
propertyParser.registerProperty(EntityBasePlate.class, dEntity.class);
propertyParser.registerProperty(EntityBoundingBox.class, dEntity.class);
propertyParser.registerProperty(EntityChestCarrier.class, dEntity.class);
propertyParser.registerProperty(EntityColor.class, dEntity.class);
propertyParser.registerProperty(EntityCritical.class, dEntity.class);
Expand Down
Expand Up @@ -35,6 +35,7 @@
import org.bukkit.material.Attachable;
import org.bukkit.material.MaterialData;
import org.bukkit.util.BlockIterator;
import org.bukkit.util.Vector;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -268,6 +269,10 @@ public dLocation(Location location) {
location.getYaw(), location.getPitch());
}

public dLocation(Vector vector) {
super(null, vector.getX(), vector.getY(), vector.getZ());
}

public dLocation(World world, double x, double y) {
this(world, x, y, 0);
this.is2D = true;
Expand Down Expand Up @@ -2019,7 +2024,7 @@ && getBlock().getType() == Material.COMMAND) {
}

public void applyProperty(Mechanism mechanism) {
dB.echoError("Cannot apply properties to an location!");
dB.echoError("Cannot apply properties to a location!");
}

@Override
Expand Down
@@ -0,0 +1,126 @@
package net.aufdemrand.denizen.objects.properties.entity;

import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.nms.util.BoundingBox;
import net.aufdemrand.denizen.objects.dEntity;
import net.aufdemrand.denizen.objects.dLocation;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizencore.objects.Element;
import net.aufdemrand.denizencore.objects.Mechanism;
import net.aufdemrand.denizencore.objects.dList;
import net.aufdemrand.denizencore.objects.dObject;
import net.aufdemrand.denizencore.objects.properties.Property;
import net.aufdemrand.denizencore.tags.Attribute;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

public class EntityBoundingBox implements Property {

public static boolean describes(dObject object) {
return object instanceof dEntity && !(((dEntity) object).isCitizensNPC());
}

public static EntityBoundingBox getFrom(dObject object) {
if (!describes(object)) {
return null;
}

else {
return new EntityBoundingBox((dEntity) object);
}
}

private static Set<UUID> modifiedBoxes = new HashSet<UUID>();

public static void remove(UUID uuid) {
if (modifiedBoxes.contains(uuid)) {
modifiedBoxes.remove(uuid);
}
}

///////////////////
// Instance Fields and Methods
/////////////

private EntityBoundingBox(dEntity entity) {
this.entity = entity;
}

dEntity entity;

private dList getBoundingBox() {
BoundingBox boundingBox = NMSHandler.getInstance().getEntityHelper().getBoundingBox(entity.getBukkitEntity());
dList list = new dList();
list.add(new dLocation(boundingBox.getPosition()).identify());
list.add(new dLocation(boundingBox.getSize()).identify());
return list;
}

/////////
// Property Methods
///////

@Override
public String getPropertyString() {
if (modifiedBoxes.contains(entity.getUUID())) {
return getBoundingBox().identify();
}
return null;
}

@Override
public String getPropertyId() {
return "bounding_box";
}

@Override
public String getAttribute(Attribute attribute) {
if (attribute == null) {
return null;
}

// <--[tag]
// @attribute <e@entity.bounding_box>
// @returns dList(dLocation)
// @mechanism dEntity.bounding_box
// @group properties
// @description
// Returns the collision bounding box of the entity in the format "<position>|<size>".
// -->
if (attribute.startsWith("bounding_box")) {
return getBoundingBox().getAttribute(attribute.fulfill(1));
}

return null;
}

@Override
public void adjust(Mechanism mechanism) {
Element value = mechanism.getValue();

// <--[mechanism]
// @object dEntity
// @name bounding_box
// @input dList(dLocation)
// @description
// Changes the collision bounding box of the entity in the format "<position>|<size>".
// @tags
// <e@entity.bounding_box>
// -->

if (mechanism.matches("bounding_box")) {
List<dLocation> locations = value.asType(dList.class).filter(dLocation.class);
if (locations.size() == 2) {
BoundingBox boundingBox = new BoundingBox(locations.get(0).toVector(), locations.get(1).toVector());
NMSHandler.getInstance().getEntityHelper().setBoundingBox(entity.getBukkitEntity(), boundingBox);
modifiedBoxes.add(entity.getUUID());
}
else {
dB.echoError("Must specify exactly 2 dLocations in the format \"<position>|<size>\"!");
}
}
}
}
Expand Up @@ -5,6 +5,7 @@
import net.aufdemrand.denizen.flags.FlagManager;
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.objects.dEntity;
import net.aufdemrand.denizen.objects.properties.entity.EntityBoundingBox;
import net.aufdemrand.denizen.utilities.DenizenAPI;
import net.aufdemrand.denizen.utilities.world.DenizenWorldAccess;
import net.aufdemrand.denizencore.objects.Element;
Expand Down Expand Up @@ -151,5 +152,6 @@ public static void unlinkEntity(Entity ent) {
}
entities.remove(ent.getUniqueId());
FlagManager.clearEntityFlags(new dEntity(ent));
EntityBoundingBox.remove(ent.getUniqueId());
}
}
Expand Up @@ -3,6 +3,7 @@
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_10_R1;
import net.aufdemrand.denizen.nms.interfaces.EntityHelper;
import net.aufdemrand.denizen.nms.util.BoundingBox;
import net.aufdemrand.denizen.nms.util.Utilities;
import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
import net.minecraft.server.v1_10_R1.*;
Expand Down Expand Up @@ -597,4 +598,20 @@ else if (337.5 <= yaw && yaw < 360.0) {
public void move(Entity entity, Vector vector) {
((CraftEntity) entity).getHandle().move(vector.getX(), vector.getY(), vector.getZ());
}

@Override
public BoundingBox getBoundingBox(Entity entity) {
AxisAlignedBB boundingBox = ((CraftEntity) entity).getHandle().getBoundingBox();
Vector position = new Vector(boundingBox.a, boundingBox.b, boundingBox.c);
Vector size = new Vector(boundingBox.d, boundingBox.e, boundingBox.f);
return new BoundingBox(position, size);
}

@Override
public void setBoundingBox(Entity entity, BoundingBox boundingBox) {
Vector position = boundingBox.getPosition();
Vector size = boundingBox.getSize();
((CraftEntity) entity).getHandle().a(new AxisAlignedBB(position.getX(), position.getY(), position.getZ(),
size.getX(), size.getY(), size.getZ()));
}
}
Expand Up @@ -3,6 +3,7 @@
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_8_R3;
import net.aufdemrand.denizen.nms.interfaces.EntityHelper;
import net.aufdemrand.denizen.nms.util.BoundingBox;
import net.aufdemrand.denizen.nms.util.Utilities;
import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
import net.minecraft.server.v1_8_R3.*;
Expand Down Expand Up @@ -600,4 +601,20 @@ else if (337.5 <= yaw && yaw < 360.0) {
public void move(Entity entity, Vector vector) {
((CraftEntity) entity).getHandle().move(vector.getX(), vector.getY(), vector.getZ());
}

@Override
public BoundingBox getBoundingBox(Entity entity) {
AxisAlignedBB boundingBox = ((CraftEntity) entity).getHandle().getBoundingBox();
Vector position = new Vector(boundingBox.a, boundingBox.b, boundingBox.c);
Vector size = new Vector(boundingBox.d, boundingBox.e, boundingBox.f);
return new BoundingBox(position, size);
}

@Override
public void setBoundingBox(Entity entity, BoundingBox boundingBox) {
Vector position = boundingBox.getPosition();
Vector size = boundingBox.getSize();
((CraftEntity) entity).getHandle().a(new AxisAlignedBB(position.getX(), position.getY(), position.getZ(),
size.getX(), size.getY(), size.getZ()));
}
}
Expand Up @@ -3,6 +3,7 @@
import net.aufdemrand.denizen.nms.NMSHandler;
import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_9_R2;
import net.aufdemrand.denizen.nms.interfaces.EntityHelper;
import net.aufdemrand.denizen.nms.util.BoundingBox;
import net.aufdemrand.denizen.nms.util.Utilities;
import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
import net.minecraft.server.v1_9_R2.*;
Expand Down Expand Up @@ -597,4 +598,20 @@ else if (337.5 <= yaw && yaw < 360.0) {
public void move(Entity entity, Vector vector) {
((CraftEntity) entity).getHandle().move(vector.getX(), vector.getY(), vector.getZ());
}

@Override
public BoundingBox getBoundingBox(Entity entity) {
AxisAlignedBB boundingBox = ((CraftEntity) entity).getHandle().getBoundingBox();
Vector position = new Vector(boundingBox.a, boundingBox.b, boundingBox.c);
Vector size = new Vector(boundingBox.d, boundingBox.e, boundingBox.f);
return new BoundingBox(position, size);
}

@Override
public void setBoundingBox(Entity entity, BoundingBox boundingBox) {
Vector position = boundingBox.getPosition();
Vector size = boundingBox.getSize();
((CraftEntity) entity).getHandle().a(new AxisAlignedBB(position.getX(), position.getY(), position.getZ(),
size.getX(), size.getY(), size.getZ()));
}
}

0 comments on commit 58a41a8

Please sign in to comment.