added 'exact' to 'trace' in entity API
This commit is contained in:
1 parent
324d9549c8
commit
208d07bf47
3 files changed
+19
-4
No files matched your search
@@ -434,13 +434,17 @@ where entity is looking at. From most prominent (order 0) to opposite (order 5,
|
||||
|
||||
Returns the result of ray tracing from entity perspective, indicating what it is looking at. Default reach is 4.5
|
||||
blocks (5 for creative players), and by default it traces for blocks and entities, identical to player attack tracing
|
||||
action. This can be customized with `options`, use 'blocks' to trace for blocks, 'liquids' to include liquid blocks
|
||||
as possible results, and 'entities' to trace entities. Any combination of the above is possible. When tracing
|
||||
action. This can be customized with `options`, use `'blocks'` to trace for blocks, `'liquids'` to include liquid blocks
|
||||
as possible results, and `'entities'` to trace entities. You can also specify `'exact'` which returns the actual hit
|
||||
coordinate as a triple, instead of a block or entity value. Any combination of the above is possible. When tracing
|
||||
entities and blocks, blocks will take over the priority even if transparent or non-colliding
|
||||
(aka fighting chickens in tall grass).
|
||||
|
||||
Regardless of the options selected, the result could be `null` if nothing is in reach, entity, if look targets an
|
||||
entity, and block value if block is in reach.
|
||||
Regardless of the options selected, the result could be:
|
||||
- `null` if nothing is in reach
|
||||
- an entity if look targets an entity
|
||||
- block value if block is in reach, or
|
||||
- a coordinate triple if `'exact'` option was used and hit was successful.
|
||||
|
||||
### `query(e, 'brain', memory)`
|
||||
|
||||
|
||||
@@ -552,6 +552,7 @@ public class EntityValue extends Value
|
||||
boolean entities = true;
|
||||
boolean liquids = false;
|
||||
boolean blocks = true;
|
||||
boolean exact = false;
|
||||
|
||||
if (a!=null)
|
||||
{
|
||||
@@ -578,6 +579,9 @@ public class EntityValue extends Value
|
||||
blocks = true;
|
||||
else if (what.equalsIgnoreCase("liquids"))
|
||||
liquids = true;
|
||||
else if (what.equalsIgnoreCase("exact"))
|
||||
exact = true;
|
||||
|
||||
else throw new InternalExpressionException("Incorrect tracing: "+what);
|
||||
}
|
||||
}
|
||||
@@ -597,6 +601,7 @@ public class EntityValue extends Value
|
||||
hitres = Tracer.rayTraceBlocks(e, 1, reach, liquids);
|
||||
|
||||
if (hitres == null) return Value.NULL;
|
||||
if (exact && hitres.getType() != HitResult.Type.MISS) return ValueConversions.fromVec(hitres.getPos());
|
||||
switch (hitres.getType())
|
||||
{
|
||||
case MISS: return Value.NULL;
|
||||
|
||||
@@ -12,6 +12,7 @@ import net.minecraft.util.Identifier;
|
||||
|
||||
import net.minecraft.util.dynamic.GlobalPos;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.registry.RegistryKey;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -29,6 +30,11 @@ public class ValueConversions
|
||||
return ListValue.of(new NumericValue(pos.getX()), new NumericValue(pos.getY()), new NumericValue(pos.getZ()));
|
||||
}
|
||||
|
||||
public static Value fromVec(Vec3d vec)
|
||||
{
|
||||
return ListValue.of(new NumericValue(vec.x), new NumericValue(vec.y), new NumericValue(vec.z));
|
||||
}
|
||||
|
||||
public static Value dimName(ServerWorld world)
|
||||
{
|
||||
return ofId(world.getRegistryKey().getValue());
|
||||
|
||||
Reference in new issue
Block a user