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