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