I was playing rogue lineage a few days ago and I noticed how cool it was just to be able to climb on walls. This wasn't just a custom controller similar to what they did here, but instead you would jump onto the the wall and you would start climbing it instead of changing the gravity. I attempted to replicate this by using BodyVelocity and making an invisible platform whenever the user has stopped moving, but I get a few errors.
- sometimes the raycast does not register the wall (possibly could switch to touched, but then I would have to list every wall in the game and that would be a hassel)
- the player would keep floating in the air even though clearly the raycast shouldn't be seeing anything (once again, could benefit from touched but im not really sure)
- forward/backward cannot be pressed the sametime as left/right movement
- (rare) sometimes the player would jump to get over an obstacle and they would start "climbing" (floating)
PLEASE give me tips on my code, I am a new learner of rblx lua so bare with me. (really sorry for the long code)
local function platform(bool)
if not char:FindFirstChild("platform") and bool == true then
local platform = Instance.new("Part")
platform.Name = "platform"
platform.Size = Vector3.new(2.1, 1, 1)
platform.Position = Vector3.new(char["Left Leg"].Position.X-.5, char["Left Leg"].Position.Y-1.534, char["Left Leg"].Position.Z)
platform.CastShadow = false
platform.Transparency = 1
platform.Anchored = true
platform.CanCollide = true
platform.Parent = char
elseif bool == false then
local platform = char:FindFirstChild("platform")
if platform then
platform:Destroy()
end
end
end
InputService.InputBegan:Connect(function(key)
if key.KeyCode == Enum.KeyCode.Space and climbing == false and humanoid.WalkSpeed ~= 0 then
if not char then return end
local startTime = tick()
connection_ = InputService.InputBegan:Connect(function(input2)
if input2.KeyCode == Enum.KeyCode.Space then
eligible = true
connection_:Disconnect()
end
end)
repeat wait() until eligible == true or tick()-startTime > .75
connection_:Disconnect()
if tick()-startTime > .5 then return end
local origin = char:WaitForChild("Head").Position
local result = workspace:Raycast(origin, direction, params)
if result and climbing == false then
print("found")
humanoid.AutoRotate = false
climbing = true
local part = result.Instance
-- play anim here
local newTime = tick()
platform(true)
connection = InputService.InputBegan:Connect(function(input)
if tick()-newTime >= 7.5 then
connection:Disconnect()
destroyAll()
platform(false)
humanoid.AutoRotate = true
return
elseif input.KeyCode == Enum.KeyCode.W then
platform(false)
local forward = Instance.new("BodyVelocity", HRP)
forward.Name = "forward"
forward.Velocity = Vector3.new(0,15,0)
repeat wait() result = workspace:Raycast(origin, direction, params) until not result or not char or isDown(Enum.KeyCode.W) == false or tick()-newTime >= 7.5
if not char or tick()-newTime >= 7.5 then connection:Disconnect() destroyAll() platform(false) humanoid.AutoRotate = true return end
if not result then
connection:Disconnect()
forward.Velocity = Vector3.new(15, 12, 0)
wait(.5)
destroyAll()
climbing = false
humanoid.AutoRotate = true
else
forward:Destroy()
platform(true)
end
elseif input.KeyCode == Enum.KeyCode.S then
platform(false)
local backward = Instance.new("BodyVelocity", HRP)
backward.Name = "backward"
backward.Velocity = Vector3.new(0,-15,0)
repeat wait() until isDown(Enum.KeyCode.S) == false or tick()-newTime >= 7.5
if tick()-newTime >= 7.5 then connection:Disconnect() destroyAll() platform(false) humanoid.AutoRotate = true return end
backward:Destroy()
platform(true)
end
there is more but its really long (just for pressing S, D and A.)

2 comments
trash post
i'm going to ban you iucids