WEBVTT

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

00:08.330 --> 00:14.960
Now that our spells have the concept of status, we can show those spells in our offensive and passive

00:14.960 --> 00:16.070
ability trees.

00:17.060 --> 00:22.980
Now, by default, these icons aren't associated with any specific abilities.

00:23.000 --> 00:25.070
Right now, they just have locked.

00:25.820 --> 00:29.990
They each need to have their own concept of ability.

00:30.170 --> 00:37.880
Much like the equipped abilities, Rho has globes, each of which know what their input tag is and the

00:37.880 --> 00:38.360
trees.

00:38.360 --> 00:42.990
They need to know what ability they're assigned to, not input tag.

00:43.010 --> 00:50.210
So for that reason, these spell globes, the kind that are in the offensive and passive ability trees

00:50.210 --> 00:53.510
each need to know what ability is assigned to them.

00:53.750 --> 00:59.610
Now, so far we only have one ability that belongs in these trees and that's our firebolt.

00:59.630 --> 01:03.350
So really, just one of these is going to get its ability tag.

01:03.350 --> 01:08.630
But the class, the widget blueprint class itself needs an ability tag variable.

01:09.380 --> 01:18.680
So I'm no longer interested in my equipped row button or my equipped spell row or my firebolt ability.

01:18.710 --> 01:19.970
Looks like I have my overlay.

01:19.970 --> 01:21.530
I'm going to close that too.

01:21.920 --> 01:28.940
What I want is the widget I'm using in my offensive abilities and that's going to be my spell globe

01:28.940 --> 01:33.230
button, not my equipped row button that goes in the equipped row.

01:33.260 --> 01:36.830
This one, the spell globe button goes in the trees.

01:37.040 --> 01:44.420
This class needs a gameplay tag variable to identify the ability associated with it.

01:44.420 --> 01:48.440
So I'm going to add a variable and call it ability tag.

01:50.880 --> 01:53.430
And we'll change its type to gameplay tag.

01:56.280 --> 02:03.600
So now that we have an ability tag and it's going to be set to none by default, we can assign the ability

02:03.600 --> 02:12.450
tags in our trees by going to our spell menu folder and I'm going to open offensive spell tree and click

02:12.450 --> 02:14.840
on this spell globe down here.

02:14.850 --> 02:19.920
It's going to be the spell globe that I assign the ability of Firebolt to.

02:20.070 --> 02:22.080
Here's the design I have in mind.

02:22.110 --> 02:28.440
I'm going to have all fire spells in the first column, all lightning spells in the second column,

02:28.440 --> 02:33.360
and all arcane spells in the third column, and they'll go from bottom to top.

02:33.360 --> 02:39.930
So we'll start off with the bottom left ability with our firebolt ability in it.

02:39.960 --> 02:42.990
So I'm going to take this and set its ability tag.

02:42.990 --> 02:49.920
Now, that means that that ability tag variable that we just added needs to be instance editable so

02:49.920 --> 02:57.310
we can take the ability tag, check the eye icon, compile it and back in offensive spell tree, we

02:57.310 --> 03:00.700
can select that one and search for ability tag.

03:01.830 --> 03:06.060
And we can set the ability tag to abilities fire firebolt.

03:06.420 --> 03:13.650
Now whenever we broadcast ability info, we can check that ability tag broadcast along with it.

03:13.680 --> 03:19.200
So our spell glow button needs to listen for that type of event.

03:19.350 --> 03:26.040
So here in the event graph, notice that it's using the overlay widget controller because we made this

03:26.040 --> 03:27.150
from another widget.

03:27.180 --> 03:29.220
We don't want overlay widget controller.

03:29.220 --> 03:30.660
We're going to delete that.

03:30.660 --> 03:31.860
I don't need that.

03:31.890 --> 03:37.080
Our spell glow button is going to have the spell menu widget controller, and we're going to set that

03:37.080 --> 03:38.820
from the spell menu here.

03:38.850 --> 03:45.570
Here in spell menu, we're already setting the equipped spell row widget controller.

03:45.570 --> 03:50.460
We also want to set the widget controllers for our spell trees.

03:50.490 --> 03:56.640
Our offensive spell tree, which we need to select and check is variable for and our passive spell tree,

03:56.640 --> 03:58.770
which also needs to be a variable.

03:59.100 --> 04:04.750
So back on the event graph, we need to set their widget controllers as well.

04:04.840 --> 04:10.540
So we're going to get offensive spell tree and passive spell tree and call set widget controller for

04:10.540 --> 04:14.230
both of them using the widget controller variable.

04:14.620 --> 04:18.850
So let's call set widget controller for offensive spell tree.

04:18.880 --> 04:23.800
Passing that into target and widget controller in two in widget controller.

04:23.800 --> 04:27.760
And we'll do the same thing for passive spell tree.

04:27.790 --> 04:32.980
We'll set its widget controller and we'll go ahead and hook up these nodes.

04:34.030 --> 04:41.470
Well, straighten up the nodes as well and we'll expand our comment to contain these now.

04:42.490 --> 04:48.430
And now that we know that those widgets will have their widget controller set, we can assign events

04:48.430 --> 04:49.690
to delegates in them.

04:50.050 --> 04:52.990
I'm just going to do this in the offensive tree.

04:54.030 --> 04:59.610
As soon as the offensive spell tree has its widget controller set, it can set the widget controllers

04:59.610 --> 05:01.770
for all of its globes.

05:04.600 --> 05:08.050
So I'm going to select all of them and check is variable.

05:08.710 --> 05:11.680
As soon as I do that, their names all change.

05:11.680 --> 05:12.640
So they're unique.

05:12.670 --> 05:14.530
They all have numbers after them.

05:14.710 --> 05:17.170
I'm not going to bother renaming them for now.

05:17.170 --> 05:19.870
I'm just going to set their widget controllers.

05:19.990 --> 05:23.260
So we're going to use event widget controller set.

05:25.740 --> 05:32.940
And we're going to take each of our spell globe buttons, starting with the first and call set widget

05:32.940 --> 05:33.780
controller.

05:35.060 --> 05:36.770
Using our widget controller.

05:42.250 --> 05:44.410
We'll pass that in for widget controller.

05:44.440 --> 05:47.050
I'm going to get widget controller up and out of the way.

05:49.800 --> 05:53.100
And drag in each of my other spell globe buttons.

05:53.880 --> 05:56.820
We'll start with one and go all the way up to eight.

05:57.530 --> 05:59.420
So we can time lapse this.

06:08.930 --> 06:14.720
And with that, all of our sub widgets have their widget controllers set and we can collapse this to

06:14.720 --> 06:16.880
a function set.

06:16.910 --> 06:19.100
Widget Controllers.

06:20.800 --> 06:24.790
And once all of these sub widgets have their widget controllers set.

06:25.560 --> 06:32.520
Our spell glow buttons can assign an event to respond to the ability info Delegate.

06:33.360 --> 06:35.390
On the spell menu widget controller.

06:35.400 --> 06:38.490
Which means first we need to get our widget controller.

06:42.630 --> 06:44.970
Cast his spell Menu Widget Controller.

06:55.800 --> 06:57.780
We'll promote that to a variable.

07:00.000 --> 07:00.440
Beep.

07:00.540 --> 07:00.840
Spell.

07:00.870 --> 07:01.380
Menu.

07:01.410 --> 07:02.610
Widget Controller.

07:05.430 --> 07:07.140
Go ahead and comment that.

07:11.510 --> 07:14.720
And then we can take BP spell Menu Widget Controller.

07:15.770 --> 07:19.880
And assign ability info delegate.

07:22.790 --> 07:25.310
And here we can break the ability info.

07:25.930 --> 07:27.510
Now, here's the thing.

07:27.520 --> 07:35.650
We need to identify the ability by its ability tag, but we also need to know its status now because

07:35.650 --> 07:39.850
if the status is locked, we just need to keep this with the locked icon.

07:39.910 --> 07:43.720
If the status is eligible, we need to change the icon.

07:43.720 --> 07:45.930
But keep the background as gray.

07:45.940 --> 07:50.850
But if it's unlocked or equipped, we need to set both the background and the icon.

07:50.860 --> 07:57.130
So now that we need to know that status, we're going to want our ability info struct to contain an

07:57.130 --> 08:03.180
ability status and we'll need to set that before broadcasting it up to our widgets.

08:03.190 --> 08:06.010
So we have a few things to do in code.

08:06.010 --> 08:12.880
Let's go ahead and close and save and make sure that our spell globes can receive the ability status

08:12.880 --> 08:14.530
in our ability info.

08:14.620 --> 08:21.040
Now that means we should start by adding the status to our ability info struct that we're broadcasting.

08:21.040 --> 08:30.110
So I'm going to go ahead and close all tabs and enter my public ability system data folder and go into

08:30.110 --> 08:35.630
ability info where our aura ability info struct is defined.

08:35.630 --> 08:39.860
We're going to add a new gameplay tag and it can be blueprint read only.

08:39.860 --> 08:42.290
We don't need to make it edit defaults only.

08:42.290 --> 08:44.990
It doesn't make sense to set it in the data asset.

08:45.020 --> 08:52.430
This depends entirely on the current status of the gameplay ability, so we need to set that dynamically.

08:53.020 --> 08:58.000
So let's add a new gameplay tag with blueprint read only called status tag.

08:58.390 --> 09:01.960
It'll be set to an empty gameplay tag by default.

09:02.600 --> 09:09.440
Now that this status tag exists, we need to set it when we broadcast from the spell menu widget controller.

09:09.440 --> 09:16.580
So we're going to go into our private folder into UI, widget controller Spell Menu.

09:16.580 --> 09:17.720
Widget controller.

09:18.360 --> 09:20.820
Where we're broadcasting ability info.

09:21.090 --> 09:24.600
Actually this is a function on a widget controller.

09:24.600 --> 09:30.660
So let's go into a widget controller where we're broadcasting ability info from here and here is where

09:30.660 --> 09:36.960
we can set the status because we have our ability info that we're about to broadcast up to our widgets.

09:37.290 --> 09:39.060
So how are we going to do it?

09:39.090 --> 09:45.570
Well, we can take our info, we can take its status tag and we can set it.

09:45.600 --> 09:48.300
We just need to know what that status is.

09:48.420 --> 09:50.730
Well, we have our ability spec, right?

09:51.030 --> 09:56.850
And recall we recently added a function to our ability system component.

09:56.880 --> 10:04.320
Let's go to our ability system component CPP file and that function is called get status from spec.

10:04.530 --> 10:10.770
We pass in an ability spec we loop through its dynamic ability tags and search for the first tag.

10:10.770 --> 10:15.210
We find that has abilities dot status in it and return that.

10:15.330 --> 10:19.150
So we had the foresight to know that we would need this.

10:19.390 --> 10:26.290
So back in our widget controller or a widget controller, since we have access to our ability system

10:26.290 --> 10:33.130
component and we know that this variable has been set because we've called get or ask previously in

10:33.130 --> 10:33.880
the function.

10:33.880 --> 10:41.050
So we know that it's been set, we can get that ability system component and call get status from spec

10:41.050 --> 10:43.480
and we can pass in the ability spec.

10:43.750 --> 10:50.110
Now every time broadcast ability info is called, we're setting the status tag and passing that on up

10:50.110 --> 10:52.870
in our ability info struct.

10:53.110 --> 10:59.040
Now we can check that status when receiving it in our spell globes.

10:59.050 --> 11:00.160
We'll do that next.

11:00.160 --> 11:02.800
Let's go ahead and compile and launch.

11:04.540 --> 11:05.050
All right.

11:05.050 --> 11:06.210
We're back in the editor.

11:06.220 --> 11:09.880
Let's go back into our spell globe button here.

11:09.880 --> 11:14.050
In the event graph, we're listening to Ability Info Delegate.

11:14.050 --> 11:15.280
And check this out.

11:15.310 --> 11:17.590
We now have a status that we can check.

11:18.370 --> 11:20.820
So there are two tags we need to check here.

11:20.830 --> 11:26.860
We need to make sure that this info has the ability tag matching our spell globe, but we now need to

11:26.860 --> 11:28.810
check its status tag as well.

11:29.600 --> 11:31.480
We'll first check the ability tag.

11:31.490 --> 11:33.530
We're going to say matches tag.

11:34.620 --> 11:38.190
We're going to use exact match and make a branch.

11:42.210 --> 11:46.410
And if the info matches this Globes tag, we can continue.

11:46.770 --> 11:51.960
And before we continue, I'm now going to collapse this into a function so we can work all within a

11:51.960 --> 11:52.650
function.

11:52.650 --> 11:54.900
And this function we can collapse.

11:55.950 --> 12:00.360
We can call this receive ability info.

12:01.050 --> 12:02.940
So let's go into our function.

12:04.670 --> 12:09.260
And the reason I want this to be a function is so we can organize this a little bit.

12:09.290 --> 12:15.740
Now, the first thing we want to do after making sure that the tag matches is check what the status

12:15.770 --> 12:18.080
is in the status tag.

12:19.110 --> 12:22.800
I'm going to promote this status tag to a local variable.

12:23.540 --> 12:25.130
Called status tag.

12:26.060 --> 12:27.950
We'll just call it status, actually.

12:28.570 --> 12:31.720
That way we don't have to drag a bunch of wires around.

12:33.960 --> 12:40.530
We can just do a branch to check our status for each of the four statuses.

12:40.860 --> 12:45.420
So I'm going to bring that status in and use matches tag.

12:47.680 --> 12:52.990
And we're going to use an exact match and we're going to check our status against abilities.

12:55.850 --> 12:58.370
Status and we'll check.

12:58.370 --> 12:59.900
Locked first.

13:01.310 --> 13:04.910
And if it's locked, well, that's the easiest case, right?

13:04.940 --> 13:13.400
We just need to make sure that the icon and the background are set to these textures here.

13:13.640 --> 13:19.640
So we're going to take our icon, make sure it's a variable and our background, and we'll drag those

13:19.640 --> 13:20.420
in here.

13:20.630 --> 13:22.280
Image icon.

13:22.550 --> 13:24.320
Image Background.

13:24.650 --> 13:28.220
And we can simply call set brush from texture.

13:29.470 --> 13:34.390
For the icon and we can just hard code the locked icon.

13:34.420 --> 13:36.430
Locked underscore SM.

13:38.830 --> 13:39.910
We'll set that.

13:40.900 --> 13:43.660
For the image background we're going to set.

13:44.360 --> 13:45.950
Brush from material.

13:48.680 --> 13:50.300
And we're going to choose.

13:51.050 --> 13:53.180
The locked material.

13:55.410 --> 13:57.900
And this can be collapsed to a function.

13:59.600 --> 14:00.170
Collapse.

14:00.170 --> 14:03.200
The function set globe locked.

14:06.070 --> 14:11.380
Now, if we make it past this, then we need to check against the next status.

14:11.380 --> 14:15.790
So we're going to duplicate those nodes and add another branch.

14:15.790 --> 14:19.060
And this time we're going to check against a different status.

14:19.270 --> 14:20.140
We just checked.

14:20.140 --> 14:20.860
Locked.

14:21.160 --> 14:24.070
The next easiest one is going to be equipped.

14:24.070 --> 14:26.320
So I'm going to change this to equipped.

14:26.530 --> 14:31.510
And for this one, we know what we need to set the textures to, don't we?

14:32.610 --> 14:36.300
We need to use the icon in the background material.

14:37.410 --> 14:39.270
I'm going to promote these two variables too.

14:39.300 --> 14:40.420
So this is easy.

14:40.440 --> 14:43.710
So the icon I'm going to promote to a local variable.

14:44.550 --> 14:46.980
Called ability icon.

14:49.220 --> 14:53.390
And the background material I'm going to promote to a local variable.

14:54.870 --> 14:56.280
Ability background.

15:04.470 --> 15:09.390
And if our status is equipped, we're going to take image icon.

15:09.870 --> 15:12.720
We're going to set brush from texture.

15:14.720 --> 15:20.030
Using ability icon and we're going to take image background.

15:21.240 --> 15:22.500
Set brush.

15:25.320 --> 15:26.610
From material.

15:28.360 --> 15:30.130
Using ability background.

15:34.280 --> 15:37.280
Now these could be collapsed to a function.

15:37.280 --> 15:41.300
Only ability icon and ability background are local variables.

15:41.300 --> 15:49.130
So what we have to do is pull them out and collapse the rest of this to a function so we can do that

15:49.130 --> 15:52.550
and call this set globe equipped.

15:54.080 --> 15:59.720
But we do need to make sure to keep these outside of the function because they're local.

16:00.450 --> 16:04.290
Now after equipped, we need to check the next status.

16:04.650 --> 16:07.050
So we'll check matches tag here.

16:07.080 --> 16:12.750
Another branch hook the false up to it and we've already checked locked and equipped.

16:12.780 --> 16:20.100
We're going to check against eligible and this is kind of a hybrid of locked and equipped.

16:20.130 --> 16:23.940
We're going to set the image icon.

16:24.360 --> 16:26.340
So we're going to call set.

16:27.110 --> 16:31.670
Brush from texture to the ability icon.

16:32.840 --> 16:35.150
Only we're going to set the background to locked.

16:35.180 --> 16:36.230
The gray one.

16:36.230 --> 16:43.430
So we're going to take image, background and call set brush from material.

16:44.390 --> 16:48.230
And I'm going to hard code in that locked material.

16:49.260 --> 16:54.030
So this one is kind of a hybrid, so I need to bring that ability icon out.

16:54.270 --> 16:56.960
Hook this up and then collapse to a function.

16:56.970 --> 17:02.280
This will be collapsed to set Globe eligible.

17:07.310 --> 17:09.890
And then the last one, we haven't checked.

17:09.920 --> 17:13.070
We've checked locked, equipped, eligible.

17:13.280 --> 17:16.010
And there's also unlocked.

17:16.040 --> 17:18.440
Now unlocked and equipped are the same.

17:18.440 --> 17:24.470
So we could just check both of those at the same time and make an Or boolean here.

17:26.970 --> 17:29.100
So this one will be.

17:29.940 --> 17:30.990
Unlocked.

17:32.200 --> 17:38.680
So if it's equipped or unlocked, that will be for this case because both of these.

17:40.190 --> 17:44.990
Ability, icon and ability background should be set.

17:46.260 --> 17:49.440
So it could be set globe equipped or.

17:50.500 --> 17:54.520
Unlocked, so I'm just going to rename it to set.

17:54.550 --> 17:57.160
Globe equipped or unlocked?

17:58.420 --> 17:59.290
Like so.

18:00.610 --> 18:00.940
Okay.

18:00.940 --> 18:05.410
So receive ability info now handles all of the cases.

18:07.160 --> 18:09.260
For ability statuses.

18:15.020 --> 18:21.620
I just really want this to look as neat as I possibly can make it, and I think that's about as good

18:21.620 --> 18:22.700
as I can get.

18:23.000 --> 18:24.560
But it doesn't look too bad.

18:25.450 --> 18:28.930
Okay, so now our spell glow button.

18:28.950 --> 18:34.420
An event widget controller set is casting its widget controller to a spell menu.

18:34.420 --> 18:44.230
Widget controller Assigning an event to ability info delegate receiving that info and updating its globe

18:44.260 --> 18:46.090
based on the status.

18:46.090 --> 18:52.210
So as long as that status is set, then our spell globe button is going to receive it.

18:52.710 --> 18:57.870
Now in our spell menu when we're setting our sub widget widget controllers.

18:58.460 --> 19:05.150
It looks like we're setting our offensive spell tree widget controller, after which we call broadcast

19:05.150 --> 19:12.110
initial values and our offensive spell tree has its widget controller set, at which point it sets the

19:12.110 --> 19:17.420
widget controllers for all of its spell globe buttons, including this one.

19:17.420 --> 19:23.000
This is the one we're interested in because we set its ability tag to abilities.

19:23.000 --> 19:24.710
Fire Firebolt.

19:25.360 --> 19:33.490
So because this globe has the ability tag abilities, fire firebolt and our spell glow button and receive

19:33.520 --> 19:36.850
ability info, we're checking matches tag.

19:37.890 --> 19:41.900
Checking the ability info struct ability tag against.

19:41.910 --> 19:46.680
Well, we should be checking against our spell globes ability tag here.

19:46.680 --> 19:49.470
And if we make it past that we'll update it.

19:49.470 --> 19:50.850
So moment of truth.

19:50.850 --> 19:53.490
Let's press play and open our spell menu.

19:53.490 --> 19:58.140
And sure enough, there's our ability that we assigned the ability tag.

19:58.140 --> 20:03.660
Now that's pretty cool, but we're not really testing any of the other statuses.

20:03.660 --> 20:09.300
We need to test whether this shows the correct thing based on the other statuses.

20:09.300 --> 20:16.320
So what we can do is we can close the editor, we can save all of our work and in our ability system

20:16.320 --> 20:24.480
component, when we're giving abilities in add character abilities, we can change that status that

20:24.480 --> 20:29.520
we're giving the ability just to test out what we're seeing in the HUD.

20:29.550 --> 20:36.060
So we know that equipped works, we can check eligible, which should look the same, except that background

20:36.060 --> 20:37.020
should be gray.

20:37.020 --> 20:38.560
Let's check that out.

20:38.890 --> 20:40.900
So we'll just compile and test.

20:42.460 --> 20:42.910
Okay.

20:42.910 --> 20:44.320
So we can press play.

20:44.560 --> 20:46.810
We can open our menu.

20:46.810 --> 20:49.030
And this is what eligible should look like.

20:49.060 --> 20:53.080
We have the firebolt icon, but we have the gray background.

20:53.080 --> 20:58.840
So this is what it would look like if you now meet the level requirement for an ability, but you have

20:58.840 --> 21:02.650
not yet spent a spell point on it and you cannot yet equip it.

21:02.650 --> 21:06.250
So it's still grayed out, but you can see what it is, right?

21:06.250 --> 21:08.830
So that's eligible.

21:09.130 --> 21:11.920
We can also check the other statuses.

21:13.830 --> 21:17.110
We know what equipped and eligible look like.

21:17.130 --> 21:22.440
We can check what locked looks like, and it shouldn't be too surprising.

21:22.440 --> 21:26.040
It's going to be the locked icon, same as its default.

21:26.040 --> 21:27.600
But we can still check.

21:28.430 --> 21:33.320
So we can press play open and see the locked icon as expected.

21:33.320 --> 21:41.990
And finally, we can just test out the last we tested equipped, locked, eligible.

21:42.110 --> 21:48.740
Now we can see what unlocked looks like and unlocked should be when we've unlocked the spell.

21:48.770 --> 21:49.910
It was eligible.

21:49.910 --> 21:51.410
We spent a spell point on it.

21:51.440 --> 21:53.090
Now it should be colorful.

21:53.090 --> 21:55.690
It should look the same as if we had equipped it.

21:55.700 --> 21:58.010
So let's make sure that that's the case.

21:58.660 --> 21:59.050
Okay.

21:59.050 --> 22:02.080
Pressing play, opening the menu, and there's what it looks like.

22:02.110 --> 22:03.010
Unlocked.

22:03.400 --> 22:07.330
All right, so at least we know that we're showing the correct thing.

22:07.330 --> 22:13.540
We do want to make sure that this is set back to equipped, though, and now things are working.

22:13.810 --> 22:14.650
All right.

22:14.650 --> 22:17.670
So that's going to pretty much conclude the video.

22:17.680 --> 22:24.220
There's one thing I want to just show you that I ran into when testing that I want to fix real quick.

22:25.710 --> 22:26.100
Okay.

22:26.100 --> 22:31.500
So I'm going to show you one thing I ran into when testing, and that's if I open one of my menus and

22:31.500 --> 22:38.340
kill the game, stop simulation, then I get this error that says set input mode game and UI expects

22:38.340 --> 22:39.930
a valid player controller.

22:39.930 --> 22:41.610
So we're killing the game.

22:41.610 --> 22:47.580
The player controller gets destroyed apparently before our widgets get destroyed and we're attempting

22:47.610 --> 22:53.640
to call set input mode game in UI on a widget controller that is not valid.

22:53.640 --> 23:02.460
So we need to go into where we're doing that, which is in UI overlay, WB overlay, open that graph

23:02.460 --> 23:08.940
and here when we're closing the menu attribute menu and spell menu for that matter, we need to make

23:08.940 --> 23:13.650
sure that we're only calling this function on the player controller if it's valid.

23:13.650 --> 23:15.780
So we're going to use is valid here.

23:18.050 --> 23:21.710
And remember, this is for the false case.

23:21.710 --> 23:24.310
So don't go and plug the true up into it.

23:24.320 --> 23:25.220
Use false.

23:25.220 --> 23:28.180
Otherwise you're creating a logic error there.

23:28.190 --> 23:33.110
So false goes to is valid which goes to set input mode game and UI.

23:33.140 --> 23:34.880
That's for the attribute menu.

23:34.910 --> 23:37.610
We're going to do it for the spell menu too.

23:37.640 --> 23:38.750
So.

23:39.300 --> 23:45.570
Take that player controller call is valid on it before trying to use it.

23:45.570 --> 23:46.860
And now.

23:49.880 --> 23:53.150
We can press play, we can open our menu, we can kill the game.

23:53.150 --> 23:54.110
No errors.

23:54.110 --> 23:55.880
And that goes for both menus.

23:55.970 --> 24:00.740
Just something I noticed in testing that I figured we'd clean up and fix.

24:00.740 --> 24:02.260
So that's looking good.

24:02.270 --> 24:03.850
Everything can be saved.

24:03.860 --> 24:07.340
Excellent job and I'll see you in the next video.
