21
21
destroy them. To disable this feature, make the global
22
22
destroyDestructableSpeedThreshold a very high value:
23
23
24
- Knockback3.destroyDestructableSpeedThreshold = 999999999.
24
+ Knockback3.destroyDestructableSpeedThreshold = 999999999.
25
25
26
26
This value defaults to 300.
27
27
*/
@@ -32,14 +32,24 @@ import LinkedListModule
32
32
import HashMap
33
33
import Objects
34
34
35
+ /** A vec3 -> real function. */
36
+ public interface TerrainZProvider
37
+ function get(vec3 where) returns real
38
+
39
+ /**
40
+ If configured, provides an alternative source for getting terrain z-height.
41
+ This can be useful for avoiding a desync in some cases.
42
+ */
43
+ @configurable TerrainZProvider HEIGHTMAP_PROVIDER = (vec3 w) -> w.getTerrainZ()
44
+
35
45
/** The square rect size used for finding destructables. */
36
- @configurable let DESTRUCTABLE_ENUM_SIZE = 130.
46
+ @configurable let DESTRUCTABLE_ENUM_SIZE = 130.
37
47
38
48
/**
39
49
If enabled, units have their move-speed changed while airborne.
40
50
Warning: this is not a lock-safe form of crowd control.
41
51
*/
42
- @configurable let USE_MOVE_SPEED_MODIFIERS = true
52
+ @configurable let USE_MOVE_SPEED_MODIFIERS = true
43
53
44
54
/**
45
55
If enabled, units have their prop window changed while airborne.
@@ -50,8 +60,8 @@ Warning: this is not a lock-safe form of crowd control.
50
60
public class Knockback3
51
61
use LinkedListModule
52
62
53
- /** Fraction of velocity retained after colliding with ground/destructable. */
54
- static var restitutionCoefficientGround = .2
63
+ /** Fraction of velocity retained after colliding with ground/destructable. */
64
+ static var restitutionCoefficientGround = .2
55
65
static var restitutionCoefficientDestructable = .3
56
66
57
67
/** Ratio. */
@@ -98,13 +108,13 @@ public class Knockback3
98
108
*/
99
109
static function add(unit u, real velocity, angle groundAngle, angle airAngle)
100
110
let instVel = velocity * ANIMATION_PERIOD
101
- let v = ZERO3.polarProject(instVel, groundAngle, airAngle)
111
+ let v = ZERO3.polarProject(instVel, groundAngle, airAngle)
102
112
if unitNodes.has(u)
103
113
unitNodes.get(u).del += v
104
114
else
105
115
let knockback = new Knockback3()
106
116
unitNodes.put(u, knockback)
107
- knockback.u = u
117
+ knockback.u = u
108
118
knockback.del = v
109
119
if size == 1
110
120
clock.startPeriodic(ANIMATION_PERIOD, function tick)
@@ -120,10 +130,10 @@ public class Knockback3
120
130
angle will always be used from the pair of possible trajectories. Example:
121
131
*/
122
132
static function add(unit u, vec2 target, real groundSpeed)
123
- let t = (target - u.getPos()).length() / groundSpeed
133
+ let t = (target - u.getPos()).length() / groundSpeed
124
134
let theta = u.getPos().angleTo(target)
125
- let velZ = gravity * t / 2. / ANIMATION_PERIOD
126
- let vel = theta.toVec(groundSpeed).withZ(velZ)
135
+ let velZ = gravity * t / 2. / ANIMATION_PERIOD
136
+ let vel = theta.toVec(groundSpeed).withZ(velZ)
127
137
let speed = vel.length()
128
138
129
139
add(u, speed, theta, vec2(groundSpeed, vel.z).getAngle())
@@ -132,7 +142,7 @@ public class Knockback3
132
142
static function setVel(unit u, real velocity, angle groundAngle, angle airAngle)
133
143
if unitNodes.has(u)
134
144
let knockback = unitNodes.get(u)
135
- let instVel = velocity * ANIMATION_PERIOD
145
+ let instVel = velocity * ANIMATION_PERIOD
136
146
137
147
knockback.del = ZERO3.polarProject(instVel, groundAngle, airAngle)
138
148
else
@@ -177,10 +187,10 @@ public class Knockback3
177
187
178
188
private static function tickAboveGround(Knockback3 knockback, vec3 newPos3, vec3 pos3)
179
189
knockback.del.z -= gravity * ANIMATION_PERIOD
180
- let heightDifference = newPos3.getTerrainZ( ) - pos3.getTerrainZ( )
190
+ let heightDifference = HEIGHTMAP_PROVIDER.get(newPos3 ) - HEIGHTMAP_PROVIDER.get(pos3 )
181
191
182
192
knockback.u..setFlyHeight(newPos3.z - heightDifference, 0.)
183
- ..setXY(newPos3)
193
+ ..setXY(newPos3)
184
194
185
195
if USE_MOVE_SPEED_MODIFIERS
186
196
knockback.u.setMoveSpeed(0.)
@@ -218,12 +228,12 @@ public class Knockback3
218
228
knockback.u.setPropWindow(knockback.u.getDefaultPropWindow() * bj_DEGTORAD)
219
229
220
230
221
- private static let clock = CreateTimer()
231
+ private static let clock = CreateTimer()
222
232
223
233
private static function tick()
224
234
for knockback from staticItr()
225
- let pos3 = knockback.u.getPos3Fly()
226
- var newPos3 = pos3 + knockback.del
235
+ let pos3 = knockback.u.getPos3Fly()
236
+ var newPos3 = pos3 + knockback.del
227
237
228
238
if not newPos3.inPlayable()
229
239
newPos3.x = pos3.x
0 commit comments