Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Does anyone have an idea for how I could recreate the dive like in Super Mario 64?

Asked by 3 years ago
Edited 3 years ago

Okay, so im working on some sort of platformer movement heavily inspired by Super Mario 64.

I got punches, kicks and triple jumps working. But when I got to the dive part, I had no clue how to make the player slide. I tried PlatformStand with invisible blocks, but that didn't help. Usually the player would just do a flip. I tried gyros, and I don't think they helped that much. So what it is currently like (at the time of posting this) is you bounce when you land. But I need it to slide.

I can't really show footage of how the sliding works in-game, but I can show footage of how mine works.

Also, this script is for Void Script Builder. I was testing this in the main vip server I usually play with my friends on, which is why there is a castle map in the background.

Clip here: https://gyazo.com/1701d1fa72f5f10997a45c3836c4a8d9

Anyone know how to make it work better? Also, incase you're wondering about how the dive is done currently, here is some code:


function fling(what, to, force) local bv = Instance.new("BodyVelocity", what) --bv.MaxForce = Vector3.new(10000000000, 10000000000, 10000000000) bv.MaxForce = Vector3.new(force, force, force) bv.Velocity = to Debris:AddItem(bv, 0.05) end fling(root, root.CFrame.lookVector * 65 - Vector3.new(0, 21, 0), 1000000)

If you manage to help, thank you! :)

Oh, please note: I looked at EgoMoose's platformer, but I couldn't really understand it. Plus, since this is just a script for Void Script Builder, I didn't think I could really do what he did.

Edit: I played around for a while, and this is my new result:

It's still not really what I want, but until I get an answer I'll just leave it at this I guess: https://gyazo.com/749c530f2ea47fd3ca9f6a860304edcc

Oh also if you want here is the entire dive function (It's really messy right now)

local diving = false
function Dive()
    if attack == false then
        bv.Parent = nil
        fling(root, root.CFrame.lookVector * 65 - Vector3.new(0, 21, 0), 1000000)
        local floor = RayCast(root.Position, (CFrame.new(root.Position, root.Position + Vector3.new(0, -1, 0))).lookVector, (char["UpperTorso"].Size.y + char["LowerTorso"].Size.y)+1.96+hum.HipHeight, char)
        if floor then
            hum:ChangeState("Jump")
            Swait(11)
        end
        coroutine.wrap(function()
            diving = true
            attack = true
            local down = 0
            local x, y, z = root.CFrame:ToEulerAnglesYXZ()
            local newCF = CFrame.Angles(x, y, z)
            local Gyro = Instance.new("BodyGyro", root)
            Gyro.MaxTorque = Vector3.new(1000000,70000,1000000)
            Gyro.CFrame = CFrame.new(root.Position, (CFrame.new(root.CFrame.x, root.CFrame.y, root.CFrame.z) * CFrame.Angles(0, y, 0) * CFrame.new(0, 0, 3).p))
            while diving do
                Swait()
                down = down + (Rad(3) / 1.5)
                if down > Rad(41) then
                    down = Rad(41)
                end
                Gyro.CFrame = CFrame.new(root.Position, (CFrame.new(root.CFrame.x, root.CFrame.y, root.CFrame.z) * CFrame.Angles(0, y, 0) * CFrame.new(0, 0, 3).p))
                hum.PlatformStand = true
                local floor = RayCast(root.Position, (CFrame.new(root.Position, root.Position + Vector3.new(0, -1, 0))).lookVector, (char["UpperTorso"].Size.y + char["LowerTorso"].Size.y)+2.86+hum.HipHeight, char)
                coroutine.resume(coroutine.create(function()
                    if floor ~= nil then
                        removeVelocity(char)
                        --fling(root, root.CFrame.lookVector * 35 + Vector3.new(0, 2, 0), 10000000)
                        local BV = Instance.new("BodyVelocity", root)
                        BV.MaxForce = Vector3.new(10000000, 10, 10000000)
                        BV.Velocity = root.CFrame.lookVector * 51 + Vector3.new(0, 2, 0)
                        coroutine.resume(coroutine.create(function()
                            local slide = 45
                            while diving and BV do
                                air = true
                                floor = shadow
                                slide = slide - 12
                                slide.Velocity = root.CFrame.lookVector * slide
                            end
                        end))
                        Swait(9)
                        diving = false
                        hum.PlatformStand = false
                        BV:Destroy()
                    end
                    if hum.Jump and floor ~= nil then
                        removeVelocity(char)
                        --fling(root, root.CFrame.lookVector * 35 + Vector3.new(0, 2, 0), 10000000)
                        hum.PlatformStand = false
                        --fling(root, root.CFrame.lookVector * 35 + Vector3.new(0, 2, 0), 1000000)
                    end
                end))
                speedy = 0.2
                --[[
                AnimateThing(char["LowerTorso"], ltnor * CFrame.new(0, -1.5, 0) * CFrame.Angles(Rad(-95 - 25), Rad(0), Rad(0)), speedy/2.25)
                AnimateThing(char["UpperTorso"], utnor * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)

                AnimateThing(char["RightUpperArm"], rsnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(185), Rad(15), Rad(0)), speedy)
                AnimateThing(char["RightLowerArm"], rsnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)
                AnimateThing(char["RightHand"], rsnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                AnimateThing(char["LeftUpperArm"], lsnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(185), Rad(-15), Rad(0)), speedy)
                AnimateThing(char["LeftLowerArm"], lsnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)
                AnimateThing(char["LeftHand"], lsnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                AnimateThing(char["RightUpperLeg"], rhnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-15), Rad(0), Rad(6)), speedy)
                AnimateThing(char["RightLowerLeg"], rhnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-7), Rad(0), Rad(0)), speedy)
                AnimateThing(char["RightFoot"], rhnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                AnimateThing(char["LeftUpperLeg"], lhnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-15), Rad(0), Rad(-6)), speedy)
                AnimateThing(char["LeftLowerLeg"], lhnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-7), Rad(0), Rad(0)), speedy)
                AnimateThing(char["LeftFoot"], lhnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                AnimateThing(char["Head"], necknor * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(95 + 5), Rad(0), Rad(0)), speedy)
                ]]
                if diving == false then air = false end
                if floor == nil then
                    AnimateThing(char["LowerTorso"], ltnor * CFrame.new(0, -1.5, 0) * CFrame.Angles(Rad(-95 - 1) - down, Rad(0), Rad(0)), speedy*1.1)
                    AnimateThing(char["UpperTorso"], utnor * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["RightUpperArm"], rsnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(185), Rad(15), Rad(0)), speedy)
                    AnimateThing(char["RightLowerArm"], rsnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["RightHand"], rsnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["LeftUpperArm"], lsnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(185), Rad(-15), Rad(0)), speedy)
                    AnimateThing(char["LeftLowerArm"], lsnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["LeftHand"], lsnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["RightUpperLeg"], rhnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-15), Rad(0), Rad(6)), speedy)
                    AnimateThing(char["RightLowerLeg"], rhnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-7), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["RightFoot"], rhnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["LeftUpperLeg"], lhnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-15), Rad(0), Rad(-6)), speedy)
                    AnimateThing(char["LeftLowerLeg"], lhnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-7), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["LeftFoot"], lhnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["Head"], necknor * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(95 + 5), Rad(0), Rad(0)), speedy)
                elseif floor ~= nil then
                    AnimateThing(char["LowerTorso"], ltnor * CFrame.new(0, -3.76, 0) * CFrame.Angles(Rad(-95 + 5), Rad(0), Rad(0)), speedy/1.45)
                    AnimateThing(char["UpperTorso"], utnor * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["RightUpperArm"], rsnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(185), Rad(15), Rad(0)), speedy)
                    AnimateThing(char["RightLowerArm"], rsnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["RightHand"], rsnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["LeftUpperArm"], lsnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(185), Rad(-15), Rad(0)), speedy)
                    AnimateThing(char["LeftLowerArm"], lsnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(5), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["LeftHand"], lsnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["RightUpperLeg"], rhnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-15), Rad(0), Rad(6)), speedy)
                    AnimateThing(char["RightLowerLeg"], rhnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-7), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["RightFoot"], rhnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["LeftUpperLeg"], lhnor1 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-15), Rad(0), Rad(-6)), speedy)
                    AnimateThing(char["LeftLowerLeg"], lhnor2 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(-7), Rad(0), Rad(0)), speedy)
                    AnimateThing(char["LeftFoot"], lhnor3 * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(0), Rad(0), Rad(0)), speedy)

                    AnimateThing(char["Head"], necknor * CFrame.new(0, 0, 0) * CFrame.Angles(Rad(95 + 5), Rad(0), Rad(0)), speedy)
                end
            end
            bv.Parent = root
            hum.PlatformStand = false
            attack = false
            diving = false
            Gyro:Destroy()
        end)()
    end
end
0
I think I might just keep the dive like this since im not getting answers. Plus, my friends don't seem to have a problem with it. youngmacka123 17 — 3y

Answer this question