Skip to content

Commit 7bef333

Browse files
Cokemonkey11Frotty
authored andcommitted
add configurable heightmap provider (#303)
1 parent 578e28f commit 7bef333

File tree

1 file changed

+26
-16
lines changed

1 file changed

+26
-16
lines changed

wurst/util/Knockback3.wurst

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
destroy them. To disable this feature, make the global
2222
destroyDestructableSpeedThreshold a very high value:
2323

24-
Knockback3.destroyDestructableSpeedThreshold = 999999999.
24+
Knockback3.destroyDestructableSpeedThreshold = 999999999.
2525

2626
This value defaults to 300.
2727
*/
@@ -32,14 +32,24 @@ import LinkedListModule
3232
import HashMap
3333
import Objects
3434

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+
3545
/** The square rect size used for finding destructables. */
36-
@configurable let DESTRUCTABLE_ENUM_SIZE = 130.
46+
@configurable let DESTRUCTABLE_ENUM_SIZE = 130.
3747

3848
/**
3949
If enabled, units have their move-speed changed while airborne.
4050
Warning: this is not a lock-safe form of crowd control.
4151
*/
42-
@configurable let USE_MOVE_SPEED_MODIFIERS = true
52+
@configurable let USE_MOVE_SPEED_MODIFIERS = true
4353

4454
/**
4555
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.
5060
public class Knockback3
5161
use LinkedListModule
5262

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
5565
static var restitutionCoefficientDestructable = .3
5666

5767
/** Ratio. */
@@ -98,13 +108,13 @@ public class Knockback3
98108
*/
99109
static function add(unit u, real velocity, angle groundAngle, angle airAngle)
100110
let instVel = velocity * ANIMATION_PERIOD
101-
let v = ZERO3.polarProject(instVel, groundAngle, airAngle)
111+
let v = ZERO3.polarProject(instVel, groundAngle, airAngle)
102112
if unitNodes.has(u)
103113
unitNodes.get(u).del += v
104114
else
105115
let knockback = new Knockback3()
106116
unitNodes.put(u, knockback)
107-
knockback.u = u
117+
knockback.u = u
108118
knockback.del = v
109119
if size == 1
110120
clock.startPeriodic(ANIMATION_PERIOD, function tick)
@@ -120,10 +130,10 @@ public class Knockback3
120130
angle will always be used from the pair of possible trajectories. Example:
121131
*/
122132
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
124134
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)
127137
let speed = vel.length()
128138

129139
add(u, speed, theta, vec2(groundSpeed, vel.z).getAngle())
@@ -132,7 +142,7 @@ public class Knockback3
132142
static function setVel(unit u, real velocity, angle groundAngle, angle airAngle)
133143
if unitNodes.has(u)
134144
let knockback = unitNodes.get(u)
135-
let instVel = velocity * ANIMATION_PERIOD
145+
let instVel = velocity * ANIMATION_PERIOD
136146

137147
knockback.del = ZERO3.polarProject(instVel, groundAngle, airAngle)
138148
else
@@ -177,10 +187,10 @@ public class Knockback3
177187

178188
private static function tickAboveGround(Knockback3 knockback, vec3 newPos3, vec3 pos3)
179189
knockback.del.z -= gravity * ANIMATION_PERIOD
180-
let heightDifference = newPos3.getTerrainZ() - pos3.getTerrainZ()
190+
let heightDifference = HEIGHTMAP_PROVIDER.get(newPos3) - HEIGHTMAP_PROVIDER.get(pos3)
181191

182192
knockback.u..setFlyHeight(newPos3.z - heightDifference, 0.)
183-
..setXY(newPos3)
193+
..setXY(newPos3)
184194

185195
if USE_MOVE_SPEED_MODIFIERS
186196
knockback.u.setMoveSpeed(0.)
@@ -218,12 +228,12 @@ public class Knockback3
218228
knockback.u.setPropWindow(knockback.u.getDefaultPropWindow() * bj_DEGTORAD)
219229

220230

221-
private static let clock = CreateTimer()
231+
private static let clock = CreateTimer()
222232

223233
private static function tick()
224234
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
227237

228238
if not newPos3.inPlayable()
229239
newPos3.x = pos3.x

0 commit comments

Comments
 (0)