Quick actions

cmd+k|ctrl+k

Navigation

Languages

potions v2

Snippet info

Language

Lua

Visibility

public

Author

thosewhoknow

Created

2023-04-03T14:00:55.442301Z

Updated

2024-04-20T19:22:09.474172Z


local Blood = {}

local Part = Instance.new("Part")
Part.BottomSurface = Enum.SurfaceType.Smooth
Part.TopSurface = Enum.SurfaceType.Smooth
Part.Anchored = true
Part.CanCollide = false
Part.Color = BrickColor.new("Maroon").Color
Part.Material = Enum.Material.Glass
Part.Size = Vector3.new(0.15, 0.15, 1)

local Mesh = Instance.new("SpecialMesh")
Mesh.MeshType = Enum.MeshType.Sphere
Mesh.Parent = Part

local PhysicsStep = 1 / 240
local Gravity = Vector3.new(0, -workspace.Gravity, 0)

local function GetPosition(p0, v0, dt)
    return p0 + v0 * dt + 0.5 * Gravity * (dt ^ 2) + 0.5 * PhysicsStep * Gravity * dt
end

local RenderList = {}

local Param = RaycastParams.new()
Param.FilterDescendantsInstances = {script, owner.Character}

local Callback

function Blood:Create(Position, Velocity, Color)
    local NewObject = Part:Clone()
    NewObject.Position = Position
    NewObject.Color = Color or Color3.new(0.5, 0, 0)
    NewObject.Parent = script
    
    RenderList[NewObject] = {
        Origin = Position,
        Acceleration = Velocity,
        Lifetime = 0,
        LastPosition = Position
    }
end

function Blood:OnHit(NewCallback)
    Callback = NewCallback
end

function Blood:Update(DeltaTime)
    for Part, Object in RenderList do 
        Object.Lifetime += DeltaTime
        local Position = GetPosition(Object.Origin, Object.Acceleration, Object.Lifetime)
        Part.CFrame = CFrame.lookAt(Object.LastPosition, Position)
        
        local Vector = Position - Object.LastPosition
        local Hit = workspace:Raycast(Object.LastPosition, Vector, Param)
        if Hit then
            Callback(Part, Object, Hit)
            RenderList[Part] = nil
            continue
        end
        
        Object.LastPosition = Position
        
        Part.Size = Vector3.new(0.25, 0.25, Vector.Magnitude)

    end
end

Blood:OnHit(function(Part, Data, Result)
    local s = math.random(100, 250)/450
    Part.Size = Vector3.new(s, 0.1, s)
    Part.Anchored = false
    Part.CFrame = CFrame.lookAt(Result.Position, Result.Position + Result.Normal) * CFrame.Angles(math.pi/2,0,0)
    local Weld = Instance.new("WeldConstraint")
    Weld.Part0 = Result.Instance
    Weld.Part1 = Part
    Weld.Parent = Part
    local SFX = Instance.new("Sound")
    SFX.SoundId = "rbxassetid://9120590980"
    SFX.Parent = Part
    SFX:Play()
    task.delay(7, game.Destroy, Part)
end)

return Blood
INFO