Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local toolbar = plugin:CreateToolbar("Ledge Creator")
- local uis = game:GetService("UserInputService")
- local SelectionService = game:GetService("Selection")
- local studio_service = game:GetService("StudioService")
- local pluginButton = toolbar:CreateButton(
- "call",
- "Create ledge for selected parts",
- "rbxassetid://2782179754"
- )
- local ledge_SIZE_LIMIT = NumberRange.new(0.01, 100)
- local ledge_HEIGHT_LIMIT = NumberRange.new(0.01, 100)
- local ledge_parts: {BasePart} = {}
- local mouse_start_pos: Vector3 = Vector3.zero
- local mouse_pos: Vector3 = Vector3.zero
- local mouse1_down: boolean = false
- local ledge_heighting: boolean = false
- local ledge_sizing: boolean = false
- local invert_height: boolean = false
- local DEFAULT_SIZE: number = 0.1
- local DEFAULT_HEIGHT: number = 0.2
- plugin:Activate(false)
- task.wait()
- local mouse: PluginMouse = plugin:GetMouse()
- pluginButton.Click:Connect(function()
- mouse_start_pos = mouse_pos
- local selection = game:GetService('Selection'):Get()
- if not selection[1] then print('ledge creator -- empty selection')return end
- table.clear(ledge_parts)
- for _, v in selection do
- if v:IsA('BasePart')then
- local new_ledge = v:FindFirstChild('LedgeC')or v:Clone()
- new_ledge.Name = 'LedgeC'
- new_ledge.Parent = v.Parent or workspace
- for _, v in Enum.NormalId:GetEnumItems()do
- local new_decal = Instance.new('Decal', new_ledge)
- new_decal.Name = 'ledge_preview'
- new_decal.Texture = 'rbxassetid://15396807460'
- new_decal.Transparency = 0.5
- new_decal.Face = v
- end
- ledge_parts[new_ledge] = v
- end
- end
- invert_height = false
- ledge_heighting = true
- end)
- local function clear_decals(v: BasePart): nil
- for _, decal: Decal in v:GetChildren()do
- if decal.Name == 'ledge_preview'then
- decal:Destroy()
- end
- end
- end
- uis.InputBegan:Connect(function(input: InputObject)
- if ledge_heighting or ledge_sizing then
- if input.KeyCode.Name == 'Escape' then
- ledge_heighting = false
- ledge_sizing = false
- for v: BasePart,_ in ledge_parts do
- v:Destroy()
- end
- table.clear(ledge_parts)
- return
- end
- if input.UserInputType.Name == 'MouseButton1' then
- if ledge_heighting then
- ledge_heighting = false
- ledge_sizing = true
- mouse_start_pos = mouse_pos
- else
- ledge_heighting = false
- ledge_sizing = false
- local parts: {BasePart} = {}
- for v: BasePart,_ in ledge_parts do
- clear_decals(v)
- table.insert(parts, v)
- end
- game:GetService('Selection'):Set(parts)
- table.clear(ledge_parts)
- end
- elseif input.UserInputType.Name == 'MouseButton3' then
- invert_height = not invert_height
- end
- end
- end)
- local function snap_number(n: number): number
- return math.floor((n / plugin.GridSize)) * plugin.GridSize
- end
- game:GetService('RunService').Heartbeat:Connect(function(dt)
- local position = Vector2.new(mouse.X, mouse.Y)
- mouse_pos = position
- if ledge_heighting or ledge_sizing then
- local max: number = ((ledge_heighting and ledge_HEIGHT_LIMIT.Max)or ledge_SIZE_LIMIT.Max)
- local mouse_sens: number = (ledge_heighting and 0.5) or 0.05
- local value: number = (position.X - mouse_start_pos.X) * mouse_sens
- local factor: number = math.clamp((position.X - mouse_start_pos.X) * mouse_sens, 0.01, max)
- if ledge_parts ~= nil then
- for v: BasePart, parent: BasePart in ledge_parts do
- if ledge_sizing then
- v.Size = Vector3.new(snap_number(parent.Size.X + math.max(factor, ledge_SIZE_LIMIT.Min)), v.Size.Y, snap_number(parent.Size.Z + math.max(factor, ledge_SIZE_LIMIT.Min)))
- else
- v.Size = Vector3.new(parent.Size.X + 1, snap_number(parent.Size.Y * (math.clamp((factor / max), 0.01, 0.99))), parent.Size.Z + 1)
- local y = -parent.Size.Y / 2.0 + (v.Size.Y / 2.0) - 0.005
- if invert_height then
- y = parent.Size.Y / 2.0 - (v.Size.Y / 2.0) + 0.005
- end
- v.CFrame = parent.CFrame * CFrame.new(0, y, 0)
- end
- end
- end
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement