Ad
Still have questions? Join our Discord server and get real time help.
Log in to vote
5

[Solved] How can I use the features of PlatformStand while avoiding the negative downsides?

Asked by 2 months ago
Edited 1 month ago

Hey guys! I'm here with my first question ever. After looking through page after page on google and discussing this with a few other developers, I decided I needed to hear from a broader group who might have more experience in this matter. I am asking this question because I cannot create my own character/humanoid and associated functionalities (at this time, and I'd rather not in the future), so please don't list that as a solution.


Because I don't want to fall into the trap of asking for help with my attempted solution and missing a potentially better solution, I'll start with my issue and then list the stuff I've tried. Right now, I'm trying to create a custom swimming framework that functions within certain y values on the plane. For instance, if the player's position vector has a y value that is, say, less than 0 and greater than -25, then that player would be able to swim. This is a project for someone else, so don't tell me that I need to use Roblox's water (anyway, this causes less lag on the large scale I'm working with).


Initially, I tried using a BodyGyro, but when that didn't work out, I moved on to manually setting the CFrame of the HumanoidRootPart. Basically, I make it so that the player, head to toe, points in the direction the camera is looking like an arrow. Right now, this works like a charm, but it doesn't. You see, for some annoying reason, Roblox decided that the Humanoid should always be upright. This meant that I needed to modify the CFrame on the RenderStepped event of the RunService. While this worked, it was really glitchy and constantly dragged me to the surface of the water by the force of the glitches. This is my basic problem, and I'd love any suggestions you guys have on how to fix it.


After discussing this with another developer, he suggested the PlatformStand property be set to true. And it worked! At least, it seemed to work until I realized that when I stopped swimming, my momentum carried me onward for what seemed like an indefinite amount of time. Not only that, but when I swam into a wall or solid object, my character immediately spun out of control and would not stop moving in seemingly random contortions for, again, what seemed like an indefinite amount of time. Now, I know why this is happening in theory, but I don't know in a way that can help me fix it, nor do I know a different way, other than PlatformStand, to cease the glitchy resetting of the HumanoidRootPart's CFrame.


Here are the relevant bits of my code: ```lua -- some irrelevant code before this connection = run_service.RenderStepped:Connect(function() if input_going then

    local direction = camera.CFrame.LookVector
    local position = root_part.Position

    root_part.CFrame = CFrame.new(
        position, 
        position + direction
    )*CFrame.Angles(math.pi/2, math.pi, math.pi)

    body_velocity.Velocity = camera.CFrame.LookVector*30 

else            
    body_velocity:Destroy()
    connection:Disconnect()

    local direction = camera.CFrame.LookVector
    local position = root_part.Position

    root_part.CFrame = CFrame.new(position)*CFrame.Angles(0, math.atan2(-direction.X, -direction.Z), 0)

    if is_swimming then

        body_position.MaxForce = Vector3.new(0, 7250, 0)
        body_position.D = 3000

    end         
end

end)

-- and later on:

while true do -- note that this loop does not loop very quickly for efficiency's sake.

local pos = root_part.Position
local y_pos = pos.Y

if y_pos > base_height and y_pos < top_height then

    if not is_swimming then

        if not created then
            body_position = Instance.new("BodyPosition")
            body_position.Parent = root_part
            body_position.MaxForce = Vector3.new(0, 7250, 0)
            body_position.D = 3000
            created = true
        end

        humanoid.WalkSpeed = 0
        humanoid.PlatformStand = true

-- and there is more code here, but it's unimportant -- just know that everything is reset to defaults when the player is outside of the water ```


In conclusion, I'd just like to restate my problem for clarity:

I'm working with a swimming framework and whenever I try to set the orientation of the HumanoidRootPart to make the player upside down, sideways or something odd, it tries to reset it. I've managed to correct this via RenderStepped, which I probably would have used anyway so that the player's character is always pointing the right direction, but this current solution is very glitchy due to Roblox constantly trying to reset the orientation. PlatformStand is an option, but I don't know how I'd use it with all the downsides it has. Basically, I'm looking for a way to fix the downsides of PlatformStand or to remove the constant HumanoidRootPart orientation auto-correction (if it can be called correction).


If you would like to test the place with the PlatformStand feature on (or off) to see what exactly is happening, leave a comment below and I'll make the appropriate changes (cause I'm testing a variety of things), and post a link. If you have any additional questions, feel free to post those below as well.


Thanks!

0
If you see a variable that isn't defined in the script, or looks like I'm not defining it locally, don't worry. All variables are declared properly at the beginning of the LocalScript. AetherProgrammer 75 — 2mo
0
Best option here would be to use a BodyGyro instead of changing the CFrame directly. From my experiences this shouldn't interfere with PlatformStand. ThatPreston 302 — 2mo
0
Try disabling autojump. I think this is the reason why the humanoid always wants to be upright. mc3334 376 — 1mo
0
Try disabling autojump. I think this is the reason why the humanoid always wants to be upright. mc3334 376 — 1mo

2 answers

Log in to vote
0
Answered by 1 month ago

Turns out that no super ideal solution worked. I did, however, solve the issue. While a BodyGyro did not work in the place of modifying the cframe of the root part, I found that if I used the platform stand property, modified the cframe of the root part, and then set the body gyro, it fixed collisions. Then I had to fix the issue of physics not slowing down the player anymore due to the platformstand property. Turns out, setting the Velocity of the root part to Vector3.new(0, 0, 0) whenever the player stopped moving their character solved the issue. The combination of all of these was the fix I was looking for. Thanks for the other answer (which had the right idea, but roblox reenabled what I disabled anyway) and the comments trying to help.

Ad
Log in to vote
0
Answered by 1 month ago

After running a few tests, the "Running" HumanoidStateType, as well as a lot of others, seem to be keeping the Humanoid upright.

You could experiment more by using :StateChanged and seeing what the Humanoid is doing and disabling things from there: https://developer.roblox.com/api-reference/event/Humanoid/StateChanged https://developer.roblox.com/api-reference/function/Humanoid/SetStateEnabled


Now you could also force set a HumanoidStateType so the Humanoid is forced to follow it. You do this by RunService unless the HumanoidStateType gets locked the first time you set it.

I have looked through some states and found the HumanoidStateType Physics in which it's description is: The Humanoid doesn’t apply any force on its own. (Unending PlatformStand) Has to be unset manually using /Humanoid/ChangeState.

https://developer.roblox.com/api-reference/function/Humanoid/ChangeState https://developer.roblox.com/api-reference/enum/HumanoidStateType

Isn't really a direct answer, but hopefully this can lead you to a solution to your problem. Good luck!

0
The second part of your question doesn't really deal with the issue at hand (due to issues I had listed in the question). However, the first part seems intriguing, and I'll be sure to check it out. AetherProgrammer 75 — 1mo

Answer this question