entity_area now accepts tuple arguments, and ai_tracker shows correctly player item pickup area
This commit is contained in:
1 parent
d072d80df0
commit
5adc3ae3f9
4 files changed
+70
-27
No files matched your search
@@ -2555,10 +2555,14 @@ living entities based on their spawn group.
|
|||||||
All categories can be preceded with `'!'` which will fetch all entities that are valid (health > 0) but not
|
All categories can be preceded with `'!'` which will fetch all entities that are valid (health > 0) but not
|
||||||
belonging to that group. Calls to `entity_list` always fetch entities from the current world that the script executes.
|
belonging to that group. Calls to `entity_list` always fetch entities from the current world that the script executes.
|
||||||
|
|
||||||
### `entity_area(type, cx, cy, cz, dx, dy, dz)`
|
### `entity_area(type, center, distance)`
|
||||||
|
|
||||||
Returns entities of a specified type in an area centered on `cx, cy, cz` and at most `dx, dy, dz` blocks away from
|
|
||||||
the center point. Uses the same selectors as `entities_list`.
|
Returns entities of a specified type in an area centered on `center` and at most `distance` blocks away from
|
||||||
|
the center point. Uses the same `type` selectors as `entities_list`.
|
||||||
|
|
||||||
|
`center` and `distance` can either be a triple of coordinates or three consecutive arguments for `entity_area`. `center` can
|
||||||
|
also be represented as a block, in this case the search box will be centered on the middle of the block.
|
||||||
|
|
||||||
entity_area is simpler than `entity_selector` and runs about 20% faster, but is limited to predefined selectors and
|
entity_area is simpler than `entity_selector` and runs about 20% faster, but is limited to predefined selectors and
|
||||||
cuboid search area.
|
cuboid search area.
|
||||||
|
|||||||
@@ -56,10 +56,14 @@ living entities based on their spawn group.
|
|||||||
All categories can be preceded with `'!'` which will fetch all entities that are valid (health > 0) but not
|
All categories can be preceded with `'!'` which will fetch all entities that are valid (health > 0) but not
|
||||||
belonging to that group. Calls to `entity_list` always fetch entities from the current world that the script executes.
|
belonging to that group. Calls to `entity_list` always fetch entities from the current world that the script executes.
|
||||||
|
|
||||||
### `entity_area(type, cx, cy, cz, dx, dy, dz)`
|
### `entity_area(type, center, distance)`
|
||||||
|
|
||||||
Returns entities of a specified type in an area centered on `cx, cy, cz` and at most `dx, dy, dz` blocks away from
|
|
||||||
the center point. Uses the same selectors as `entities_list`.
|
Returns entities of a specified type in an area centered on `center` and at most `distance` blocks away from
|
||||||
|
the center point. Uses the same `type` selectors as `entities_list`.
|
||||||
|
|
||||||
|
`center` and `distance` can either be a triple of coordinates or three consecutive arguments for `entity_area`. `center` can
|
||||||
|
also be represented as a block, in this case the search box will be centered on the middle of the block.
|
||||||
|
|
||||||
entity_area is simpler than `entity_selector` and runs about 20% faster, but is limited to predefined selectors and
|
entity_area is simpler than `entity_selector` and runs about 20% faster, but is limited to predefined selectors and
|
||||||
cuboid search area.
|
cuboid search area.
|
||||||
|
|||||||
@@ -191,19 +191,20 @@ public class Entities {
|
|||||||
return (_c, _t ) -> retval;
|
return (_c, _t ) -> retval;
|
||||||
});
|
});
|
||||||
|
|
||||||
expression.addLazyFunction("entity_area", 7, (c, t, lv) ->
|
expression.addLazyFunction("entity_area", -1, (c, t, lv) ->
|
||||||
{
|
{
|
||||||
Vec3d center = new Vec3d(
|
if (lv.size()<3) throw new InternalExpressionException("'entity_area' requires entity type, center and range arguments");
|
||||||
NumericValue.asNumber(lv.get(1).evalValue(c)).getDouble(),
|
|
||||||
NumericValue.asNumber(lv.get(2).evalValue(c)).getDouble(),
|
|
||||||
NumericValue.asNumber(lv.get(3).evalValue(c)).getDouble()
|
|
||||||
);
|
|
||||||
Box area = new Box(center, center).expand(
|
|
||||||
NumericValue.asNumber(lv.get(4).evalValue(c)).getDouble(),
|
|
||||||
NumericValue.asNumber(lv.get(5).evalValue(c)).getDouble(),
|
|
||||||
NumericValue.asNumber(lv.get(6).evalValue(c)).getDouble()
|
|
||||||
);
|
|
||||||
String who = lv.get(0).evalValue(c).getString();
|
String who = lv.get(0).evalValue(c).getString();
|
||||||
|
CarpetContext cc = (CarpetContext)c;
|
||||||
|
Vector3Argument centerLocator = Vector3Argument.findIn(cc, lv, 1);
|
||||||
|
Vec3d center = centerLocator.vec;
|
||||||
|
if (centerLocator.fromBlock) center.add(0.5, 0.5, 0.5);
|
||||||
|
Vector3Argument rangeLocator = Vector3Argument.findIn(cc, lv, centerLocator.offset);
|
||||||
|
if (rangeLocator.fromBlock)
|
||||||
|
throw new InternalExpressionException("Range of 'entity_area' cannot come from a block argument");
|
||||||
|
Vec3d range = rangeLocator.vec;
|
||||||
|
Box area = new Box(center, center).expand(range.x, range.y, range.z);
|
||||||
|
|
||||||
Pair<EntityType<?>, Predicate<? super Entity>> pair = EntityValue.getPredicate(who);
|
Pair<EntityType<?>, Predicate<? super Entity>> pair = EntityValue.getPredicate(who);
|
||||||
if (pair == null)
|
if (pair == null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -161,21 +161,55 @@ global_functions = {
|
|||||||
'item_pickup' -> {
|
'item_pickup' -> {
|
||||||
'*' -> [
|
'*' -> [
|
||||||
_(arg) -> _(e) -> (
|
_(arg) -> _(e) -> (
|
||||||
if (e~'type' == 'player', return([[],[],[]]));
|
|
||||||
visuals = [];
|
visuals = [];
|
||||||
abnoxious_visuals = [];
|
abnoxious_visuals = [];
|
||||||
half_width = e~'width'/2;
|
e_half_width = e~'width'/2;
|
||||||
height = e~'height';
|
e_height = e~'height';
|
||||||
__create_box(abnoxious_visuals, e,
|
[box_from, box_to, color] = if (e~'type' == 'player',
|
||||||
[-1-half_width,0,-1-half_width],
|
|
||||||
[1+half_width, height,1+half_width],
|
if ((ride = e~'mount') != null,
|
||||||
0xffff0000, 'item range', false
|
rpos = pos(ride)-pos(e);
|
||||||
|
r_half_width = ride~'width'/2;
|
||||||
|
r_height = ride~'height';
|
||||||
|
[ [
|
||||||
|
-1+min(-e_half_width, rpos:0-r_half_width),
|
||||||
|
min(0, rpos:1),
|
||||||
|
-1+min(-e_half_width, rpos:2-r_half_width)
|
||||||
|
], [
|
||||||
|
1+max(e_half_width, rpos:0+r_half_width),
|
||||||
|
max(e_height, rpos:1+r_height),
|
||||||
|
1+max(e_half_width, rpos:2+r_half_width)
|
||||||
|
], 0xffaa0000
|
||||||
|
]
|
||||||
|
,
|
||||||
|
[
|
||||||
|
[ -1-e_half_width, -0.5, -1-e_half_width ],
|
||||||
|
[ 1+e_half_width, e_height+0.5, 1+e_half_width ],
|
||||||
|
0xffaa0000
|
||||||
|
]
|
||||||
|
)
|
||||||
|
,
|
||||||
|
|
||||||
|
[
|
||||||
|
[ -1-e_half_width, 0, -1-e_half_width ],
|
||||||
|
[ 1+e_half_width, e_height, 1+e_half_width ],
|
||||||
|
0xffff0000
|
||||||
|
]
|
||||||
);
|
);
|
||||||
[x,y,z] = pos(e);
|
box_ctr = (box_from+box_to)/2;
|
||||||
for (filter(entity_area('item', x, y+height/2, z, 1+half_width, height/2, 1+half_width), pos(_) != pos(e)),
|
box_range = box_ctr-box_from;
|
||||||
|
|
||||||
|
__create_box(abnoxious_visuals, e,
|
||||||
|
box_from,
|
||||||
|
box_to,
|
||||||
|
color, 'item range', false
|
||||||
|
);
|
||||||
|
for (filter(entity_area('item', pos(e)+box_ctr, box_range), pos(_) != pos(e)),
|
||||||
visuals+=['line', global_duration, 'from', pos(e)+[0,1,0], 'to', pos(_)+[0,0,0], 'color', 0xffff00ff]
|
visuals+=['line', global_duration, 'from', pos(e)+[0,1,0], 'to', pos(_)+[0,0,0], 'color', 0xffff00ff]
|
||||||
);
|
);
|
||||||
[visuals, abnoxious_visuals, []];
|
|
||||||
|
|
||||||
|
[visuals, abnoxious_visuals, []]
|
||||||
),
|
),
|
||||||
,
|
,
|
||||||
null
|
null
|
||||||
|
|||||||
Reference in new issue
Block a user