My last answer was pretty vague. I’ll give you a more detailed one. You might want to use simpler methods of calculating drag and lift. If I have the time (right now I’m just writing this due to procrastination) I’ll consider making an even more detailed tutorial on projectiles.
You should run this code on either the client or the server. Keep in mind that setting Network Ownership will cause a delay, but running it on the server may cause the arrow to not look as smooth.
Firstly, apply a force, in the direction of mouse.Hit, when the mouse is released. Then, in a heartbeat loop, calculate the downforce (([gravitational acceleration] * mass) - lift) and the drag ((velocity * velocity * density / 2) * [facial area] * coefficient). You can base your lift equation off of this one.
You can add these two to get the resistant forces. You can apply this force by using either a VectorForce, BodyForce, or a BodyVelocity. If you’re using a BodyForce or VectorForce, don’t calculate gravity (it is already accounted for).
You should then set the orientation of your arrow, using a BodyGyro, to the direction of the velocity to simulate the arc. You can change the drag efficiency and the lift coefficient to make the arrow fly farther, shorter, higher, lower, or at a different speed.
If you’re using a BodyVelocity (which I recommend), you can get the velocity by adding ((force / mass) * [delta time]) to a variable at the end of your loop. You can get the power by simply multiplying force and velocity.
Because we are using BodyMovers, we can use a Touched event on the server. When the touched event fires, you should first disconnect it to save memory and to make it so it can only damage what it hits first. Secondly, check if it hit a model with a Humanoid and deal the damage. I would make this directly proportional to the speed it collides at. You can weld it easily using WeldConstraints and run further code allowing for the player to pick it up - or just delete it.