@@ -8,12 +8,16 @@ function NativeCrabAI:Create(Owner)
8
8
local Members = {};
9
9
10
10
Members .lateralMoveState = Actor .LAT_STILL ;
11
+ Members .jumpState = ACrab .NOTJUMPING ;
11
12
Members .deviceState = ACrab .STILL ;
12
13
Members .lastAIMode = Actor .AIMODE_NONE ;
13
14
Members .teamBlockState = Actor .NOTBLOCKED ;
14
15
Members .SentryFacing = Owner .HFlipped ;
15
16
Members .fire = false ;
17
+ Members .groundContact = 5 ;
18
+ Members .flying = false ;
16
19
20
+ Members .AirTimer = Timer ();
17
21
Members .ReloadTimer = Timer ();
18
22
Members .BlockedTimer = Timer ();
19
23
Members .TargetLostTimer = Timer ();
@@ -38,6 +42,15 @@ function NativeCrabAI:Create(Owner)
38
42
-- set shooting skill
39
43
Members .aimSpeed , Members .aimSkill = SharedBehaviors .GetTeamShootingSkill (Owner .Team );
40
44
45
+ -- the native AI assume the jetpack cannot be destroyed
46
+ if Owner .Jetpack then
47
+ if not Members .isPlayerOwned then
48
+ Owner .Jetpack .JetTimeTotal = Owner .Jetpack .JetTimeTotal * 1.2 ; -- increase jetpack fuel to compensate for extra fuel spend
49
+ end
50
+
51
+ Members .minBurstTime = math.min (Owner .Jetpack .BurstSpacing * 2 , Owner .Jetpack .JetTimeTotal * 0.99 ); -- in milliseconds
52
+ end
53
+
41
54
setmetatable (Members , self );
42
55
self .__index = self ;
43
56
return Members ;
46
59
function NativeCrabAI :Update (Owner )
47
60
self .Ctrl = Owner :GetController ();
48
61
62
+ -- Our jetpack might have thrust balancing enabled, so update for our current mass
63
+ if Owner .Jetpack then
64
+ self .jetImpulseFactor = Owner .Jetpack :EstimateImpulse (false ) * GetPPM () / TimerMan .DeltaTimeSecs ;
65
+ self .jetBurstFactor = (Owner .Jetpack :EstimateImpulse (true ) * GetPPM () / TimerMan .DeltaTimeSecs - self .jetImpulseFactor ) * math.pow (TimerMan .DeltaTimeSecs , 2 ) * 0.5 ;
66
+ end
67
+
49
68
if self .isPlayerOwned then
50
69
if self .PlayerInterferedTimer :IsPastSimTimeLimit () then
51
70
-- Tell the coroutines to abort to avoid memory leaks
@@ -273,6 +292,50 @@ function NativeCrabAI:Update(Owner)
273
292
end
274
293
end
275
294
295
+ -- check if the feet reach the ground
296
+ if self .AirTimer :IsPastSimMS (250 ) then
297
+ self .AirTimer :Reset ();
298
+
299
+ local Origin = {};
300
+ if Owner .LeftFGLeg then
301
+ table.insert (Origin , Vector (Owner .LeftFGLeg .Pos .X , Owner .LeftFGLeg .Pos .Y ) + Vector (0 , 4 ));
302
+ end
303
+ if Owner .RightFGLeg then
304
+ table.insert (Origin , Vector (Owner .RightFGLeg .Pos .X , Owner .RightFGLeg .Pos .Y ) + Vector (0 , 4 ));
305
+ end
306
+ if Owner .LeftBGLeg then
307
+ table.insert (Origin , Vector (Owner .LeftBGLeg .Pos .X , Owner .LeftBGLeg .Pos .Y ) + Vector (0 , 4 ));
308
+ end
309
+ if Owner .RightBGLeg then
310
+ table.insert (Origin , Vector (Owner .RightBGLeg .Pos .X , Owner .RightBGLeg .Pos .Y ) + Vector (0 , 4 ));
311
+ end
312
+ if # Origin == 0 then
313
+ table.insert (Origin , Vector (Owner .Pos .X , Owner .Pos .Y ) + Vector (0 , 4 + ToMOSprite (Owner ):GetSpriteHeight () + Owner .SpriteOffset .Y ));
314
+ end
315
+ for i = 1 , # Origin do
316
+ if SceneMan :GetTerrMatter (Origin [i ].X , Origin [i ].Y ) ~= rte .airID then
317
+ self .groundContact = 5 ;
318
+ break ;
319
+ else
320
+ self .groundContact = self .groundContact - 1 ;
321
+ end
322
+ end
323
+
324
+ local newFlying = false ;
325
+ if not (Owner .LeftFGLeg and Owner .RightFGLeg and Owner .LeftBGLeg and Owner .RightBGLeg ) then
326
+ newFlying = true ;
327
+ end
328
+
329
+ if self .groundContact < 0 then
330
+ newFlying = true ;
331
+ end
332
+
333
+ if self .flying ~= newFlying then
334
+ Owner :SendMessage (" AI_IsFlying" , newFlying );
335
+ self .flying = newFlying ;
336
+ end
337
+ end
338
+
276
339
-- controller states
277
340
self .Ctrl :SetState (Controller .WEAPON_FIRE , self .fire or self .squadShoot );
278
341
@@ -285,6 +348,24 @@ function NativeCrabAI:Update(Owner)
285
348
elseif self .lateralMoveState == Actor .LAT_RIGHT then
286
349
self .Ctrl :SetState (Controller .MOVE_RIGHT , true );
287
350
end
351
+
352
+ if self .jump and Owner .Jetpack and Owner .Jetpack .JetTimeLeft > TimerMan .AIDeltaTimeMS then
353
+ if self .jumpState == ACrab .PREJUMP then
354
+ self .jumpState = ACrab .UPJUMP ;
355
+ elseif self .jumpState ~= ACrab .UPJUMP then -- the jetpack is off
356
+ self .jumpState = ACrab .PREJUMP ;
357
+ end
358
+ else
359
+ self .jumpState = ACrab .NOTJUMPING ;
360
+ end
361
+
362
+ if Owner .Jetpack then
363
+ if self .jumpState == ACrab .PREJUMP then
364
+ self .Ctrl :SetState (Controller .BODY_JUMPSTART , true ); -- try to trigger a burst
365
+ elseif self .jumpState == ACrab .UPJUMP then
366
+ self .Ctrl :SetState (Controller .BODY_JUMP , true ); -- trigger normal jetpack emission
367
+ end
368
+ end
288
369
end
289
370
290
371
function NativeCrabAI :Destroy (Owner )
0 commit comments