WEBVTT

00:06.830 --> 00:08.010
Welcome back.

00:08.030 --> 00:11.870
Now the aura damage gameplay ability has lots of parameters.

00:11.870 --> 00:13.730
Well, not a lot, but a few.

00:13.730 --> 00:16.400
And some of them have to do with debuffs.

00:16.400 --> 00:17.060
Now.

00:17.390 --> 00:27.320
Now I'd like a nice, easy to use function on our ability system library that can take in a number of

00:27.320 --> 00:35.930
parameters including a damage effect and just apply that damage effect to some target.

00:36.140 --> 00:43.070
So all the things associated with that setting all the set by color magnitudes, I'd like to be handled

00:43.070 --> 00:44.420
by this function.

00:44.420 --> 00:50.150
Now, this function can take a whole bunch of parameters in, but we're going to have more and more

00:50.150 --> 00:55.490
parameters as we create more and more combat tricks and combat features.

00:56.040 --> 01:01.170
And each time we add more parameters, we're going to have to add those parameters to this function

01:01.170 --> 01:02.280
we're going to make.

01:02.430 --> 01:10.080
So to get around that, I'd like to make a new type of struct for damage parameters and the struct can

01:10.080 --> 01:15.300
take all these parameters and store them and we can simply pass that into our function.

01:15.330 --> 01:18.540
That will apply the damage gameplay effect.

01:18.600 --> 01:24.420
So we're going to create a new type and I'm going to put this in the header file where we're defining

01:24.420 --> 01:27.330
our ability system types.

01:27.510 --> 01:30.420
So that's going to be our ability types.

01:30.420 --> 01:37.410
And here in our ability types, this is where we've defined our custom gameplay effect context.

01:37.440 --> 01:43.380
This is also where I'd like to define my custom struct for damage effect parameters.

01:43.650 --> 01:48.210
So we can put this above our effect context or below it.

01:48.240 --> 01:49.470
It doesn't matter.

01:49.650 --> 01:53.940
I'll put it above and this is going to be a struct.

01:53.970 --> 02:05.160
I'm going to call it F damage effect params and I'm going to make this a use struct with blueprint type

02:05.280 --> 02:14.430
so it gets a generated body and f damage effect params can get a default constructor.

02:14.430 --> 02:19.140
I'm just going to define it open and close its body here like that.

02:19.850 --> 02:26.840
And because I plan on passing this struct over to ora ability system library, I'm just going to have

02:26.840 --> 02:32.090
a world context object in here as one of the member variables of this struct.

02:32.120 --> 02:34.250
It's going to be a U object pointer.

02:35.210 --> 02:37.520
This can be actually a T object pointer.

02:40.890 --> 02:41.430
Of type.

02:41.460 --> 02:46.590
You object and I'm going to call it world context object.

02:47.820 --> 02:50.160
And I'll set it equal to a null pointer.

02:50.640 --> 02:57.690
Now, this will be a new property, but I'm not going to expose any of these parameters.

02:58.340 --> 03:01.990
So if we feel like exposing these to blueprint, we can.

03:02.000 --> 03:03.620
I know it's a blueprint type.

03:03.650 --> 03:07.400
That doesn't mean we need to set these necessarily in blueprint.

03:07.430 --> 03:09.800
I plan on setting them from C plus plus.

03:09.920 --> 03:12.080
Now we'll have a world context object.

03:12.080 --> 03:15.470
We're also going to have a damage gameplay effect class.

03:15.560 --> 03:20.960
This will be a subclass of and it'll be a new gameplay effect.

03:25.820 --> 03:28.550
And this will be the damage gameplay effect class.

03:28.850 --> 03:33.080
So we'll call it damage gameplay effect class.

03:34.820 --> 03:37.670
So giving this a new property as well.

03:38.370 --> 03:40.110
We can set this to a null pointer.

03:40.110 --> 03:43.770
We can initialize everything to null that we can.

03:44.070 --> 03:50.700
Now the damage effect params is going to carry the source ability system component with it.

03:50.880 --> 04:00.630
So we'll make a t object pointer of type you ability system component called source ability system component.

04:01.170 --> 04:05.280
And in addition to that we'll have the target ability system component.

04:05.310 --> 04:10.890
Now we won't be able to set this until we know what the target ability system component is, but as

04:10.890 --> 04:12.830
soon as we do know, we can set that.

04:12.840 --> 04:18.060
So I'm going to also have a target ability system component as well.

04:18.210 --> 04:21.780
And I'll just be giving all of these new property macros.

04:22.300 --> 04:27.370
Now damage effect params needs to know how much damage to cause.

04:27.370 --> 04:28.620
So I'm going to have a float.

04:28.630 --> 04:30.370
We'll call it base damage.

04:32.220 --> 04:34.110
It'll be initialized to zero.

04:34.560 --> 04:37.050
We can also carry along the ability level.

04:37.050 --> 04:40.890
So I'm going to have a float ability level and that will be one.

04:40.890 --> 04:43.290
So if we don't set it, it'll just be one.

04:43.440 --> 04:48.150
We're going to have a damage type so we know what kind of damage we're causing.

04:48.150 --> 04:55.830
So we'll have an gameplay tag called Damage type and we'll set that equal to an empty gameplay tag.

05:00.480 --> 05:04.710
And of course we'll have four variables pertaining to debuffs.

05:04.740 --> 05:06.870
We'll have float debuff.

05:08.840 --> 05:13.970
Chance and these will all get zero by default.

05:14.360 --> 05:16.100
We'll have a float debuff.

05:16.520 --> 05:17.570
Damage.

05:18.920 --> 05:22.160
We'll have a float debuff.

05:23.180 --> 05:29.780
Duration and we'll have a float debuff frequency.

05:34.650 --> 05:40.470
So if we have damage that doesn't do any debuff, we could just set that debuff chance to zero.

05:40.590 --> 05:45.000
So we'll go ahead and just stick a property on everything here.

05:52.730 --> 05:57.500
And with that we have the makings of our damage effect params.

05:58.130 --> 06:05.690
So because we have damage effect params and we have an aura damage gameplay ability, these effect params

06:05.690 --> 06:12.860
are going to be set based on variables that exist in our gameplay ability such as the base damage.

06:12.860 --> 06:19.490
Once we retrieve it from a curve table perhaps, and the ability level the damage type and these variables

06:19.490 --> 06:20.150
here.

06:20.150 --> 06:29.450
So I think it would be nice if we created a function on the damage gameplay ability that can make damage

06:29.480 --> 06:32.870
effect params from the class defaults.

06:34.370 --> 06:39.590
So we'll make a function that can do that on or a damage gameplay ability.

06:39.740 --> 06:47.060
This can be a public function and we could even expose it to blueprint so we can make a function that

06:47.060 --> 06:56.240
returns some damage effect params and we can add the include for that or ability types here so that

06:56.240 --> 07:04.490
we can use this type and the function will be make damage effect params from class defaults.

07:05.220 --> 07:11.340
And this can take in an a actor called Target actor passed in by Pointer.

07:12.150 --> 07:18.870
That way, if we already know who the target is, then we can get its ability system component and set

07:18.870 --> 07:21.420
any parameters from that target actor.

07:21.420 --> 07:25.410
And if we don't know who the target actor is, we can pass in a null pointer.

07:25.410 --> 07:32.280
In fact, we can just set this equal to a null pointer by default, and that way it's an optional parameter

07:32.520 --> 07:35.370
so we can generate this definition.

07:36.000 --> 07:41.520
And what this function will do is create a new f damage effect params.

07:41.760 --> 07:46.140
So we're going to say f damage effect params called.

07:47.510 --> 07:48.800
We'll call it params.

07:50.400 --> 07:53.520
And we can start setting things on the params.

07:53.550 --> 07:57.780
Now first we have params dot world context object.

07:57.780 --> 08:03.090
I'll go in order of the order that I added these in or ability type.

08:03.090 --> 08:06.090
So we'll start at the top world context object.

08:06.600 --> 08:14.520
So world context object and it's tempting to just pass in target actor but target actor could be a null

08:14.520 --> 08:15.360
pointer.

08:15.360 --> 08:20.250
So we definitely want a valid world context object here.

08:20.250 --> 08:26.640
So I'm just going to pass in the avatar from this ability so we can get Avatar actor from actor info

08:26.640 --> 08:27.810
and pass that in.

08:27.810 --> 08:34.710
Now the next thing we added was damage gameplay effect class and on the aura damage gameplay ability,

08:34.740 --> 08:41.280
we're going to have a damage gameplay effect class so we can set that right there.

08:41.640 --> 08:49.540
Now the next one in our damage effect params is the source ability system component and we can get that

08:49.540 --> 08:51.730
from an ability, no problem.

08:51.730 --> 08:57.310
So we're going to take that source ability system component and we can get our ability system component

08:57.310 --> 09:01.180
by using get ability system component from actor info.

09:02.480 --> 09:08.930
After that we have the target ability system component and for this we may or may not have a valid target

09:08.930 --> 09:09.740
actor yet.

09:09.740 --> 09:19.700
So what we'll do is just place an if and say if target actor, then we'll call get ability system component

09:19.700 --> 09:23.360
on the you ability system blueprint library.

09:23.360 --> 09:30.680
So we'll say get ability system component passing in target actor and we'll only call it if target actor

09:30.680 --> 09:36.920
is not a null pointer of course get ability system component if we go to it.

09:38.880 --> 09:45.510
We'll see that it calls ability system globals get ability system component from actor.

09:46.990 --> 09:53.140
And if we go to its definition, we see that if actor equals null pointer return null pointer.

09:53.140 --> 09:56.230
So really this check is already done for us.

09:56.260 --> 09:59.620
We don't actually have to make that check.

09:59.620 --> 10:06.250
So if we want this to be a little bit more compact, it's no problem just setting that ability system

10:06.250 --> 10:12.880
component to what's returned from this function as what's returned from this function will just be null

10:13.120 --> 10:14.860
if target actor is null.

10:14.860 --> 10:21.430
So we can say params dot target ability system component equals and we'll call that function.

10:22.080 --> 10:29.910
So I can close ability system blueprint library after target ability system component is based damage.

10:30.090 --> 10:37.440
Now base damage is just a float in our params, which means we need to perform that lookup from the

10:37.440 --> 10:38.790
damage curve table.

10:38.790 --> 10:39.480
Right.

10:39.510 --> 10:41.460
Well we can do that pretty easily.

10:41.460 --> 10:47.310
So we're going to say params dot damage and it's actually base damage and that's going to be gotten

10:47.310 --> 10:50.640
from our damage and from damage.

10:51.090 --> 10:56.430
We can call get value at level simply passing in get ability level.

10:57.830 --> 11:03.350
Now after base damage is ability level so we can pass that in as well.

11:03.440 --> 11:12.800
So we can say params dot level or I mean ability level of course equals get ability level after ability

11:12.800 --> 11:15.750
level comes the damage type.

11:15.770 --> 11:20.720
So we can say params dot damage type equals damage type.

11:22.610 --> 11:29.270
And after the damage type we have debuff chance damage, duration and frequency.

11:29.300 --> 11:31.010
We're going to set those as well.

11:31.680 --> 11:35.160
So params dot debuff.

11:36.570 --> 11:38.880
I'm going to go ahead and copy this.

11:42.110 --> 11:45.710
And we have debuff chance we'll set that equal to debuff chance.

11:47.120 --> 11:51.950
We have debuff damage that'll be debuff damage.

11:54.670 --> 11:58.990
Debuff duration equals debuff duration.

12:01.840 --> 12:06.820
And DBA frequency will be debuff frequency.

12:09.750 --> 12:12.750
And after that we've set all the parameters.

12:12.750 --> 12:17.400
So this function has done its job and it can simply return params.

12:19.480 --> 12:22.270
Now I see this squiggly here.

12:22.270 --> 12:23.850
You probably notice this.

12:23.860 --> 12:27.910
I completely breezed over it, but I didn't actually set damage.

12:27.910 --> 12:31.960
Gameplay effect class equal to damage effect class.

12:31.960 --> 12:33.820
That's something that I needed to do.

12:34.000 --> 12:40.030
Now the function is complete and actually this can be made const.

12:40.060 --> 12:46.600
It isn't changing any state on the ability, so we can just stick the const keyword on there.

12:46.630 --> 12:47.650
No problem.

12:48.370 --> 12:55.870
And now we have make damage effect params from class defaults and this makes it easy so we don't have

12:55.870 --> 13:01.090
to just create an f damage effect params and manually fill everything in.

13:01.090 --> 13:02.740
It's just going to do it itself.

13:02.740 --> 13:04.870
It's an inherent ability.

13:04.870 --> 13:11.710
That's not to say we couldn't create an f damage effect params anyway, but now we have this and now

13:11.710 --> 13:18.370
we can create a function on our ability system blueprint library that takes one of these effect params

13:18.370 --> 13:20.540
and applies a gameplay effect.

13:20.540 --> 13:23.750
So that is our next task.

13:24.500 --> 13:32.120
And now we can create a static function on our ability system library that will take in an F damage

13:32.120 --> 13:35.690
effect params and using those params.

13:35.690 --> 13:39.470
It will apply the damage gameplay effect to the target.

13:40.250 --> 13:42.530
And that's going to be your quest.

13:42.560 --> 13:47.310
So we'd like a function to apply a damage gameplay effect.

13:47.330 --> 13:52.550
So create a function in aura ability system library for doing this.

13:52.580 --> 13:55.760
Make it take in an F damage effect params.

13:55.850 --> 14:01.940
And it's going to assign all the set by color magnitudes for the gameplay effect and apply it to the

14:01.940 --> 14:02.780
target.

14:02.900 --> 14:07.250
This can be a static function and you can expose it to blueprint if you like.

14:07.340 --> 14:11.450
So pause the video and create this function in your function library.

14:11.480 --> 14:12.230
Now.

14:16.020 --> 14:16.500
Okay.

14:16.500 --> 14:21.020
So we need a function that can take in an f damage effect params.

14:21.030 --> 14:26.880
So I'm going to close all tabs except this one, but I'm going to open up my ability system blueprint

14:26.880 --> 14:34.440
library that's going to be in ability system and here it is Aura, ability, system library.

14:34.470 --> 14:36.540
I'm going to make a new function in here.

14:37.550 --> 14:43.550
And I'll go ahead and stick it second to last because this weird little function off on its own doesn't

14:43.550 --> 14:45.230
have a U function macro.

14:45.650 --> 14:50.480
So I'm going to push it off to the side and we're going to make a new static function and this is going

14:50.480 --> 15:01.010
to be apply damage effect and it's going to take in a const reference of F damage effect params and

15:01.010 --> 15:05.210
I'll call this damage effect params like so.

15:05.480 --> 15:12.560
Now I didn't give it a return type, but that's something that you probably found yourself wondering

15:12.560 --> 15:14.170
what is the return type?

15:14.180 --> 15:15.110
What should it be?

15:15.110 --> 15:16.310
Should it be void?

15:16.340 --> 15:23.760
Well, when I apply a damage gameplay effect, what I'm left with is an effect context handle.

15:23.780 --> 15:29.960
Sometimes you may wish to keep that context handle and hold on to it.

15:29.990 --> 15:31.670
Hold it dear to your heart.

15:32.730 --> 15:39.540
So that's what I'm going to return is an gameplay effect context handle.

15:39.690 --> 15:41.550
It's okay if you didn't do that.

15:41.580 --> 15:44.070
That's just what I'm going to do now.

15:44.070 --> 15:47.520
I'm going to go ahead and generate the definition.

15:47.520 --> 15:53.390
But actually before going in and adding things to it, let's make it a new function.

15:53.400 --> 15:58.470
I'm going to go ahead and make it blueprint callable, so I'm going to copy the function macro from

15:58.470 --> 16:01.080
up here and stick it right here.

16:01.170 --> 16:05.640
And subcategory can be damage effect.

16:06.120 --> 16:10.860
Okay, so what is this function going to do?

16:11.130 --> 16:16.920
Well, first I know that I'm going to want to apply a gameplay effect.

16:17.340 --> 16:19.530
We can work backwards if we like.

16:19.530 --> 16:24.390
I can call apply gameplay effect one of the various versions of it.

16:24.450 --> 16:31.980
And if we're going to apply a gameplay effect by this point in time, we need the target ability system

16:31.980 --> 16:33.660
component to be valid.

16:33.670 --> 16:39.100
So if it's not valid by this point, I'm considering that an error and I'll go ahead and let it crash.

16:39.310 --> 16:44.050
So to apply a gameplay effect to the target, I need to get that target.

16:44.050 --> 16:50.590
So I'm going to get it from damage effect params because we have a target ability system component and

16:50.590 --> 16:54.850
the target ability system component has apply gameplay effect to self.

16:54.850 --> 16:57.880
We can apply a gameplay effect spec to self.

16:57.910 --> 17:04.390
You could have used apply gameplay effect spec to target, but then your source ability system component

17:04.390 --> 17:11.050
would have to be valid unless you called apply spec to target from the target to the target.

17:11.050 --> 17:12.970
Either way, we have options.

17:13.300 --> 17:13.780
Now.

17:13.780 --> 17:16.570
If we call this function we need a gameplay effect spec.

17:16.570 --> 17:17.170
Right?

17:17.170 --> 17:23.500
Which means we need to make one of those and I'm going to make one from the source ability system component.

17:23.500 --> 17:29.830
So I'm going to take damage effect params dot source ability system component and make a gameplay effect

17:29.830 --> 17:32.290
spec with make outgoing spec.

17:32.560 --> 17:40.300
Now make outgoing spec is going to need to know the damage gameplay effect class which also exists in

17:40.300 --> 17:47.440
the parameters so we can take damage effect params dot damage gameplay effect class.

17:48.580 --> 17:51.820
It also needs the level that's in our effect params too.

17:51.850 --> 17:53.500
It's the ability level.

17:54.160 --> 17:58.780
And finally the context is the last input.

17:58.810 --> 18:01.840
We're going to make an effect context as well.

18:02.080 --> 18:07.870
So if we take our damage effect params, we take our source ability system component we can call make

18:07.900 --> 18:09.220
effect context.

18:09.520 --> 18:15.670
You see how we put a few key pieces of information into this struct and all of a sudden we already have

18:15.670 --> 18:17.580
the ability to do a lot of things.

18:17.590 --> 18:19.450
It's kind of amazing, right?

18:19.750 --> 18:26.380
Now once we've created the context handle with make effect context, I'm going to store it in a local

18:26.380 --> 18:27.280
variable.

18:27.280 --> 18:32.770
So this is an F game gameplay effect context handle.

18:33.040 --> 18:36.760
I'm going to call it effect context handle.

18:41.420 --> 18:45.260
And we know that the context handle has a source object we can set.

18:45.260 --> 18:46.490
So I'm going to take effect.

18:46.490 --> 18:49.520
Context handle dot source object.

18:49.610 --> 18:54.490
Actually, it's Add source object, and I'm going to add the source Avatar actor.

18:54.500 --> 19:02.360
So I'm going to go ahead and make a const local a actor for storing the Avatar actor.

19:02.360 --> 19:09.440
I'm going to call this source Avatar actor and just get it from the ability system component on the

19:09.440 --> 19:10.130
source.

19:10.130 --> 19:16.340
So that's going to be damage effect, params dot source ability system component dot get avatar actor.

19:16.370 --> 19:22.220
So I have the source avatar actor and I'm going to pass that in to add source object.

19:22.220 --> 19:25.130
So my effect context has the source object.

19:25.680 --> 19:29.820
Now make outgoing spec needs that effect context handle.

19:29.820 --> 19:37.060
So I'm going to pass in effect context handle and this outgoing spec is an gameplay effect.

19:37.080 --> 19:46.590
Spec handle so I can save that in a local gameplay effect spec handle called spec handle.

19:48.270 --> 19:54.120
Okay, so we now have the spec handle and when we apply the gameplay effect, we can.

19:54.690 --> 19:58.080
Pass in the gameplay effect spec.

19:58.080 --> 20:05.820
Now we can do what we've done before by taking a spec handle, accessing data and dereferencing that

20:05.820 --> 20:09.780
pointer we've seen before that we had to call get right.

20:10.650 --> 20:12.960
But I'm going to let you in on a little secret.

20:12.960 --> 20:15.900
You don't actually have to call get Dereferencing.

20:15.900 --> 20:20.540
The wrapper will also give you the dereferenced value inside of it.

20:20.550 --> 20:21.630
Pretty cool, right?

20:21.660 --> 20:23.670
A little bit less syntax there.

20:23.760 --> 20:25.470
So now here's the thing.

20:25.470 --> 20:33.240
We have basically just created a convenience function that takes all these params and just applies the

20:33.240 --> 20:40.020
gameplay effect carried in those params, but we need to assign set by caller magnitudes, don't we?

20:40.140 --> 20:44.070
That's the whole point of making this function for our convenience.

20:44.190 --> 20:50.910
So we're going to assign set by caller magnitudes here and we'll start with the damage that's the most

20:50.910 --> 20:54.760
important now to assign a set by caller magnitude.

20:54.760 --> 20:57.490
We use the ability system blueprint library.

21:01.230 --> 21:07.170
And the function that we need is assign tag set by color magnitude and it needs a spec handle.

21:07.170 --> 21:10.140
While we have the spec handle, we can pass that straight in.

21:10.170 --> 21:13.800
We also need the damage type and that's on damage effect params.

21:13.800 --> 21:15.210
It's called damage type.

21:16.320 --> 21:23.070
We also need the magnitude and that's the damage on damage effect params, it's called base damage.

21:24.810 --> 21:32.580
So now if we call this function passing in some valid effect, params will basically just have a damage

21:32.580 --> 21:33.720
gameplay effect.

21:33.990 --> 21:41.010
Now I'd like to also assign tags set by color magnitudes for all the debuff parameters and there's four

21:41.010 --> 21:41.640
of them.

21:41.880 --> 21:50.520
So I'm going to take this line all the way up to spec handle and copy it and paste it and the next input

21:50.520 --> 21:56.010
I'll go ahead and close the parentheses and add the semicolon and the next input is the gameplay tag

21:56.010 --> 21:58.260
that's going to be for those debuffs.

21:58.260 --> 22:02.610
So I'm going to go ahead and just get aura gameplay tags straight away.

22:02.610 --> 22:05.460
So const for gameplay tags.

22:06.960 --> 22:08.550
That'll be a const reference.

22:08.550 --> 22:13.650
I'm going to call it gameplay tags and use for a gameplay tags get.

22:15.240 --> 22:18.390
So back down to our set by caller magnitude.

22:18.390 --> 22:20.430
I'm going to use the debuff.

22:21.300 --> 22:27.000
And we need debuff chance, damage, duration and frequency.

22:27.000 --> 22:29.400
So I'm going to use debuff chance.

22:29.400 --> 22:36.510
I'm going to get that first and set that equal to the value in our damage effect params for debuff chance.

22:36.900 --> 22:41.550
And we're going to have three more of these set by collar magnitudes.

22:41.580 --> 22:52.260
The next one will be debuff, we can do debuff damage and that's going to be the debuff damage from

22:52.260 --> 22:53.970
our damage effect params.

22:55.290 --> 22:57.060
We'll go ahead and do this again.

22:57.390 --> 23:04.470
The next one can be debuff duration which will be set to, you guessed it, debuff duration.

23:05.490 --> 23:09.960
And the final one is the frequency, right?

23:11.040 --> 23:13.260
And that'll be set to debuff frequency.

23:15.060 --> 23:19.620
So now we've just assigned a whole bunch of set by color magnitudes.

23:20.330 --> 23:24.530
And apply damage effect can apply that damage gameplay effect.

23:24.560 --> 23:30.950
Now this returns a context handle, so I'd like to return that effect context handle.

23:31.810 --> 23:33.520
This is just for convenience.

23:33.520 --> 23:41.110
I mean, we don't have to return this, but I just happen to choose to return this and we'll see later

23:41.110 --> 23:42.430
if we need to use it.

23:42.460 --> 23:45.370
Now our spec handle could be const here.

23:45.910 --> 23:49.510
Writer thinks I made a typo in effect context handle.

23:49.750 --> 23:50.410
I didn't.

23:50.410 --> 23:51.160
So.

23:51.460 --> 23:59.080
So now we have this function that can apply damage effects by receiving some params.

23:59.890 --> 24:05.200
Now, this is great because the effects spec is now going to carry these set by caller magnitudes along

24:05.200 --> 24:05.980
with it.

24:06.070 --> 24:09.950
And in the next video, we'll see how we can use this function.

24:09.970 --> 24:12.160
So give compiling a try.

24:12.190 --> 24:14.230
Let's see if we can catch any errors.

24:14.230 --> 24:15.640
Looks like I have one.

24:15.670 --> 24:18.660
You gameplay effect undeclared identifier.

24:18.670 --> 24:21.820
So I didn't forward declare you gameplay effect.

24:21.820 --> 24:24.040
I'm going to go ahead and do that.

24:27.200 --> 24:28.790
So I'm going to compile again.

24:30.180 --> 24:31.800
And that's going to do it.

24:32.100 --> 24:32.970
All right.

24:32.970 --> 24:34.290
Great job on the challenge.

24:34.290 --> 24:35.940
And I'll see you in the next video.
