A semi-solid platform is a platform that you can jump up through but you can't clip through it when you're on top of it. I have no clue how I would even start this, so any help would be majorly appreciated.
I haven't tested this idea, but I think you might be able to pull it off. Each of these semi-solids should have CanCollide set to false. Tag all of your semi-solids with CollectionService and on the client, loop through them and listen for Touched events. Inside the client touched event, check for collisions with that client's character's feet. Wait a preset time (this will require a little tweaking) and locally set CanCollide to true. You'll also want to check for the player ending their contact with the part and disable CanCollide accordingly. Since the client owns the character's position, they will appear to be standing on top of the semi-solid to all the other clients as well, even though their local version of the part has CanCollide set to false. ~If you need further clarification, I can write out this idea and test the code.~ See below
Tag Editor: https://www.roblox.com/library/948084095/Tag-Editor
Mark your semisolids with a tag called "Semisolid".
Implementation located in StarterPlayerScripts (yes, it's local):
local cs = game:GetService("CollectionService") for _, v in pairs(cs:GetTagged("Semisolid")) do v.Touched:Connect(function (p) if p.Name:find("Foot") and p.Parent == script.Parent.Parent.Character then wait(0.1) v.CanCollide = true coroutine.wrap(function () while wait(1) do local stillTouching = false for _, part in pairs(v:GetTouchingParts()) do if part.Parent == p.Parent then stillTouching = true break end end if not stillTouching then v.CanCollide = false break end end end)() end end) end
A semi-solid platform. I am new to scripting but i think this could help. To make it, make the part you want to jump thro. Disable collisions for the part. Then insert a script in the part you will jump to and put in this script.
script.Parent.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") then wait(0.1) script.Parent.CanCollide = true script.Parent.Script:Destroy() end end)
I hope this helps!