Free YouTube Transcribe

Video transcript

Smart Enemy AI | (Part 19: Player Block/Parry/Combo) | Tutorial in Unreal Engine 5 (UE5)

Ali Elzoheiry · 10,026 words · 46 min read

Want to search this transcript, jump the video from any line, or download it as TXT, SRT, or VTT?

Open in the transcript tool

Full transcript

Intro

0:00welcome back everyone to part 19 of the

0:02series and in this part you will learn

0:04how to create this melee combat system

0:07for the player that you can block

0:10attacks and if you time them correctly

0:12you can Parry attacks that stagger the

0:14enemy like this giving you enough time

0:16to do this super

0:18cool combo let's see it again one two

0:24three

0:25nice and we also learning how to create

0:28this melee stance that you can switch to

0:30Mage stance to shoot projectiles and go

0:33to unarmed stance and then switch back

0:35to

0:37melee now um I usually focus on the

0:40enemy in this series but in this part I

0:42decided to focus on the player um before

0:45moving on to the boss fight we need the

0:46player to be able to actually fight and

0:49it's also super cool just to have the

0:50player uh be able to do these cool melee

0:53attacks so I hope you enjoyed and let's

0:55get

0:58started

Adding Melee Stance

1:03all right so the first thing we want to

1:05do is add a melee stance to our uh

1:08player so right now we have this default

1:10or unarmed stance and when I press right

1:12click I enter the Mage stance where I

1:15can shoot the projectile so we want to

1:17add another stance for holding the melee

1:19sword or Shield so let's do that open up

1:24our player folder our player uh and if

1:28you recall we have have uh here where we

1:31enter magic stance enter default stance

1:34and we switch between them by pressing

1:36right click so uh and we also have this

1:39enum e player stance so I'm going to

1:42open this up and I'm going to add uh

1:44another value here called melee so we

1:48have default magic and melee and

1:50actually default I'm going to rename

1:51this to

1:52unarmed so now we have unarmed magic and

1:56melee great so back here in my player uh

2:01let's also rename this

2:04um unarmed stance and let's just name

2:08this magic stance I don't need

2:11enter okay so now we want to have a new

2:14stance here so let me just make some

2:19room all

2:22right so now let's add a new custom

2:26event and call this the melee stance

2:30so it's going to start by setting The

2:33Stance um enum value to

2:36melee uh and I'm going to use the uh

2:39character movement the same as the magic

2:41stance so I'm going to allow strafing to

2:43do that I'm going to set use controll

2:45desired rotation and uh disable Orient

2:49rotation to movement so same as we have

2:52them here just copy all of this and copy

2:56also the move

2:58speed and paste it right

3:03here uh and the move speed will be a bit

3:07different uh so I know for our strafe we

3:10have a pretty slow move speed so I'm

3:12going to promote this to a variable and

3:14call it the melee walk speed and I think

3:19this value was pretty low but we're

3:20going to make the strafe faster at least

3:23the running wood the sword faster in a

3:24bit for now I'm going to set this at

3:27150 and then we want to actually spawn

3:32um the sword so let me pull off of here

3:35and do spawn actor from class we already

3:38have our sword

3:41weapon um the transform I'm going to

3:44leave empty so to leave it empty you

3:47have to split so that it has default

3:49values or uh pull off of it and say make

3:53transform um these are the only ways to

3:55leave it empty because just not doing

3:57anything and compile it will complain

3:58that this has to have a value so I'm

4:01going to split it so it stops

4:04complaining and then I'm going to

4:08um attach actor to

4:13component and I'm going to attach it to

4:16the

4:18mesh and since we're using the same mesh

4:21as the enemy we do have a socket already

4:23for it let me open it to see what it was

4:25called search for sword yeah hand R

4:29sword sockets so I'm going to go here

4:32and put this as my socket name and I'm

4:34going to have them all snap to Target so

4:37they take the location rotation and

4:39scale of the socket

4:42itself all right so now this looks like

4:45a pretty basic uh melee stance uh now

4:48you need a way to switch between it so

4:51right now we use rightclick uh I'm not

4:53going to do that I'm going to have the

4:55number key so one two and three switch

4:57between them so I'm going to delete this

5:01um and actually I'm going to create a

5:02new function over here and I'm going to

5:05call it change stance and it takes as

5:08input the new

5:10stance that I want to change to and this

5:13is of Type e player

5:17stance now the first thing is I'm going

5:19to take uh the existing stance so get

5:25stance and I'm going to promote it to a

5:28local variable local means it's stored

5:30inside this function and I'm going to

5:32call it old stance and you'll see why

5:34I'm doing this in a second so I'm

5:36storing the existing stance and then

5:39immediately after I'm going to switch to

5:40the unarmed stance uh because the

5:43unarmed stance uh resets uh the socket

5:46offset resets the aim timeline removes

5:49the Crosshair so it just resets anything

5:50that was done by any other stance so I

5:52think this is good to

5:54have so I'm going to switch to the

5:56unarmed stance and then I'm going to

5:57switch pull off of the the new stance

6:00and say

6:01switch so now I have all the different

6:04cases U so if I'm trying to switch to

6:06Magic stance all I have to do is call

6:08Magic stance and if I'm trying to switch

6:11to melee stance I call melee stance if

6:14I'm trying to switch to unarmed I don't

6:16have to do anything because I already

6:17switched to unarmed before doing

6:20this uh but what about this old stance

6:22why did I add it uh because if I'm

6:25already in melee stance I shouldn't

6:27switch to melee stance I should actually

6:29undo it so I should switch to

6:31unarmed um or I already switched to

6:34unarmed so maybe I should just not do

6:36anything here so I'm going to add a

6:37branch before each of these uh me move

6:41that a bit so I'm going to add a branch

6:44here and a branch uh we check if the

6:48value of the old stance so this local

6:50variable that I

6:53created is not equal enum to

6:58Magic

7:00so if this value is not equal to Magic

7:03then switch to Magic otherwise don't do

7:05anything don't do anything means stay in

7:07the unarmed and the same for the

7:10melee uh if whoop let me copy this if

7:14this value is not equal to

7:17melee and

7:20Branch then switch to melee but if it is

7:22melee then don't do

7:25anything all right and that's pretty

7:27much our change stance function

7:30now let's call it just let me close this

7:34up um all right so let me call it

7:37somewhere here

7:38maybe uh on keyboard press zero let's

7:45say so zero switch stance by the way um

7:50I'm only doing this it's called change

7:52stance I'm only using the keyboard

7:54events because uh I don't want to create

7:56new input uh using the enhanced input

7:59system but if you are creating an actual

8:01game not for testing don't use it like

8:02this create an actual enhanced

8:05input uh so zero switches to

8:10unarmed uh

8:12one switches to melee let's do it like

8:18that

8:20and two switches to

8:26magic all right uh

8:30um let's test it

8:32out so now if I press one I'm holding

8:36the sword so I'm switch I didn't change

8:39the animations yet we're going to fix

8:40that and if I press one again I go back

8:43to the unarmed but I still have the

8:45sword in my hand and if I switch to now

8:48I'm in Mage and I still have the sword

8:49in my

8:50hand um so we want to actually remove

8:53the sword when we switch to the unarmed

8:56State um so what I can do is

9:00move this a bit here in the unarmed

9:02State at the very end um let me promote

9:06this to a variable this is the sword

9:08that we're spawning I'm going to call it

9:10uh

9:12equipped equipped weapon and I'm going

9:15to change the type to be uh the weapon

9:18base so that this can be any weapon not

9:21just a

9:24sword and plug this

9:27here and and then at the very end of

9:32the uh unarmed of the unarmed event I'm

9:36going to right click this equipped

9:38weapon convert to a validated get so

9:41this is the weapon that we just created

9:43if it is valid destroy

9:47it all right and here we call this

9:50change

9:52stance move it a bit closer all right

9:55now let's see spawn the sword press

9:59press it again sword is gone press it

10:01again I have the sword switch to mage

10:03sword is

10:05gone perfect okay now let's uh fix our

Melee Locomotion Animations

10:10animation issue so let's open up

10:14our animation blueprint

10:18player and let's see how we can switch

10:21stance so in our loc motion double click

10:24this in our walk run uh we have this

10:29blend by Bo the checks if the stance is

10:31equal to Magic use the magic Locomotion

10:34if the St and if it's false use the

10:36unarmed so we're going to remove this

10:39and we're going to use a new blend um

10:41you can do something called blend by

10:44enum so we can do blend by E player

10:47stance so this will give you all the

10:49values in the enum but you have to right

10:51click and add them yourself so you can

10:53add the unarmed add the magic add the

10:56melee and then you can say what happens

10:58on melee unarmed and Magic so this is

11:02our magic

11:03one uh this is our unarmed one and also

11:07our default one so let's uh do it for

11:10both default and

11:15unarmed and now we need our melee one

11:18and luckily we already have a blend

11:20space that we used for the melee enemy

11:23uh it was called strafe sword

11:26yeah and Direction and ground speed we

11:28are have so plug Direction plug ground

11:31speed and plug this to

11:33melee all right oh I forgot to put this

11:37one very

11:39important all right compile and save and

11:41now let's

11:43see nope

11:46still not

11:49working

11:50uh let's see why not so over here we

11:57switch to the melee stance

12:00and this should update oh we forgot to

12:04plug in the value of the enum this

12:06should be stance of

12:09course uh that would do

12:12it and now let's try again so yes here

12:16we go but in the idle State it's not

12:18doing anything so let's change the idle

12:20State as

12:22well yeah and let's quickly go back to

12:25the idle State uh actually let me copy

12:28the same blend space here this one and

12:31go to our idle

12:33State delete this delete this plug this

12:39one default is this one copy it again

12:43also the

12:45unarmed magic is this one and melee

12:49what's the sword idle called sword

12:52idle great and just plug it in

12:57here and now we have have our idle State

13:00as well let me try again yep here we go

13:03idling um one thing that's annoying

13:05though is that uh the player is very

13:07slow in this state can't go faster than

13:10this uh so I'm going to fix that and

13:13luckily before I started recording I

13:16already downloaded some

13:18animations for uh the run with sword so

13:23I have a run forward run back and run uh

13:27uh left and right with the sword so I'm

13:30going to just edit our blend space so

13:33this blend space that we use here for

13:36the uh sword strafe uh right now the

13:40maximum speed of this blend space is if

13:42you look at the uh

13:44vertical uh sorry which one is it yeah

13:47the vertical axis the maximum speed is

13:50100 um so player can't go faster than

13:52this I'm going to increase this to 430

13:56because this is the value I tested with

13:57my animation

13:59and I'm going to look at my sword shield

14:02run animations and put these values at

14:05430 so this is the run back so it should

14:09be

14:11here oh I need to turn off this

14:14sampling because uh it's going to change

14:18my values all right so run back at 430

14:21over here and over here uh on these

14:24Corners because this is the when the

14:26direction is - 180 to 180 that means

14:28you're going

14:29backwards here run forward when the

14:32direction is zero and this one is run

14:35left when the direction is 90 and run

14:39right when the direction is

14:4390 all

14:46right that should do it uh now let's

14:49quickly change our melee walk speed to

14:51be 430 this new value that we added and

14:55now let's see yes much better I can go

14:59in all directions and I can go pretty

15:02fast let's actually make this uh small

15:04detour let's make this change to our um

15:07ABP Manu as well uh because right now uh

15:12in our Locomotion State uh what we do is

15:14that if we're not focusing the target uh

15:17we switch to the normal walk uh uh

15:20Montage this is because we couldn't run

15:23in this sord strafe animation but now we

15:26can so let me just delete this

15:29and then we don't need to switch back to

15:33um anything if we're not focusing the

15:35targets because we can still not focus

15:37the Target and be in the sword strafe

15:39and that's

15:42fine um all

15:45right very nice next thing we want to do

Simple Sword Attack

15:48is uh create the sword uh attack uh

15:52functionality so it's going to be

15:54similar to

15:55the where is it magic spell attack here

15:59um so let's create it next to it move

16:03this up here move the magic spell up as

16:06well and let's create it somewhere

16:09here um custom event we're going to call

16:12this uh melee attack so just like the

16:16magic spell we check our stance we do

16:18once and um oh actually here we should

16:22be setting attacking as

16:26well uh so we should set attacking to

16:29True don't know I forgot about that uh

16:32but anyway it's going to be very similar

16:33so let's check first make sure that uh

16:37we are in the right stance when we do

16:39this so is our stance equal to melee

16:43that's the only case where you can do a

16:45melee

16:46attack uh if true we're going to do a do

16:49once so you can't keep spamming it and

16:52we're going to create a new custom event

16:54call it reset melee attack this is when

16:58we'll call when the attack is over to be

17:00able to undo this or reset this do

17:03once and we uh set attacking to

17:09true and then we play the Montage so

17:13let's

17:14play

17:16Montage in our skeletal mesh

17:20component and I think it's called

17:23slash Yep this Montage here boom

17:29and it has the slash

17:31notify so we need to do something on

17:34this slash notify so pull off of name

17:37say switch on name make sure to plug

17:40this in the notify begin remove the

17:43default pin and add a pin called slash

17:47and here on slash we can pull off of our

17:49bpc attacks because we have our attack

17:51helpers there and we have a sphere trace

17:54on damage it's called let's do radius 20

17:59length

18:01200 and damage info pull off of it and

18:04say make and let's say it's melee damage

18:08causes a hitch reaction and does a

18:11damage of I don't know

18:1520 uh can be blocked can be parried blah

18:18blah blah actually we're going to be

18:19using the very soon in this tutorial

18:21we're going to be using the damage

18:22response we're going to be using the can

18:24be blocked that can be parried and the

18:26should force interrupt we're going to be

18:27using all of these so we're really going

18:29to use the damage system to its fullest

18:31in this

18:34one all right so um on complete and on

18:38interrupt we should call uh reset melee

18:42attack on complete and on interrupt and

18:47switch

18:50attacking back to

18:53false cuz we are no longer

18:56attacking all right now now this will

18:59just play one uh sword swing but we're

19:01going to expand on that let's look at it

19:04now oh we need to call it so um let me

19:10just name

19:13this melee

19:16attack and right now we have just left

19:19Mouse button calls this shoot thing uh

19:23we're going to change it a bit to handle

19:25both

19:26cases uh

19:30all right so we're going to call this

19:31instead of shoot just

19:34attack and it depends on the stance so

19:39we're going to get stance we're going to

19:41switch on the stance and if we are

19:45unarmed don't do anything if you're in

19:47the magic then do the shoot magic spell

19:51and if you're in melee do the melee

19:56attack compile and save and let's see

20:00all right now I'm clicking nothing's

20:01happening if I am holding a sword

20:05nice I can still move while holding the

20:09sword um because we didn't disable

20:12movements but also instead of disabling

20:15Movement we can simply go to our

20:18animations look for our sword slash and

20:23say enable root motion and enabling root

20:27motion will also so disable movement

20:30yeah so now I can't

20:32move and you'll see the camera moves

20:35slightly because yeah the actual

20:37character is moving to the front a bit

20:39with root

20:41motion all right uh now you'll notice

20:44also one thing if I have root motion

20:46enabled and I'm attacking but I switch

20:48the camera the player doesn't move until

20:50the attack is over see

20:53that if you want the camera movement to

20:56also move the player during the attack

20:59uh this very simple there's only one

21:00checkbox you have to do in the character

21:03movement uh search

21:05for uh rotation and click on allow

21:09physics rotation uh during animation so

21:13this one will allow you to do this yeah

21:17see now even though root motion is

21:19enabled I can rotate the character while

21:22a root motion attack or animations

21:24playing this is really nice because if

21:26you are in mid attack and your enemy

21:29moves you want to still be able to react

21:31to

21:32it now before uh we add the super cool

Adding The Shield

21:36combo attack I want to First give our

21:38player a shield so that the combo looks

21:40even

21:41cooler um so to do that um luckily I

21:44already have a shield mesh that I

21:46created here I put it into weapons

21:48meshes

21:49Shields and it looks like this so it

21:52matches our super Co golden sword

21:55aesthetic very basic mesh really

21:59uh and I'm going to create a weapon out

22:00of it um so in our weapons folder uh

22:05right click off the weapon base create

22:07child I'm going to call this BP weapon

22:12shield and in the mesh I'm just going to

22:15select my shield

22:18mesh um I don't think I'm going to do

22:20anything else to it that should be

22:24enough all

22:26right

22:28and now uh we want to actually add our

22:32Shield so somewhere

22:35here um do we have a socket for the

22:39shields let's see

22:42Shield we do

22:46not so let's actually create that one

22:49first I'm going to do this real quick so

22:52go over here use

22:55animation uh use the block

22:59animation and then add it somewhere here

23:02in

23:03our arm right

23:07click oops add sockets and we're going

23:11to call this

23:12the

23:15um arm L Shield

23:20socket and right click and a preview

23:24asset to see what it looks like Shield

23:29rotate it a bit move it to the front

23:37here

23:44yep yeah that looks good and now we have

23:47our socket so I'm going to copy this

23:49name go back here and move this a

23:55bit now let's spawn another

23:59actor from class uh this is in our uh

24:03melee stance by the way after we spawn

24:06the swords then we spawn the

24:10Shields and

24:13we attach actor to component same that

24:17we do

24:19here to our mesh but this time the

24:22socket name is different arm

24:26l

24:29Shield

24:30sockets I think that's what we called

24:34it um all right now let's see what this

24:38looks like oh I have errors where what

24:40are my errors oh here split

24:44this and let's see I don't have a

24:50shield uh components can be attached to

24:53other component oh I am attaching the

24:55wrong thing aren't I oh yes yes I am

24:58need to attach this

25:00one all right so now let's see and my

25:04shield is in a very awkward

25:07place did I get the socket name wrong I

25:10think I got the socket name wrong arml

25:13Shield socket let me copy it this

25:17time uh yeah I spelled Shield

25:19incorrectly I'm not sure in which place

25:22but this is the spelling I have now and

25:24boom yes now we have a Shield looks

25:28really

25:30cool all

25:32right um now one thing uh again here um

25:36I didn't create a variable so when I

25:38switch back to unarmed I still have the

25:41Shield or I switch to Mage I still have

25:43the shield um so I actually over here I

25:46want to destroy any equipped weapon and

25:48not just the this equipped weapon so I'm

25:51going to change this to be an array of

25:52equipped weapons and because you can

25:54have multiple weapons equipped now so

25:57over here here in the equipped weapon

25:58I'm going to rename this to equipped

26:01weapons and I'm going to change this to

26:03be an array by going over here and

26:05selecting array and yes change variable

26:09type uh this one's going to complain

26:11because you can't assign a single value

26:13to an array anymore uh but I'm going to

26:16be spawning weapons differently so I'm

26:18going to actually create a new function

26:20I'm going to also remove this I'm going

26:22to create a new function that spawns a

26:24weapon and another function that

26:26destroys all of them so let's do that

26:28let's have a new function here call it

26:31equip weapon and it takes as input

26:36a um weapon and this is going to be of

26:41type weapon

26:43base and what it's going to do is that

26:46um no actually not going to be of type

26:48weapon base it's going to be of type uh

26:51weapon based class reference so that's I

26:54can actually spawn an actor from class

26:57and use this

26:59class and split the

27:02spawn and then over here I'm going to uh

27:06get my equipped

27:09weapons array and I'm going to

27:13say add

27:15unique so I'm going to add to this array

27:18this newly equipped

27:21weapon uh and then I'm going to proceed

27:24with the uh what was it called yeah this

27:27one the attach actor to components

27:31here didn't I

27:33copy copy paste

27:38yeah and this is going to be my

27:41actor um and the socket name uh I'm

27:44going to have this as a variable as well

27:46so plug it in here socket name and at

27:50the end I'm going to do a return nodes

27:53and let's just return the weapon and

27:56call this

27:58weapon

27:59ref all right uh now I need another

28:02function called

28:04unequip all weapons and all it does is

28:08it gets our equipped weapons array does

28:12a for each Loop so Loops over all of

28:16them and it

28:18destroys the

28:22weapon um and at at the end when it's

28:25completed uh it should empty the array

28:27so get the array and call clear this is

28:30what empties the

28:32array all right so now here instead of

28:36doing

28:37this uh I'm going to

28:40actually let's move that delete this uh

28:44now I'm just going to call uh

28:46equip

28:49weapon I'm going to call it I want the

28:51sword and this is our socket name now we

28:56can delete this

28:59and then I'm going to call it

29:02again equip weapon and this one I want a

29:07shield and this is our socket name now I

29:12can delete

29:15this all right does this have a default

29:17value by the way nope okay now that's

29:20good right so now I am equipping both

29:23weapons and in the end here I just want

29:26to call

29:28uh

29:30unequip

29:32unequip all weapons yeah there's

29:36one all right now it's nice and

29:39short great let's see what it looks like

29:43and nice everything is being equipped

29:47and unequipped now of course you can

29:49have animations for equipping and

29:51unequipping I am not right now but um

29:54yeah this looks pretty good now let's

3 Hit Sword Combo

29:57add our combo attack because right now

29:59we only have this uh one sword slash

30:03attack um so in our melee attack um well

30:08to save us all time um I actually

30:11created uh this combo Montage but I'm

30:15going to explain it still so it's one

30:18Montage that has all of the uh attacks

30:22in it so there are a lot of different

30:25ways you can do combos uh I prefer this

30:28one where all of the combo attacks are

30:30in the same montage and then you have

30:33notify windows that tell you when you

30:35can complete a montage or when to end it

30:38so let me explain if I press the attack

30:42button

30:43once then all of this part plays a sword

30:47swing this just a

30:48sound and then here a notify window uh

30:53plays and you can add these by right

30:55click add notify state Montage notify

30:59window uh and what a notify window is

31:02the difference between a notify window

31:03and a regular notify is that a window

31:05has a start and has an end a regular

31:07notify just has a start so in this

31:11window I say this is when the player can

31:13press another click to continue the

31:15Montage so to continue to the second

31:17attack but if the player doesn't click

31:21during this window then stop the Montage

31:24so only play the first slash and the

31:26same for the second one right here this

31:29is when the second Montage window starts

31:31if the player clicks anytime during this

31:33window then continue the

31:35Montage otherwise stop

31:38it and here we just have this cool

31:40lightning effect and ground smash um um

31:45sound and we also call AOE slash which

31:49is the thing that does AOE damage or

31:51just a montage that we name that we use

31:53for AOE

31:54damage now let's see how we can use all

31:57of this now I created the Montage but

31:58we're going to use it together so back

32:01in my player here I'm going to switch to

32:03this um sword combo montage and of

32:07course as always the you can download

32:08the source code the assets from my

32:10patreon for free if you want to get the

32:12Montage itself and all of the animations

32:14that I'm using uh but they're mainly

32:16from mixo and retargeted to the unreal

32:19uh mannequin and with a root bone now

32:21the root bone is very important here

32:23because I will be using root motion for

32:25these animations

32:27all right so right now if I don't change

32:29anything and I just press play I'm going

32:31to click

32:32once and the entire sequence plays so I

32:35just clicked once see my hands aren't

32:37doing anything and the entire sequence

32:40is playing um so now how do we get these

32:44notify Windows to play a role I'm going

32:47to need some space so let's move these a

32:52bit so um as I told you notify Windows

32:56have a start start and an end so um what

33:00I'm going to do is when the window is

33:03starting I'm going to create a variable

33:05so let's create a new variable here call

33:07it

33:08is

33:10within

33:12combo is within resume combo window and

33:17this is going to be of type

33:20Boolean and make sure it's not an array

33:22it's

33:24single so I'm going to add a new notify

33:27here um first let's handle the AOE slash

33:30case so CU we have at the very end the

33:32explosion so this is going to be similar

33:34to

33:36this so on AOE slash we get our bpc

33:39attacks as well and we call AOE

33:44damage uh plug it

33:46here um the attack Target uh was it AOE

33:52damage right yeah and what do we do with

33:54the attack Target again

34:03uh we make sure we're only damaging the

34:05attack

34:08Target

34:09interesting I actually don't want to

34:11only damage the attack Target I want to

34:13damage

34:16anyone but okay for now let's uh pass in

34:20the attack Target

34:24as um

34:27now actually I'm going to remove this I

34:28don't want to damage the attack Target

34:30only so I'm going to remove this check

34:33and uh we're going to because this is

34:35AOE damage AOE damage shouldn't damage a

34:37single Target should damage

34:39anyone so I'm going to remove this check

34:43I'm going to also remove attack Target

34:44from

34:47here and what I'm going to do is make

34:49sure I'm only damaging my team

34:51members um so I'm going

34:55to get

34:57[Music]

34:59my uh what was it AOE damage actor yeah

35:03so I'm going to get this actor's team

35:06number and I'm going to get my owner's

35:09team

35:12number come

35:14on get owner get team

35:21number and only if these values are not

35:25equal

35:35if these values are not let me just

35:38clean it up these values are not equal

35:40then I damage so we're not damaging only

35:43the target but we're damaging any non

35:46team

35:47member all right small

35:50detour refresh

35:55node

35:57all right refresh

35:59node great now we don't need attack

36:02Target

36:05anymore um so we can delete this

36:09excellent okay now back in my player I

36:12don't need attack Target so let's do a

36:15radius of I don't know 200 no it's 299

36:19200 and damage Let's uh make a explosion

36:24damage of 20 as well or I don't know 30

36:27maybe make it do more damage so this is

36:30the last attack in the

36:34combo all right so now we need to add

36:37another one so this one is called uh

36:40what did we call it resume combo window

36:42I'm going to copy it to make sure no

36:44typos resume combo window and as I

36:48mentioned what resume combo window will

36:50do is just call uh sorry set this is

36:54within combo window Boolean value to

37:00true and then we have this notify end so

37:03I can pull off of this and say switch

37:07again uh and I can call it on notify end

37:11this

37:12time let's make ourselves some

37:18room all

37:25right

37:28all right so now here on notify end I'm

37:32also going to add a pin for resume combo

37:36window so when resume combo window is

37:39over then is within combo window should

37:42be

37:45false all right and also when the attack

37:48is over is within combo window should be

37:51false as

37:55well all right

37:58that

37:59looks

38:01better uh okay so now we all we did is

38:05set the value is uh of is within combo

38:08window but we didn't change anything now

38:10I also click once and everything still

38:12happens so now what we want is to check

38:15if uh is within combo window ended and

38:20we didn't trigger another click then end

38:24the Montage end the uh stopped playing

38:27the

38:28Montage so um how do we do that so over

38:32here when the attack begins um say

38:36somewhere around here I'm going to do a

38:39branch I'm going to check if I am within

38:43a combo

38:46window um or actually let's say if I'm

38:48not within a combo

38:51window uh

38:55not

38:57so if you're not within a combo window

38:59that means you're doing the first uh

39:01combo attack then do things normally but

39:04if you

39:05are uh what I want to do is create

39:07another Boolean V variable call it can

39:10resume combo and I'm going to set this

39:14value to True here so if I am within the

39:17combo window and I pressed melee attack

39:21then call can resume

39:24combo and over here uh when the combo

39:27ends I'm going to check am I within or

39:32sorry can I resume the

39:37combo if yes then keep resuming the

39:40combo and don't do anything if false I'm

39:42going to stop playing the Montage so

39:44call stop and a montage and select the

39:48combo

39:51Montage all right so now if I play if I

39:55press one

39:57combo ends

40:00right um and I can't press one again so

40:04I can't continue the Montage and the

40:06reason is because of this du once I need

40:09to actually reset this do once when the

40:11resume window starts so over here I need

40:14to call reset melee attack when I enter

40:17the resume

40:18window so now if I do

40:21it

40:24yeah great but I actually

40:29forgot one more thing so we set can

40:32resume combo to true but we never set it

40:34to false again so it has to be set to

40:37false as soon as we enter the resume

40:39window as well so as soon as we enter

40:44here we set can resume combo to

40:49false yeah perfect now I can also just

40:52do once and I can also just do two of

40:55them

40:56so if I don't click again uh the Montage

40:59stops and if I click all three the

41:01entire Montage plays

41:04perfect so just a quick uh recap uh we

41:08start the melee attack uh we do a du one

41:11so that we can't spam it and we check if

41:14we are not within a um combo window that

41:19means it's our first combo attack so

41:21just play the full combo montage and

41:24then on slash do a slash on AOE slash to

41:27an AOE slash and on resume combo window

41:31which is this window here we're going to

41:33set a variable to True which is called

41:36is within resume window and as soon as

41:38we end or outside we set this V variable

41:41to false so as soon as we enter we set

41:44it to true and we say can resume combo

41:47is false because we're waiting for a

41:48click only a click can trigger this scan

41:50resume combo and then we reset the melee

41:53attack to allow you to be able to click

41:55again

41:57and if you do click so as soon as we

42:01enter the resume combo window we set

42:03this value to false again because we're

42:05outside the window now because this is

42:07on notify end so when this is called on

42:10notify end uh we check can we resume the

42:13combo if we can't so this is false if we

42:17can't then stop the Montage and if we

42:20can don't do anything because not doing

42:21anything resumes the combo

Block & Parry Functionality

42:24anyway now it's time to add our blocking

42:27functionality uh and after we add the

42:29block we're going to test uh the block

42:32and the attack with the melee enemy so

42:34do an actual nice little um combat

42:38fight so let's add the block um

42:42somewhere

42:44here um so for the block I actually uh

42:47already have a Montage as well and this

42:49is a pretty simple one uh we have this

42:52Shield block and it's a montage and not

42:55an animation State because I want it to

42:58play for a duration and then after a

43:00while it stops so you can't keep holding

43:02the block

43:03forever um and similar to the combo we

43:07have this window here that's the Parry

43:10window so if I block uh if I get

43:14attacked during this window it will be

43:16considered a parry and we we're going to

43:18see how we're going to do paries now

43:19it's going to be really cool uh now you

43:21can decrease this window if you want it

43:23to be a shorter Parry time and so on and

43:26you can also not do Montage notifies at

43:28all and do it in the blueprint if you

43:30want the Peri window to be controlled by

43:32a stat for example so you upgrade it to

43:35have longer Parry window uh because this

43:37one will be

43:38static um and we also have this um block

43:43react so when you actually block

43:45something successfully you do this uh

43:47little

43:49animation all right so let's see how

43:50we're going to use that so let's create

43:53a custom event and call it let's start

43:58block and um it does a few things here

44:01uh first thing is that it um sets the oh

44:06sorry actually uh one thing I forgot to

44:09mention is I have uh a montage notify

44:13here called block and the reason uh I

44:16have a notify as well is because when

44:18the animation starts you're still not

44:20really blocking you're just holding the

44:21shield and only after a while I want the

44:25block to happen so that if you hold the

44:28shield um too late it doesn't count as a

44:31block um so you have to reach this part

44:34of the animation to count as actually

44:36blocking and we'll see how we're going

44:37to do

44:38that so start block let's just say it

44:41plays the Montage

44:45called um Shield

44:47block place it in the mesh

44:52component and we do a switch here so

44:56switch on notify

44:59begin uh we're going to check the

45:03block and what we're going to do is to

45:05enable blocking is using our damage

45:07system we just pull off of our bpc

45:09damage system and say is blocking oh not

45:12get sorry set is blocking to

45:16true this is what allows us to block

45:19that's the same we use for the enemy as

45:22well um and uh when we finish uh we just

45:27want to call um set block to false so

45:32over here on complete and on interrupt

45:35say is blocking is

45:37false um so that's the Block in the most

45:40basic sense we're going to uh modify

45:42this a

45:43bit oh and we also want a do once here

45:46so you can't spam it as well so do a do

45:51once oh and we also want a check that we

45:53are in the correct stance

45:56so

45:58if get

46:01stance is

46:05equal to

46:08melee then and only then enter the block

46:12and once you enter the block you

46:14reset and we also want a custom event

46:19here called

46:20reset

46:22block and we're going to call it here as

46:25well

46:26reset

46:29block all right now uh I'm going to have

46:32the right Mouse button um do the block

46:35so let's just comment this as

46:39block and uh this is attack input so

46:45let's have another one here right Mouse

46:47button when it's pressed it does start

46:50block oh we actually want to wait to end

46:53block when we release it as well so I am

46:56going to move these to an event call it

47:01custom event call it end

47:04block and this is what happens when

47:06block

47:12ends

47:15uh and actually um I should put plug

47:19this here and on complete and on

47:22interrupted I'm going to call uh no

47:24sorry not reset block now we want to

47:26call end

47:30block all right and another thing is

47:34that uh we want n block to stop playing

47:38uh well interrupt this Montage if it is

47:40playing so I can say uh is Montage no

47:45actually need to get my

47:46mesh and get anim instance yeah so get

47:51anim instance on your mesh and check is

47:54playing or montage is playing search for

47:58the

47:59block so if you are playing the block

48:04Montage oh actually I don't need to do

48:06that at all I just need to call stop

48:09montage and give it the block monage and

48:12then if this is not if it's not playing

48:14the block Montage it won't stop

48:17anything all right and now when we

48:20release this button just call end

48:24block great and this is the block

48:29input input has only one

48:33U all

48:36right and I forgot something else didn't

48:38I yes I did I forgot to

48:41check if I am in the correct

48:46stance

48:49so I need both of these as

48:54well

48:58so only in melee can you do

49:01this

49:04yep all right now it looks correct Let's

49:08test it

49:09out have my sword and block and if I'm

49:14moving while I'm blocking I can still

49:15move because I have it played in the

49:18upper um uh upper body slot so not in

49:22the lower not in the full body just the

49:24upper body so that's why I can move and

49:26block at the same

49:28time and if I release my mouse button it

49:31interrupts and stops my

49:34blocking yeah

49:38perfect um now before we add Parry let's

49:42um let's test it out let's see what it

49:45looks like with an enemy so I am going

49:47to put an enemy here get my melee enemy

49:52and let's start

49:54fighting oh show me what you

49:57got and did I

50:00block I didn't oh actually one very

50:03important thing we forgot is uh do we

50:06actually set these attacks as blockable

50:08by the

50:09enemy so the enemy here has uh a ground

50:12smash attack um that we say um can't be

50:17blocked and can't be

50:18parried uh short range attack this one

50:21let's say it can be blocked and can be

50:24parried

50:27um and long range attack also the same

50:30can be blocked can be parried spinning

50:33attack let's say it can only be blocked

50:35but you can't Parry the Spin

50:37Attack

50:39perfect now let's test it out again all

50:42right come at

50:44me okay so I

50:46blocked okay let me show you again I

50:49didn't take damage but no animation

50:51played right so let's show you again I'm

50:53blocking I didn't take damage

50:56but nothing happened uh that's because

50:58we didn't set the reaction the block

51:02reaction so how do we do that now if you

51:06recall uh we have here on damage

51:08response and this comes from the bpc

51:10damage system so if I click on bpc

51:12damage system I also have an event for

51:14unblocked so it's going to go here and

51:16click on this plus icon and let me put

51:19it next to the block

51:24here

51:26all right and there's something wrong

51:29here this should also give me the damage

51:31causer sorry let me open up the damage

51:34system real quick so right click edit

51:36bpc damage system go to my take damage

51:40function and I

51:42want unblocked to also pass the damage

51:46causer so go over here to unblocked up

51:51in here and say them damage causer as

51:56well type

52:00actor now we can pass the damage causer

52:03and this is very important for parrying

52:04because when you parry you also want to

52:06damage or knock back whoever is causing

52:09you damage so I need to know the damage

52:12causer um all right now now that we

52:15fixed

52:17that uh let's go back to our player all

52:21right so now uh what happens when we

52:24block uh successfully uh we just want to

52:27play a montage no not this one play

52:31Montage y that

52:33one um on the mesh

52:37component and we have A's it called

52:41block react yeah so we have this one now

52:44I have two of them I have block react

52:46this one with root motion uh that moves

52:50back a bit so I'll show you I have this

52:53Shield block react

52:55act one with root

52:58motion um actually this should have this

53:03one is the no root motion and this one

53:04is with root

53:06motion yeah so I why do I have two um

53:10because actually this goes pretty far

53:13back uh because uh when you parry I want

53:16to play the same animation but without

53:18Root motion but when you block without

53:20parrying I want to play the one with

53:22root motion so you go back a bit so

53:24there's visual input difference between

53:26parrying and blocking and now if you

53:28have a Parry Montage a different

53:30animation completely that's also fine

53:32but let's see how we're going to use

53:34that um so now I play the normal uh

53:38animation and

53:42um yeah for now it's fine let me show

53:44you what this looks like for now so I'm

53:46going to

53:47block there we go now that looks like a

53:50block

53:54right nice and I can block these okay I

53:58blocked some I got hit by some let's try

53:59it again and jump block very nice and I

54:04can also damage and he can also block me

54:08so now we're having

54:15a all

54:17right let's see if I can kill him

54:22oh nice I killed him okay so one thing I

54:25noticed is that he blocked my explosion

54:28attack which I definitely don't intend

54:30it to be blockable so this one this

54:33explosion let's say it can't be blocked

54:35can be parried and should force

54:36interrupt so even if you're doing a

54:38non-interruptible attack this explosion

54:40should interrupt you uh so let me show

54:43you what it's going to look

54:46like so

54:48now see I interrupted him even though he

54:51was doing an uninterruptible

54:54attack great so block is working very

54:57nice looks really

54:59cool uh now let's see how to do the

55:02Parry functionality so uh same as we

55:05used our notify Windows we're going to

55:07use it again here in the block so if you

55:10recall uh we have a notify called Parry

55:13window here and I'm going to create also

55:17a new variable called is within Parry

55:21window as you might

55:23expect and

55:25when it begins so open up here on notify

55:29start look for Parry

55:32window and all we're going to do is set

55:35this Parry window to

55:38true and we're going to do another

55:40switch I could just copy this one and do

55:42it on notify end but let's remove the

55:45block so on notify end we just set Parry

55:50window to

55:54false

55:55great let me move

55:59this and also here um we also want to

56:04set par window

56:06to and it's not going to matter Perry

56:08window should always be false but yeah

56:10if you interrupted within a Parry window

56:12we have to make sure that we call it to

56:13false on end

56:16yeah

56:18um all

56:20right so this one is BL lock success and

56:27Parry so now we want to handle the Parry

56:29here because if you remember there are

56:31attacks that can be pared some that

56:33can't so after you play the

56:38Montage uh we want to ask ourselves can

56:40we Parry so we do a

56:46branch uh and check if we are in if we

56:51are within the Parry

56:53window and

56:55and the attack can be

56:58parried do this Branch

57:02here let me move this check a bit

57:05further back because we're going to use

57:06it again

57:09here sorry just cleaning this up all

57:12right so if the attack can be

57:15pared and you are within the Parry

57:20window

57:21then let's just call a function called

57:24Parry that we're going to create here so

57:28custom event let's call it

57:30Parry attack and we need to know who

57:33we're parrying so we need to know the

57:35attack Target which is an

57:42actor uh and if you recall I told you I

57:44have two animations that I'm playing

57:46depending on whether I can Parry or not

57:48so the one with root motion and the one

57:50without so I'm going to also do a select

57:53here

57:55[Music]

57:58off of this same

58:02variable so if can Parry is true then

58:07use the no root motion Shield

58:10block and if I can't Parry then use the

58:13regular shield

58:16block all

58:21right great and then here we just call

58:27parry and if you can't Parry just don't

58:30do anything and let's also pass the

58:32damage causer as our attack Target

58:36here all right so now let's actually

58:39create the Parry now what I want the

58:41Parry to do is first to do damage so I'm

58:45going to call take damage the one with

58:46message next to it on this attack

58:49Target and I'm going to do uh well

58:52damage caer itself and I'm I'm going to

58:54do a little bit of damage here so let's

58:58say um five yeah just a little damage

59:02and do melee and here usually you want

59:05paries to stagger the enemy so we have

59:08this damage response so I'm going to use

59:09stagger and it can't be blocked and

59:12can't be

59:13parried um but it shouldn't force uh

59:18interrupt but stagger is what we are

59:21going to add later on I'm going to show

59:22you how when you parry an enemy they

59:25fall back a bit or they get staggered

59:27basically um but for now what I also

59:30want to happen is I want the camera to

59:31zoom in to slow motion to happen and

59:34then zoom out you know this is usually

59:36what you see in games uh this Parry

59:38effect so let's see how we can do that

59:41um so uh first what I'm going to do is I

59:44am going to

59:47um we have this as a reminder uh when we

59:51switch to the magic State we zoom in the

59:54camera right

59:55so we have this aim camera that uh that

59:58Zooms in and you can see it over here

1:00:02yeah this aim timeline so I'm going to

1:00:04reuse this aim timeline for our Parry as

1:00:08well so here I'm just going to say aim

1:00:11timeline sorry get AIM timeline here and

1:00:15I'm going to say play from start so we

1:00:20play the aim timeline well actually do

1:00:22damage to the guy first then we play the

1:00:24timeline and then we slow down time so

1:00:29let's um do a delay first of 0.2 seconds

1:00:34sure and then set Global time dilation

1:00:38to 0.2 as

1:00:40well so this is our slow motion and

1:00:44let's do it

1:00:45for 0.1

1:00:50seconds and after that we want to set

1:00:54glob Global time dilation back to

1:00:58one and revert the uh the aim camera

1:01:03again so get our aim timeline and say

1:01:10reverse

1:01:12yep that should be it let's see if it

1:01:15works I want to do a good Parry boom

1:01:18very nice so let me show you again if I

1:01:21I'm not within the Parry window so right

1:01:24now now I'm just

1:01:26blocking that's actually I something's

1:01:29wrong I definitely wasn't within the

1:01:31Parry

1:01:32window oh this one we forgot to plug in

1:01:37the notify that is very important okay

1:01:41and now it should

1:01:42work so not within the Parry

1:01:47window something is

1:01:53up should have

1:01:56played this

1:01:59Montage oh I played the wrong Montage I

1:02:01apologize this is shouldn't be Shield

1:02:05block it should be Shield block

1:02:08react Shield block react yeah that's the

1:02:11right Montage I was playing the regular

1:02:13block Montage that's why I didn't notice

1:02:14the difference okay

1:02:17now yes and you see I got pushed back

1:02:20but if I Parry in the right time I don't

1:02:22get pushed back look again

1:02:24boom no push back so then I'm in

1:02:28position to

1:02:30attack

1:02:33boom can't block this one so I got

1:02:37attacked didn't Parry in a good enough

1:02:39time and here this one can't be parried

1:02:42can be blocked but it can't be

1:02:45parried um now there's some something

1:02:48really interesting I want to show you if

1:02:49I have two enemies attacking me so if I

1:02:51have two enemies attacking me and I

1:02:54change my tokens to B2 so I can get

1:02:58attacked by two enemies at the same

1:03:00time uh I can't block them both at the

1:03:02same time let me show you so if I try to

1:03:04do

1:03:06this I want them both to attack me come

1:03:09on yeah see I got hit even though the

1:03:13camera did the zoom in slow motion so I

1:03:15mean that means I parried the first one

1:03:17but I got hit by the second one let me

1:03:19show you

1:03:21again see I still got hit I took damage

1:03:24and that is because as soon as you block

1:03:27successfully let me show you here as

1:03:29soon as you block successfully you play

1:03:31another montage and what happens when

1:03:33you play a montage it interrupts the

1:03:35first montage and what happens when this

1:03:38montage is interrupted we call end

1:03:41block and end block of course disables

1:03:43blocking so what we want is to not end

1:03:47block if what interrupted us was a

1:03:50successful block so while you're

1:03:52successfully blocking I want you to

1:03:54remain blocking so I'm going to remove

1:03:56this interrupt here and I'm going to add

1:03:59a Boolean uh value here so let's add

1:04:07a sorry let's move this here I'm going

1:04:09to add a new variable and call it uh is

1:04:13reacting to block so if you are reacting

1:04:17to

1:04:18block we set this value to

1:04:23true

1:04:27and when you're done reacting to block

1:04:30we call end

1:04:34block all right so this montage is what

1:04:37calls n block anymore but if we're

1:04:39interrupted here we want to check

1:04:42there's a branch are we interrupted

1:04:44because we are reacting to

1:04:46block if true don't do anything because

1:04:50then you're playing this montage and end

1:04:52block will be called anyway here but if

1:04:55false then we want to call end block

1:04:57that means you're interrupted by

1:04:58something else other than a successful

1:05:01block uh and in the end block as well we

1:05:04want to call is

1:05:07reacting set is reacting to block as

1:05:12false now I can block twice and let's

1:05:16see jump at

1:05:19me perfect now the camera did a little

1:05:22bit of a funky movement there but I I I

1:05:24blocked them both see

1:05:27again very

1:05:29nice um and I think we can fix this

1:05:32funky camera movement by instead of

1:05:33saying play from start we just say play

1:05:37so that means it's going to play from

1:05:38where it currently is instead of from

1:05:39the start let me show you so jump at

1:05:44me perfect see I blocked both of them

1:05:47and no funky camera

1:05:50movement

1:05:53nice

1:05:55and that one I can't

1:05:56block nice very cool now the final thing

Stagger Enemy When Parried

1:06:00as promised I'm going to show you how to

1:06:02stagger an enemy uh when you parry them

1:06:05so right now when I Parry the

1:06:07enemy nothing happens right um because

1:06:12uh they're playing a montage and they

1:06:14can't be interrupted so I want two

1:06:17things to happen uh when I successfully

1:06:20Parry I want should force interrupt to

1:06:22be true so that means the will interrupt

1:06:25whatever Montage are currently playing

1:06:27that's the first one and let's see how

1:06:29that one's going to

1:06:30look now let's meet

1:06:33Parry yeah see it looks like they took

1:06:35damage now but I want them not just to

1:06:38play the hit reaction I want them to

1:06:39play a stagger animation and luckily I

1:06:42have a stagger animation and Montage

1:06:45right here and it just looks like this

1:06:47the enemy just falls back backwards a

1:06:50bit and I also have root motion enabled

1:06:52to make them actually move

1:06:55back um now this animation I edited a

1:06:58bit because it wasn't made for a melee

1:07:01enemy but I made some changes to it um

1:07:04but now it looks like this so let's go

1:07:07to our base enemy so to our

1:07:11BP

1:07:12enemy base and see where we handle hit

1:07:17reactions uh we handle hit

1:07:20reaction

1:07:21somewhere here yeah and we don't do

1:07:24anything with this damage response right

1:07:26we always play this hit reaction Montage

1:07:28regardless of what damage response is

1:07:31now I'm going to change that a bit so

1:07:33next to the hit reaction Montage I am

1:07:35going to create another one so another

1:07:37variable because you know hit reaction

1:07:39Montage can be different per enemy type

1:07:41so that's why it's a variable here so

1:07:43I'm going to create a new variable call

1:07:44it the Stagger

1:07:48montage and I'm going to do a select

1:07:51here on this Montage to play

1:07:54and the select is going to depend on the

1:07:59damage

1:08:02response all right let's move this a bit

1:08:06now for Simplicity I'm going to have all

1:08:09of them play the hit reaction so where's

1:08:13my hit reaction Montage yeah so I'm

1:08:17going to have all of them play the hit

1:08:18reaction for

1:08:20now um because we oh sorry because we

1:08:22didn't set the damage response on all of

1:08:25the attacks um so it might not work for

1:08:27all cases uh but we have the Stagger now

1:08:31so I'm going to get the Stagger

1:08:34montage and play it here but if the

1:08:38Stagger montage is not valid I want to

1:08:41still play the hit reaction Montage so

1:08:43if an enemy doesn't have a stagger uh

1:08:45Montage so first I'm going to

1:08:48check if is valid do the function

1:08:52one and this is going to get oh sorry

1:08:56this is going to get a bit loopy uh but

1:08:59then I'm inside this select I'm going to

1:09:01have another select I do a select

1:09:06here and off of this value so if stagger

1:09:09montage is true it's valid use stagger

1:09:12if not use hit

1:09:14reaction uh so it's a select within a

1:09:16select I hope this makes sense uh now

1:09:19I'm going to go to my melee enemy and on

1:09:21the class defaults I'm going to search

1:09:24for stagger and I'm going to give him

1:09:26this stagger

1:09:28montage and I can also do the same for

1:09:31the range because they're both the same

1:09:33skeleton so I can search for stagger for

1:09:36the

1:09:36range and give him this stagger now I

1:09:39can't do that for the Mage enemy because

1:09:41it uses a different skeleton but you can

1:09:43of course add this stagger Montage to uh

1:09:45your melee get a stagger animation for

1:09:48your Mage as well but let's see how this

1:09:50one looks like now come at me Bros

1:09:54boom Parry parry and they got staggered

1:09:58let me show you with just one enemy so

1:09:59it's uh a bit more

1:10:04obvious all right

1:10:06and very nice you see how he falls

1:10:13back nice and now I can block multiple

1:10:19times can't block that see if I can kill

1:10:23him

1:10:25boom uh now one thing I noticed as well

1:10:27I'm going to fix it really quick is that

1:10:28once the enemy dies they continue the

1:10:31attack that they were doing um and this

1:10:33is because in our base enemy here on

1:10:36death we don't stop the currently

1:10:38playing Montage so first thing I'm going

1:10:41to do on Die here is just say

1:10:44stop Montage stop

1:10:48montage and if I don't pass in an anim

1:10:51Montage it just stops whatever montage

1:10:53is playing

1:10:54and that's really all you need to fix

1:10:56that bug all right let's try it again

1:10:59attack me Parry Boom Boom

1:11:05Boom come on hit me uhoh I need to run

1:11:09away from

1:11:10that oh

1:11:12no

1:11:14okay I'm going to get him I'm going to

1:11:16get him and boom he's dead very nice as

Next Up In Part 20

1:11:22always thank you all for watching

1:11:24and the next tutorial is going to be the

1:11:26boss fight finally uh I needed to add

1:11:29the uh melee attacks to the player so

1:11:31that the boss can actually interact with

1:11:33the player because we only had one Mage

1:11:35attack uh so now I'm planning the boss

1:11:37fight and it will be the next tutorial

1:11:40hopefully and if you want to download

1:11:42the project files so far to follow along

1:11:44if you haven't followed from the

1:11:45beginning you can get them all including

1:11:47the damage system the projectile system

1:11:49and every tutorial that I made before on

1:11:52my patreon for free link down in the

1:11:54description and I will see you in the

1:11:56next

1:11:59[Music]

1:12:12one

This transcript was generated from the captions YouTube publishes for this video. Get the transcript of any YouTube video atfreeyoutubetranscribe.com: free, unlimited, no sign-up.