Skip to content

Commit 7f784d1

Browse files
committed
feat: Add EntityInstancePositionVariable
1 parent 67df2ef commit 7f784d1

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.typewritermc.entity.entries.variable
2+
3+
import com.typewritermc.core.books.pages.Colors
4+
import com.typewritermc.core.entries.Ref
5+
import com.typewritermc.core.entries.emptyRef
6+
import com.typewritermc.core.exceptions.ContextDataNotFoundException
7+
import com.typewritermc.core.extension.annotations.Entry
8+
import com.typewritermc.core.extension.annotations.GenericConstraint
9+
import com.typewritermc.core.extension.annotations.VariableData
10+
import com.typewritermc.core.utils.point.Coordinate
11+
import com.typewritermc.core.utils.point.Position
12+
import com.typewritermc.core.utils.point.Vector
13+
import com.typewritermc.engine.paper.entry.entity.AudienceEntityDisplay
14+
import com.typewritermc.engine.paper.entry.entries.EntityInstanceEntry
15+
import com.typewritermc.engine.paper.entry.entries.VarContext
16+
import com.typewritermc.engine.paper.entry.entries.VariableEntry
17+
import com.typewritermc.engine.paper.entry.entries.safeCast
18+
import com.typewritermc.engine.paper.entry.findDisplay
19+
20+
@Entry(
21+
"entity_instance_position_variable",
22+
"A variable that returns the position of an entity instance",
23+
Colors.GREEN,
24+
"material-symbols:person-pin-circle"
25+
)
26+
@GenericConstraint(Position::class)
27+
@GenericConstraint(Coordinate::class)
28+
@GenericConstraint(Vector::class)
29+
@VariableData(EntityInstancePositionVariableData::class)
30+
/**
31+
* The `EntityInstancePositionVariable` is a variable that returns the position of an entity instance.
32+
*
33+
* ## How could this be used?
34+
* This can be used in combination with the [PlayerNearLocationEventEntry] to trigger an event when a player is within a certain range of an entity.
35+
*/
36+
class EntityInstancePositionVariable(
37+
override val id: String = "",
38+
override val name: String = "",
39+
val default: Position = Position.ORIGIN,
40+
) : VariableEntry {
41+
override fun <T : Any> get(context: VarContext<T>): T {
42+
val player = context.player
43+
val data = context.getData<EntityInstancePositionVariableData>()
44+
?: throw ContextDataNotFoundException(context.klass, context.data)
45+
46+
val position = data.instance.findDisplay<AudienceEntityDisplay>()?.position(player.uniqueId) ?: default
47+
48+
return context.safeCast(position)
49+
?: throw IllegalStateException("Could not cast position to ${context.klass}, EntityInstancePositionVariable is only compatible with Position/Coordinate/Vector fields")
50+
}
51+
}
52+
53+
data class EntityInstancePositionVariableData(
54+
val instance: Ref<EntityInstanceEntry> = emptyRef(),
55+
)

0 commit comments

Comments
 (0)