271 lines
5.2 KiB
Markdown
271 lines
5.2 KiB
Markdown
---
|
|
title: Selectors
|
|
type: docs
|
|
weight: 2
|
|
---
|
|
|
|
Selectors determine which entities or blocks are targeted by an interaction.
|
|
|
|
**Package:** `com.hypixel.hytale.server.core.modules.interaction.interaction.config.selector`
|
|
|
|
## Selector Types
|
|
|
|
### RaycastSelector
|
|
|
|
Casts a ray from the player's view to find targets:
|
|
|
|
```yaml
|
|
Selector:
|
|
Type: Raycast
|
|
Range: 5.0
|
|
BlockCollision: true
|
|
EntityCollision: true
|
|
```
|
|
|
|
Properties:
|
|
- `Range` - Maximum distance
|
|
- `BlockCollision` - Stop at blocks
|
|
- `EntityCollision` - Detect entities
|
|
|
|
### AOECircleSelector
|
|
|
|
Selects all targets in a circular area:
|
|
|
|
```yaml
|
|
Selector:
|
|
Type: AOECircle
|
|
Radius: 3.0
|
|
Height: 2.0
|
|
```
|
|
|
|
Properties:
|
|
- `Radius` - Circle radius
|
|
- `Height` - Vertical extent
|
|
|
|
### AOECylinderSelector
|
|
|
|
Selects targets in a cylindrical area:
|
|
|
|
```yaml
|
|
Selector:
|
|
Type: AOECylinder
|
|
Radius: 4.0
|
|
Height: 3.0
|
|
HeightOffset: 0.0
|
|
```
|
|
|
|
### StabSelector
|
|
|
|
Close-range forward attack:
|
|
|
|
```yaml
|
|
Selector:
|
|
Type: Stab
|
|
Range: 2.0
|
|
Width: 1.5
|
|
```
|
|
|
|
### HorizontalSelector
|
|
|
|
Horizontal sweep attack:
|
|
|
|
```yaml
|
|
Selector:
|
|
Type: Horizontal
|
|
Range: 3.0
|
|
Angle: 90.0
|
|
```
|
|
|
|
## Selector Interface
|
|
|
|
The `Selector` interface provides methods for targeting:
|
|
|
|
```java
|
|
import com.hypixel.hytale.component.CommandBuffer;
|
|
import com.hypixel.hytale.component.Ref;
|
|
import com.hypixel.hytale.function.consumer.TriIntConsumer;
|
|
import com.hypixel.hytale.math.vector.Vector4d;
|
|
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
|
|
import java.util.function.BiConsumer;
|
|
import java.util.function.Predicate;
|
|
|
|
public interface Selector {
|
|
// Select target entities - consumer receives entity ref AND hit location
|
|
void selectTargetEntities(
|
|
CommandBuffer<EntityStore> buffer,
|
|
Ref<EntityStore> attacker,
|
|
BiConsumer<Ref<EntityStore>, Vector4d> consumer,
|
|
Predicate<Ref<EntityStore>> filter
|
|
);
|
|
|
|
// Select target blocks
|
|
void selectTargetBlocks(
|
|
CommandBuffer<EntityStore> buffer,
|
|
Ref<EntityStore> attacker,
|
|
TriIntConsumer consumer
|
|
);
|
|
|
|
// Update selector state each tick
|
|
void tick(
|
|
CommandBuffer<EntityStore> buffer,
|
|
Ref<EntityStore> entity,
|
|
float startTime,
|
|
float currentTime
|
|
);
|
|
}
|
|
```
|
|
|
|
{{< callout type="info" >}}
|
|
**Note:** The instance method `selectTargetEntities()` provides hit location via `Vector4d`, while the static `selectNearbyEntities()` only provides entity references.
|
|
{{< /callout >}}
|
|
|
|
## Entity Matchers
|
|
|
|
Filter which entities can be selected:
|
|
|
|
### VulnerableMatcher
|
|
|
|
Only select entities that can take damage:
|
|
|
|
```yaml
|
|
Matcher:
|
|
Type: Vulnerable
|
|
```
|
|
|
|
### PlayerMatcher
|
|
|
|
Only select players:
|
|
|
|
```yaml
|
|
Matcher:
|
|
Type: Player
|
|
```
|
|
|
|
## Static Selection Utilities
|
|
|
|
The `Selector` interface provides static methods for common operations:
|
|
|
|
### Select Nearby Blocks
|
|
|
|
```java
|
|
Selector.selectNearbyBlocks(
|
|
commandBuffer,
|
|
attackerRef,
|
|
range,
|
|
(x, y, z) -> {
|
|
// Process each block position
|
|
}
|
|
);
|
|
|
|
// Or from a position
|
|
Selector.selectNearbyBlocks(
|
|
position,
|
|
range,
|
|
(x, y, z) -> {
|
|
// Process each block position
|
|
}
|
|
);
|
|
```
|
|
|
|
### Select Nearby Entities
|
|
|
|
```java
|
|
import java.util.function.Consumer;
|
|
import java.util.function.Predicate;
|
|
|
|
Selector.selectNearbyEntities(
|
|
commandBuffer,
|
|
attackerRef,
|
|
range,
|
|
(Consumer<Ref<EntityStore>>) entityRef -> {
|
|
// Process each entity
|
|
},
|
|
(Predicate<Ref<EntityStore>>) entityRef -> {
|
|
// Filter predicate - return true to include
|
|
return true;
|
|
}
|
|
);
|
|
|
|
// Or from a position with ComponentAccessor
|
|
Selector.selectNearbyEntities(
|
|
componentAccessor,
|
|
position,
|
|
range,
|
|
entityRef -> {
|
|
// Process each entity
|
|
},
|
|
entityRef -> true // Filter or null
|
|
);
|
|
```
|
|
|
|
{{< callout type="info" >}}
|
|
**Note:** The consumer receives `Ref<EntityStore>` only. For entity hit positions (like `Vector4d`), use `selectTargetEntities()` from a Selector instance instead.
|
|
{{< /callout >}}
|
|
|
|
## Practical Examples
|
|
|
|
### Sword Slash
|
|
|
|
```yaml
|
|
SwordSlash:
|
|
Type: DamageCalculator
|
|
Selector:
|
|
Type: Horizontal
|
|
Range: 2.5
|
|
Angle: 120.0
|
|
Matcher:
|
|
Type: Vulnerable
|
|
Damage:
|
|
Base: 10.0
|
|
Type: Physical
|
|
```
|
|
|
|
### Healing Aura
|
|
|
|
```yaml
|
|
HealingAura:
|
|
Type: ChangeStatInteraction
|
|
Selector:
|
|
Type: AOECircle
|
|
Radius: 5.0
|
|
Height: 3.0
|
|
Matcher:
|
|
Type: Player
|
|
Stat: Health
|
|
Amount: 5.0
|
|
```
|
|
|
|
### Mining
|
|
|
|
```yaml
|
|
Mining:
|
|
Type: BreakBlock
|
|
Selector:
|
|
Type: Raycast
|
|
Range: 4.0
|
|
BlockCollision: true
|
|
EntityCollision: false
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
{{< callout type="info" >}}
|
|
**Selector Guidelines:**
|
|
- Use appropriate range for the interaction type
|
|
- Apply filters to avoid unintended targets
|
|
- Consider performance with large AOE selectors
|
|
- Use raycast for precision attacks
|
|
- Always check `entity.isValid()` before accessing entity components
|
|
{{< /callout >}}
|
|
|
|
{{< callout type="warning" >}}
|
|
**Entity Validity:** Before interacting with an entity, verify it is still valid to prevent null pointer exceptions:
|
|
```java
|
|
if (entityRef.isValid()) {
|
|
// Safe to access entity components
|
|
// ... perform operations
|
|
}
|
|
```
|
|
The server validates entity references internally, but custom code should always check validity with `Ref.isValid()`.
|
|
{{< /callout >}}
|