@@ -17,7 +17,6 @@ import net.minecraft.entity.Entity
1717import net.minecraft.entity.player.EntityPlayer
1818import net.minecraftforge.fml.common.gameevent.TickEvent
1919import java.util.concurrent.ConcurrentHashMap
20- import kotlin.math.min
2120
2221object Tracers : Module(
2322 name = " Tracers" ,
@@ -49,6 +48,7 @@ object Tracers : Module(
4948 private val alpha by setting(" Alpha" , 255 , 0 .. 255 , 1 , { page == Page .RENDERING })
5049 private val yOffset by setting(" Y Offset Percentage" , 0 , 0 .. 100 , 5 , { page == Page .RENDERING })
5150 private val thickness by setting(" Line Thickness" , 2.0f , 0.25f .. 5.0f , 0.25f , { page == Page .RENDERING })
51+ private val fadeSpeed by setting(" Fade Speed" , 150 , 0 .. 500 , 25 , { page == Page .RENDERING }, unit = " ms" )
5252
5353 /* Range color settings */
5454 private val rangedColor by setting(" Ranged Color" , true , { page == Page .RANGE_COLOR })
@@ -60,7 +60,7 @@ object Tracers : Module(
6060 ENTITY_TYPE , COLOR , RENDERING , RANGE_COLOR
6161 }
6262
63- private var renderList = ConcurrentHashMap <Entity , Pair < ColorHolder , Float >>() /* <Entity, <RGBAColor, AlphaMultiplier>> */
63+ private var renderList = ConcurrentHashMap <Entity , TracerData >()
6464 private var cycler = HueCycler (600 )
6565 private val renderer = ESPRenderer ()
6666
@@ -70,9 +70,19 @@ object Tracers : Module(
7070 renderer.thickness = thickness
7171 renderer.tracerOffset = yOffset
7272
73- for ((entity, pair) in renderList) {
74- val rgba = pair.first.clone()
75- rgba.a = (rgba.a * pair.second).toInt()
73+ for ((entity, tracerData) in renderList) {
74+ val rgba = tracerData.color.clone()
75+
76+ if (fadeSpeed > 0 ) {
77+ val animationCoefficient = tracerData.age * tracerData.color.a / fadeSpeed
78+
79+ rgba.a = if (tracerData.isEntityPresent) {
80+ animationCoefficient.toInt().coerceAtMost(tracerData.color.a)
81+ } else {
82+ (- animationCoefficient + tracerData.color.a).toInt().coerceAtLeast(0 )
83+ }
84+ }
85+
7686 renderer.add(entity, rgba)
7787 }
7888
@@ -91,22 +101,26 @@ object Tracers : Module(
91101 ArrayList ()
92102 }
93103
94- val cacheMap = HashMap <Entity , Pair <ColorHolder , Float >>()
95- for (entity in entityList) {
96- cacheMap[entity] = Pair (getColor(entity), 0f )
104+ entityList.forEach { entity ->
105+ renderList.computeIfAbsent(entity) {
106+ TracerData (getColor(entity), System .currentTimeMillis(), true )
107+ }
97108 }
98109
99- for ((entity, pair) in renderList) {
100- cacheMap.computeIfPresent(entity) { _, cachePair -> Pair (cachePair.first, min(pair.second + 0.075f , 1f )) }
101- cacheMap.computeIfAbsent(entity) { Pair (getColor(entity), pair.second - 0.05f ) }
110+ renderList.forEach { (entity, tracerData) ->
111+ if (entityList.contains(entity)) {
112+ tracerData.color = getColor(entity)
113+ return @forEach
114+ }
102115
103- if (pair.second < 0f ) {
104- cacheMap.remove(entity)
116+ if (tracerData.isEntityPresent) {
117+ tracerData.isEntityPresent = false
118+ tracerData.timeStamp = System .currentTimeMillis()
119+ return @forEach
105120 }
106- }
107121
108- renderList.clear( )
109- renderList.putAll(cacheMap)
122+ if (tracerData.age > fadeSpeed || fadeSpeed == 0 ) renderList.remove(entity )
123+ }
110124 }
111125 }
112126
@@ -132,4 +146,8 @@ object Tracers : Module(
132146 val a = convertRange(distance, 0f , colorChangeRange.toFloat(), alpha.toFloat(), alphaFar.toFloat()).toInt()
133147 return ColorHolder (r, g, b, a)
134148 }
149+
150+ private data class TracerData (var color : ColorHolder , var timeStamp : Long , var isEntityPresent : Boolean ) {
151+ val age get() = System .currentTimeMillis() - timeStamp
152+ }
135153}
0 commit comments