Simple projectile package based off of @rbxts/projectile.
npm install @rbxts/projectile-castCreate a projectile using the following options:
Simple demo:
``TS
// main.client.ts
import { Projectile, CylinderRenderer } from "@rbxts/projectile-cast";
import { Players } from "@rbxts/services";
const SHOT_COUNT = 3;
const MIN_SPREAD_ANGLE = math.rad(0);
const MAX_SPREAD_ANGLE = math.rad(10);
const random = new Random();
const mouse = Players.LocalPlayer.GetMouse();
let tag: object | undefined;
mouse.Button1Down.Connect(() => {
const myTag = {};
tag = myTag;
while (tag === myTag) {
const character = Players.LocalPlayer.Character;
if (!character) break;
const head = character.FindFirstChild("Head");
if (!head || !head.IsA("BasePart")) break;
const position = head.CFrame.Position;
const endPos = mouse.Hit.Position;
for (let i = 0; i < SHOT_COUNT; i++) {
const velocity = new CFrame(position, endPos)
.mul(CFrame.Angles(0, 0, random.NextNumber(0, 2 * math.pi))) // roll to a random angle
.mul(CFrame.Angles(0, random.NextNumber(MIN_SPREAD_ANGLE, MAX_SPREAD_ANGLE), 0))
.LookVector.mul(75);
const Bullet = new Projectile(position, velocity, {
Acceleration: new Vector3(0, -50, 0),
Bounce: true,
Penetration: true,
MinExitVelocity: 50,
PhysicsIgnore: [character],
Duration: 4,
Renderer: new CylinderRenderer(Color3.fromHSV(math.random(), 1, 1)),
});
Bullet.Touched.Connect((rayResult: RayResult) => {
print(rayResult.Instance);
})
}
task.wait(1 / 30);
}
});
mouse.Button1Up.Connect(() => (tag = undefined));
``