as you can see in the video
I tried ODM system using VectorForce
I kinda got it working but when every I try to go to a different block it first just falls to the ground before going to the position
and when im on the ground the player barely moves compared to when im in the air
here is the script
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Player = game.Players.LocalPlayer
local Character: Model = script.Parent
local Mouse = Player:GetMouse()
local Humanoid: Humanoid = Character:WaitForChild("Humanoid")
local RootPart = Character.PrimaryPart
local RootAttachment = Instance.new("Attachment", RootPart)
local Hooks: { [string]: {Position: Vector3?, ForceObject: VectorForce?, Hooked: boolean?, BeamObject: Part?} } = {
Left = {
Hooked = false,
Position = nil,
ForceObject = nil,
BeamObject = nil
};
Right = {
Hooked = false,
Position = nil,
ForceObject = nil,
BeamObject = nil
}
}
local function AveragePosition(pos1, pos2)
local averageX = (pos1.X + pos2.X) / 2
local averageY = (pos1.Y + pos2.Y) / 2
local averageZ = (pos1.Z + pos2.Z) / 2
return Vector3.new(averageX, averageY, averageZ)
end
local function Hook(side)
if Hooks[side].Hooked == true then return end
if Mouse.Hit then
local HookPosition = Mouse.Hit.Position
local VectorForce = Instance.new("VectorForce", RootPart)
VectorForce.Attachment0 = RootAttachment
VectorForce.RelativeTo = Enum.ActuatorRelativeTo.World
local HitPositionReference = Instance.new("Part", workspace)
HitPositionReference.Anchored = true
HitPositionReference.Position = Mouse.Hit.Position
HitPositionReference.Transparency = 1
HitPositionReference.CanCollide = false
local ReferenceAtt = Instance.new("Attachment", HitPositionReference)
local Beam = ReplicatedStorage:WaitForChild("Beam"):Clone()
Beam.Parent = HitPositionReference
Beam.Attachment0 = ReferenceAtt
Beam.Attachment1 = Character[side.."Box"].BeamAtt
Hooks[side].BeamObject = HitPositionReference
Hooks[side].ForceObject = VectorForce
Hooks[side].Position = HookPosition
Hooks[side].Hooked = true
end
end
local function ReleaseHook(side)
if Hooks[side].Hooked == false then return end
if Hooks[side].ForceObject then
Hooks[side].ForceObject:Destroy()
end
if Hooks[side].BeamObject then
Hooks[side].BeamObject:Destroy()
end
Hooks[side].Hooked = false
Hooks[side].Position = nil
end
UserInputService.InputBegan:Connect(function(input, GPE)
if GPE then return end
if input.KeyCode == Enum.KeyCode.Q then
Hook("Left")
elseif input.KeyCode == Enum.KeyCode.E then
Hook("Right")
end
end)
UserInputService.InputEnded:Connect(function(input, GPE)
if GPE then return end
if input.KeyCode == Enum.KeyCode.Q then
ReleaseHook("Left")
elseif input.KeyCode == Enum.KeyCode.E then
ReleaseHook("Right")
end
end)
RunService.RenderStepped:Connect(function()
if Hooks["Right"].Hooked == true then
Hooks["Right"].ForceObject.Force = (Hooks["Right"].Position - RootPart.Position).Unit * workspace.Gravity * 20
end
if Hooks["Left"].Hooked == true then
Hooks["Left"].ForceObject.Force = (Hooks["Left"].Position - RootPart.Position).Unit * workspace.Gravity * 20
end
end)