242 lines
8.0 KiB
Lua
242 lines
8.0 KiB
Lua
require(game.ReplicatedFirst.ReadyModule)
|
|
-- This is a script that handles a tool for creating objects
|
|
local player = game.Players.LocalPlayer
|
|
-- Gui Objects
|
|
local paintFrame = _G:WaitFor("PaintFrame")
|
|
--local paintSelection = paintFrame:WaitForChild("ScrollingFrame")
|
|
--local paintDefault = paintSelection:WaitForChild("Default")
|
|
local userInputEvent = nil
|
|
|
|
local renderEvent = nil
|
|
local mouseModule = require(_G.Modules.MouseModule)
|
|
|
|
local currentColor = Color3.new(1, 1, 1)
|
|
local lastPainted = nil
|
|
|
|
local input = game:GetService("UserInputService")
|
|
|
|
local partStateModule = require(_G.Modules.PartStateModule)
|
|
local partState = partStateModule.new()
|
|
|
|
local paintFrame = _G:WaitFor("PaintFrame")
|
|
|
|
local colorPickerFrame = paintFrame.ColorPickerFrame
|
|
local colorSelectorFrame = paintFrame.ColorSelectorFrame
|
|
local colorLabel = paintFrame.ColorLabel
|
|
|
|
local materialSelectorFrame = paintFrame.MaterialSelectorFrame
|
|
local materialLabel = paintFrame.MaterialLabel
|
|
|
|
local polyFrame = paintFrame.PolyFrame
|
|
local polyLabel = paintFrame.PolyLabel
|
|
|
|
-- local label = game:GetService("Selection"):Get()[1] for name,id in ([[DiamondPlate7546654401Metal7547178395Wood7547190453WoodPlanks7547301709SmoothPlastic Rubber14108673018Neon Glass7547304577]]):gmatch("([a-zA-Z]+)([0-9]*)") do local l = label:Clone() l.Parent = label.Parent l.Image = "rbxassetid://"..id l.Name = name end
|
|
|
|
local hues = {}
|
|
local hue = Color3.new(0,0,1)
|
|
local finalColor = nil
|
|
|
|
local function makeColorGradient()
|
|
local n = tonumber
|
|
local t = {}
|
|
for r,g,b in ("100101001011010110100"):gmatch("(.)(.)(.)") do
|
|
local color = Color3.new(n(r),n(g),n(b))
|
|
--table.insert(t,ColorSequenceKeypoint.new(#t/7,color))
|
|
table.insert(hues,color)
|
|
end
|
|
--return ColorSequence.new(t)
|
|
end
|
|
makeColorGradient()
|
|
|
|
local function getHue(value)
|
|
local index1 = math.clamp(math.floor(value*6)+1,1,7)
|
|
local index2 = math.clamp(math.floor(value*6)+2,2,7)
|
|
local a = hues[index1]
|
|
local b = hues[index2]
|
|
local alpha = value*6 - math.floor(value*6)
|
|
print(value,index1,index2,alpha)
|
|
return a:Lerp(b,alpha)
|
|
end
|
|
|
|
local function pickerFactory(object,callback,use_x,use_y)
|
|
local held
|
|
local inputs = {[Enum.UserInputType.MouseButton1]=true,[Enum.UserInputType.Touch]=true,[Enum.UserInputType.MouseMovement]=true}
|
|
local function changed(input)
|
|
if input == held or (held and input.UserInputType == Enum.UserInputType.MouseMovement) then
|
|
local p = object.Pointer.Position
|
|
local s = object.Pointer.AbsoluteSize
|
|
local x_scale,y_scale,x_offset,y_offset,x_value,y_value
|
|
if use_x then
|
|
x_scale = math.clamp((input.Position.X - object.AbsolutePosition.X) / (object.AbsoluteSize.X + s.X),0,object.AbsoluteSize.X/(object.AbsoluteSize.X + s.X))
|
|
x_value = math.clamp((input.Position.X - object.AbsolutePosition.X) / (object.AbsoluteSize.X),0,1)
|
|
x_offset = s.X/2
|
|
else
|
|
x_scale = p.X.Scale
|
|
x_offset = p.X.Offset
|
|
end
|
|
if use_y then
|
|
y_scale = math.clamp((input.Position.Y - object.AbsolutePosition.Y) / (object.AbsoluteSize.Y + s.Y),0,object.AbsoluteSize.Y/(object.AbsoluteSize.Y + s.Y))
|
|
y_value = math.clamp((input.Position.Y - object.AbsolutePosition.Y) / (object.AbsoluteSize.Y),0,1)
|
|
y_offset = s.Y/2
|
|
else
|
|
y_scale = p.Y.Scale
|
|
y_offset = p.Y.Offset
|
|
end
|
|
object.Pointer.Position = UDim2.new(x_scale,x_offset,y_scale,y_offset)
|
|
callback(x_value,y_value)
|
|
end
|
|
end
|
|
object.InputBegan:Connect(function(input)
|
|
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
|
|
held = input
|
|
changed(input)
|
|
end
|
|
end)
|
|
object.InputEnded:Connect(function(input)
|
|
if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then
|
|
held = nil
|
|
end
|
|
end)
|
|
input.InputChanged:Connect(changed)
|
|
end
|
|
|
|
local saturation = 0
|
|
local brightness = 0
|
|
local function updateColor()
|
|
finalColor = hue:Lerp(Color3.new(1,1,1),saturation):Lerp(Color3.new(0,0,0),brightness)
|
|
colorSelectorFrame.Preview.BackgroundColor3 = finalColor
|
|
colorLabel.CancelButton.Visible = true
|
|
end
|
|
|
|
pickerFactory(colorPickerFrame.Hue,function(_,y)
|
|
local color = getHue(y)
|
|
hue = color
|
|
colorPickerFrame.Picker.BackgroundColor3 = color
|
|
updateColor()
|
|
end,false,true)
|
|
|
|
pickerFactory(colorPickerFrame.Picker,function(x,y)
|
|
saturation = 1-x
|
|
brightness = y
|
|
updateColor()
|
|
end,true,true)
|
|
|
|
local colorPicking = false
|
|
colorSelectorFrame.PickButton.Activated:Connect(function()
|
|
colorPicking = true
|
|
colorSelectorFrame.PickButton.BackgroundColor3 = Color3.new(0.5,1,0.5)
|
|
end)
|
|
|
|
colorLabel.CancelButton.Activated:Connect(function()
|
|
colorLabel.CancelButton.Visible = false
|
|
finalColor = nil
|
|
end)
|
|
|
|
local finalMaterial = nil
|
|
local materialStroke = materialSelectorFrame:WaitForChild("UIStroke")
|
|
materialStroke.Enabled = true
|
|
materialStroke.Parent = nil
|
|
|
|
for _,item in pairs(materialSelectorFrame:GetChildren()) do
|
|
if item:IsA("ImageButton") then
|
|
item.Activated:Connect(function()
|
|
finalMaterial = Enum.Material[item.Name]
|
|
materialLabel.CancelButton.Visible = true
|
|
materialStroke.Parent = item
|
|
end)
|
|
end
|
|
end
|
|
materialLabel.CancelButton.Activated:Connect(function()
|
|
materialLabel.CancelButton.Visible = false
|
|
materialStroke.Parent = nil
|
|
finalMaterial = nil
|
|
end)
|
|
|
|
local finalShift = nil
|
|
local finalThickness = nil
|
|
|
|
polyFrame.ShiftButton.Activated:Connect(function()
|
|
if not finalShift then finalShift = 1
|
|
elseif finalShift == 1 then finalShift = -1
|
|
elseif finalShift == -1 then finalShift = nil end
|
|
|
|
if not finalShift then polyFrame.ShiftButton.Text = "Shift Off"
|
|
elseif finalShift == -1 then polyFrame.ShiftButton.Text = "Shift Out"
|
|
elseif finalShift == 1 then polyFrame.ShiftButton.Text = "Shift In" end
|
|
|
|
polyLabel.CancelButton.Visible = true
|
|
end)
|
|
|
|
polyFrame.ThicknessBox.FocusLost:Connect(function(enter)
|
|
if enter then
|
|
finalThickness = tonumber(polyFrame.ThicknessBox.Text) or nil
|
|
if finalThickness < 0.05 then finalThickness = 0.05 end
|
|
local text = ""
|
|
if finalThickness then text = tostring(finalThickness).." studs" end
|
|
polyFrame.ThicknessBox.Text = text
|
|
end
|
|
|
|
polyLabel.CancelButton.Visible = true
|
|
end)
|
|
|
|
polyLabel.CancelButton.Activated:Connect(function()
|
|
polyLabel.CancelButton.Visible = false
|
|
finalShift = nil
|
|
finalThickness = nil
|
|
polyFrame.ShiftButton.Text = "Shift Off"
|
|
polyFrame.ThicknessBox.Text = ""
|
|
end)
|
|
|
|
polyLabel.CancelButton.Visible = false
|
|
colorLabel.CancelButton.Visible = false
|
|
materialLabel.CancelButton.Visible = false
|
|
|
|
local function render(delta)
|
|
local result = mouseModule.getMouseHit()
|
|
if result and result.Instance then
|
|
local object = _G.Methods.getObjectFromPart(result.Instance,player)
|
|
if object then script.SelectionBox.Adornee = object else script.SelectionBox.Adornee = nil end
|
|
script.SelectionBox.FillTransparency = 1
|
|
if not mouseModule.isMouseDown() then return end
|
|
script.SelectionBox.FillTransparency = 0.5
|
|
if colorPicking then
|
|
finalColor = result.Instance.Color
|
|
colorSelectorFrame.Preview.BackgroundColor3 = finalColor
|
|
colorPicking = false
|
|
colorSelectorFrame.PickButton.BackgroundColor3 = Color3.new(1,1,1)
|
|
if object then lastPainted = object end
|
|
return
|
|
end
|
|
if lastPainted == object then return end
|
|
lastPainted = object
|
|
if not lastPainted then return end
|
|
local state = partStateModule.new()
|
|
if finalColor then state.color = finalColor end
|
|
if finalShift then state.look = game.Workspace.CurrentCamera.CFrame.LookVector state.shift = finalShift end
|
|
if finalThickness then state.size = Vector3.new(finalThickness,0,0) end
|
|
if finalMaterial then state.material = finalMaterial end
|
|
_G.Remotes.Apply:FireServer(lastPainted,state:serialise())
|
|
else
|
|
lastPainted = nil
|
|
script.SelectionBox.Adornee = nil
|
|
end
|
|
end
|
|
|
|
paintFrame.Visible = false
|
|
|
|
local function init(s)
|
|
if renderEvent then renderEvent:Disconnect() end
|
|
s.Parent.Equipped:Connect(function()
|
|
if renderEvent then renderEvent:Disconnect() end
|
|
renderEvent = game:GetService("RunService").RenderStepped:Connect(render)
|
|
paintFrame.Visible = true
|
|
end)
|
|
|
|
s.Parent.Unequipped:Connect(function()
|
|
if renderEvent then renderEvent:Disconnect() end
|
|
paintFrame.Visible = false
|
|
script.SelectionBox.Adornee = nil
|
|
end)
|
|
end
|
|
|
|
return {init = init} |