Ad
Log in to vote
4

Lets try my blood script AGAIN?

Asked by 4 years ago

Hello! I have been askign freqently about my script and actually figured most of it out on my own. I am making a blood script. I finnally got everything wrokign except 2 things: 1. I don't know how to make the parts come out of the player's body. 2. All the parts seem to be welded together. I need them to be all separated. I have the script inserted into the player already. Here is the script so far:

s = script.Parent

s.Humanoid.Died:connect (function ()
wait (0)
P1 = Instance.new("Part",game.Workspace)
P1.BrickColor = BrickColor.new("Bright red")
P1.FormFactor = 2
P1.Size = Vector3.new(1,0.4,1)
P1.CanCollide = true
P1.Anchored = false
P2 = Instance.new("Part",game.Workspace)
P2.BrickColor = BrickColor.new("Bright red")
P2.FormFactor = 2
P2.Size = Vector3.new(1,0.4,1)
P2.CanCollide = true
P2.Anchored = false
wait (0)
P3 = Instance.new("Part",game.Workspace)
P3.BrickColor = BrickColor.new("Bright red")
P3.FormFactor = 2
P3.Size = Vector3.new(1,0.4,1)
P3.CanCollide = true
P3.Anchored = false
P4 = Instance.new("Part",game.Workspace)
P4.BrickColor = BrickColor.new("Bright red")
P4.FormFactor = 2
P4.Size = Vector3.new(1,0.4,1)
P4.CanCollide = true
P4.Anchored = false
end)


3 answers

Log in to vote
2
Answered by 4 years ago

*This code was placed in a LocalScript in StarterGUI. In order to make the blood come out of the player's body, you must first make the blood's CFrame be the same as the player's torso/head. Also, the blood parts were sticking together because their surfaces were studs and inlets, and these two surfaces, when put together, MAKE A WELD. I fixed up everything for you below. :)

s = game.Players.LocalPlayer

s.Character.Humanoid.Died:connect(function()
    wait(0)

    local P1 = Instance.new("Part",game.Workspace)
    local P2 = Instance.new("Part",game.Workspace)
    local P3 = Instance.new("Part",game.Workspace)
    local P4 = Instance.new("Part",game.Workspace)

    P1.CFrame = CFrame.new(s.Character.Torso.Position)
    P2.CFrame = CFrame.new(s.Character.Torso.Position)
    P3.CFrame = CFrame.new(s.Character.Torso.Position)
    P4.CFrame = CFrame.new(s.Character.Torso.Position)

    P1.BottomSurface = "Smooth"
    P1.TopSurface = "Smooth"
    P2.BottomSurface = "Smooth"
    P2.TopSurface = "Smooth"
    P3.BottomSurface = "Smooth"
    P3.TopSurface = "Smooth"
    P4.BottomSurface = "Smooth"
    P4.TopSurface = "Smooth"

    P1.BrickColor = BrickColor.new("Bright red")
    P1.FormFactor = 2
    P1.Size = Vector3.new(1,0.4,1)
    P1.CanCollide = true
    P1.Anchored = false

    P2.BrickColor = BrickColor.new("Bright red")
    P2.FormFactor = 2
    P2.Size = Vector3.new(1,0.4,1)
    P2.CanCollide = true
    P2.Anchored = false
    wait (0)

    P3.BrickColor = BrickColor.new("Bright red")
    P3.FormFactor = 2
    P3.Size = Vector3.new(1,0.4,1)
    P3.CanCollide = true
    P3.Anchored = false

    P4.BrickColor = BrickColor.new("Bright red")
    P4.FormFactor = 2
    P4.Size = Vector3.new(1,0.4,1)
    P4.CanCollide = true
    P4.Anchored = false
end)



I hope this helps.

Ad
Log in to vote
2
Answered by
Perci1 4869 Trusted Moderation Voter
4 years ago

You never set the position of the blood parts. In this case it should suffice to simply position them at the same position as the torso.

P1.Position = script.Parent.Torso.Position

If this doesn't work out right, we can offset them a bit.

P1.Position = script.Parent.Torso.Position - Vector3.new(2,0,0)

It would also be much more clean and efficient to put that code inside a function, then calling that function four times. This way we don't have repeating code.

function createPart()
    local part = Instance.new("Part",game.Workspace)
    part.BrickColor = BrickColor.new("Bright red")
    part.FormFactor = 2
    part.Size = Vector3.new(1,0.4,1)
    part.CanCollide = true
    part.Anchored = false
    part.Position = script.Parent.Torso.Position
end

script.Parent.Humanoid.Died:connect(function()
    createPart()
    createPart()
    createPart()
    createPart()
end)

However, there is an even better way to do this. We can use parameters, arguments, and for loops to make the function create the specific amount of parts we want, without repeating code and without repeatedly calling it. This new method will also give us perfect control in case we want to create more or less parts at a specific time.

function createParts(numberOfParts)
    for i = 1, numberOfParts do
        local part = Instance.new("Part",game.Workspace)
        part.BrickColor = BrickColor.new("Bright red")
        part.FormFactor = 2
        part.Size = Vector3.new(1,0.4,1)
        part.CanCollide = true
        part.Anchored = false
        part.Position = script.Parent.Torso.Position
    end
end

script.Parent.Humanoid.Died:connect(function()
    createParts(4)
end)
0
Thank you! I didn't know how to set the position to the body of the character. That was all I was missing! I used the same original script that I made but just added that for the sake of understanding it better. minikitkat 687 — 4y
Log in to vote
1
Answered by
BlueTaslem 16833 Moderation Voter Administrator Community Moderator Super Administrator
4 years ago

Objects have a .Position or .CFrame property which is where they are located. It's better to place things with CFrame usually, because Position will behave not exactly as you expect.

The .CFrame property is (unsurprisingly) a CFrame value. You can just use the player's Torso's .CFrame value for it.

Possibly they are getting joined to each other or the Baseplate. Try adding a :BreakJoints() call to each of P1, P2, etc.

Since all of them are the same, and you're only using wait(0) you should use a loop.


for count = 1, 4 do
    local p = Instance.new("Part",game.Workspace)
    p.BrickColor = BrickColor.new("Bright red")
    p.FormFactor = 2
    p.Size = Vector3.new(1,0.4,1)
    p.CanCollide = true -- Redundant; Is default value.
    p.Anchored = false -- Redundant; Is default value
    p:BreakJoints()
    p.CFrame = s.Torso.CFrame
end

Answer this question