Copy salient and essential scripts and models from Plane Building Roblox
This commit is contained in:
@@ -0,0 +1,242 @@
|
||||
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}
|
||||
Reference in New Issue
Block a user