Files
PlaneBuilding/scripts/modules/PaintModule.lua
T

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}