@@ -17,7 +17,6 @@ import net.minecraft.entity.Entity
17
17
import net.minecraft.entity.player.EntityPlayer
18
18
import net.minecraftforge.fml.common.gameevent.TickEvent
19
19
import java.util.concurrent.ConcurrentHashMap
20
- import kotlin.math.min
21
20
22
21
object Tracers : Module(
23
22
name = " Tracers" ,
@@ -49,6 +48,7 @@ object Tracers : Module(
49
48
private val alpha by setting(" Alpha" , 255 , 0 .. 255 , 1 , { page == Page .RENDERING })
50
49
private val yOffset by setting(" Y Offset Percentage" , 0 , 0 .. 100 , 5 , { page == Page .RENDERING })
51
50
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" )
52
52
53
53
/* Range color settings */
54
54
private val rangedColor by setting(" Ranged Color" , true , { page == Page .RANGE_COLOR })
@@ -60,7 +60,7 @@ object Tracers : Module(
60
60
ENTITY_TYPE , COLOR , RENDERING , RANGE_COLOR
61
61
}
62
62
63
- private var renderList = ConcurrentHashMap <Entity , Pair < ColorHolder , Float >>() /* <Entity, <RGBAColor, AlphaMultiplier>> */
63
+ private var renderList = ConcurrentHashMap <Entity , TracerData >()
64
64
private var cycler = HueCycler (600 )
65
65
private val renderer = ESPRenderer ()
66
66
@@ -70,9 +70,19 @@ object Tracers : Module(
70
70
renderer.thickness = thickness
71
71
renderer.tracerOffset = yOffset
72
72
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
+
76
86
renderer.add(entity, rgba)
77
87
}
78
88
@@ -91,22 +101,26 @@ object Tracers : Module(
91
101
ArrayList ()
92
102
}
93
103
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
+ }
97
108
}
98
109
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
+ }
102
115
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
105
120
}
106
- }
107
121
108
- renderList.clear( )
109
- renderList.putAll(cacheMap)
122
+ if (tracerData.age > fadeSpeed || fadeSpeed == 0 ) renderList.remove(entity )
123
+ }
110
124
}
111
125
}
112
126
@@ -132,4 +146,8 @@ object Tracers : Module(
132
146
val a = convertRange(distance, 0f , colorChangeRange.toFloat(), alpha.toFloat(), alphaFar.toFloat()).toInt()
133
147
return ColorHolder (r, g, b, a)
134
148
}
149
+
150
+ private data class TracerData (var color : ColorHolder , var timeStamp : Long , var isEntityPresent : Boolean ) {
151
+ val age get() = System .currentTimeMillis() - timeStamp
152
+ }
135
153
}
0 commit comments