WEBVTT

00:06.840 --> 00:08.040
Welcome back.

00:08.250 --> 00:14.550
Now, in our character class info, we have a set by color version of our primary attributes gameplay

00:14.550 --> 00:15.270
effect.

00:15.270 --> 00:20.190
We now need to initialize our attributes if we're loading in from disk.

00:20.610 --> 00:25.770
I'd like to create an Aura Ability system library function for this.

00:25.890 --> 00:29.070
So I'm going to go into Aura Ability System library.

00:29.070 --> 00:36.210
I'm looking at initialize default attributes as a sort of example, but I'm going to make a new version

00:36.210 --> 00:41.160
of this that we can pass in data that we're loading in from disk.

00:41.160 --> 00:46.830
So I'm going to find here in the header file initialize default attributes.

00:46.830 --> 00:51.600
Because I'd like to have a new version of this function right beneath it.

00:51.870 --> 00:53.640
So this can be static.

00:53.640 --> 00:55.170
It can be void.

00:55.560 --> 01:01.350
We're going to call this initialize default attributes from save data.

01:02.070 --> 01:07.320
And this is going to take in a world context object, but it doesn't need the character class.

01:07.320 --> 01:09.180
It doesn't need the level either.

01:09.210 --> 01:16.200
Now we are going to pass in the ability system component, but on top of that we're going to pass in

01:16.200 --> 01:17.130
save data.

01:17.130 --> 01:22.950
We can pass in you load screen save game and add a forward declaration for it.

01:22.950 --> 01:24.780
And we'll call this save game.

01:24.780 --> 01:28.680
So with that let's generate this function definition.

01:28.680 --> 01:31.080
Now what are we going to do here.

01:31.080 --> 01:35.370
It's going to be similar to initialize default attributes.

01:35.370 --> 01:38.790
For one we do want to get character class info.

01:38.790 --> 01:42.720
And we're doing that on this line in initialize default attributes.

01:42.720 --> 01:45.000
So we're going to get that character class info here.

01:45.000 --> 01:48.240
And if this character class info is a null pointer.

01:48.240 --> 01:51.030
In other words we're on a client I'm going to return.

01:51.300 --> 01:56.310
So if character class info equals null pointer return.

01:57.090 --> 02:04.380
Now what I'm going to do is from character class info I'm going to get those primary attributes, the

02:04.380 --> 02:05.790
set by caller version.

02:05.790 --> 02:09.720
And I'm going to assign set by caller magnitudes to it.

02:09.720 --> 02:11.430
Now we have an example of that.

02:11.430 --> 02:17.040
If we scroll almost all the way down to the bottom we have apply damage effect right.

02:17.040 --> 02:22.140
And apply damage effect is assigning set by caller magnitudes to the spec handle.

02:22.140 --> 02:24.990
And what it needed was a few things.

02:24.990 --> 02:27.150
It needs to get the gameplay tags.

02:27.300 --> 02:32.130
It needs the source avatar actor so we can add a source object.

02:32.130 --> 02:37.980
It needs to make an effect context handle, and it needs to make a spec handle and assign some set by

02:37.980 --> 02:39.330
caller magnitudes.

02:39.330 --> 02:46.230
So I'm going to take the first line where we're assigning a set by caller magnitude all the way up to

02:46.230 --> 02:48.210
the gameplay tags and copy it.

02:48.210 --> 02:52.920
Now I'm going to remove most of this, but it does have several things that I need.

02:52.920 --> 02:59.280
So I'll go back up to my new function, initialize default attributes from Save Data and paste this

02:59.280 --> 03:02.970
here, and we'll start to take out what we don't need.

03:03.440 --> 03:05.780
First of all, we need gameplay tags.

03:05.780 --> 03:08.750
That's a good one for the source avatar actor.

03:08.750 --> 03:15.410
We already have the ability system component, so we can call get avatar actor directly from that for

03:15.410 --> 03:17.240
the effect context handle.

03:17.240 --> 03:22.730
Again, we already have the ability system component we can simply call make effect context on it.

03:22.730 --> 03:26.690
We can add the source object using source avatar actor.

03:26.690 --> 03:32.750
That's fine, but we don't need to set death, impulse, knockback, force, or any of these damage

03:32.750 --> 03:35.720
related variables on the context handle.

03:36.450 --> 03:38.550
Let's go ahead and remove those lines.

03:38.580 --> 03:40.650
Now we do need a spec handle.

03:40.650 --> 03:43.470
But again we have the ability system component.

03:43.470 --> 03:46.260
We can call make outgoing spec directly on it.

03:46.260 --> 03:48.780
And for the damage gameplay effect class.

03:48.780 --> 03:53.250
Now we're going to need to get that class from character class info.

03:53.250 --> 03:57.330
So we're going to use character class.

03:57.330 --> 04:00.090
Sorry, autocomplete gave me something I didn't want.

04:00.090 --> 04:01.620
I'm going to have to take that out.

04:02.220 --> 04:06.960
What I meant to type was character class info.

04:07.170 --> 04:11.190
And from that we're going to get primary attributes set by color.

04:11.190 --> 04:14.280
And we're going to apply this effect at level one.

04:14.280 --> 04:17.970
So one dot f and we're going to pass in the effect context handle.

04:17.970 --> 04:24.990
So now that we have a spec handle we can start assigning set by color magnitudes for our primary attributes.

04:24.990 --> 04:27.930
And those exist on our save game object.

04:27.990 --> 04:33.000
So we're calling assign tag set by color magnitude passing in the spec handle.

04:33.000 --> 04:36.840
But the tag now is going to be an attribute tag.

04:36.840 --> 04:40.170
We're going to use gameplay tags dot attributes primary.

04:40.170 --> 04:42.270
And we can start with strength.

04:42.270 --> 04:45.750
And for the value we're going to get them from saved game.

04:45.750 --> 04:48.960
We're going to get save game strength.

04:50.470 --> 04:55.630
And now we've set our primary attribute set by color magnitude for strength.

04:55.630 --> 04:59.350
And we're going to do this three more times 123.

04:59.560 --> 05:03.400
And we're going to change the attribute tag for each of them.

05:03.400 --> 05:08.890
For the second one we'll do intelligence and use save game intelligence.

05:09.800 --> 05:15.920
For the third one, we'll do resilience and set it to save game resilience.

05:15.920 --> 05:21.410
And finally we have vigor using save game vigor.

05:21.830 --> 05:26.930
Now that we've set these we can apply that gameplay effect.

05:27.350 --> 05:30.950
And we're doing that all the way down here as well.

05:30.950 --> 05:37.370
If we go back down, we'll see that we take the ability system component and call apply gameplay effects

05:37.370 --> 05:38.030
back to self.

05:38.030 --> 05:38.780
That's it.

05:38.780 --> 05:42.860
So let's go back up to initialize default attributes from save data.

05:42.860 --> 05:46.010
I just searched for save game and that took me to it.

05:46.190 --> 05:48.770
So we're going to apply this effect.

05:48.770 --> 05:56.510
We're going to take the AC and call apply gameplay effect spec to self.

05:56.690 --> 05:59.810
We're going to apply that gameplay effect spec.

05:59.810 --> 06:02.030
So we're going to take spec handle.

06:03.290 --> 06:04.160
Dot data.

06:04.160 --> 06:08.180
We're going to dereference data now.

06:08.180 --> 06:11.810
After this we can apply the secondary attributes.

06:11.810 --> 06:16.670
And we can do that the same way we did it up here in initialize default attributes.

06:16.670 --> 06:22.520
We just have to get character class info, secondary attributes and character class info, vital attributes.

06:22.520 --> 06:28.460
But we have to be careful here because the secondary attributes in character class info, that's the

06:28.460 --> 06:32.810
secondary attributes for enemies, isn't it?

06:32.810 --> 06:37.100
Because it doesn't have infinite duration, it's an instant effect.

06:37.100 --> 06:39.920
So that's something we have to keep in mind.

06:39.920 --> 06:45.170
We're going to want infinite duration gameplay effects for these.

06:45.170 --> 06:49.670
So first let's actually apply what we've got here.

06:49.670 --> 06:55.460
We'll go ahead and paste these lines down here and replace avatar actor with source.

06:55.460 --> 06:56.690
Avatar actor.

06:58.100 --> 07:01.430
And replace level with one dot f.

07:04.150 --> 07:10.090
But we're going to need character class info to have infinite duration, secondary and vital attributes

07:10.120 --> 07:11.230
gameplay effects.

07:11.230 --> 07:14.350
So that's something we are going to need to fix.

07:14.350 --> 07:20.140
So our character class info data asset is going to need a different secondary attributes.

07:20.140 --> 07:24.670
It's going to need one that's infinite duration so that we can apply this to aura.

07:24.700 --> 07:31.750
The vital attributes is actually just an instant gameplay effect applied after secondary attributes

07:31.750 --> 07:35.950
have been applied, but secondary has to be an infinite one.

07:35.950 --> 07:42.100
So let's go into character class info and add one more T subclass of.

07:42.100 --> 07:43.840
For secondary attributes.

07:43.840 --> 07:49.570
We'll copy the secondary attributes one and we'll call this secondary attributes underscore infinite.

07:49.570 --> 07:52.990
And this one will have for aura specifically.

07:52.990 --> 07:57.760
And that's the one that we're going to use here in Aura Ability System library.

07:57.790 --> 08:00.160
We'll use secondary attributes infinite.

08:00.160 --> 08:03.610
And we'll just set that in the data asset to that gameplay effect.

08:03.610 --> 08:05.560
That we already have in aura.

08:05.560 --> 08:05.950
Okay.

08:05.950 --> 08:12.040
So now that we have this, if we remember to set that secondary attributes infinite, we can initialize

08:12.040 --> 08:17.170
default attributes from save data in aura character right here.

08:17.170 --> 08:19.600
If this is not the first time loading in.

08:19.600 --> 08:23.440
So we can use you aura ability system library.

08:24.310 --> 08:29.620
Initialize default attributes from save data passing in a world context object.

08:29.620 --> 08:30.700
That's this.

08:30.700 --> 08:34.330
And passing in an ability system component.

08:34.330 --> 08:39.790
And finally passing in a u load screen save game.

08:39.790 --> 08:43.360
That's going to be the save data that we have here.

08:43.510 --> 08:44.740
Save data.

08:46.340 --> 08:52.070
And with that we should be loading in our attributes once we've saved them.

08:52.520 --> 08:55.820
Now that's a big thing to test, so let's compile.

08:55.820 --> 09:04.130
Make sure to add that infinite gameplay effect to class default info and see if we can save some progress.

09:04.130 --> 09:06.080
We have lots of things to test.

09:06.080 --> 09:13.610
We can check our level, our XP spell points, attribute points, even our primary attributes after

09:13.610 --> 09:14.840
spending points.

09:14.840 --> 09:21.680
So let's test it out okay, so I'm going to open up my assets and get a character class info.

09:21.680 --> 09:24.110
Here's secondary attributes infinite.

09:24.110 --> 09:31.790
And that's going to be our GE secondary attributes not the enemy not test just secondary attributes.

09:31.790 --> 09:33.140
That's the infinite one.

09:33.140 --> 09:37.700
If we browse to it and open it up we'll see that it has.

09:38.440 --> 09:40.060
Infinite duration.

09:40.270 --> 09:41.920
That's the one we'll use.

09:42.280 --> 09:44.650
All right, we're ready to test.

09:44.650 --> 09:47.050
Let's go into maps load menu.

09:47.050 --> 09:49.750
And I'd like to clear out our saved data.

09:49.750 --> 09:53.590
So I'm going to select this slot and delete it and just make a new one.

09:54.740 --> 09:56.570
I'll give it my proper name.

09:57.560 --> 10:00.230
Select that slot and press play.

10:01.120 --> 10:03.790
Now it looks like I sort of leveled up.

10:03.790 --> 10:04.300
Kind of.

10:04.300 --> 10:06.220
It started me off at level zero.

10:06.220 --> 10:07.690
So that's weird.

10:07.690 --> 10:12.460
We have zero spell points, but we have our attributes initialized.

10:12.460 --> 10:21.400
Now, I know why I started off at level zero, because if I go back to here, we're setting our level

10:21.400 --> 10:25.540
to the save data player level, which is zero really.

10:25.540 --> 10:27.970
We should be setting these to default values.

10:27.970 --> 10:30.520
If this is our first time loading in.

10:30.520 --> 10:33.910
If not then we should load them in from disk, right?

10:33.910 --> 10:39.520
So if it's our first time loading in we should move these lines.

10:41.230 --> 10:42.460
Right here.

10:43.060 --> 10:44.110
We should move them.

10:44.110 --> 10:45.880
The whole thing, the if statement and all.

10:45.880 --> 10:52.270
I'm going to control X to cut it and move it into this else here because otherwise it's our first time

10:52.270 --> 10:52.870
loading in.

10:52.870 --> 10:57.940
And we should start off at our default values, which means we don't have to load them up at all.

10:57.940 --> 11:00.910
Our player state already has default values.

11:00.910 --> 11:02.830
It starts our level off at one.

11:02.830 --> 11:05.050
Our XP is one.

11:05.050 --> 11:07.660
Strangely, it should actually be zero.

11:07.840 --> 11:11.320
We should start off with empty XP and no attribute points.

11:11.320 --> 11:12.160
No spell points.

11:12.160 --> 11:13.030
So that's great.

11:13.030 --> 11:15.100
So that's going to fix that issue.

11:15.130 --> 11:18.580
We don't need to load anything in if it's the first time right.

11:18.580 --> 11:20.500
So we're ready to test this.

11:20.500 --> 11:25.270
Although one last thing we're calling load progress which is adding character abilities.

11:25.270 --> 11:29.890
So we don't actually need to add character abilities right here.

11:30.070 --> 11:37.510
We do still want to load character abilities from disk, but we're going to move this to do now into

11:37.510 --> 11:39.760
here where we're loading progress.

11:39.760 --> 11:45.670
So if it's the else case right here, this is where we're loading in.

11:45.670 --> 11:47.260
Not for the first time.

11:47.260 --> 11:49.690
That's when we need to load in abilities from disk.

11:49.690 --> 11:50.800
We don't need to do it here.

11:50.800 --> 11:53.290
And we don't need to call add character abilities.

11:53.290 --> 11:55.990
We're already doing that if it's our first time.

11:55.990 --> 12:01.090
So let's go ahead and test out everything that we've done so far.

12:01.120 --> 12:01.840
Okay.

12:01.840 --> 12:06.400
So what we're going to do is we're going to bring in an enemy so we can level up.

12:06.400 --> 12:11.860
Let's go to blueprints character and we'll bring in a goblin spear.

12:12.700 --> 12:17.500
That way we can gain some experience and test out leveling up.

12:17.500 --> 12:19.300
So let's go to load menu.

12:19.300 --> 12:27.430
And I'm just going to delete all my slots and start fresh I'll call this Steven get that new slot.

12:27.430 --> 12:30.610
Press play and we can try leveling up.

12:30.610 --> 12:32.650
Let's go ahead and kill this enemy.

12:33.750 --> 12:35.340
Okay, so we've leveled up.

12:35.340 --> 12:36.900
We've reached level four.

12:37.320 --> 12:39.720
We now have some spell points.

12:39.720 --> 12:41.460
We have three attribute points.

12:41.460 --> 12:42.840
Three spell points.

12:42.870 --> 12:48.720
Now it doesn't matter what levels our abilities are, we're not loading those in from disk.

12:48.720 --> 12:50.550
So that doesn't really matter.

12:50.550 --> 12:54.810
We could spend a point just to save it and see if we load it in at two.

12:54.840 --> 12:56.730
We just need to remember how many we have.

12:56.730 --> 12:58.380
We'll have two spell points.

12:58.380 --> 13:01.230
I'll go ahead and spend an attribute point on strength.

13:01.230 --> 13:04.080
So that strength is 11 and we'll have two attribute points.

13:04.080 --> 13:07.200
So two and two we'll remember that.

13:07.200 --> 13:08.670
And we're at level four.

13:08.670 --> 13:10.530
So let's go to a checkpoint.

13:10.530 --> 13:14.070
Make sure we save our progress and load back in.

13:14.070 --> 13:18.960
So we're first of all not seeing that my level is four.

13:18.960 --> 13:22.590
So we're going to want to make sure that that level updates.

13:22.590 --> 13:24.120
But we haven't implemented that yet.

13:24.120 --> 13:24.510
Right.

13:24.510 --> 13:27.450
But we can select the slot and load in.

13:27.450 --> 13:32.820
And well I got the level up message and the sound, which is funny.

13:32.820 --> 13:33.960
We don't need that.

13:33.960 --> 13:35.430
So we want to fix that.

13:35.430 --> 13:37.200
But I'm at level four.

13:37.200 --> 13:41.220
I have 11 strength and two attribute points which is what I saved at.

13:41.880 --> 13:45.630
And I have two spell points even though I have no abilities.

13:45.630 --> 13:51.420
And that's because we're not loading in abilities from disk and we're preventing loading those default

13:51.420 --> 13:54.330
abilities if this is not our first time loading in.

13:54.330 --> 14:02.310
So that is the behavior that we expected, because we still need to implement the saving and loading

14:02.310 --> 14:03.300
of abilities.

14:03.300 --> 14:04.680
So that's fine.

14:04.680 --> 14:11.520
But before we get to saving and loading abilities, I just want to take care of a couple little issues.

14:11.520 --> 14:17.190
So the first one is that when I load in, I don't want to see that level up message or hear that level

14:17.190 --> 14:18.180
up sound.

14:18.180 --> 14:26.010
So when we make those broadcasts for when our level changes, we need to broadcast some information,

14:26.010 --> 14:27.570
such as a boolean.

14:27.570 --> 14:33.840
That's true or false depending on if this is loading in that level from disk.

14:33.840 --> 14:37.110
So we still do want to broadcast to our widgets.

14:37.110 --> 14:41.220
So they update themselves, but we don't want the level up effects.

14:41.220 --> 14:43.800
So that's one thing we can do right now.

14:43.800 --> 14:49.410
We can fix that by changing the delegate we broadcast when our level changes.

14:49.410 --> 14:51.870
Now we broadcast that from the player state.

14:51.870 --> 14:57.930
If we go to Aura Player state, we'll see that on level change delegate broadcasts the level.

14:58.110 --> 15:05.220
But when we set the level, we now need to know if we're setting it by loading it in from disk or if

15:05.220 --> 15:06.930
we're actually leveling up.

15:06.930 --> 15:08.700
So that's a fix we can implement.

15:08.700 --> 15:11.130
We can make on level change delegate.

15:11.130 --> 15:12.330
Have a boolean.

15:12.330 --> 15:16.260
That's true if we're leveling up and false if we're not.

15:16.530 --> 15:19.440
So that's going to be an aura player state.

15:19.440 --> 15:21.060
We'll go up to the top.

15:21.060 --> 15:28.050
We have player stat changed and on level change delegate is an on player stat changed.

15:28.050 --> 15:32.940
We're actually going to want a delegate that broadcasts a boolean now instead.

15:32.940 --> 15:37.740
So let's make a multicast delegate to params.

15:37.740 --> 15:42.990
So declare multicast delegate two params.

15:44.170 --> 15:46.900
And this is going to be on level changed.

15:47.590 --> 15:54.490
So we now need to params because the next one is a boolean that will tell us if we leveled up.

15:55.510 --> 16:01.180
So it'll be a B level up and we'll now change.

16:02.350 --> 16:10.180
On level change, delegate to the F on level changed and that means we have to broadcast, right?

16:10.730 --> 16:19.250
Now what we can do is we can make our set level a non-level up setter and just broadcast false here.

16:19.250 --> 16:24.230
That way we don't have to go and change a bunch of code that's setting the level, just really one place.

16:24.230 --> 16:27.710
But we can also have a set level that broadcasts.

16:27.710 --> 16:28.130
True.

16:28.130 --> 16:31.400
And that's for set level with level up.

16:31.400 --> 16:39.920
So let's make another setter just under set level I'll just copy this and this will be set level with

16:39.920 --> 16:40.850
level up.

16:40.850 --> 16:45.770
And actually that means we do need to change where we're calling set level where we're leveling up.

16:45.770 --> 16:51.020
Now this one is going to be just like set level only it's going to broadcast.

16:51.020 --> 16:51.470
True.

16:51.470 --> 16:52.160
So true.

16:52.160 --> 16:53.690
They're now changing.

16:53.690 --> 16:56.510
This delegate is going to break a couple things.

16:56.510 --> 16:58.280
And we're going to have to fix those.

16:58.280 --> 17:00.200
But let's take this step by step.

17:00.200 --> 17:03.680
First let's change where we're calling set level.

17:03.680 --> 17:07.100
When we level up to set level with level up.

17:07.430 --> 17:10.460
And that's going to be in our attribute set when we level up.

17:10.460 --> 17:12.560
So I'm just going to search for set level.

17:14.480 --> 17:20.000
Level up and it looks like we're actually executing interface functions.

17:20.000 --> 17:22.400
We're executing here, adds a player level.

17:22.400 --> 17:26.210
So let's go ahead and go to our character.

17:26.210 --> 17:28.640
And here's add to player level implementation.

17:28.640 --> 17:33.980
So really it looks like add to level is the only function we'd call to level up.

17:33.980 --> 17:36.320
We're never going to set the level directly.

17:36.320 --> 17:43.190
So or a player state add to level could actually just handle broadcasting that delegate.

17:43.190 --> 17:45.680
Let's go to our player state add to level.

17:46.070 --> 17:49.010
And here we'll broadcast true.

17:49.010 --> 17:52.010
So add to level is what we'll use to level up.

17:52.010 --> 17:55.310
And we don't really need set level with level up.

17:55.310 --> 17:59.630
We'll just have set level for setting it when we're loading from disk.

17:59.630 --> 18:00.890
That's totally fine.

18:00.890 --> 18:03.560
So I'm going to remove set level from level up.

18:03.560 --> 18:04.820
Set level with level up.

18:04.820 --> 18:06.260
That is I'm going to remove that.

18:06.260 --> 18:14.300
And we'll just have add to level for leveling up and set level for loading in from disk and in or a

18:14.300 --> 18:21.950
character add to player level will call add to level and when loading from disk we'll call set level

18:21.950 --> 18:29.060
right here and that will broadcast false as our set level will broadcast false in that delegate and

18:29.060 --> 18:31.310
add to level will broadcast true.

18:31.310 --> 18:37.220
So now it's up to our overlay widget controller to accept the broadcast.

18:37.220 --> 18:42.110
Its callback or lambda needs to be compatible with this broadcast.

18:42.110 --> 18:44.540
So the next thing to do is.

18:45.070 --> 18:47.320
Go into the private folder.

18:47.320 --> 18:51.220
Into widget controller, into overlay widget controller.

18:51.220 --> 18:53.530
Here's on level change delegate.

18:53.740 --> 18:56.200
It now needs to take in a boolean.

18:56.200 --> 18:59.560
So bool and this will be called be level up.

19:00.100 --> 19:02.860
And our overlay widget needs to know that too.

19:02.890 --> 19:09.910
So on player level change delegate is a dynamic multicast delegate that needs to take in a boolean now.

19:10.420 --> 19:14.620
So I'm going to go into overlay widget controller dot h.

19:14.620 --> 19:22.060
And we need our on player level changed to now be a delegate that can take a float and a boolean.

19:22.180 --> 19:27.880
So we'll copy on attribute change signature and we'll make one with two params.

19:28.060 --> 19:33.850
And this will be f on level changed signature.

19:35.030 --> 19:36.920
It'll take a float called New Value.

19:36.950 --> 19:39.830
We'll call it new level, actually, and a bool.

19:39.830 --> 19:42.350
And it looks like I don't have the params there.

19:42.380 --> 19:43.370
There we go.

19:43.370 --> 19:47.420
So we have new level and we have a bool called be level up.

19:47.420 --> 19:50.210
And that needs a comma there.

19:50.210 --> 19:54.800
And we'll change the type of on player level change delegate to this type.

19:55.900 --> 19:56.350
Now.

19:56.350 --> 19:59.950
Because of that, it needs to broadcast a boolean as well.

20:00.130 --> 20:04.330
So right here our broadcast will now broadcast be level up.

20:04.330 --> 20:09.430
And now we need to go and fix things that will be broken in blueprint as a result of this.

20:09.430 --> 20:13.450
And I don't think anything else responds to on player level change.

20:13.450 --> 20:14.290
Delegate.

20:14.780 --> 20:16.790
So that's the only thing we need to fix.

20:16.790 --> 20:19.010
Let's compile and launch the editor.

20:19.070 --> 20:23.780
Okay, so player state line 74 we have on rep level.

20:23.780 --> 20:28.400
So this also has to know if it's a level up.

20:28.400 --> 20:30.710
So that's an issue isn't it.

20:30.710 --> 20:33.710
Because on the client we're not going to know.

20:33.710 --> 20:35.960
Although this is a single player loading system here.

20:35.960 --> 20:39.800
So what we're going to do is just pass in true to satisfy that.

20:40.070 --> 20:45.320
And for a multiplayer solution we'd have to think of something else, right?

20:45.320 --> 20:47.690
We'd have to accommodate for that boolean.

20:47.690 --> 20:49.190
But it doesn't matter.

20:49.190 --> 20:50.180
We can just pass in.

20:50.180 --> 20:53.090
True for that and we can compile this now.

20:53.090 --> 20:58.910
So back in the editor we have to go into our overlay widget and fix things.

20:58.910 --> 21:03.170
So let's go to our overlay WB overlay.

21:03.170 --> 21:04.670
Go to the event graph.

21:04.670 --> 21:06.950
And right here is broken.

21:07.160 --> 21:09.740
So we need to refresh the nodes.

21:09.740 --> 21:12.710
And it looks like we broadcast a float.

21:12.710 --> 21:17.780
We can fix that by making this delegate broadcast an integer.

21:17.780 --> 21:21.500
That should have been a float on level change signature.

21:22.150 --> 21:24.190
Can broadcast it in 32.

21:24.220 --> 21:25.720
But that's not a big deal.

21:25.750 --> 21:29.020
However, we are going to want to just really quickly recompile.

21:29.020 --> 21:31.780
If we don't want to have to fix a broken blueprint node again.

21:31.780 --> 21:38.350
So let's recompile and back in the editor we can open our overlay and now we can fix that broken node.

21:42.550 --> 21:44.200
So we'll refresh it.

21:46.020 --> 21:54.330
And we can pass the level end to handle level up message only handle level up message is doing what

21:54.330 --> 22:01.950
it's creating our level up message widget, setting its text and adding it to the viewport.

22:01.950 --> 22:02.520
Right.

22:02.520 --> 22:07.200
We want to prevent all of this if it's not a level up.

22:07.680 --> 22:15.780
So we're going to place a branch here and check level up and only do the level up message if it is a

22:15.780 --> 22:16.560
level up.

22:16.650 --> 22:22.500
Now what about this here value globe level?

22:22.710 --> 22:27.390
Well it looks like there's some weird stuff going on with it, right?

22:27.390 --> 22:34.230
If we control F and search for value globe level, it's right here.

22:34.230 --> 22:36.750
And set widget controllers.

22:36.900 --> 22:39.120
We're setting its widget controller.

22:39.120 --> 22:41.310
It's a separate widget right.

22:41.310 --> 22:45.150
And that means we need to go look at that widget.

22:45.150 --> 22:47.220
If we search for value globe.

22:47.870 --> 22:50.360
We can find it, we can browse to it.

22:50.360 --> 22:52.010
It is in spell globes.

22:52.790 --> 22:55.490
Now we can see what's going on here.

22:56.690 --> 23:01.640
Of course, this is bound to the overlay widget controller's delegate.

23:01.640 --> 23:05.240
Let's refresh this node and we can call set text here.

23:05.240 --> 23:07.610
Now this doesn't matter if it's a level up or not.

23:07.610 --> 23:09.380
So with that we can fix that.

23:09.380 --> 23:10.580
And it looks better.

23:10.580 --> 23:12.860
We can press play and it looks good okay.

23:12.860 --> 23:15.710
So that should fix loading in.

23:15.710 --> 23:18.320
Let's go back and go to load menu.

23:19.240 --> 23:20.530
And let's load in.

23:22.800 --> 23:28.050
And we don't get that level up message even though we're setting our level here to four.

23:28.080 --> 23:35.670
Okay, now don't freak out if you open your attributes menu and try to spend a point on strength and

23:35.670 --> 23:39.720
nothing happens because we're not applying any abilities here.

23:39.720 --> 23:44.520
And remember, our attributes are using a passive ability.

23:44.520 --> 23:49.980
Listen for events because we're sending gameplay events when we upgrade our attributes.

23:49.980 --> 23:56.190
Well, when we're loading in and it's not the first time, we don't apply that gameplay ability we need

23:56.190 --> 24:02.490
to load in our gameplay abilities if it's not our first time loading in, so we're not loading those

24:02.490 --> 24:04.140
in yet, we need to do that.

24:04.140 --> 24:09.420
That's going to be next when we figure out how we can save our gameplay abilities, so that's coming

24:09.420 --> 24:10.020
right up.

24:10.020 --> 24:14.010
But other than that, we're able to load in our attributes.

24:14.010 --> 24:17.400
We have two spell points there and that's great.

24:17.520 --> 24:19.380
So a couple things right.

24:19.380 --> 24:24.840
First, I'd like to make sure that we show our level here in the load screen.

24:24.840 --> 24:27.030
And then we want to save and load abilities.

24:27.030 --> 24:28.710
So we'll do those things next.

24:28.710 --> 24:30.750
Great job and I'll see you soon.
