forked from aya/aya
6891 lines
241 KiB
Plaintext
6891 lines
241 KiB
Plaintext
<roblox xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="4">
|
|
<External>null</External>
|
|
<External>nil</External>
|
|
<Item class="Model" referent="RBX3CC71DDB17D842A3B313B465F8D61360">
|
|
<Properties>
|
|
<CoordinateFrame name="ModelInPrimary">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
<Z>0</Z>
|
|
<R00>1</R00>
|
|
<R01>0</R01>
|
|
<R02>0</R02>
|
|
<R10>0</R10>
|
|
<R11>1</R11>
|
|
<R12>0</R12>
|
|
<R20>0</R20>
|
|
<R21>0</R21>
|
|
<R22>1</R22>
|
|
</CoordinateFrame>
|
|
<string name="Name">Terrain Tools</string>
|
|
<Ref name="PrimaryPart">null</Ref>
|
|
</Properties>
|
|
<Item class="LocalScript" referent="RBX24C942C33E7244998199BC2CFBC8DAC6">
|
|
<Properties>
|
|
<bool name="Disabled">false</bool>
|
|
<Content name="LinkedSource">
|
|
<null></null>
|
|
</Content>
|
|
<string name="Name">TerrainBrushScript</string>
|
|
<ProtectedString name="Source"><![CDATA[--Made by Stickmasterluke
|
|
|
|
|
|
while not workspace:WaitForChild('Terrain').IsSmooth do
|
|
workspace.Terrain.Changed:wait()
|
|
end
|
|
|
|
local on = false
|
|
local setup = false
|
|
local currentTool = nil
|
|
local utilityModule = require(script.Parent.Utility)(plugin)
|
|
|
|
|
|
--[[
|
|
How to add a module:
|
|
1. Add the require to the modules table below.
|
|
2. Add a plugin button for it into the pluginButtons table, with the same index as used in the modules table.
|
|
|
|
How modules work
|
|
Your ModuleScript should return a table. The table can contain the following functions
|
|
On = This function will be called when your tool is selected. Will hand in the mouse object, and a Deselect function to turn it off.
|
|
Off = This function will be called when your tool is deselected.
|
|
operation = This function will be called when this toolset's brushing functionality is used
|
|
operation(centerPoint, materialsTable, occupanciesTable, resolution, selectionSize, strength, desiredMaterial, brushShape, minBounds, maxBounds)
|
|
]]
|
|
|
|
local modules = {
|
|
['Smooth'] = require(script.Parent.SmootherModule),
|
|
['Generate'] = utilityModule:GetUsingAsPlugin() and require(script.Parent.GenerationModule) or {},
|
|
['Region Editor'] = require(script.Parent.RegionEditorModule),
|
|
}
|
|
|
|
|
|
local buttonCreator = utilityModule:GetButtonCreator()
|
|
|
|
local plugins = {
|
|
{name = 'Generate',
|
|
button = utilityModule:GetUsingAsPlugin() and buttonCreator:CreateButton(
|
|
'Generate', --button title
|
|
'Generate landscapes of terrain.', --hover text
|
|
'http://www.roblox.com/asset/?id=236006872' --button image
|
|
),
|
|
studioOnly = true,
|
|
},
|
|
{name = 'Add',
|
|
button = buttonCreator:CreateButton(
|
|
'Add',
|
|
'Click and hold to add terrain.',
|
|
'http://www.roblox.com/asset/?id=225328572'
|
|
),
|
|
usesMaterials = true,
|
|
},
|
|
{name = 'Subtract',
|
|
button = buttonCreator:CreateButton(
|
|
'Subtract',
|
|
'Click and hold to remove terrain.',
|
|
'http://www.roblox.com/asset/?id=225328818'
|
|
),
|
|
},
|
|
{name = 'Paint',
|
|
button = buttonCreator:CreateButton(
|
|
'Paint',
|
|
'Paint the material of the terrain.',
|
|
'http://www.roblox.com/asset/?id=225328954'
|
|
),
|
|
usesMaterials = true,
|
|
},
|
|
{name = 'Grow',
|
|
button = buttonCreator:CreateButton(
|
|
'Grow',
|
|
'Click and hold to grow and expand terrain.',
|
|
'http://www.roblox.com/asset/?id=225329153'
|
|
),
|
|
usesMaterials = true,
|
|
},
|
|
{name = 'Erode',
|
|
button = buttonCreator:CreateButton(
|
|
'Erode',
|
|
'Click and hold to erode and remove terrain.',
|
|
'http://www.roblox.com/asset/?id=225329301'
|
|
),
|
|
},
|
|
{name = 'Smooth',
|
|
button = buttonCreator:CreateButton(
|
|
'Smooth',
|
|
'Brush to smooth out rough or jagged terrain.',
|
|
'http://www.roblox.com/asset/?id=225329641'
|
|
),
|
|
},
|
|
{name = 'Region Editor',
|
|
button = buttonCreator:CreateButton(
|
|
'Regions',
|
|
'Manipulate regions of smooth terrain.',
|
|
'http://www.roblox.com/asset/?id=240631063'
|
|
),
|
|
},
|
|
}
|
|
|
|
for i,tool in pairs(plugins) do
|
|
if not tool.studioOnly or (utilityModule:GetUsingAsPlugin() and tool.studioOnly) then
|
|
tool.button.Click:connect(function()
|
|
if not on or (currentTool ~= nil and tool ~= currentTool) then --if off or on but current tool isn't the desired tool, then select this tool.
|
|
if not setup then --I do this so that things only get set up when this plugin is used.
|
|
FirstTimeSetUp()
|
|
end
|
|
Selected(tool)
|
|
else
|
|
Deselected()
|
|
end
|
|
end)
|
|
if not utilityModule:GetUsingAsPlugin() then
|
|
if tool.button.Deselected then
|
|
tool.button.Deselected:connect(function()
|
|
Deselected()
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function FirstTimeSetUp()
|
|
setup = true
|
|
local changeHistory = utilityModule:GetUsingAsPlugin() and game:GetService('ChangeHistoryService') or nil
|
|
local terrain = game.Workspace.Terrain
|
|
local coreGui = utilityModule:GetCoreGui()
|
|
local gui = script.Parent:WaitForChild('TerrainBrushGui')
|
|
local guiFrame = gui:WaitForChild('Frame')
|
|
local closeButton = guiFrame:WaitForChild('CloseButton')
|
|
local titlelabel = guiFrame:WaitForChild('TitleLabel')
|
|
local checkBox1 = guiFrame:WaitForChild('CheckBox1')
|
|
local checkBox2 = guiFrame:WaitForChild('CheckBox2')
|
|
local checkBox3 = guiFrame:WaitForChild('CheckBox3')
|
|
local checkBox4 = guiFrame:WaitForChild('CheckBox4')
|
|
local toolTip1 = guiFrame:WaitForChild('ToolTip1')
|
|
local toolTip2 = guiFrame:WaitForChild('ToolTip2')
|
|
local label4 = guiFrame:WaitForChild('Label4')
|
|
local divider2 = guiFrame:WaitForChild('Divider2')
|
|
local library = assert(LoadLibrary('RbxGui'))
|
|
local mouse = utilityModule:GetMouse()
|
|
local userInput = game:GetService('UserInputService')
|
|
local prevCameraType = game.Workspace.CurrentCamera.CameraType
|
|
|
|
--SUB SETTINGS-- (Non-userfacing Settings)
|
|
local resolution = 4 --This is the size of voxels on Roblox. Why is this a variable? ;)
|
|
local minSelectionSize = 1
|
|
local maxSelectionSize = 16
|
|
local clickThreshold = .1
|
|
local toolTipShowTime = 3.5
|
|
local materialsTable = require(script.Parent.MaterialsList)
|
|
local brushShapes = {
|
|
['Sphere'] = {
|
|
name = 'Sphere',
|
|
button = guiFrame:WaitForChild('ShapeButton1'),
|
|
image = 'http://www.roblox.com/asset/?id=225799533',
|
|
selectedImage = 'http://www.roblox.com/asset/?id=225801914',
|
|
},
|
|
['Box'] = {
|
|
name = 'Box',
|
|
button = guiFrame:WaitForChild('ShapeButton2'),
|
|
image = 'http://www.roblox.com/asset/?id=225799696',
|
|
selectedImage = 'http://www.roblox.com/asset/?id=225802254',
|
|
},
|
|
}
|
|
----------------
|
|
|
|
----SETTINGS---- (Interface Settings)
|
|
local selectionSize = 6
|
|
local strength = .5
|
|
local snapToGrid = false
|
|
local planeLock = false
|
|
local ignoreWater = true
|
|
local brushShape = 'Sphere'
|
|
local materialSelection = materialsTable[1]
|
|
local dynamicMaterial = false
|
|
----------------
|
|
|
|
----Variables----
|
|
local forcePlaneLock = false
|
|
local forceSnapToGrid = false
|
|
local forceDynamicMaterial = false
|
|
local forceDynamicMaterialTo = true
|
|
local isDynamic = false
|
|
local forceIgnoreWater = false
|
|
local forceIgnoreWaterTo = true
|
|
local isIgnoreWater = true
|
|
local forceMaterial = nil
|
|
local nearMaterial = nil
|
|
local selectionPart = nil
|
|
local selectionObject = nil
|
|
local gridLineParts = {}
|
|
local currentLoopTag = nil
|
|
local lastMainPoint = Vector3.new(0, 0, 0)
|
|
local click = false
|
|
local firstOperation = tick()
|
|
local downKeys = {}
|
|
local lastPlanePoint = Vector3.new(0, 0, 0)
|
|
local lastNormal = Vector3.new(0, 1, 0)
|
|
local lastCursorDistance = 300
|
|
local one256th = 1/256 --This should later be replaced with 0 once smooth terrain doesn't aproximate 1/256 to 0. This is causing small occupancies to become air
|
|
local toolTip1Change = nil
|
|
local toolTip2Change = nil
|
|
local materialAir = Enum.Material.Air
|
|
local materialWater = Enum.Material.Water
|
|
local ceil = math.ceil
|
|
local floor = math.floor
|
|
local abs = math.abs
|
|
local min = math.min
|
|
local max = math.max
|
|
local sqrt = math.sqrt
|
|
local sin = math.sin
|
|
local cos = math.cos
|
|
local pi = math.pi
|
|
---------------
|
|
|
|
|
|
local selectionSizeSlider, selectionSizeValue = library.CreateSlider(maxSelectionSize, 90, UDim2.new(1, -98, 0, 40))
|
|
selectionSizeSlider.Parent = guiFrame
|
|
selectionSizeValue.Changed:connect(function()
|
|
selectionSize = selectionSizeValue.Value
|
|
if selectionPart then
|
|
selectionPart.Size = Vector3.new(1, 1, 1) * selectionSize * resolution + Vector3.new(.1, .1, .1)
|
|
end
|
|
|
|
toolTip1.Visible = true
|
|
local currentToolTip1Change = {}
|
|
toolTip1Change = currentToolTip1Change
|
|
wait(toolTipShowTime)
|
|
if toolTip1Change == currentToolTip1Change then
|
|
toolTip1.Visible = false
|
|
end
|
|
end)
|
|
selectionSizeValue.Value = selectionSize
|
|
toolTip1.Visible = false
|
|
|
|
|
|
local strengthslider, strengthValue = library.CreateSlider(101, 90, UDim2.new(1, -98, 0, 65))
|
|
strengthslider.Parent = guiFrame
|
|
strengthValue.Changed:connect(function()
|
|
strength = (strengthValue.Value - 1) / 100
|
|
if selectionObject then
|
|
selectionObject.SurfaceTransparency = .95 - strength * .3
|
|
end
|
|
|
|
toolTip2.Visible = true
|
|
local currentToolTip2Change = {}
|
|
toolTip2Change = currentToolTip2Change
|
|
wait(toolTipShowTime)
|
|
if toolTip2Change == currentToolTip2Change then
|
|
toolTip2.Visible = false
|
|
end
|
|
end)
|
|
strengthValue.Value = strength * 100
|
|
toolTip2.Visible = false
|
|
|
|
function setBrushShape(newBrushShape)
|
|
brushShape = newBrushShape
|
|
for _,v in pairs(brushShapes) do
|
|
--v.button.Image = (newBrushShape == v) and v.selectedImage or v.image
|
|
v.button.ImageTransparency = (newBrushShape == v.name) and 0 or .5
|
|
v.button.ImageColor3 = (newBrushShape == v.name) and Color3.new(1,1,1) or Color3.new(.5,.5,.5)
|
|
end
|
|
clearSelection()
|
|
end
|
|
for _,v in pairs(brushShapes) do
|
|
v.button.MouseButton1Down:connect(function()
|
|
setBrushShape(v.name)
|
|
end)
|
|
end
|
|
|
|
local function setMaterialSelection(newMaterialSelection)
|
|
materialSelection = newMaterialSelection
|
|
updateUsabilityLocks()
|
|
for _, v in pairs(guiFrame:GetChildren()) do
|
|
if string.sub(v.Name,1,14) == 'MaterialButton' then
|
|
if v.Name == 'MaterialButton' .. materialSelection.enum.Name then
|
|
v.BackgroundTransparency = .1
|
|
else
|
|
v.BackgroundTransparency = 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
for i,materialSubTable in pairs(materialsTable) do
|
|
local newMaterialButton = Instance.new('ImageButton')
|
|
newMaterialButton.Name = 'MaterialButton' .. materialSubTable.enum.Name
|
|
newMaterialButton.BorderSizePixel = 2
|
|
newMaterialButton.BorderColor3 = Color3.new(.2, 1, 1)
|
|
newMaterialButton.BackgroundColor3 = Color3.new(.2, 1, 1)
|
|
newMaterialButton.BackgroundTransparency = 1
|
|
newMaterialButton.Image = materialSubTable.image
|
|
newMaterialButton.Size = UDim2.new(0, 35, 0, 35)
|
|
newMaterialButton.Position = UDim2.new(0, 5 + ((i-1) % 4) * 40, 0, 225 + ceil(i/4) * 40)
|
|
newMaterialButton.MouseButton1Down:connect(function()
|
|
setMaterialSelection(materialsTable[i])
|
|
end)
|
|
newMaterialButton.Parent = guiFrame
|
|
end
|
|
|
|
function resizeGuiFrame()
|
|
local materialsDynamic = dynamicMaterial
|
|
if forceDynamicMaterial then
|
|
materialsDynamic = forceDynamicMaterialTo
|
|
end
|
|
local desiredSize = UDim2.new(0, 180, 0, 240)
|
|
if currentTool and currentTool.usesMaterials then
|
|
checkBox3.Visible=true
|
|
label4.Visible=true
|
|
divider2.Visible=true
|
|
desiredSize = desiredSize + UDim2.new(0, 0, 0, 35)
|
|
if not materialsDynamic then
|
|
desiredSize = desiredSize + UDim2.new(0, 0, 0, 5 + ceil(#materialsTable / 4) * 40) --Dynamically resizes frame if we add more materials later.
|
|
end
|
|
else
|
|
checkBox3.Visible=false
|
|
label4.Visible=false
|
|
divider2.Visible=false
|
|
end
|
|
guiFrame.Size = desiredSize
|
|
--guiFrame:TweenSize(desiredSize, 'Out', 'Quad', .5) --illegal in studio
|
|
end
|
|
|
|
|
|
function updatePlaneLock()
|
|
checkBox1.Style = forcePlaneLock and Enum.ButtonStyle.RobloxRoundButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
checkBox1.Text = (planeLock or forcePlaneLock) and 'X' or ''
|
|
checkBox1.AutoButtonColor = not forcePlaneLock
|
|
if not (planeLock or forcePlaneLock) then
|
|
clearGrid()
|
|
end
|
|
end
|
|
checkBox1.MouseButton1Down:connect(function()
|
|
planeLock = not planeLock
|
|
updatePlaneLock()
|
|
end)
|
|
|
|
function updateSnapToGrid()
|
|
checkBox2.Style = forceSnapToGrid and Enum.ButtonStyle.RobloxRoundButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
checkBox2.Text = (snapToGrid or forceSnapToGrid) and 'X' or ''
|
|
checkBox2.AutoButtonColor = not forceSnapToGrid
|
|
end
|
|
checkBox2.MouseButton1Down:connect(function()
|
|
snapToGrid = not snapToGrid
|
|
updateSnapToGrid()
|
|
end)
|
|
|
|
function updateDynamicMaterial()
|
|
isDynamic = dynamicMaterial
|
|
if forceDynamicMaterial then
|
|
isDynamic = forceDynamicMaterialTo
|
|
end
|
|
checkBox3.Style = forceDynamicMaterial and Enum.ButtonStyle.RobloxRoundButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
checkBox3.AutoButtonColor = not forceDynamicMaterial
|
|
checkBox3.Text = isDynamic and 'X' or ''
|
|
resizeGuiFrame()
|
|
for _, v in pairs(guiFrame:GetChildren()) do
|
|
if string.sub(v.Name,1,14) == 'MaterialButton' then
|
|
v.Visible = not isDynamic
|
|
end
|
|
end
|
|
end
|
|
checkBox3.MouseButton1Down:connect(function()
|
|
dynamicMaterial = not dynamicMaterial
|
|
updateDynamicMaterial()
|
|
end)
|
|
|
|
function updateIgnoreWater()
|
|
isIgnoreWater = ignoreWater
|
|
if forceIgnoreWater then
|
|
isIgnoreWater = forceIgnoreWaterTo
|
|
end
|
|
checkBox4.Style = forceIgnoreWater and Enum.ButtonStyle.RobloxRoundButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
checkBox4.AutoButtonColor = not forceIgnoreWater
|
|
checkBox4.Text = isIgnoreWater and 'X' or ''
|
|
end
|
|
checkBox4.MouseButton1Down:connect(function()
|
|
ignoreWater = not ignoreWater
|
|
updateIgnoreWater()
|
|
end)
|
|
-------------
|
|
|
|
|
|
do
|
|
local runService = game:GetService('RunService').RenderStepped
|
|
function quickWait(waitTime)
|
|
if not waitTime then
|
|
runService:wait()
|
|
elseif waitTime < .033333 then
|
|
local startTick = tick()
|
|
runService:wait()
|
|
local delta = tick() - startTick
|
|
if delta <= waitTime * .5 then
|
|
quickWait(waitTime - delta)
|
|
end
|
|
else
|
|
wait(waitTime)
|
|
end
|
|
end
|
|
end
|
|
|
|
function deepCast(origin, endPoint, ignoreList, filterFunction, cubeTerrain)
|
|
local ray = Ray.new(origin, endPoint - origin)
|
|
local hit, pos, normal, material = game.Workspace:FindPartOnRayWithIgnoreList(ray, ignoreList, cubeTerrain)
|
|
if hit and filterFunction(hit) then
|
|
table.insert(ignoreList, hit)
|
|
return deepCast(pos, endPoint, ignoreList, filterFunction, cubeTerrain)
|
|
else
|
|
return hit, pos, normal, material
|
|
end
|
|
end
|
|
|
|
function clearSelection()
|
|
if selectionObject then
|
|
selectionObject:Destroy()
|
|
selectionObject = nil
|
|
end
|
|
if selectionPart then
|
|
selectionPart:Destroy()
|
|
selectionPart = nil
|
|
end
|
|
end
|
|
|
|
function clearGrid()
|
|
for i, v in pairs(gridLineParts) do
|
|
if v then
|
|
v:Destroy()
|
|
end
|
|
gridLineParts[i] = nil
|
|
end
|
|
end
|
|
|
|
function drawGrid(point, normal, transparency, color)
|
|
local transparency = transparency or .95
|
|
local color = BrickColor.new(color or 'Institutional white')--'Pastel light blue')
|
|
local gridCellSize = selectionSize * resolution
|
|
local gridSize = 10
|
|
local baseCframe = CFrame.new(point, point + normal)
|
|
local normalSpase = CFrame.new(Vector3.new(0, 0, 0), normal):pointToObjectSpace(point)
|
|
local roundedNormalOffset = (Vector3.new((normalSpase.x / gridCellSize) % 1, (normalSpase.y / gridCellSize) % 1, 0) - Vector3.new(.5, .5, 0)) * -gridCellSize
|
|
for u = 1, gridSize do
|
|
local linePart = gridLineParts[u]
|
|
if not linePart then
|
|
linePart = Instance.new('Part')
|
|
linePart.Transparency = 1
|
|
linePart.TopSurface = 'Smooth'
|
|
linePart.BottomSurface = 'Smooth'
|
|
linePart.Anchored = true
|
|
linePart.CanCollide = false
|
|
linePart.formFactor = 'Custom'
|
|
local selectionBox = Instance.new('SelectionBox')
|
|
selectionBox.Color = color
|
|
selectionBox.Transparency = transparency
|
|
selectionBox.Adornee = linePart
|
|
selectionBox.Parent = linePart
|
|
linePart.Parent = gui
|
|
gridLineParts[u] = linePart
|
|
elseif linePart.SelectionBox.Transparency ~= transparency or linePart.SelectionBox.Color ~= color then
|
|
linePart.SelectionBox.Transparency = transparency
|
|
linePart.SelectionBox.Color = color
|
|
end
|
|
local percent = (u - 1) / (gridSize - 1)
|
|
linePart.Size = Vector3.new(gridCellSize * gridSize * sin(math.acos(percent * 1.8 - .9)), 0, 0)
|
|
linePart.CFrame = baseCframe * CFrame.new(0, (percent - .5) * (gridSize - 1) * gridCellSize, 0) * CFrame.new(roundedNormalOffset)
|
|
end
|
|
for u = 1, gridSize do
|
|
local linePart = gridLineParts[gridSize + u]
|
|
if not linePart then
|
|
linePart = Instance.new('Part')
|
|
linePart.Transparency = 1
|
|
linePart.TopSurface = 'Smooth'
|
|
linePart.BottomSurface = 'Smooth'
|
|
linePart.Anchored = true
|
|
linePart.CanCollide = false
|
|
linePart.formFactor = 'Custom'
|
|
local selectionBox = Instance.new('SelectionBox')
|
|
selectionBox.Color = color
|
|
selectionBox.Transparency = transparency
|
|
selectionBox.Adornee = linePart
|
|
selectionBox.Parent = linePart
|
|
linePart.Parent = gui
|
|
gridLineParts[gridSize + u] = linePart
|
|
elseif linePart.SelectionBox.Transparency ~= transparency or linePart.SelectionBox.Color ~= color then
|
|
linePart.SelectionBox.Transparency = transparency
|
|
linePart.SelectionBox.Color = color
|
|
end
|
|
local percent = (u - 1) / (gridSize - 1)
|
|
linePart.Size = Vector3.new(0, gridCellSize * gridSize * sin(math.acos(percent * 1.8 - .9)), 0)
|
|
linePart.CFrame = baseCframe * CFrame.new((percent - .5) * (gridSize - 1) * gridCellSize, 0, 0) * CFrame.new(roundedNormalOffset)
|
|
end
|
|
end
|
|
|
|
local function getCell(list, x, y, z, materialList)
|
|
-- only include materialsList if you want to ignore water
|
|
return (materialList and materialList[x] and materialList[x][y] and materialList[x][y][z]) == materialWater and 0
|
|
or list and list[x] and list[x][y] and list[x][y][z]
|
|
end
|
|
|
|
local function getNeighborOccupancies(list, x, y, z, materialsList, includeSelf)
|
|
--only include materialsList if you want to ignore water
|
|
local fullNeighbor = false
|
|
local emptyNeighbor = false
|
|
local neighborOccupancies = includeSelf and getCell(list, x, y, z, materialsList) or 0
|
|
local totalNeighbors = includeSelf and 1 or 0
|
|
local nearMaterial = materialSelection.enum
|
|
for axis = 1, 3 do
|
|
for offset = -1, 1, 2 do
|
|
local neighbor = nil
|
|
local neighborMaterial = nil
|
|
if axis == 1 then
|
|
neighbor = list[x + offset] and list[x + offset][y][z]
|
|
elseif axis == 2 then
|
|
neighbor = list[x][y + offset] and list[x][y + offset][z]
|
|
elseif axis == 3 then
|
|
neighbor = list[x][y][z + offset]
|
|
end
|
|
if neighbor then
|
|
if materialsList then
|
|
if axis == 1 then
|
|
neighborMaterial = materialsList[x + offset] and materialsList[x + offset][y][z]
|
|
elseif axis == 2 then
|
|
neighborMaterial = materialsList[x][y + offset] and materialsList[x][y + offset][z]
|
|
elseif axis == 3 then
|
|
neighborMaterial = materialsList[x][y][z + offset]
|
|
end
|
|
if neighborMaterial == materialWater then
|
|
neighbor = 0
|
|
end
|
|
end
|
|
if neighbor >= 1 then
|
|
fullNeighbor = true
|
|
end
|
|
if neighbor <= 0 then
|
|
emptyNeighbor = true
|
|
end
|
|
totalNeighbors = totalNeighbors + 1
|
|
neighborOccupancies = neighborOccupancies + neighbor
|
|
end
|
|
end
|
|
end
|
|
return neighborOccupancies / (totalNeighbors ~= 0 and totalNeighbors or getCell(list, x, y, z, materialsList)), fullNeighbor, emptyNeighbor
|
|
end
|
|
|
|
local function round(n)
|
|
return floor(n + .5)
|
|
end
|
|
|
|
function findFace()
|
|
local cameraLookVector = game.Workspace.CurrentCamera.CoordinateFrame.lookVector
|
|
--[[local absx = abs(cameraLookVector.x) --this code is for 90 plane locking
|
|
local absy = abs(cameraLookVector.y)
|
|
local absz = abs(cameraLookVector.z)
|
|
if absy >= absx and absy >= absz then --preference towards y axis planes
|
|
return Vector3.new(0, cameraLookVector.y / absy, 0)
|
|
elseif absx >= absz then
|
|
return Vector3.new(cameraLookVector.x / absx, 0, 0)
|
|
end
|
|
return Vector3.new(0, 0, cameraLookVector.z / absz)]]
|
|
|
|
return Vector3.new(round(cameraLookVector.x), round(cameraLookVector.y), round(cameraLookVector.z)).unit --this code is for 45 degree plane locking
|
|
end
|
|
|
|
function lineToPlaneIntersection(linePoint, lineDirection, planePoint, planeNormal)
|
|
local denominator = lineDirection:Dot(planeNormal)
|
|
if denominator == 0 then
|
|
return linePoint
|
|
end
|
|
local distance = ((planePoint - linePoint):Dot(planeNormal)) / denominator
|
|
return linePoint + lineDirection * distance
|
|
end
|
|
|
|
function updateUsabilityLocks()
|
|
if currentTool then
|
|
forceSnapToGrid = currentTool.usesMaterials and materialSelection.forceSnapToGrid
|
|
updateSnapToGrid()
|
|
|
|
forcePlaneLock = currentTool.name == 'Add' or currentTool.name == 'Subtract'
|
|
updatePlaneLock()
|
|
|
|
forceDynamicMaterial = currentTool.name == 'Subtract' or currentTool.name == 'Erode' or currentTool.name == 'Paint' or currentTool.name == 'Smooth' or currentTool.name == 'Smoother'
|
|
forceDynamicMaterialTo = not (forceDynamicMaterial and currentTool.name == 'Paint')
|
|
|
|
isDynamic = dynamicMaterial
|
|
if forceDynamicMaterial then
|
|
isDynamic = forceDynamicMaterialTo
|
|
end
|
|
|
|
forceIgnoreWater = materialSelection.forceIgnoreWater and not isDynamic
|
|
if materialSelection.forceIgnoreWater then
|
|
forceIgnoreWaterTo = materialSelection.forceIgnoreWaterTo
|
|
end
|
|
|
|
isIgnoreWater = ignoreWater
|
|
if forceIgnoreWater then
|
|
isIgnoreWater = forceIgnoreWaterTo
|
|
end
|
|
|
|
updateIgnoreWater()
|
|
updateDynamicMaterial()
|
|
end
|
|
end
|
|
|
|
function operation(centerPoint)
|
|
local desiredMaterial = isDynamic and nearMaterial or materialSelection.enum
|
|
|
|
local radius = selectionSize * .5 * resolution
|
|
local minBounds = Vector3.new(
|
|
floor((centerPoint.x - radius) / resolution) * resolution,
|
|
floor((centerPoint.y - radius) / resolution) * resolution,
|
|
floor((centerPoint.z - radius) / resolution) * resolution)
|
|
local maxBounds = Vector3.new(
|
|
ceil((centerPoint.x + radius) / resolution) * resolution,
|
|
ceil((centerPoint.y + radius) / resolution) * resolution,
|
|
ceil((centerPoint.z + radius) / resolution) * resolution)
|
|
local region = Region3.new(minBounds, maxBounds)
|
|
|
|
local materials, occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
if modules[currentTool.name] then
|
|
if modules[currentTool.name]['operation'] then
|
|
|
|
local middle = materials[ceil(#materials * .5)] --This little section of code sets nearMaterial to middle of matrix
|
|
if middle then --dig X
|
|
local middle = middle[ceil(#middle * .5)]
|
|
if middle then --dig Y
|
|
local middle = middle[ceil(#middle * .5)]
|
|
if middle and middle ~= materialAir and middle ~= materialWater then --dig Z
|
|
nearMaterial = middle
|
|
desiredMaterial = isDynamic and nearMaterial or desiredMaterial
|
|
end
|
|
end
|
|
end
|
|
|
|
modules[currentTool.name]['operation'](centerPoint, materials, occupancies, resolution, selectionSize, strength, desiredMaterial, brushShape, minBounds, maxBounds)
|
|
end
|
|
else
|
|
local airFillerMaterial = materialAir
|
|
local waterHeight = 0
|
|
if isIgnoreWater and (currentTool.name == 'Erode' or currentTool.name == 'Subtract') then
|
|
--[[local centerPointCell = Vector3.new(floor((centerPoint.x+.5)/resolution) * resolution, floor((centerPoint.y+.5)/resolution) * resolution, floor((centerPoint.z+.5)/resolution) * resolution)
|
|
local sampleRegion = Region3.new(centerPointCell - Vector3.new(resolution,resolution,resolution), centerPointCell + Vector3.new(resolution,resolution,resolution))
|
|
local sampleMaterials, sampleOccupancies = terrain:ReadVoxels(sampleRegion, resolution)]]
|
|
|
|
for ix,vx in ipairs(materials) do
|
|
for iy,vy in ipairs(vx) do
|
|
for iz, vz in ipairs(vy) do
|
|
if vz == materialWater then
|
|
airFillerMaterial = materialWater
|
|
if iy > waterHeight then
|
|
waterHeight = iy
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for ix, vx in ipairs(occupancies) do
|
|
local cellVectorX = minBounds.x + (ix - .5) * resolution - centerPoint.x
|
|
|
|
for iy, vy in pairs(vx) do
|
|
local cellVectorY = minBounds.y + (iy - .5) * resolution - centerPoint.y
|
|
|
|
for iz, cellOccupancy in pairs(vy) do
|
|
local cellVectorZ = minBounds.z + (iz - .5) * resolution - centerPoint.z
|
|
|
|
local cellMaterial = materials[ix][iy][iz]
|
|
local distance = sqrt(cellVectorX * cellVectorX + cellVectorY * cellVectorY + cellVectorZ * cellVectorZ)
|
|
|
|
local magnitudePercent = 1
|
|
local brushOccupancy = 1
|
|
if brushShape == 'Sphere' then
|
|
magnitudePercent = cos(min(1, distance / (radius + resolution * .5)) * pi * .5)
|
|
brushOccupancy = max(0, min(1, (radius + .5 * resolution - distance) / resolution))
|
|
elseif brushShape == 'Box' then
|
|
if not (snapToGrid or forceSnapToGrid) then
|
|
local xOutside = 1 - max(0, abs(cellVectorX / resolution) + .5 - selectionSize * .5)
|
|
local yOutside = 1 - max(0, abs(cellVectorY / resolution) + .5 - selectionSize * .5)
|
|
local zOutside = 1 - max(0, abs(cellVectorZ / resolution) + .5 - selectionSize * .5)
|
|
brushOccupancy = xOutside * yOutside * zOutside
|
|
end
|
|
end
|
|
|
|
if cellMaterial ~= materialAir and cellMaterial ~= materialWater and cellMaterial ~= nearMaterial then
|
|
nearMaterial = cellMaterial
|
|
if isDynamic then
|
|
desiredMaterial = nearMaterial
|
|
end
|
|
end
|
|
|
|
if isIgnoreWater and cellMaterial == materialWater then
|
|
cellMaterial = materialAir
|
|
cellOccupancy = 0
|
|
end
|
|
local airFillerMaterial = waterHeight >= iy and airFillerMaterial or materialAir
|
|
|
|
if currentTool.name == 'Add' then
|
|
if selectionSize <= 2 then
|
|
if brushOccupancy >= .5 then
|
|
if cellMaterial == materialAir or cellOccupancy <= 0 then
|
|
materials[ix][iy][iz] = desiredMaterial
|
|
end
|
|
occupancies[ix][iy][iz] = 1
|
|
end
|
|
else
|
|
if brushOccupancy > cellOccupancy then
|
|
occupancies[ix][iy][iz] = brushOccupancy
|
|
end
|
|
if brushOccupancy >= .5 and cellMaterial == materialAir then
|
|
materials[ix][iy][iz] = desiredMaterial
|
|
end
|
|
end
|
|
elseif currentTool.name == 'Subtract' then
|
|
if cellMaterial ~= materialAir then
|
|
if selectionSize <= 2 then
|
|
if brushOccupancy >= .5 then
|
|
occupancies[ix][iy][iz] = airFillerMaterial == materialWater and 1 or 0
|
|
materials[ix][iy][iz] = airFillerMaterial
|
|
end
|
|
else
|
|
local desiredOccupancy = max(0,1 - brushOccupancy)
|
|
if desiredOccupancy < cellOccupancy then
|
|
if desiredOccupancy <= one256th then
|
|
occupancies[ix][iy][iz] = airFillerMaterial == materialWater and 1 or 0
|
|
materials[ix][iy][iz] = airFillerMaterial
|
|
else
|
|
occupancies[ix][iy][iz] = min(cellOccupancy, desiredOccupancy)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
elseif currentTool.name == 'Grow' then
|
|
if brushOccupancy >= .5 then --working on
|
|
local desiredOccupancy = cellOccupancy
|
|
local neighborOccupancies, fullNeighbor, emptyNeighbor = getNeighborOccupancies(occupancies, ix, iy, iz, isIgnoreWater and materials)
|
|
if cellOccupancy > 0 or fullNeighbor then --problem if selection size is small.
|
|
desiredOccupancy = desiredOccupancy + neighborOccupancies * (strength + .1) * .25 * brushOccupancy * magnitudePercent
|
|
end
|
|
if cellMaterial == materialAir and desiredOccupancy > 0 then
|
|
materials[ix][iy][iz] = desiredMaterial
|
|
end
|
|
if desiredOccupancy ~= cellOccupancy then
|
|
occupancies[ix][iy][iz] = desiredOccupancy
|
|
end
|
|
end
|
|
elseif currentTool.name == 'Erode' then
|
|
if cellMaterial ~= materialAir then
|
|
local flippedBrushOccupancy = 1 - brushOccupancy
|
|
if flippedBrushOccupancy <= .5 then
|
|
local desiredOccupancy = cellOccupancy
|
|
local emptyNeighbor = false
|
|
local neighborOccupancies = 6
|
|
for axis = 1, 3 do
|
|
for offset = -1, 1, 2 do
|
|
local neighbor = nil
|
|
local neighborMaterial = nil
|
|
if axis == 1 then
|
|
neighbor = occupancies[ix + offset] and occupancies[ix + offset][iy][iz]
|
|
neighborMaterial = materials[ix + offset] and materials[ix + offset][iy][iz]
|
|
elseif axis == 2 then
|
|
neighbor = occupancies[ix][iy + offset] and occupancies[ix][iy + offset][iz]
|
|
neighborMaterial = materials[ix][iy + offset] and materials[ix][iy + offset][iz]
|
|
elseif axis == 3 then
|
|
neighbor = occupancies[ix][iy][iz + offset]
|
|
neighborMaterial = materials[ix][iy][iz + offset]
|
|
end
|
|
if neighbor then
|
|
if isIgnoreWater and neighborMaterial == materialWater then
|
|
neighbor = 0
|
|
end
|
|
if neighbor <= 0 then
|
|
emptyNeighbor = true
|
|
end
|
|
neighborOccupancies = neighborOccupancies - neighbor
|
|
end
|
|
end
|
|
end
|
|
if cellOccupancy < 1 or emptyNeighbor then
|
|
desiredOccupancy = max(0,desiredOccupancy - (neighborOccupancies / 6) * (strength + .1) * .25 * brushOccupancy * magnitudePercent)
|
|
end
|
|
if desiredOccupancy <= one256th then
|
|
occupancies[ix][iy][iz] = airFillerMaterial == materialWater and 1 or 0
|
|
materials[ix][iy][iz] = airFillerMaterial
|
|
else
|
|
occupancies[ix][iy][iz] = desiredOccupancy
|
|
end
|
|
end
|
|
end
|
|
elseif currentTool.name == 'Paint' then
|
|
if brushOccupancy > 0 and cellOccupancy > 0 then
|
|
materials[ix][iy][iz] = desiredMaterial
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
terrain:WriteVoxels(region, resolution, materials, occupancies)
|
|
end
|
|
|
|
|
|
function Selected(tool)
|
|
if plugin then
|
|
plugin:Activate(true)
|
|
end
|
|
if tool.button then
|
|
tool.button:SetActive(true)
|
|
lastTool = tool
|
|
end
|
|
if not userInput.MouseEnabled then
|
|
prevCameraType = game.Workspace.CurrentCamera.CameraType
|
|
game.Workspace.CurrentCamera.CameraType = Enum.CameraType.Fixed
|
|
end
|
|
on = true
|
|
currentTool = tool
|
|
|
|
updateUsabilityLocks()
|
|
|
|
if modules[tool.name] and modules[tool.name]['On'] then
|
|
modules[tool.name].On(mouse,Deselected)
|
|
end
|
|
if not modules[tool.name] or modules[tool.name]['operation'] then
|
|
|
|
resizeGuiFrame()
|
|
titlelabel.Text = tool.name
|
|
gui.Parent = coreGui
|
|
gui.Frame.Visible = true
|
|
|
|
local loopTag = {} --using table as a unique value for debouncing
|
|
currentLoopTag = loopTag
|
|
|
|
while currentLoopTag and currentLoopTag == loopTag do
|
|
local t = tick()
|
|
local radius = selectionSize * .5 * resolution
|
|
local cameraPos = mouse.Origin.p
|
|
|
|
local ignoreModel = nil
|
|
if game.Players.LocalPlayer and game.Players.LocalPlayer.Character then
|
|
ignoreModel = game.Players.LocalPlayer.Character
|
|
end
|
|
local mouseRay = Ray.new(cameraPos, mouse.UnitRay.Direction*10000)
|
|
local hitObject, mainPoint = game.Workspace:FindPartOnRay(mouseRay, ignoreModel, false, isIgnoreWater)
|
|
|
|
if tool.name == 'Add' then
|
|
mainPoint = mainPoint - mouse.UnitRay.Direction * .05
|
|
elseif tool.name == 'Subtract' or tool.name == 'Paint' or tool.name == 'Grow' then
|
|
mainPoint = mainPoint + mouse.UnitRay.Direction * .05
|
|
end
|
|
|
|
if mouse.Target == nil then --cage the cursor so that it does not fly away
|
|
mainPoint = cameraPos + mouse.UnitRay.Direction * lastCursorDistance --limits the distance of the mainPoint if the mouse is not hitting an object
|
|
end
|
|
|
|
if not mouseDown or click then
|
|
lastPlanePoint = mainPoint
|
|
lastNormal = findFace()
|
|
end
|
|
|
|
if planeLock or forcePlaneLock then
|
|
mainPoint = lineToPlaneIntersection(cameraPos, mouse.UnitRay.Direction, lastPlanePoint, lastNormal)
|
|
end
|
|
|
|
if snapToGrid or forceSnapToGrid then
|
|
local snapOffset = Vector3.new(1, 1, 1) * (radius % resolution) --in studs
|
|
local tempMainPoint = (mainPoint - snapOffset) / resolution + Vector3.new(.5, .5, .5) --in voxels
|
|
mainPoint = Vector3.new(floor(tempMainPoint.x), floor(tempMainPoint.y), floor(tempMainPoint.z)) * resolution + snapOffset
|
|
end
|
|
|
|
if mouseDown then
|
|
if click then
|
|
firstOperation = t
|
|
lastMainPoint = mainPoint
|
|
end
|
|
|
|
if click or t > firstOperation + clickThreshold then
|
|
click = false
|
|
if downKeys[Enum.KeyCode.LeftAlt] or downKeys[Enum.KeyCode.RightAlt] then
|
|
--pick color
|
|
local function filterNonTerrain(thing)
|
|
if thing and thing == terrain then
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
local hit, hitPosition, normal, foundMaterial = deepCast(cameraPos, cameraPos + mouse.UnitRay.Direction*10000, {}, filterNonTerrain, true)
|
|
if hit then
|
|
for _, materialTable in pairs(materialsTable) do
|
|
if materialTable.enum == foundMaterial then
|
|
setMaterialSelection(materialTable)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
else
|
|
local difference = mainPoint - lastMainPoint
|
|
local dragDistance = (difference).magnitude
|
|
local crawlDistance = radius * .5 --Maybe adjustable setting? Considering using a different method of crawling, with a percent rather than a finite distance.
|
|
if dragDistance > crawlDistance then
|
|
local differenceVector = difference.unit
|
|
local dragDistance = min(dragDistance, crawlDistance * 2 + 20) --limiting this so that it does not attempt too many operations within a single drag.
|
|
local samples = ceil(dragDistance / crawlDistance - .1)
|
|
for i = 1, samples do
|
|
operation(lastMainPoint + differenceVector * dragDistance * (i / samples))
|
|
end
|
|
mainPoint = lastMainPoint + differenceVector * dragDistance
|
|
else
|
|
operation(mainPoint)
|
|
end
|
|
lastMainPoint = mainPoint
|
|
end
|
|
end
|
|
end
|
|
|
|
if not selectionPart then
|
|
selectionPart = Instance.new('Part')
|
|
selectionPart.Name = 'SelectionPart'
|
|
selectionPart.Transparency = 1
|
|
selectionPart.TopSurface = 'Smooth'
|
|
selectionPart.BottomSurface = 'Smooth'
|
|
selectionPart.Anchored = true
|
|
selectionPart.CanCollide = false
|
|
selectionPart.formFactor = 'Custom'
|
|
selectionPart.Size = Vector3.new(1, 1, 1) * selectionSize * resolution + Vector3.new(.1, .1, .1)
|
|
selectionPart.Parent = gui
|
|
end
|
|
if not selectionObject then
|
|
selectionObject = Instance.new(brushShape == 'Sphere' and 'SelectionSphere' or 'SelectionBox')
|
|
selectionObject.Name = 'SelectionObject'
|
|
selectionObject.Color = BrickColor.new('Toothpaste')
|
|
selectionObject.SurfaceTransparency = .95 - strength * .3
|
|
selectionObject.SurfaceColor = BrickColor.new('Toothpaste')
|
|
selectionObject.Adornee = selectionPart
|
|
selectionObject.Parent = selectionPart
|
|
end
|
|
|
|
if not userInput.TouchEnabled or mouseDown then
|
|
selectionPart.CFrame = CFrame.new(mainPoint)
|
|
|
|
if planeLock or forcePlaneLock then
|
|
local mainPointIntersect = lineToPlaneIntersection(mainPoint, mouse.UnitRay.Direction, lastPlanePoint, lastNormal) --we need to get this otherwise the plane can shift whiel drawing
|
|
drawGrid(mainPointIntersect, lastNormal, mouseDown and .8)
|
|
end
|
|
end
|
|
|
|
lastCursorDistance = max(20 + selectionSize * resolution * 1.5,(mainPoint - cameraPos).magnitude)
|
|
|
|
quickWait()
|
|
end
|
|
end
|
|
end
|
|
|
|
function Deselected()
|
|
if not userInput.MouseEnabled then
|
|
game.Workspace.CurrentCamera.CameraType = prevCameraType
|
|
end
|
|
currentLoopTag = nil
|
|
gui.Parent = script.Parent
|
|
gui.Frame.Visible = false
|
|
|
|
clearSelection()
|
|
clearGrid()
|
|
if lastTool then
|
|
lastTool.button:SetActive(false)
|
|
end
|
|
mouseDown = false
|
|
on = false
|
|
local lastCurrentTool = currentTool
|
|
currentTool = nil
|
|
if lastCurrentTool and modules[lastCurrentTool.name] and modules[lastCurrentTool.name]['Off'] then
|
|
modules[lastCurrentTool.name].Off()
|
|
end
|
|
end
|
|
|
|
closeButton.MouseButton1Down:connect(Deselected)
|
|
|
|
--Touch controls
|
|
local fingerTouches = {}
|
|
local NumUnsunkTouches = 0
|
|
|
|
local StartingDiff = nil
|
|
local startingSelectionSize = nil
|
|
|
|
local function OnTouchBegan(input, processed)
|
|
fingerTouches[input] = processed
|
|
if not processed then
|
|
click = true
|
|
NumUnsunkTouches = NumUnsunkTouches + 1
|
|
end
|
|
end
|
|
|
|
local function OnTouchChanged(input, processed)
|
|
if fingerTouches[input] == nil then
|
|
fingerTouches[input] = processed
|
|
if not processed then
|
|
NumUnsunkTouches = NumUnsunkTouches + 1
|
|
end
|
|
end
|
|
|
|
if NumUnsunkTouches == 1 then
|
|
if fingerTouches[input] == false then
|
|
mouseDown = true
|
|
end
|
|
else
|
|
mouseDown = false
|
|
end
|
|
if NumUnsunkTouches == 2 then
|
|
local unsunkTouches = {}
|
|
for touch, wasSunk in pairs(fingerTouches) do
|
|
if not wasSunk then
|
|
table.insert(unsunkTouches, touch)
|
|
end
|
|
end
|
|
if #unsunkTouches == 2 then
|
|
local difference = (unsunkTouches[1].Position - unsunkTouches[2].Position).magnitude
|
|
if StartingDiff and startingSelectionSize then
|
|
local scale = difference/max(0.01, StartingDiff)
|
|
selectionSize = max(minSelectionSize, min(maxSelectionSize, startingSelectionSize/scale))
|
|
selectionSizeValue.Value = selectionSize
|
|
else
|
|
StartingDiff = difference
|
|
startingSelectionSize = selectionSizeValue.Value
|
|
end
|
|
end
|
|
else
|
|
StartingDiff = nil
|
|
startingSelectionSize = nil
|
|
end
|
|
end
|
|
|
|
local function OnTouchEnded(input, processed)
|
|
if fingerTouches[input] == false then
|
|
if NumUnsunkTouches == 1 then
|
|
mouseDown = false
|
|
elseif NumUnsunkTouches == 2 then
|
|
StartingDiff = nil
|
|
startingSelectionSize = nil
|
|
mouseDown = true
|
|
end
|
|
end
|
|
|
|
if fingerTouches[input] ~= nil and fingerTouches[input] == false then
|
|
NumUnsunkTouches = NumUnsunkTouches - 1
|
|
end
|
|
fingerTouches[input] = nil
|
|
end
|
|
|
|
-- Input Handling
|
|
userInput.InputBegan:connect(function(event, soaked)
|
|
downKeys[event.KeyCode] = true
|
|
if event.UserInputType == Enum.UserInputType.MouseButton1 and not soaked and on then
|
|
mouseDown = true
|
|
click = true
|
|
elseif event.UserInputType == Enum.UserInputType.Touch and on then
|
|
OnTouchBegan(event, soaked)
|
|
end
|
|
end)
|
|
|
|
userInput.InputChanged:connect(function(input, processed)
|
|
if input.UserInputType == Enum.UserInputType.Touch then
|
|
OnTouchChanged(input, processed)
|
|
end
|
|
end)
|
|
|
|
userInput.InputEnded:connect(function(event, soaked)
|
|
downKeys[event.KeyCode] = nil
|
|
if event.UserInputType == Enum.UserInputType.MouseButton1 and mouseDown then
|
|
mouseDown = false
|
|
if changeHistory then
|
|
changeHistory:SetWaypoint('Terrain '..currentTool.name)
|
|
end
|
|
elseif event.UserInputType == Enum.UserInputType.Touch then
|
|
OnTouchEnded(event, soaked)
|
|
end
|
|
end)
|
|
|
|
function scrollwheel(change)
|
|
if on then
|
|
if downKeys[Enum.KeyCode.LeftShift] or downKeys[Enum.KeyCode.RightShift] then
|
|
selectionSize = max(minSelectionSize, min(maxSelectionSize, selectionSize + change))
|
|
selectionSizeValue.Value = selectionSize
|
|
end
|
|
if downKeys[Enum.KeyCode.LeftControl] or downKeys[Enum.KeyCode.RightControl] then
|
|
strength = max(0, min(1, strength + change * (1/(maxSelectionSize-minSelectionSize))))
|
|
strengthValue.Value = round(strength * 100 + 1)
|
|
end
|
|
end
|
|
end
|
|
|
|
mouse.WheelForward:connect(function()
|
|
scrollwheel(1)
|
|
end)
|
|
|
|
mouse.WheelBackward:connect(function()
|
|
scrollwheel(-1)
|
|
end)
|
|
|
|
if plugin then
|
|
plugin.Deactivation:connect(function()
|
|
if on then
|
|
Deselected()
|
|
end
|
|
end)
|
|
end
|
|
|
|
setBrushShape(brushShape)
|
|
setMaterialSelection(materialSelection)
|
|
updatePlaneLock()
|
|
updateSnapToGrid()
|
|
updateDynamicMaterial()
|
|
|
|
-- Reset keyboard status on lost focus as key release may never come blocked by popups etc.
|
|
userInput.WindowFocusReleased:connect(function()
|
|
downKeys = {}
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
]]> </ProtectedString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="RBX5D83DB1B1EFD4EA3A130861745D39DAF">
|
|
<Properties>
|
|
<Content name="LinkedSource">
|
|
<null></null>
|
|
</Content>
|
|
<string name="Name">SmootherModule</string>
|
|
<ProtectedString name="Source"><![CDATA[--
|
|
|
|
|
|
local terrain = game.Workspace.Terrain
|
|
|
|
|
|
local function getCell(list, x, y, z)
|
|
return list and list[x] and list[x][y] and list[x][y][z]
|
|
end
|
|
|
|
local function extendRange(x) --This is very important. It allows cells to fully diminish or fully fill by lying to the algorithm
|
|
return x * 1.5 - .25
|
|
end
|
|
|
|
function getNeighborOccupanciesFast(list, x, y, z, includeSelf)
|
|
local fullNeighbor = false
|
|
local emptyNeighbor = false
|
|
local neighborOccupancies = includeSelf and extendRange(getCell(list, x, y, z)) or 0
|
|
local totalNeighbors = includeSelf and 1 or 0
|
|
for axis = 1, 3 do
|
|
for offset = -1, 1, 2 do
|
|
local neighbor = nil
|
|
if axis == 1 then
|
|
neighbor = list[x + offset] and list[x + offset][y][z]
|
|
elseif axis == 2 then
|
|
neighbor = list[x][y + offset] and list[x][y + offset][z]
|
|
elseif axis == 3 then
|
|
neighbor = list[x][y][z + offset]
|
|
end
|
|
if neighbor then
|
|
if neighbor >= 1 then
|
|
fullNeighbor = true
|
|
end
|
|
if neighbor <= 0 then
|
|
emptyNeighbor = true
|
|
end
|
|
neighbor = extendRange(neighbor)
|
|
totalNeighbors = totalNeighbors + 1
|
|
neighborOccupancies = neighborOccupancies + neighbor
|
|
end
|
|
end
|
|
end
|
|
return neighborOccupancies / (totalNeighbors > 0 and totalNeighbors or extendRange(getCell(list, x, y, z))), fullNeighbor, emptyNeighbor
|
|
end
|
|
|
|
function getNeighborOccupancies(list, x, y, z, includeSelf, range)
|
|
local fullNeighbor = false
|
|
local emptyNeighbor = false
|
|
local range = range or 1
|
|
local neighborOccupancies = 0
|
|
local totalNeighbors = 0
|
|
local sqrt = math.sqrt
|
|
for ix = -range, range do
|
|
for iy = -range, range do
|
|
for iz = -range, range do
|
|
if includeSelf or not (ix == 0 and iy == 0 and iz == 0) then
|
|
local neighbor = getCell(list, x + ix, y + iy, z + iz)
|
|
if neighbor then
|
|
local distanceScale = 1 - (sqrt(ix * ix + iy * iy + iz * iz) / (range * 2))
|
|
if neighbor >= 1 then
|
|
fullNeighbor = true
|
|
end
|
|
if neighbor <= 0 then
|
|
emptyNeighbor = true
|
|
end
|
|
neighbor = extendRange(neighbor)
|
|
totalNeighbors = totalNeighbors + 1 * distanceScale
|
|
neighborOccupancies = neighborOccupancies + neighbor * distanceScale
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return neighborOccupancies / (totalNeighbors > 0 and totalNeighbors or extendRange(getCell(list, x, y, z))), fullNeighbor, emptyNeighbor
|
|
end
|
|
|
|
|
|
function operation(centerPoint, materials, occupancies, resolution, selectionSize, strength, desiredMaterial, brushType, minBounds, maxBounds)
|
|
local region = Region3.new(minBounds, maxBounds)
|
|
local readMaterials, readOccupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
local radius = selectionSize * .5 * resolution
|
|
|
|
local materialAir = Enum.Material.Air
|
|
|
|
for ix, vx in ipairs(readOccupancies) do
|
|
local cellVectorX = minBounds.x + (ix - .5) * resolution - centerPoint.x
|
|
|
|
for iy, vy in pairs(vx) do
|
|
local cellVectorY = minBounds.y + (iy - .5) * resolution - centerPoint.y
|
|
|
|
for iz, cellOccupancy in pairs(vy) do
|
|
local cellVectorZ = minBounds.z + (iz - .5) * resolution - centerPoint.z
|
|
|
|
local cellMaterial = materials[ix][iy][iz]
|
|
local distance = math.sqrt(cellVectorX * cellVectorX + cellVectorY * cellVectorY + cellVectorZ * cellVectorZ)
|
|
|
|
local magnitudePercent = 1
|
|
local brushOccupancy = 1
|
|
if brushType == 'Sphere' then
|
|
magnitudePercent = math.cos(math.min(1, distance / (radius + resolution * .5)) * math.pi * .5)
|
|
brushOccupancy = math.max(0, math.min(1, (radius + .5 * resolution - distance) / resolution))
|
|
elseif brushType == 'Box' then
|
|
--leave as default
|
|
end
|
|
|
|
if brushOccupancy >= .5 then
|
|
local neighborOccupancies, fullNeighbor, emptyNeighbor = getNeighborOccupancies(readOccupancies, ix, iy, iz, true, 1)
|
|
local difference = (neighborOccupancies - cellOccupancy) * (strength + .1) * .5 * brushOccupancy * magnitudePercent
|
|
|
|
if not fullNeighbor and difference > 0 then
|
|
difference = 0
|
|
elseif not emptyNeighbor and difference < 0 then
|
|
difference = 0
|
|
end
|
|
|
|
if readMaterials[ix][iy][iz] == materialAir or cellOccupancy <= 0 and difference > 0 then
|
|
materials[ix][iy][iz] = desiredMaterial
|
|
end
|
|
if difference ~= 0 then
|
|
occupancies[ix][iy][iz] = math.max(0, math.min(1, cellOccupancy + difference))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return {
|
|
['operation'] = operation
|
|
}
|
|
|
|
]]> </ProtectedString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="RBXF77B9661E26545C58CF8325608585BEA">
|
|
<Properties>
|
|
<Content name="LinkedSource">
|
|
<null></null>
|
|
</Content>
|
|
<string name="Name">RegionEditorModule</string>
|
|
<ProtectedString name="Source"><![CDATA[--Made by Stickmasterluke
|
|
|
|
|
|
--[[todo:
|
|
-fill region (with material, action)
|
|
-optimize resize scaling code more
|
|
]]
|
|
|
|
|
|
while not workspace:WaitForChild('Terrain').IsSmooth do
|
|
workspace.Terrain.Changed:wait()
|
|
end
|
|
|
|
local on = false
|
|
local setup = false
|
|
local currentTool = 'Create'
|
|
|
|
|
|
--[[local toolBar = plugin:CreateToolbar('Smooth Terrain')
|
|
regionEditButton = toolBar:CreateButton(
|
|
'Region Edit', --button title
|
|
'Manipulate regions of smoothterrain.', --hover text
|
|
'http://www.roblox.com/asset/?id=180084957' --icon
|
|
)
|
|
regionEditButton.Click:connect(function()
|
|
if not on then
|
|
if not setup then
|
|
FirstTimeSetUp()
|
|
end
|
|
Selected()
|
|
else
|
|
Deselected()
|
|
end
|
|
end)]]
|
|
|
|
|
|
function FirstTimeSetUp()
|
|
setup = true
|
|
local changeHistory = game:GetService('ChangeHistoryService')
|
|
local terrain = game.Workspace.Terrain
|
|
local utilityModule = require(script.Parent.Utility)()
|
|
local coreGui = utilityModule:GetUsingAsPlugin() and game:GetService('CoreGui') or game.Players.LocalPlayer:WaitForChild('PlayerGui')
|
|
local gui = script.Parent:WaitForChild('TerrainRegionGui')
|
|
local guiFrame = gui:WaitForChild('Frame')
|
|
local closeButton = guiFrame:WaitForChild('CloseButton')
|
|
local buttonFillAir = guiFrame:WaitForChild('ButtonFillAir')
|
|
local buttonFillWater = guiFrame:WaitForChild('ButtonFillWater')
|
|
local buttonSelect = guiFrame:WaitForChild('ButtonSelect')
|
|
local buttonMove = guiFrame:WaitForChild('ButtonMove')
|
|
local buttonResize = guiFrame:WaitForChild('ButtonResize')
|
|
local buttonRotate = guiFrame:WaitForChild('ButtonRotate')
|
|
local buttonCopy = guiFrame:WaitForChild('ButtonCopy')
|
|
local buttonPaste = guiFrame:WaitForChild('ButtonPaste')
|
|
local buttonDelete = guiFrame:WaitForChild('ButtonDelete')
|
|
local buttonFill = guiFrame:WaitForChild('ButtonFill')
|
|
local fillFrame = gui:WaitForChild('FillFrame')
|
|
local materialsTable = require(script.Parent.MaterialsList)
|
|
local buttonFillFrameClose = fillFrame:WaitForChild('CloseButton')
|
|
local buttonFillConfirm = fillFrame:WaitForChild('ButtonFillConfirm')
|
|
local library = assert(LoadLibrary('RbxGui'))
|
|
--local mouse = plugin:GetMouse()
|
|
|
|
----SETTINGS----
|
|
local mode = 'Select' --Select, Edit
|
|
local tool = 'None' --None, Resize, Move, Rotate
|
|
local button = 'Select' --Select, Move, Resize, Rotate
|
|
local fillAir = true
|
|
local fillWater = true
|
|
----------------
|
|
|
|
--SUB SETTINGS--
|
|
local resolution = 4 --This is the size of voxels on Roblox. Why is this a variable? ;)
|
|
local textSelectColor = Color3.new(72/255, 145/255, 212/255)
|
|
local white = Color3.new(238/255, 238/255, 238/255)
|
|
local editColor1 = 'Institutional white'
|
|
local editColor2 = 'Light stone grey'
|
|
local rotationInterval = math.pi * .5
|
|
local regionLengthLimit = 125
|
|
----------------
|
|
|
|
--Variables--
|
|
local faceToNormal = {
|
|
[Enum.NormalId.Top] = Vector3.new(0, 1, 0),
|
|
[Enum.NormalId.Bottom] = Vector3.new(0, -1, 0),
|
|
[Enum.NormalId.Left] = Vector3.new(-1, 0, 0),
|
|
[Enum.NormalId.Right] = Vector3.new(1, 0, 0),
|
|
[Enum.NormalId.Front] = Vector3.new(0, 0, -1),
|
|
[Enum.NormalId.Back] = Vector3.new(0, 0, 1),
|
|
}
|
|
local undefined=0/0
|
|
local selectionStart = nil
|
|
local selectionEnd = nil
|
|
local selectionPart = nil
|
|
local selectionObject = nil
|
|
local selectionHandles = nil
|
|
local materialSelection = materialsTable[5]
|
|
local downLoop = nil
|
|
local clickStart = Vector3.new(0, 0, 0)
|
|
local dragVector = nil
|
|
local dragStart = true
|
|
local lockedMaterials, lockedOccupancies = nil, nil
|
|
local lockedRegion = nil
|
|
local behindThis = nil
|
|
local axis = 'X'
|
|
local materialAir = Enum.Material.Air
|
|
local materialWater = Enum.Material.Water
|
|
local floor = math.floor --Scaling linear resize
|
|
local ceil = math.ceil
|
|
-------------
|
|
|
|
|
|
local function setMaterialSelection(newMaterialSelection)
|
|
materialSelection = newMaterialSelection
|
|
for _, v in pairs(fillFrame:GetChildren()) do
|
|
if string.sub(v.Name,1,14) == 'MaterialButton' then
|
|
if v.Name == 'MaterialButton' .. materialSelection.enum.Name then
|
|
v.BackgroundTransparency = .1
|
|
else
|
|
v.BackgroundTransparency = 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for i,materialSubTable in pairs(materialsTable) do
|
|
local newMaterialButton = Instance.new('ImageButton')
|
|
newMaterialButton.Name = 'MaterialButton' .. materialSubTable.enum.Name
|
|
newMaterialButton.BorderSizePixel = 2
|
|
newMaterialButton.BorderColor3 = Color3.new(.2, 1, 1)
|
|
newMaterialButton.BackgroundColor3 = Color3.new(.2, 1, 1)
|
|
newMaterialButton.BackgroundTransparency = 1
|
|
newMaterialButton.Image = materialSubTable.image
|
|
newMaterialButton.Size = UDim2.new(0, 35, 0, 35)
|
|
newMaterialButton.Position = UDim2.new(0, 5 + ((i-1) % 4) * 40, 0, -5 + ceil(i/4) * 40)
|
|
newMaterialButton.MouseButton1Down:connect(function()
|
|
setMaterialSelection(materialsTable[i])
|
|
end)
|
|
newMaterialButton.Parent = fillFrame
|
|
end
|
|
fillFrame.Size = UDim2.new(0, 180, 0, 95 + ceil(#materialsTable / 4) * 40)
|
|
setMaterialSelection(materialSelection)
|
|
|
|
|
|
function setButton(newButton)
|
|
lockInMap()
|
|
buttonSelect.Style = newButton == 'Select' and Enum.ButtonStyle.RobloxRoundDropdownButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
buttonSelect.TextColor3 = newButton == 'Select' and textSelectColor or white
|
|
buttonMove.Style = newButton == 'Move' and Enum.ButtonStyle.RobloxRoundDropdownButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
buttonMove.TextColor3 = newButton == 'Move' and textSelectColor or white
|
|
buttonResize.Style = newButton == 'Resize' and Enum.ButtonStyle.RobloxRoundDropdownButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
buttonResize.TextColor3 = newButton == 'Resize' and textSelectColor or white
|
|
buttonRotate.Style = newButton == 'Rotate' and Enum.ButtonStyle.RobloxRoundDropdownButton or Enum.ButtonStyle.RobloxRoundDefaultButton
|
|
buttonRotate.TextColor3 = newButton == 'Rotate' and textSelectColor or white
|
|
if newButton == 'Select' then
|
|
mode = 'Select'
|
|
tool = 'Resize'
|
|
elseif newButton == 'Move' then
|
|
mode = 'Edit'
|
|
tool = 'Move'
|
|
elseif newButton == 'Resize' then
|
|
mode = 'Edit'
|
|
tool = 'Resize'
|
|
elseif newButton == 'Rotate' then
|
|
mode = 'Edit'
|
|
tool = 'Rotate'
|
|
end
|
|
button = newButton
|
|
renderSelection()
|
|
end
|
|
|
|
buttonSelect.MouseButton1Down:connect(function()
|
|
setButton('Select')
|
|
end)
|
|
buttonMove.MouseButton1Down:connect(function()
|
|
setButton('Move')
|
|
end)
|
|
buttonResize.MouseButton1Down:connect(function()
|
|
setButton('Resize')
|
|
end)
|
|
buttonRotate.MouseButton1Down:connect(function()
|
|
setButton('Rotate')
|
|
end)
|
|
|
|
buttonFillAir.MouseButton1Down:connect(function()
|
|
fillAir = not fillAir
|
|
buttonFillAir.Text = fillAir and 'X' or ''
|
|
if button=='Move' or button=='Resize' then
|
|
updateDragOperation()
|
|
elseif button=='Rotate' then
|
|
updateRotateOperation()
|
|
end
|
|
end)
|
|
buttonFillWater.MouseButton1Down:connect(function()
|
|
fillWater = not fillWater
|
|
buttonFillWater.Text = fillWater and 'X' or ''
|
|
if button=='Move' or button=='Resize' then
|
|
updateDragOperation()
|
|
elseif button=='Rotate' then
|
|
updateRotateOperation()
|
|
end
|
|
end)
|
|
|
|
function lockInMap() --Should call this every time the terrain under your selection changes. Don't for resize though, it uses the original lockin for rescaling.
|
|
if selectionStart and selectionEnd then
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
lockedRegion = region
|
|
lockedMaterials, lockedOccupancies = terrain:ReadVoxels(region, resolution)
|
|
end
|
|
end
|
|
|
|
do
|
|
local runService = game:GetService('RunService').RenderStepped
|
|
function quickWait(waitTime)
|
|
if not waitTime then
|
|
runService:wait()
|
|
elseif waitTime < .033333 then
|
|
local startTick = tick()
|
|
runService:wait()
|
|
local delta = tick() - startTick
|
|
if delta <= waitTime * .5 then
|
|
quickWait(waitTime - delta)
|
|
end
|
|
else
|
|
wait(waitTime)
|
|
end
|
|
end
|
|
end
|
|
|
|
function clearSelection()
|
|
if selectionArcHandles then
|
|
selectionArcHandles:Destroy()
|
|
selectionArcHandles = nil
|
|
end
|
|
if selectionHandles then
|
|
selectionHandles:Destroy()
|
|
selectionHandles = nil
|
|
end
|
|
if selectionObject then
|
|
selectionObject:Destroy()
|
|
selectionObject = nil
|
|
end
|
|
if selectionPart then
|
|
selectionPart:Destroy()
|
|
selectionPart = nil
|
|
end
|
|
end
|
|
|
|
local function round(n)
|
|
return n + .5 - ((n + .5)%1)
|
|
end
|
|
|
|
local function positionWorldToVoxel(pos)
|
|
return Vector3.new(ceil(pos.x / resolution), ceil(pos.y / resolution), ceil(pos.z / resolution))
|
|
end
|
|
|
|
local function make3DTable(size,fill)
|
|
local size = size or Vector3.new(1,1,1)
|
|
local newTable = {}
|
|
for x = 1, size.x do
|
|
local xt = {}
|
|
for y = 1, size.y do
|
|
local yt = {}
|
|
for z = 1, size.z do
|
|
yt[z] = fill
|
|
end
|
|
xt[y] = yt
|
|
end
|
|
newTable[x] = xt
|
|
end
|
|
return newTable
|
|
end
|
|
|
|
local function linInterp(a,b,p)
|
|
return a+(b-a)*p
|
|
end
|
|
|
|
local function exaggerate(n,exaggeration)
|
|
return (n-.5)*exaggeration + .5 --optimized
|
|
--return n*exaggeration - exaggeration*.5 + .5
|
|
end
|
|
local function exaggeratedLinInterp(a,b,p,exaggeration)
|
|
local unclamped = (a+(b-a)*p-.5)*exaggeration+.5
|
|
return (unclamped < 0 and 0) or (unclamped > 1 and 1) or unclamped
|
|
|
|
--At first I thought this didn't need to be clamped because the terrain clamps that anways.
|
|
--But I then realized I am using this number a bit more before handing it to terrain.
|
|
--After doing some tests. Clamping is necessary for artificial structures being streched. If unclamped, rounding of artificial edges occurs.
|
|
--return (a+(b-a)*p-.5)*exaggeration+.5
|
|
--Maybe this extra dimension of unclamping might be desired for natural terrain, but not artificuial?
|
|
end
|
|
|
|
function updateDragOperation()
|
|
local dragVector = dragVector or Vector3.new(0,0,0)
|
|
local temporaryStart = selectionStart
|
|
local temporaryEnd = selectionEnd
|
|
if tool == 'Resize' then
|
|
if dragStart then
|
|
temporaryStart = Vector3.new(
|
|
math.min(
|
|
math.max(temporaryStart.x+dragVector.x,temporaryEnd.x-regionLengthLimit),
|
|
temporaryEnd.x),
|
|
math.min(
|
|
math.max(temporaryStart.y+dragVector.y,temporaryEnd.y-regionLengthLimit),
|
|
temporaryEnd.y),
|
|
math.min(
|
|
math.max(temporaryStart.z+dragVector.z,temporaryEnd.z-regionLengthLimit),
|
|
temporaryEnd.z)
|
|
)
|
|
else
|
|
temporaryEnd = Vector3.new(
|
|
math.max(
|
|
math.min(temporaryEnd.x+dragVector.x,temporaryStart.x+regionLengthLimit),
|
|
temporaryStart.x),
|
|
math.max(
|
|
math.min(temporaryEnd.y+dragVector.y,temporaryStart.y+regionLengthLimit),
|
|
temporaryStart.y),
|
|
math.max(
|
|
math.min(temporaryEnd.z+dragVector.z,temporaryStart.z+regionLengthLimit),
|
|
temporaryStart.z)
|
|
)
|
|
end
|
|
if mode == 'Edit' then
|
|
--[[local loopx = #lockedMaterials --Tiling resize --fun but not too many use cases with natural terrain.
|
|
local loopy = #lockedMaterials[1]
|
|
local loopz = #lockedMaterials[1][1]
|
|
local tempRegionSize = Vector3.new(1,1,1) + temporaryEnd - temporaryStart
|
|
local newMat = {}
|
|
local newOcc = {}
|
|
local offsetx = -1
|
|
local offsety = -1
|
|
local offsetz = -1
|
|
if dragStart then
|
|
offsetx = offsetx + (-tempRegionSize.x % loopx)
|
|
offsety = offsety + (-tempRegionSize.y % loopy)
|
|
offsetz = offsetz + (-tempRegionSize.z % loopz)
|
|
end
|
|
for x=1, tempRegionSize.x do
|
|
local targetx = (offsetx + x) % loopx + 1
|
|
local xtm = {}
|
|
local xto = {}
|
|
for y=1, tempRegionSize.y do
|
|
local targety = (offsety + y) % loopy + 1
|
|
local ytm = {}
|
|
local yto = {}
|
|
for z=1, tempRegionSize.z do
|
|
local targetz = (offsetz + z) % loopz + 1
|
|
ytm[z] = lockedMaterials[targetx][targety][targetz]
|
|
yto[z] = lockedOccupancies[targetx][targety][targetz]
|
|
end
|
|
xtm[y] = ytm
|
|
xto[y] = yto
|
|
end
|
|
newMat[x] = xtm
|
|
newOcc[x] = xto
|
|
end]]
|
|
|
|
--[[local loopx = #lockedMaterials --Scaling closest neightbor resize --not perfect
|
|
local loopy = #lockedMaterials[1]
|
|
local loopz = #lockedMaterials[1][1]
|
|
local tempRegionSize = Vector3.new(1,1,1) + temporaryEnd - temporaryStart
|
|
local tempSizeX = tempRegionSize.x
|
|
local tempSizeY = tempRegionSize.y
|
|
local tempSizeZ = tempRegionSize.z
|
|
local roundx = tempSizeX < loopx and math.floor or math.ceil
|
|
local roundy = tempSizeY < loopy and math.floor or math.ceil
|
|
local roundz = tempSizeZ < loopz and math.floor or math.ceil
|
|
local newMat = {}
|
|
local newOcc = {}
|
|
for x=1, tempSizeX do
|
|
local targetx = roundx(x/tempSizeX*loopx)
|
|
local xtm = {}
|
|
local xto = {}
|
|
for y=1, tempSizeY do
|
|
local targety = roundy(y/tempSizeY*loopy)
|
|
local ytm = {}
|
|
local yto = {}
|
|
for z=1, tempSizeZ do
|
|
local targetz = roundz(z/tempSizeZ*loopz)
|
|
ytm[z] = lockedMaterials[targetx][targety][targetz]
|
|
yto[z] = lockedOccupancies[targetx][targety][targetz]
|
|
end
|
|
xtm[y] = ytm
|
|
xto[y] = yto
|
|
end
|
|
newMat[x] = xtm
|
|
newOcc[x] = xto
|
|
end]]
|
|
|
|
local region = Region3.new((temporaryStart - Vector3.new(1,1,1)) * resolution, temporaryEnd * resolution)
|
|
if behindThis then
|
|
terrain:WriteVoxels(behindThis.region, resolution, behindThis.materials, behindThis.occupancies)
|
|
else
|
|
if selectionStart and selectionEnd then
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
local regionSize = region.Size / resolution
|
|
terrain:WriteVoxels(region, resolution, make3DTable(regionSize,materialAir), make3DTable(regionSize,0))
|
|
end
|
|
end
|
|
behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
local behindMaterials, behindOccupancies = behindThis.materials, behindThis.occupancies
|
|
|
|
local loopx = #lockedMaterials - 1
|
|
local loopy = #lockedMaterials[1] - 1
|
|
local loopz = #lockedMaterials[1][1] - 1
|
|
local tempRegionSize = Vector3.new(1,1,1) + temporaryEnd - temporaryStart
|
|
local tempSizeX = tempRegionSize.x
|
|
local tempSizeY = tempRegionSize.y
|
|
local tempSizeZ = tempRegionSize.z
|
|
local newMat = {}
|
|
local newOcc = {}
|
|
for x=1, tempSizeX do
|
|
local scalex = (x-1)/(tempSizeX-1)*loopx
|
|
if scalex ~= scalex then
|
|
scalex = 0
|
|
end
|
|
local startx = floor(scalex)+1
|
|
local endx = startx+1
|
|
local interpScalex = scalex-startx+1
|
|
if startx > loopx then
|
|
endx = startx
|
|
end
|
|
|
|
local xtm = {}
|
|
local xto = {}
|
|
for y=1, tempSizeY do
|
|
local scaley = (y-1)/(tempSizeY-1)*loopy
|
|
if scaley ~= scaley then
|
|
scaley = 0
|
|
end
|
|
local starty = floor(scaley)+1
|
|
local endy = starty+1
|
|
local interpScaley = scaley-starty+1
|
|
if starty > loopy then
|
|
endy = starty
|
|
end
|
|
|
|
local ytm = {}
|
|
local yto = {}
|
|
for z=1, tempSizeZ do
|
|
local scalez = (z-1)/(tempSizeZ-1)*loopz --consider adding 1 here and removing +1's elsewhere
|
|
if scalez ~= scalez then --undefined check
|
|
scalez = 0
|
|
end
|
|
local startz = floor(scalez)+1
|
|
local endz = startz+1
|
|
local interpScalez = scalez-startz+1
|
|
if startz > loopz then
|
|
endz = startz
|
|
end
|
|
|
|
local interpz1 = exaggeratedLinInterp(lockedOccupancies[startx][starty][startz],lockedOccupancies[startx][starty][endz],interpScalez, tempSizeZ/(loopz+1))
|
|
local interpz2 = exaggeratedLinInterp(lockedOccupancies[startx][endy][startz],lockedOccupancies[startx][endy][endz],interpScalez, tempSizeZ/(loopz+1))
|
|
local interpz3 = exaggeratedLinInterp(lockedOccupancies[endx][starty][startz],lockedOccupancies[endx][starty][endz],interpScalez, tempSizeZ/(loopz+1))
|
|
local interpz4 = exaggeratedLinInterp(lockedOccupancies[endx][endy][startz],lockedOccupancies[endx][endy][endz],interpScalez, tempSizeZ/(loopz+1))
|
|
|
|
local interpy1 = exaggeratedLinInterp(interpz1,interpz2,interpScaley, tempSizeY/(loopy+1))
|
|
local interpy2 = exaggeratedLinInterp(interpz3,interpz4,interpScaley, tempSizeY/(loopy+1))
|
|
|
|
local interpx1 = exaggeratedLinInterp(interpy1,interpy2,interpScalex, tempSizeX/(loopx+1))
|
|
|
|
local newMaterial = lockedMaterials[round(scalex)+1][round(scaley)+1][round(scalez)+1]
|
|
|
|
if fillAir and newMaterial == materialAir then
|
|
ytm[z]=behindMaterials[x][y][z]
|
|
yto[z]=behindOccupancies[x][y][z]
|
|
elseif fillWater and newMaterial == materialWater and behindMaterials[x][y][z] ~= materialAir then
|
|
ytm[z]=behindMaterials[x][y][z]
|
|
yto[z]=behindOccupancies[x][y][z]
|
|
else
|
|
ytm[z]=newMaterial
|
|
yto[z]=interpx1
|
|
end
|
|
end
|
|
xtm[y] = ytm
|
|
xto[y] = yto
|
|
end
|
|
newMat[x] = xtm
|
|
newOcc[x] = xto
|
|
end
|
|
|
|
terrain:WriteVoxels(region, resolution, newMat, newOcc)
|
|
else
|
|
behindThis = nil
|
|
end
|
|
elseif tool == 'Move' then
|
|
temporaryStart = temporaryStart + dragVector
|
|
temporaryEnd = temporaryEnd + dragVector
|
|
if mode == 'Edit' then
|
|
local region = Region3.new((temporaryStart - Vector3.new(1,1,1)) * resolution, temporaryEnd * resolution)
|
|
if behindThis then
|
|
terrain:WriteVoxels(behindThis.region, resolution, behindThis.materials, behindThis.occupancies)
|
|
else
|
|
if selectionStart and selectionEnd then
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
local regionSize = region.Size / resolution
|
|
terrain:WriteVoxels(region, resolution, make3DTable(regionSize,materialAir), make3DTable(regionSize,0))
|
|
end
|
|
end
|
|
behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
local behindMaterials, behindOccupancies = behindThis.materials, behindThis.occupancies
|
|
|
|
if not (fillAir or fillWater) then
|
|
terrain:WriteVoxels(region, resolution, lockedMaterials, lockedOccupancies)
|
|
else
|
|
local newMat = {}
|
|
local newOcc = {}
|
|
|
|
for x,xv in ipairs(lockedMaterials) do
|
|
local xtm = {}
|
|
local xto = {}
|
|
for y,yv in ipairs(xv) do
|
|
local ytm = {}
|
|
local yto = {}
|
|
for z,zv in ipairs(yv) do
|
|
if fillAir and zv == materialAir then
|
|
ytm[z]=behindMaterials[x][y][z]
|
|
yto[z]=behindOccupancies[x][y][z]
|
|
elseif fillWater and zv == materialWater and behindMaterials[x][y][z] ~= materialAir then
|
|
ytm[z]=behindMaterials[x][y][z]
|
|
yto[z]=behindOccupancies[x][y][z]
|
|
else
|
|
ytm[z]=lockedMaterials[x][y][z]
|
|
yto[z]=lockedOccupancies[x][y][z]
|
|
end
|
|
end
|
|
xtm[y] = ytm
|
|
xto[y] = yto
|
|
end
|
|
newMat[x] = xtm
|
|
newOcc[x] = xto
|
|
end
|
|
terrain:WriteVoxels(region, resolution, newMat, newOcc)
|
|
end
|
|
end
|
|
end
|
|
renderSelection(temporaryStart,temporaryEnd)
|
|
end
|
|
|
|
function dragHandles(face, delta)
|
|
local normal = faceToNormal[face]
|
|
local delta = delta
|
|
local newDragVector = normal * floor((delta + .5) / resolution)
|
|
dragStart = normal.x < 0 or normal.y < 0 or normal.z < 0 --This determines if we are dragging a side on the min or max bounds
|
|
if newDragVector ~= dragVector then
|
|
dragVector = newDragVector
|
|
updateDragOperation()
|
|
end
|
|
end
|
|
|
|
local function rotate(mx,x,my,y,rotation)
|
|
if rotation == 1 then
|
|
return my + 1 - y, x
|
|
elseif rotation == 2 then
|
|
return mx + 1 - x, my + 1 - y
|
|
elseif rotation == 3 then
|
|
return y, mx + 1 - x
|
|
end
|
|
return x,y
|
|
end
|
|
|
|
function updateRotateOperation()
|
|
local dragAngle = dragAngle or 0
|
|
local rotationCFrame = CFrame.Angles(
|
|
axis ~= 'X' and 0 or dragAngle * rotationInterval,
|
|
axis ~= 'Y' and 0 or dragAngle * rotationInterval,
|
|
axis ~= 'Z' and 0 or dragAngle * rotationInterval
|
|
)
|
|
local temporarySize = Vector3.new(1,1,1) + selectionEnd - selectionStart
|
|
local centerOffset = Vector3.new(ceil(temporarySize.x * .5), ceil(temporarySize.y * .5), ceil(temporarySize.z * .5))
|
|
|
|
temporarySize = rotationCFrame * temporarySize
|
|
local temporarySizeX = round(math.abs(temporarySize.x)) --I need to round these because of floating point imprecision
|
|
local temporarySizeY = round(math.abs(temporarySize.y))
|
|
local temporarySizeZ = round(math.abs(temporarySize.z))
|
|
centerOffset = centerOffset - Vector3.new(ceil(temporarySizeX * .5), ceil(temporarySizeY * .5), ceil(temporarySizeZ * .5))
|
|
|
|
local temporaryEnd = selectionStart + centerOffset + Vector3.new(temporarySizeX, temporarySizeY, temporarySizeZ) - Vector3.new(1, 1, 1)
|
|
local temporaryStart = selectionStart + centerOffset
|
|
|
|
if mode == 'Edit' then
|
|
local region = Region3.new((temporaryStart - Vector3.new(1,1,1)) * resolution, temporaryEnd * resolution)
|
|
if behindThis then
|
|
terrain:WriteVoxels(behindThis.region, resolution, behindThis.materials, behindThis.occupancies)
|
|
else
|
|
if selectionStart and selectionEnd then
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
local regionSize = region.Size / resolution
|
|
terrain:WriteVoxels(region, resolution, make3DTable(regionSize,materialAir), make3DTable(regionSize,0))
|
|
end
|
|
--local regionSize = lockedRegion.Size / resolution
|
|
--terrain:WriteVoxels(lockedRegion, resolution, make3DTable(regionSize,materialAir), make3DTable(regionSize,0))
|
|
end
|
|
behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
local newMat = {}
|
|
local newOcc = {}
|
|
|
|
for x=1, temporarySizeX do
|
|
local xtm = {}
|
|
local xto = {}
|
|
for y=1, temporarySizeY do
|
|
local ytm = {}
|
|
local yto = {}
|
|
for z=1, temporarySizeZ do
|
|
local targetx = x
|
|
local targety = y
|
|
local targetz = z
|
|
if axis == 'Y' then --prioritize y because I know this is the primary rotation axis
|
|
targetx, targetz = rotate(temporarySizeX, x, temporarySizeZ, z, dragAngle)
|
|
elseif axis == 'X' then
|
|
targetz, targety = rotate(temporarySizeZ, z, temporarySizeY, y, dragAngle)
|
|
elseif axis == 'Z' then
|
|
targety, targetx = rotate(temporarySizeY, y, temporarySizeX, x, dragAngle)
|
|
end
|
|
local newMaterial = lockedMaterials[targetx][targety][targetz]
|
|
|
|
if fillAir and newMaterial == materialAir then
|
|
ytm[z]=behindThis.materials[x][y][z]
|
|
yto[z]=behindThis.occupancies[x][y][z]
|
|
elseif fillWater and newMaterial == materialWater and behindThis.materials[x][y][z] ~= materialAir then
|
|
ytm[z]=behindThis.materials[x][y][z]
|
|
yto[z]=behindThis.occupancies[x][y][z]
|
|
else
|
|
ytm[z]=newMaterial
|
|
yto[z]=lockedOccupancies[targetx][targety][targetz]
|
|
end
|
|
end
|
|
xtm[y] = ytm
|
|
xto[y] = yto
|
|
end
|
|
newMat[x] = xtm
|
|
newOcc[x] = xto
|
|
end
|
|
|
|
terrain:WriteVoxels(region, resolution, newMat, newOcc)
|
|
end
|
|
renderSelection(temporaryStart,temporaryEnd,rotationCFrame)
|
|
end
|
|
|
|
function dragArcHandles(rotationAxis,relativeAngle,deltaRadius)
|
|
axis = rotationAxis.Name
|
|
local newDragAngle = round(relativeAngle / rotationInterval) % 4
|
|
if newDragAngle ~= dragAngle then
|
|
dragAngle = newDragAngle
|
|
updateRotateOperation()
|
|
end
|
|
end
|
|
|
|
buttonCopy.MouseButton1Down:connect(function()
|
|
if selectionStart and selectionEnd then
|
|
local selectionStartInt16=Vector3int16.new(selectionStart.x-1,selectionStart.y-1,selectionStart.z-1)
|
|
local selectionEndInt16=Vector3int16.new(selectionEnd.x-1,selectionEnd.y-1,selectionEnd.z-1)
|
|
local region = Region3int16.new(selectionStartInt16,selectionEndInt16)
|
|
copyRegion = terrain:CopyRegion(region)
|
|
selectionEffect(nil,nil,'New Yeller',1,1.2,.5)
|
|
end
|
|
end)
|
|
|
|
buttonPaste.MouseButton1Down:connect(function()
|
|
if copyRegion then
|
|
selectionEnd=selectionStart+copyRegion.SizeInCells-Vector3.new(1,1,1)
|
|
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
terrain:PasteRegion(copyRegion,Vector3int16.new(selectionStart.x-1,selectionStart.y-1,selectionStart.z-1),true)
|
|
setButton('Move')
|
|
if utilityModule:GetUsingAsPlugin() then
|
|
changeHistory:SetWaypoint('Terrain Paste')
|
|
end
|
|
selectionEffect(nil,nil,'Lime green',1.2,1,.5)
|
|
end
|
|
end)
|
|
|
|
buttonDelete.MouseButton1Down:connect(function()
|
|
if selectionStart and selectionEnd then
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
local regionSize = region.Size / resolution
|
|
local emptyMaterialMap = make3DTable(regionSize,materialAir)
|
|
local emptyOccupancyMap = make3DTable(regionSize,0)
|
|
|
|
--[[behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = emptyMaterialMap, emptyOccupancyMap
|
|
|
|
terrain:WriteVoxels(region, resolution, emptyMaterialMap, emptyOccupancyMap)]]
|
|
if behindThis then
|
|
terrain:WriteVoxels(behindThis.region, resolution, behindThis.materials, behindThis.occupancies)
|
|
else
|
|
if selectionStart and selectionEnd then
|
|
terrain:WriteVoxels(region, resolution, emptyMaterialMap, emptyOccupancyMap)
|
|
end
|
|
end
|
|
behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
--[[lockedRegion = region
|
|
lockedMaterials, lockedOccupancies = emptyMaterialMap, emptyOccupancyMap]]
|
|
local oldStart, oldEnd = selectionStart, selectionEnd
|
|
selectionStart, selectionEnd = nil, nil
|
|
setButton('Select')
|
|
|
|
if utilityModule:GetUsingAsPlugin() then
|
|
changeHistory:SetWaypoint('Terrain Delete')
|
|
end
|
|
selectionEffect(oldStart,oldEnd,'Really red',1,1.2,.5)
|
|
end
|
|
end)
|
|
|
|
buttonFill.MouseButton1Down:connect(function()
|
|
fillFrame.Visible = not fillFrame.Visible
|
|
end)
|
|
|
|
buttonFillFrameClose.MouseButton1Down:connect(function()
|
|
fillFrame.Visible = false
|
|
end)
|
|
|
|
buttonFillConfirm.MouseButton1Down:connect(function()
|
|
if selectionStart and selectionEnd then
|
|
local region = Region3.new((selectionStart - Vector3.new(1,1,1)) * resolution, selectionEnd * resolution)
|
|
local regionSize = region.Size / resolution
|
|
|
|
local beforeMaterialMap, beforeOccupancyMap = terrain:ReadVoxels(region, resolution)
|
|
local newMaterialMap = {}
|
|
local newOccupancyMap = {}
|
|
for x = 1, regionSize.x do
|
|
local xtm = {}
|
|
local xto = {}
|
|
for y = 1, regionSize.y do
|
|
local ytm = {}
|
|
local yto = {}
|
|
for z = 1, regionSize.z do
|
|
local beforeMaterial = beforeMaterialMap[x][y][z]
|
|
|
|
if beforeMaterial == materialAir or beforeOccupancyMap[x][y][z] == 0 or not fillAir then --'fillAir' variable is actually 'Merge Empty' to the user
|
|
ytm[z] = materialSelection.enum
|
|
else
|
|
ytm[z] = beforeMaterial
|
|
end
|
|
|
|
yto[z] = 1
|
|
end
|
|
xtm[y] = ytm
|
|
xto[y] = yto
|
|
end
|
|
newMaterialMap[x] = xtm
|
|
newOccupancyMap[x] = xto
|
|
end
|
|
|
|
|
|
terrain:WriteVoxels(region, resolution, newMaterialMap, newOccupancyMap)
|
|
|
|
behindThis = {}
|
|
behindThis.region = region
|
|
behindThis.materials, behindThis.occupancies = terrain:ReadVoxels(region, resolution)
|
|
|
|
fillFrame.Visible = false
|
|
|
|
if utilityModule:GetUsingAsPlugin() then
|
|
changeHistory:SetWaypoint('Terrain Fill')
|
|
end
|
|
selectionEffect(nil,nil,'Lime green',1.2,1,.5)
|
|
end
|
|
end)
|
|
|
|
function selectionEffect(temporaryStart,temporaryEnd,color,sizeFrom,sizeTo,effectTime)
|
|
local temporaryStart = temporaryStart or selectionStart
|
|
local temporaryEnd = temporaryEnd or selectionEnd
|
|
|
|
local effectPart = Instance.new('Part')
|
|
effectPart.Name = 'EffectPart'
|
|
effectPart.Transparency = 1
|
|
effectPart.TopSurface = 'Smooth'
|
|
effectPart.BottomSurface = 'Smooth'
|
|
effectPart.Anchored = true
|
|
effectPart.CanCollide = false
|
|
effectPart.formFactor = 'Custom'
|
|
effectPart.Parent = gui
|
|
|
|
local selectionEffectObject = Instance.new('SelectionBox')
|
|
selectionEffectObject.Name = 'SelectionObject'
|
|
selectionEffectObject.Transparency = 1
|
|
selectionEffectObject.SurfaceTransparency = .75
|
|
selectionEffectObject.SurfaceColor = BrickColor.new(color)
|
|
selectionEffectObject.Adornee = effectPart
|
|
selectionEffectObject.Parent = effectPart
|
|
|
|
local baseSize = ((temporaryEnd - temporaryStart + Vector3.new(1,1,1)) * resolution + Vector3.new(.21,.21,.21))
|
|
effectPart.CFrame = CFrame.new((temporaryStart + temporaryEnd - Vector3.new(1, 1, 1)) * .5 * resolution)
|
|
effectPart.Size = baseSize * sizeFrom
|
|
local endTick=tick()+effectTime
|
|
while endTick>tick() do
|
|
local percent=1-(endTick-tick())/effectTime
|
|
selectionEffectObject.SurfaceTransparency = .75 + percent*.25
|
|
effectPart.Size = baseSize * (sizeFrom+(sizeTo-sizeFrom)*percent)
|
|
wait()
|
|
end
|
|
effectPart:Destroy()
|
|
end
|
|
|
|
function renderSelection(temporaryStart,temporaryEnd,rotation)
|
|
local temporaryStart = temporaryStart or selectionStart
|
|
local temporaryEnd = temporaryEnd or selectionEnd
|
|
local seeable = false
|
|
if temporaryStart and temporaryEnd and selectionPart then
|
|
seeable = true
|
|
local temporarySize = ((temporaryEnd - temporaryStart + Vector3.new(1,1,1)) * resolution + Vector3.new(.2,.2,.2))
|
|
if rotation then
|
|
local rotatedSize = rotation * temporarySize
|
|
temporarySize = Vector3.new(math.abs(rotatedSize.x), math.abs(rotatedSize.y), math.abs(rotatedSize.z))
|
|
end
|
|
selectionPart.Size = temporarySize
|
|
selectionPart.CFrame = CFrame.new((temporaryStart + temporaryEnd - Vector3.new(1, 1, 1)) * .5 * resolution) * (rotation or CFrame.new(0,0,0))
|
|
end
|
|
if selectionObject then
|
|
selectionObject.Visible = seeable
|
|
selectionObject.Color = BrickColor.new(mode == 'Select' and 'Toothpaste' or editColor1)
|
|
selectionObject.SurfaceColor = BrickColor.new(mode == 'Select' and 'Toothpaste' or editColor1)
|
|
end
|
|
if selectionHandles then
|
|
selectionHandles.Visible = seeable and (tool == 'Move' or tool == 'Resize')
|
|
selectionHandles.Color = BrickColor.new(mode == 'Select' and 'Cyan' or editColor2)
|
|
selectionHandles.Style = tool == 'Move' and Enum.HandlesStyle.Movement or Enum.HandlesStyle.Resize
|
|
end
|
|
if selectionArcHandles then
|
|
selectionArcHandles.Visible = seeable and tool == 'Rotate'
|
|
selectionArcHandles.Color = BrickColor.new(mode == 'Select' and 'Cyan' or editColor2)
|
|
end
|
|
end
|
|
|
|
function Selected()
|
|
--plugin:Activate(true)
|
|
--regionEditButton:SetActive(true)
|
|
on = true
|
|
gui.Parent = coreGui
|
|
gui.Frame.Visible = true
|
|
|
|
if not selectionPart then
|
|
selectionPart = Instance.new('Part')
|
|
selectionPart.Name = 'SelectionPart'
|
|
selectionPart.Transparency = 1
|
|
selectionPart.TopSurface = 'Smooth'
|
|
selectionPart.BottomSurface = 'Smooth'
|
|
selectionPart.Anchored = true
|
|
selectionPart.CanCollide = false
|
|
selectionPart.formFactor = 'Custom'
|
|
selectionPart.Parent = gui
|
|
end
|
|
if not selectionObject then
|
|
selectionObject = Instance.new('SelectionBox')
|
|
selectionObject.Name = 'SelectionObject'
|
|
selectionObject.Color = BrickColor.new(mode == 'Select' and 'Toothpaste' or editColor1)
|
|
selectionObject.SurfaceTransparency = .85
|
|
selectionObject.SurfaceColor = BrickColor.new(mode == 'Select' and 'Toothpaste' or editColor1)
|
|
selectionObject.Adornee = selectionPart
|
|
selectionObject.Visible = false
|
|
selectionObject.Parent = selectionPart
|
|
end
|
|
if not selectionHandles then
|
|
selectionHandles = Instance.new('Handles')
|
|
selectionHandles.Name = 'SelectionHandles'
|
|
selectionHandles.Color = BrickColor.new(mode == 'Select' and 'Toothpaste' or editColor2)
|
|
selectionHandles.Adornee = selectionPart
|
|
selectionHandles.Visible = false
|
|
selectionHandles.Parent = coreGui--game.Workspace--guiFrame--selectionPart
|
|
selectionHandles.MouseDrag:connect(dragHandles)
|
|
end
|
|
if not selectionArcHandles then
|
|
selectionArcHandles = Instance.new('ArcHandles')
|
|
selectionArcHandles.Name = 'SelectionArcHandles'
|
|
selectionArcHandles.Color = BrickColor.new(mode == 'Select' and 'Toothpaste' or editColor2)
|
|
selectionArcHandles.Adornee = selectionPart
|
|
selectionArcHandles.Visible = false
|
|
selectionArcHandles.Parent = coreGui--game.Workspace--guiFrame--selectionPart
|
|
selectionArcHandles.MouseDrag:connect(dragArcHandles)
|
|
end
|
|
renderSelection()
|
|
setButton(button)
|
|
end
|
|
|
|
function Deselected()
|
|
setButton('Select')
|
|
gui.Parent = script.Parent
|
|
gui.Frame.Visible = false
|
|
|
|
clearSelection()
|
|
--regionEditButton:SetActive(false)
|
|
behindThis = nil
|
|
on = false
|
|
if turnOff then
|
|
turnOff()
|
|
end
|
|
end
|
|
|
|
mouse.Button1Down:connect(function()
|
|
if on and mode == 'Select' then
|
|
mouseDown = true
|
|
behindThis = nil
|
|
local mousePos = mouse.Hit.p + mouse.UnitRay.Direction * .05
|
|
if mouse.Target == nil then --cage the cursor so that it does not fly away
|
|
mousePos = game.Workspace.CurrentCamera.CoordinateFrame.p + mouse.UnitRay.Direction * 100
|
|
end
|
|
clickStart = positionWorldToVoxel(mousePos)
|
|
local thisDownLoop = {}
|
|
downLoop = thisDownLoop
|
|
while thisDownLoop == downLoop and mouseDown and on and mode == 'Select' do
|
|
local mousePos = mouse.Hit.p + mouse.UnitRay.Direction * .05
|
|
if mouse.Target == nil then --cage the cursor so that it does not fly away
|
|
mousePos = game.Workspace.CurrentCamera.CoordinateFrame.p + mouse.UnitRay.Direction * 100
|
|
end
|
|
local voxelCurrent = positionWorldToVoxel(mousePos)
|
|
voxelCurrent = Vector3.new(
|
|
math.max(math.min(voxelCurrent.x,clickStart.x+regionLengthLimit),clickStart.x-regionLengthLimit),
|
|
math.max(math.min(voxelCurrent.y,clickStart.y+regionLengthLimit),clickStart.y-regionLengthLimit),
|
|
math.max(math.min(voxelCurrent.z,clickStart.z+regionLengthLimit),clickStart.z-regionLengthLimit))
|
|
selectionStart = Vector3.new(math.min(clickStart.x, voxelCurrent.x), math.min(clickStart.y, voxelCurrent.y), math.min(clickStart.z, voxelCurrent.z))
|
|
selectionEnd = Vector3.new(math.max(clickStart.x, voxelCurrent.x), math.max(clickStart.y, voxelCurrent.y), math.max(clickStart.z, voxelCurrent.z))
|
|
renderSelection()
|
|
quickWait()
|
|
end
|
|
end
|
|
end)
|
|
mouse.Button1Up:connect(function()
|
|
mouseDown = false
|
|
if dragVector and dragVector.magnitude > 0 then
|
|
if tool == 'Resize' then
|
|
--[[if dragStart then
|
|
selectionStart = Vector3.new(math.min(selectionStart.x+dragVector.x,selectionEnd.x),math.min(selectionStart.y+dragVector.y,selectionEnd.y),math.min(selectionStart.z+dragVector.z,selectionEnd.z))
|
|
else
|
|
selectionEnd = Vector3.new(math.max(selectionEnd.x+dragVector.x,selectionStart.x),math.max(selectionEnd.y+dragVector.y,selectionStart.y),math.max(selectionEnd.z+dragVector.z,selectionStart.z))
|
|
end]]
|
|
if dragStart then
|
|
selectionStart = Vector3.new(
|
|
math.min(
|
|
math.max(selectionStart.x+dragVector.x,selectionEnd.x-regionLengthLimit),
|
|
selectionEnd.x),
|
|
math.min(
|
|
math.max(selectionStart.y+dragVector.y,selectionEnd.y-regionLengthLimit),
|
|
selectionEnd.y),
|
|
math.min(
|
|
math.max(selectionStart.z+dragVector.z,selectionEnd.z-regionLengthLimit),
|
|
selectionEnd.z)
|
|
)
|
|
else
|
|
selectionEnd = Vector3.new(
|
|
math.max(
|
|
math.min(selectionEnd.x+dragVector.x,selectionStart.x+regionLengthLimit),
|
|
selectionStart.x),
|
|
math.max(
|
|
math.min(selectionEnd.y+dragVector.y,selectionStart.y+regionLengthLimit),
|
|
selectionStart.y),
|
|
math.max(
|
|
math.min(selectionEnd.z+dragVector.z,selectionStart.z+regionLengthLimit),
|
|
selectionStart.z)
|
|
)
|
|
end
|
|
elseif tool == 'Move' then
|
|
selectionStart = selectionStart + dragVector
|
|
selectionEnd = selectionEnd + dragVector
|
|
end
|
|
if utilityModule:GetUsingAsPlugin() then
|
|
changeHistory:SetWaypoint('Terrain '..button)
|
|
end
|
|
end
|
|
if dragAngle and dragAngle ~= 0 then
|
|
local rotationCFrame = CFrame.Angles(
|
|
axis ~= 'X' and 0 or dragAngle * rotationInterval,
|
|
axis ~= 'Y' and 0 or dragAngle * rotationInterval,
|
|
axis ~= 'Z' and 0 or dragAngle * rotationInterval
|
|
)
|
|
local temporarySize = Vector3.new(1,1,1) + selectionEnd - selectionStart
|
|
local centerOffset = Vector3.new(ceil(temporarySize.x * .5), ceil(temporarySize.y * .5), ceil(temporarySize.z * .5))
|
|
temporarySize = rotationCFrame * temporarySize
|
|
local temporarySizeX = round(math.abs(temporarySize.x)) --I need to round these because of floating point imprecision
|
|
local temporarySizeY = round(math.abs(temporarySize.y))
|
|
local temporarySizeZ = round(math.abs(temporarySize.z))
|
|
centerOffset = centerOffset - Vector3.new(ceil(temporarySizeX * .5), ceil(temporarySizeY * .5), ceil(temporarySizeZ * .5))
|
|
|
|
selectionEnd = selectionStart + centerOffset + Vector3.new(temporarySizeX, temporarySizeY, temporarySizeZ) - Vector3.new(1, 1, 1)
|
|
selectionStart = selectionStart + centerOffset
|
|
lockInMap()
|
|
if utilityModule:GetUsingAsPlugin() then
|
|
changeHistory:SetWaypoint('Terrain '..button)
|
|
end
|
|
end
|
|
|
|
dragVector = nil
|
|
dragAngle = nil
|
|
renderSelection()
|
|
--lockInMap()
|
|
end)
|
|
|
|
closeButton.MouseButton1Down:connect(Deselected)
|
|
|
|
--[[plugin.Deactivation:connect(function()
|
|
if on then
|
|
Deselected()
|
|
end
|
|
end)]]
|
|
|
|
local function historyChanged()
|
|
selectionStart = nil
|
|
selectionEnd = nil
|
|
lockedMaterials = nil
|
|
lockedOccupancies = nil
|
|
setButton('Select')
|
|
end
|
|
|
|
if utilityModule:GetUsingAsPlugin() then
|
|
changeHistory.OnUndo:connect(historyChanged)
|
|
changeHistory.OnRedo:connect(historyChanged)
|
|
end
|
|
|
|
end
|
|
|
|
function On(mouseHandMeDown,turnOffHandMeDown)
|
|
mouse = mouseHandMeDown
|
|
turnOff = turnOffHandMeDown
|
|
if not setup then --I do this so that things only get set up when this plugin is used.
|
|
FirstTimeSetUp()
|
|
end
|
|
Selected()
|
|
end
|
|
|
|
function Off()
|
|
if Deselected then
|
|
Deselected()
|
|
end
|
|
end
|
|
|
|
return {
|
|
['On'] = On,
|
|
['Off'] = Off,
|
|
}
|
|
|
|
|
|
]]> </ProtectedString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="RBXB0759AD03F1242829B8FCD2A084D60CC">
|
|
<Properties>
|
|
<Content name="LinkedSource">
|
|
<null></null>
|
|
</Content>
|
|
<string name="Name">Utility</string>
|
|
<ProtectedString name="Source"><![CDATA[local utility = {}
|
|
local initialised = false
|
|
|
|
function initialiseUtility(plugin)
|
|
if not initialised then
|
|
initialised = true
|
|
utility.usingAsPlugin = (plugin ~= nil)
|
|
utility.plugin = plugin
|
|
|
|
local function createIngameButtonCreator()
|
|
local buttonCreator = {}
|
|
|
|
function buttonCreator:CreateButton(name, hint, image)
|
|
local backpack = game.Players.LocalPlayer:WaitForChild("Backpack")
|
|
|
|
local tool = Instance.new("Tool")
|
|
tool.TextureId = image
|
|
tool.RequiresHandle = false
|
|
tool.ToolTip = hint
|
|
tool.Parent = backpack
|
|
|
|
local result = {}
|
|
result.Click = tool.Equipped
|
|
result.Deselected = tool.Unequipped
|
|
function result:SetActive(active)
|
|
--Do nothing
|
|
end
|
|
return result
|
|
end
|
|
|
|
return buttonCreator
|
|
end
|
|
|
|
function utility:GetButtonCreator()
|
|
return utility.usingAsPlugin and utility.plugin:CreateToolbar('Smooth Terrain') or createIngameButtonCreator()
|
|
end
|
|
|
|
function utility:GetUsingAsPlugin()
|
|
return utility.usingAsPlugin
|
|
end
|
|
|
|
function utility:GetCoreGui()
|
|
return utility.usingAsPlugin and game:GetService("CoreGui") or game.Players.LocalPlayer.PlayerGui
|
|
end
|
|
|
|
function utility:GetMouse()
|
|
return utility.usingAsPlugin and utility.plugin:GetMouse() or game.Players.LocalPlayer:GetMouse()
|
|
end
|
|
end
|
|
|
|
return utility
|
|
end
|
|
|
|
return initialiseUtility]]></ProtectedString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ScreenGui" referent="RBXA7F05BD5EC62443881B4084433B636E8">
|
|
<Properties>
|
|
<string name="Name">TerrainRegionGui</string>
|
|
</Properties>
|
|
<Item class="Frame" referent="RBXB3D62515940C444CB2BDCFE00FB27F10">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">Frame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>180</XO>
|
|
<YS>0</YS>
|
|
<YO>370</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX6DB3078ABEC4481C9A2D9FCFC6681E1A">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonSelect</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">5</token>
|
|
<string name="Text">Select</string>
|
|
<Color3 name="TextColor3">4282946004</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXA2E6FBA19978433DB69B29D941B44B2F">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonRotate</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>125</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Rotate</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX90359DC5DC724B6581BF3FF149FB083B">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonResize</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>95</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Resize</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX52B75E79AFDE43068D9A23321C6F0F07">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Divider2</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>165</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX7A4AFB09EA7C481E94E8460FF4338280">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonCopy</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>175</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Copy</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX2EDEB1CA0F6E4F1BBBBC7565979CCDDB">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonPaste</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>205</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Paste</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXD8C95F13A26443D19C6A259B4415CC4A">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonFillAir</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>315</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>30</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX12410B7EF9B34664BD3D3FC315923A4B">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>30</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Merge Empty</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX2718C17E2EE34D0DB586AC7AAB0FBE44">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Divider3</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>305</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX1F7FC386AED346269C72687003B97135">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonFillWater</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>315</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>30</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX6B0EA5A16814406C83D4880E2A302F14">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>30</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Fill Water</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="RBX37E7A61D745A4B9F9E760AA3FACBA911">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">DoubleBacking</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-7</XO>
|
|
<YS>0</YS>
|
|
<YO>-7</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>16</XO>
|
|
<YS>1</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX3870BAEA62174CB7A1DE3B47B412ABEC">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonMove</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>65</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Move</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX772B151D46D04D5A851B6E01DD9CF35D">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonDelete</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>235</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Delete</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX94616A368EDB451CB303C0FAE66F80D9">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TitleLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Regions</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXA88DA314952A4519B0727A054EF631A0">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">0</token>
|
|
<token name="FontSize">4</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CloseButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-26</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXD01C7D40F108430B81F428C17F58D6F5">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonFill</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>265</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Fill</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="RBXF3B4251690BB4F67AFD6A6E472881695">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">FillFrame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>180</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>180</XO>
|
|
<YS>0</YS>
|
|
<YO>295</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX6C0E4420DA21420786F12272F0AC7C32">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">0</token>
|
|
<token name="FontSize">4</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CloseButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-26</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBXD0A15BB0D8B74E469118E266709CEAC9">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TitleLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Fill Selection</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="RBX77DF2BD22E98440D8A555D60E5247784">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">DoubleBacking</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-7</XO>
|
|
<YS>0</YS>
|
|
<YO>-7</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>16</XO>
|
|
<YS>1</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX2A08005676A245DAB04D89A862DD6C29">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ButtonFillConfirm</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>1</YS>
|
|
<YO>-40</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Fill</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="RBXD208812D56404CC68B88253A75A0EFFF">
|
|
<Properties>
|
|
<Content name="LinkedSource">
|
|
<null></null>
|
|
</Content>
|
|
<string name="Name">MaterialsList</string>
|
|
<ProtectedString name="Source"><![CDATA[--
|
|
|
|
|
|
|
|
local materialsTable = { --Interface order is defined by order here
|
|
{enum = Enum.Material.Grass, image = 'http://www.roblox.com/asset/?id=225314676'},
|
|
{enum = Enum.Material.Sand, image = 'http://www.roblox.com/asset/?id=225315607'},
|
|
{enum = Enum.Material.Rock, image = 'http://www.roblox.com/asset/?id=225315178'},
|
|
{enum = Enum.Material.Water, image = 'http://www.roblox.com/asset/?id=225315529', forceIgnoreWater = true, forceIgnoreWaterTo = false},
|
|
{enum = Enum.Material.Ground, image = 'http://www.roblox.com/asset/?id=254542189'},
|
|
{enum = Enum.Material.Sandstone, image = 'http://www.roblox.com/asset/?id=254541350'},
|
|
{enum = Enum.Material.Slate, image = 'http://www.roblox.com/asset/?id=225315290'},
|
|
{enum = Enum.Material.Snow, image = 'http://www.roblox.com/asset/?id=254541898'},
|
|
{enum = Enum.Material.Mud, image = 'http://www.roblox.com/asset/?id=254541862'},
|
|
{enum = Enum.Material.Brick, image = 'http://www.roblox.com/asset/?id=225315419', forceSnapToGrid = true},
|
|
{enum = Enum.Material.Concrete, image = 'http://www.roblox.com/asset/?id=225314983'},
|
|
{enum = Enum.Material.Glacier, image = 'http://www.roblox.com/asset/?id=254541572'},
|
|
{enum = Enum.Material.WoodPlanks, image = 'http://www.roblox.com/asset/?id=225315705', forceSnapToGrid = true},
|
|
{enum = Enum.Material.CrackedLava, image = 'http://www.roblox.com/asset/?id=254541726'},
|
|
{enum = Enum.Material.Basalt, image = 'http://www.roblox.com/asset/?id=254542066'},
|
|
}
|
|
|
|
return materialsTable
|
|
|
|
|
|
]]> </ProtectedString>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ScreenGui" referent="RBX000094F85D8D420DB832E7AF8252D2C6">
|
|
<Properties>
|
|
<string name="Name">TerrainBrushGui</string>
|
|
</Properties>
|
|
<Item class="Frame" referent="RBXDB434AB71B9D439BAD94D4AC16D90979">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">Frame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>180</XO>
|
|
<YS>0</YS>
|
|
<YO>325</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX701D0781005440C88690E6D0F598CCD3">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">0</token>
|
|
<token name="FontSize">4</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CloseButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-26</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX7742134BB6AA4797AC14B62AE818CA28">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TitleLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Terrain Brush</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBXB89F6D55BD7C46D59A0A87E2FF195659">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label1</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Size</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX977F8A7115FA4D0CA6743AA363685FF0">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label2</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>55</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Strength</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX062BFA3B70FD41C2A3E16E49CDF773C0">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label3</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>85</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Shape</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX6FCBD973832C4B6896ED3C2861E211F8">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Label4</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>233</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>60</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Material</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX3F59F1BFAB2049CAB4320AEABD8660EF">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CheckBox2</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>160</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>26</XO>
|
|
<YS>0</YS>
|
|
<YO>26</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX55BA84A3B3D74299BBD713E51C0231A0">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Snap to Grid</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ImageButton" referent="RBXDDB863321BED4BA89440B5C0DB4F7841">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>http://www.roblox.com/asset/?id=225799533</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">4294967295</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ShapeButton1</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>73</XO>
|
|
<YS>0</YS>
|
|
<YO>81</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>32</XO>
|
|
<YS>0</YS>
|
|
<YO>32</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<token name="Style">0</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ImageButton" referent="RBXC7E35CB90AB24EF187E5EC22C6A63B53">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>http://www.roblox.com/asset/?id=225799696</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">4294967295</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ShapeButton2</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>118</XO>
|
|
<YS>0</YS>
|
|
<YO>81</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>32</XO>
|
|
<YS>0</YS>
|
|
<YO>32</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<token name="Style">0</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX000A5AFFF480416AAEE03388F966AFFF">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Divider2</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>225</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX2F4F8C778B334B32884AF3E091AC3A92">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">SubDivider</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>-1</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>2</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX13DE94FDAD2F4518B48E2E6240CA5877">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4286479998</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Blocker</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>81</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX20688486945D4909AF6E861B8666737B">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Divider1</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>120</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX43FD511176154FB0A0467E7C3D1E856C">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CheckBox3</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>230</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>26</XO>
|
|
<YS>0</YS>
|
|
<YO>26</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX2E6757D4DA6D47C7B00E0E13A7974E1E">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>20</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Auto</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="RBX263AFBEB712044C8B4F8C02827762685">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">DoubleBacking</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-7</XO>
|
|
<YS>0</YS>
|
|
<YO>-7</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>16</XO>
|
|
<YS>1</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXEE882EA2E5C64F85BB165C37AC1895FE">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CheckBox1</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>130</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>26</XO>
|
|
<YS>0</YS>
|
|
<YO>26</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX0264A28D64954512B3F11B20E9F5D000">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Plane Lock</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX02A2262B1DBA49E39F51294AB17B562C">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">ToolTip2</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>55</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Ctrl + mouse wheel</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0.300000012</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX9D9C1D9D89374198B0F4E134C40585C7">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Shadow</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>1</XO>
|
|
<YS>0</YS>
|
|
<YO>1</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Ctrl + mouse wheel</string>
|
|
<Color3 name="TextColor3">4282071867</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0.300000012</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX5E8F47E5887A4D308E04484DA4832CDD">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">ToolTip1</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Shift + mouse wheel</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0.300000012</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX7BB9CCF472AA4B12A597D0A344B716E4">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Shadow</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>1</XO>
|
|
<YS>0</YS>
|
|
<YO>1</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>47</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Shift + mouse wheel</string>
|
|
<Color3 name="TextColor3">4282071867</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0.300000012</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX15203D64F10C40FF8A98B8A2679CE59E">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CheckBox4</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>190</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>26</XO>
|
|
<YS>0</YS>
|
|
<YO>26</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBX3E39435396974B4B88CE15BDE6BF06D1">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Ignore Water</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ScreenGui" referent="RBX189281EED0C24E2E8388B92742B6B85C">
|
|
<Properties>
|
|
<string name="Name">TerrainGenerationGui</string>
|
|
</Properties>
|
|
<Item class="Frame" referent="RBX3557C298A98A46888E93035A02DCEA7F">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">MainFrame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>200</XO>
|
|
<YS>0</YS>
|
|
<YO>430</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX5A92B1B3BB0348B082AD78795CFA2DBF">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">ClearButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>1</YS>
|
|
<YO>-35</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Clear</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBXCF8C7FD23A8145A48A45A7FC0CF8B93E">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.600000024</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">Divider</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>-80</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text"></string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="RBXA2F320E22A544554AB6215BF06A45872">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">DoubleBacking</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-7</XO>
|
|
<YS>0</YS>
|
|
<YO>-7</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>16</XO>
|
|
<YS>1</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX5307CB88215544FE95AC6FA91EAA2076">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TitleLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Generation </string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX3328FB79DC7D43B3AB93E90FA61C33CE">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">0</token>
|
|
<token name="FontSize">4</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CloseButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-26</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="ScrollingFrame" referent="RBX0A03AE02FF594F22BE9CEE8542D55D15">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<Content name="BottomImage">
|
|
<url>ayaasset://textures/ui/studs.png</url>
|
|
</Content>
|
|
<Vector2 name="CanvasPosition">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<UDim2 name="CanvasSize">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>495</YO>
|
|
</UDim2>
|
|
<bool name="ClipsDescendants">true</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="MidImage">
|
|
<url>ayaasset://textures/ui/smooth.png</url>
|
|
</Content>
|
|
<string name="Name">ScrollingFrame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<int name="ScrollBarThickness">12</int>
|
|
<bool name="ScrollingEnabled">true</bool>
|
|
<bool name="Selectable">true</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>-115</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Content name="TopImage">
|
|
<url>ayaasset://textures/ui/studs.png</url>
|
|
</Content>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="RBX2CF6E3E4D7644DED88ADFF4AB6A6246A">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">true</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">Canvas</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-13</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX4AFD920233A14BA4AE26D4A951305FA4">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">GenerateButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>1</YS>
|
|
<YO>-70</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Generate</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="RBXEA31EA27A4E444688E6919885F6C222B">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4278190080</Color3>
|
|
<float name="BackgroundTransparency">0.699999988</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">ScrollBackground</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-12</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>12</XO>
|
|
<YS>1</YS>
|
|
<YO>-115</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX00F7AD63B51742B4BC4F5E6C27286CE2">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">TemplateCheckBox</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>5</XO>
|
|
<YS>1</YS>
|
|
<YO>-36</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>26</XO>
|
|
<YS>0</YS>
|
|
<YO>26</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="TextLabel" referent="RBXA1F0653F197B45A5943A54A80E5CABCE">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">2</token>
|
|
<token name="FontSize">5</token>
|
|
<string name="Name">Label</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>20</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-10</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>90</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">snowcap mountains</string>
|
|
<Color3 name="TextColor3">4294111986</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX30CACBF5F8454C9FB6A73B9BB2708EA3">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">TemplateSection</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">Section</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="Frame" referent="RBX069831BF6A3647AD8E5DF3B2172BAEA4">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.899999976</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">Frame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>70</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="RBXDC21685553FE490BB5106376C3CFF8F4">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">ProgressFrame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>-200</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>400</XO>
|
|
<YS>0</YS>
|
|
<YO>160</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX011FBBB1BFA34F6BBDAF68DBF12064D4">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CancelButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0.5</XS>
|
|
<XO>8</XO>
|
|
<YS>1</YS>
|
|
<YO>-35</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.5</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Cancel</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="RBXF13CCBE45AFE427F9FD6FB87B6CC81FB">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">DoubleBacking</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-7</XO>
|
|
<YS>0</YS>
|
|
<YO>-7</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>16</XO>
|
|
<YS>1</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX38A55C954C6343E780A3B841E0E53295">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TitleLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Progress</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXF39F4CC6C5934F6A890E53810D9E3E2F">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">PuaseButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>12</XO>
|
|
<YS>1</YS>
|
|
<YO>-35</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.5</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Pause</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="RBX5B6BAA3D5E594C7A9E092B7AA8758470">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.5</float>
|
|
<Color3 name="BorderColor3">4292401368</Color3>
|
|
<int name="BorderSizePixel">2</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">Bar</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0.389999986</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="ImageLabel" referent="RBXDD66079E8BFF47F38B85F7A6970A7FF0">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>ayaassetid://67599350</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">4278248807</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>256</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>-100</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0</float>
|
|
<string name="Name">Fill</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0.381965995</XS>
|
|
<XO>0</XO>
|
|
<YS>1</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="Frame" referent="RBX715C98A4A6B247A5B4D6DDCFC768756A">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">MultipleChoiceFrame</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>200</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>180</XO>
|
|
<YS>0</YS>
|
|
<YO>295</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX72A3F31F4BB64A419D773DDC905EB6E9">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">0</token>
|
|
<token name="FontSize">4</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">CloseButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-26</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>25</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">X</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">true</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX30F5B69D5D114932BF1AB67CC633BBE1">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.75</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TitleLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>25</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Multiple Choice</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="Frame" referent="RBX1290FF125F5D4A8DA3D6F8ED37C21635">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<string name="Name">DoubleBacking</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>-7</XO>
|
|
<YS>0</YS>
|
|
<YO>-7</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>16</XO>
|
|
<YS>1</YS>
|
|
<YO>16</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">6</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBXD62E7A108C744A669BBC1AB1FE8A9A36">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">TemplateButton</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>35</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Clear</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
<Item class="TextButton" referent="RBX0AD22FE4FD2E4E7D9FFBD9CD0380027E">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0.899999976</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">TemplateMultiChoice</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>55</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">0</token>
|
|
<string name="Text">Map Size</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">0</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextButton" referent="RBX4E8A844482EF41B2B11C71883F55AD35">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<bool name="AutoButtonColor">true</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">1</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="Modal">false</bool>
|
|
<string name="Name">Button</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>10</XO>
|
|
<YS>0</YS>
|
|
<YO>20</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<bool name="Selected">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-20</XO>
|
|
<YS>0</YS>
|
|
<YO>30</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<token name="Style">4</token>
|
|
<string name="Text">Medium (256)</string>
|
|
<Color3 name="TextColor3">4293848814</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
<Item class="ImageLabel" referent="RBX4E384400662447718BE3B684FD4720E3">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<Content name="Image">
|
|
<url>ayaasset://textures/ui/dropdown_arrow.png</url>
|
|
</Content>
|
|
<Color3 name="ImageColor3">4294967295</Color3>
|
|
<Vector2 name="ImageRectOffset">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<Vector2 name="ImageRectSize">
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</Vector2>
|
|
<float name="ImageTransparency">0.300000012</float>
|
|
<string name="Name">ArrowLabel</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>1</XS>
|
|
<XO>-13</XO>
|
|
<YS>0.5</YS>
|
|
<YO>-4</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<token name="ScaleType">0</token>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>0</XS>
|
|
<XO>16</XO>
|
|
<YS>0</YS>
|
|
<YO>10</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">2</token>
|
|
<Rect2D name="SliceCenter">
|
|
<min>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</min>
|
|
<max>
|
|
<X>0</X>
|
|
<Y>0</Y>
|
|
</max>
|
|
</Rect2D>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">3</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="TextLabel" referent="RBX86076E0A711949F383FB0BA60464A5CA">
|
|
<Properties>
|
|
<bool name="Active">false</bool>
|
|
<Color3 name="BackgroundColor3">4294967295</Color3>
|
|
<float name="BackgroundTransparency">1</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClipsDescendants">false</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">4</token>
|
|
<token name="FontSize">6</token>
|
|
<string name="Name">TemplateTextBox</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>0</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">false</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>0</XO>
|
|
<YS>0</YS>
|
|
<YO>28</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">Seed: </string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">0</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">false</bool>
|
|
<int name="ZIndex">1</int>
|
|
</Properties>
|
|
<Item class="TextBox" referent="RBX8760414B0762469CA3DC5243A3CA8CF4">
|
|
<Properties>
|
|
<bool name="Active">true</bool>
|
|
<Color3 name="BackgroundColor3">4282339151</Color3>
|
|
<float name="BackgroundTransparency">0</float>
|
|
<Color3 name="BorderColor3">4279970357</Color3>
|
|
<int name="BorderSizePixel">0</int>
|
|
<bool name="ClearTextOnFocus">true</bool>
|
|
<bool name="ClipsDescendants">true</bool>
|
|
<bool name="Draggable">false</bool>
|
|
<token name="Font">3</token>
|
|
<token name="FontSize">6</token>
|
|
<bool name="MultiLine">false</bool>
|
|
<string name="Name">TextBox</string>
|
|
<Ref name="NextSelectionDown">null</Ref>
|
|
<Ref name="NextSelectionLeft">null</Ref>
|
|
<Ref name="NextSelectionRight">null</Ref>
|
|
<Ref name="NextSelectionUp">null</Ref>
|
|
<UDim2 name="Position">
|
|
<XS>0</XS>
|
|
<XO>60</XO>
|
|
<YS>0</YS>
|
|
<YO>2</YO>
|
|
</UDim2>
|
|
<float name="Rotation">0</float>
|
|
<bool name="Selectable">true</bool>
|
|
<Ref name="SelectionImageObject">null</Ref>
|
|
<UDim2 name="Size">
|
|
<XS>1</XS>
|
|
<XO>-70</XO>
|
|
<YS>1</YS>
|
|
<YO>-4</YO>
|
|
</UDim2>
|
|
<token name="SizeConstraint">0</token>
|
|
<string name="Text">618033988</string>
|
|
<Color3 name="TextColor3">4294967295</Color3>
|
|
<bool name="TextScaled">false</bool>
|
|
<Color3 name="TextStrokeColor3">4278190080</Color3>
|
|
<float name="TextStrokeTransparency">1</float>
|
|
<float name="TextTransparency">0</float>
|
|
<bool name="TextWrapped">false</bool>
|
|
<token name="TextXAlignment">2</token>
|
|
<token name="TextYAlignment">1</token>
|
|
<bool name="Visible">true</bool>
|
|
<int name="ZIndex">2</int>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</Item>
|
|
<Item class="ModuleScript" referent="RBXA2C9AC2BE77C407AB1F290A28C54682B">
|
|
<Properties>
|
|
<Content name="LinkedSource">
|
|
<null></null>
|
|
</Content>
|
|
<string name="Name">GenerationModule</string>
|
|
<ProtectedString name="Source"><![CDATA[--Stickmasterluke
|
|
|
|
|
|
local coreGui = game:GetService('CoreGui')
|
|
local changeHistoryService = game:GetService('ChangeHistoryService')
|
|
local terrain = game.Workspace.Terrain
|
|
local gui = script.Parent:WaitForChild('TerrainGenerationGui')
|
|
local mainFrame = gui:WaitForChild('MainFrame')
|
|
local scrollingFrame = mainFrame:WaitForChild('ScrollingFrame')
|
|
local canvas = scrollingFrame:WaitForChild('Canvas')
|
|
local progressFrame = gui:WaitForChild('ProgressFrame')
|
|
local pauseButton = progressFrame:WaitForChild('PuaseButton')
|
|
local cancelButton = progressFrame:WaitForChild('CancelButton')
|
|
local barFill = progressFrame:WaitForChild('Bar'):WaitForChild('Fill')
|
|
local multipleChoiceFrame = gui:WaitForChild('MultipleChoiceFrame')
|
|
|
|
|
|
|
|
local allBiomes = {
|
|
['Mountains'] = true,
|
|
['Canyons'] = false,
|
|
['Dunes'] = false,
|
|
['Arctic'] = false,
|
|
['Lavaflow'] = false,
|
|
['Hills'] = true,
|
|
['Plains'] = true,
|
|
['Marsh'] = false,
|
|
['Water'] = false,
|
|
}
|
|
|
|
|
|
local on = false
|
|
local mouse = nil
|
|
local turnOff = nil
|
|
local generating = false
|
|
local clearing = false
|
|
local paused = false
|
|
local cancelIt = false
|
|
|
|
local noise = math.noise
|
|
local min = math.min
|
|
local max = math.max
|
|
local sin = math.sin
|
|
local cos = math.cos
|
|
local floor = math.floor
|
|
local ceil = math.ceil
|
|
local sqrt = math.sqrt
|
|
local randomseed = math.randomseed
|
|
local random = math.random
|
|
local pi = math.pi
|
|
local tau = math.pi*2
|
|
|
|
|
|
---------Directly used in Generation---------
|
|
local masterSeed = 618033988
|
|
local mapWidth = 256
|
|
local mapHeight = 128
|
|
local biomeSize = 100
|
|
local generateCaves = false
|
|
local waterLevel = .48
|
|
local surfaceThickness = .018
|
|
local biomes = {}
|
|
---------------------------------------------
|
|
|
|
|
|
|
|
function createSection(name, pos, size, parent)
|
|
local sectionGui = gui:WaitForChild('TemplateSection'):clone()
|
|
sectionGui.Name = 'Section'..name
|
|
sectionGui.Text = name
|
|
sectionGui.Position = UDim2.new(0,0,0,pos)
|
|
sectionGui.Frame.Size = UDim2.new(1,0,0,size)
|
|
sectionGui.Parent = parent
|
|
sectionGui.Visible = true
|
|
return sectionGui, sectionGui.Frame
|
|
end
|
|
|
|
function createTextBox(name, pos, parent, setting, changedFunction)
|
|
local setting = setting and tostring(setting) or ''
|
|
local frame = gui:WaitForChild('TemplateTextBox'):clone()
|
|
local field = frame:WaitForChild('TextBox')
|
|
field.Text = setting
|
|
field.Changed:connect(function(prop)
|
|
if prop == 'Text' then
|
|
changedFunction(field.Text)
|
|
end
|
|
end)
|
|
changedFunction(field.Text)
|
|
frame.Name = 'TextInputBox'..name
|
|
frame.Text = ' '..name..':'
|
|
frame.Position = UDim2.new(0,0,0,pos)
|
|
frame.Parent = parent
|
|
frame.Visible = true
|
|
return frame
|
|
end
|
|
|
|
local currentMultiChoiceOpen = nil
|
|
function closeMultiChoiceFrame()
|
|
if currentMultiChoiceOpen then
|
|
currentMultiChoiceOpen.Style = 'RobloxRoundDefaultButton'
|
|
end
|
|
currentMultiChoiceOpen = nil
|
|
multipleChoiceFrame.Visible = false
|
|
end
|
|
function createMultiChoice(name, pos, parent, choices, setting, changedFunction)
|
|
local setting = setting
|
|
local frame = gui:WaitForChild('TemplateMultiChoice'):clone()
|
|
frame.Name = 'MultipleChoice'..name
|
|
frame.Text = name
|
|
frame.Position = UDim2.new(0,0,0,pos)
|
|
local button = frame:WaitForChild('Button')
|
|
button.Text = choices[setting]
|
|
button.MouseButton1Down:connect(function()
|
|
if currentMultiChoiceOpen ~= button then
|
|
currentMultiChoiceOpen = button
|
|
--button.Style = 'RobloxRoundButton' --would be nice, but with autobuttoncolor, not so much.
|
|
multipleChoiceFrame.TitleLabel.Text = name
|
|
for _,item in pairs(multipleChoiceFrame:GetChildren()) do
|
|
if string.sub(item.Name,1,6) == 'Choice' then
|
|
item:Destroy()
|
|
end
|
|
end
|
|
for i, text in ipairs(choices) do
|
|
local choiceButton = gui:WaitForChild('TemplateButton'):clone()
|
|
choiceButton.Name = 'Choice'..text
|
|
choiceButton.Visible = true
|
|
choiceButton.Text = text
|
|
choiceButton.Position = UDim2.new(0,10,0,-3+i*35)
|
|
choiceButton.Size = UDim2.new(1,-20,0,30)
|
|
choiceButton.Parent = multipleChoiceFrame
|
|
choiceButton.MouseButton1Down:connect(function()
|
|
if setting ~= i then
|
|
setting = i
|
|
button.Text = text
|
|
changedFunction(i, text)
|
|
end
|
|
closeMultiChoiceFrame()
|
|
end)
|
|
end
|
|
multipleChoiceFrame.Size = UDim2.new(0,180,0,50 + #choices*35)
|
|
multipleChoiceFrame.Visible = true
|
|
else
|
|
closeMultiChoiceFrame()
|
|
end
|
|
end)
|
|
frame.Parent = parent
|
|
frame.Visible = true
|
|
return frame
|
|
end
|
|
multipleChoiceFrame:WaitForChild('CloseButton').MouseButton1Down:connect(closeMultiChoiceFrame)
|
|
|
|
function createCheckBox(name, pos, parent, setting, changedFunction)
|
|
local setting = setting
|
|
local checkBoxGui = gui:WaitForChild('TemplateCheckBox'):clone()
|
|
checkBoxGui.Name = 'CheckBox'..name
|
|
checkBoxGui.Label.Text = name
|
|
checkBoxGui.Text = setting and 'X' or ''
|
|
checkBoxGui.Position = UDim2.new(0,4,0,pos)
|
|
checkBoxGui.Parent = parent
|
|
checkBoxGui.Visible = true
|
|
checkBoxGui.MouseButton1Down:connect(function()
|
|
setting = not setting
|
|
checkBoxGui.Text = setting and 'X' or ''
|
|
changedFunction(setting)
|
|
end)
|
|
return checkBoxGui
|
|
end
|
|
|
|
|
|
-------------------------------------------------------------------------------------------------------------------
|
|
-------------------------------------------------------------------------------------------------------------------
|
|
|
|
local rock = Enum.Material.Rock
|
|
local snow = Enum.Material.Snow
|
|
local ice = Enum.Material.Glacier
|
|
local grass = Enum.Material.Grass
|
|
local ground = Enum.Material.Ground
|
|
local mud = Enum.Material.Mud
|
|
local slate = Enum.Material.Slate
|
|
local concrete = Enum.Material.Concrete
|
|
local lava = Enum.Material.CrackedLava
|
|
local basalt = Enum.Material.Basalt
|
|
local air = Enum.Material.Air
|
|
local sand = Enum.Material.Sand
|
|
local sandstone = Enum.Material.Sandstone
|
|
local water = Enum.Material.Water
|
|
|
|
local fill = rock
|
|
|
|
local range = {}
|
|
function checkRange(v)
|
|
if not range.min or v < range.min then
|
|
range.min = v
|
|
end
|
|
if not range.max or v > range.max then
|
|
range.max = v
|
|
end
|
|
end
|
|
|
|
local function getPerlin(x,y,z,seed,scale,raw)
|
|
local seed = seed or 0
|
|
local scale = scale or 1
|
|
if not raw then
|
|
return noise(x/scale+(seed*17)+masterSeed,y/scale-masterSeed,z/scale-seed*seed)*.5 + .5 -- accounts for bleeding from interpolated line
|
|
else
|
|
return noise(x/scale+(seed*17)+masterSeed,y/scale-masterSeed,z/scale-seed*seed)
|
|
end
|
|
end
|
|
|
|
|
|
randomseed(6180339)
|
|
theseed={}
|
|
for i=1,999 do
|
|
table.insert(theseed,math.random())
|
|
end
|
|
|
|
local function getNoise(x,y,z,seed1)
|
|
local x = x or 0
|
|
local y = y or 0
|
|
local z = z or 0
|
|
local seed1 = seed1 or 7
|
|
local wtf=x+y+z+seed1+masterSeed + (masterSeed-x)*(seed1+z) + (seed1-y)*(masterSeed+z) -- + x*(y+z) + z*(masterSeed+seed1) + seed1*(x+y) --x+y+z+seed1+masterSeed + x*y*masterSeed-y*z+(z+masterSeed)*x --((x+y)*(y-seed1)*seed1)-(x+z)*seed2+x*11+z*23-y*17
|
|
return theseed[(floor(wtf%(#theseed)))+1]
|
|
end
|
|
|
|
local function thresholdFilter(value, bottom, size)
|
|
if value <= bottom then
|
|
return 0
|
|
elseif value >= bottom+size then
|
|
return 1
|
|
else
|
|
return (value-bottom)/size
|
|
end
|
|
end
|
|
|
|
local function ridgedFilter(value) --absolute and flip for ridges. and normalize
|
|
return value<.5 and value*2 or 2-value*2
|
|
end
|
|
|
|
local function ridgedFlippedFilter(value) --unflipped
|
|
return value < .5 and 1-value*2 or value*2-1
|
|
end
|
|
|
|
local function advancedRidgedFilter(value, cutoff)
|
|
local cutoff = cutoff or .5
|
|
value = value - cutoff
|
|
return 1 - (value < 0 and -value or value) * 1/(1-cutoff)
|
|
end
|
|
|
|
|
|
local function fractalize(operation,x,y,z, operationCount, scale, offset, gain)
|
|
local operationCount = operationCount or 3
|
|
local scale = scale or .5
|
|
local offset = 0
|
|
local gain = gain or 1
|
|
local totalValue = 0
|
|
local totalScale = 0
|
|
for i=1, operationCount do
|
|
local thisScale = scale^(i-1)
|
|
totalScale = totalScale + thisScale
|
|
totalValue = totalValue + (offset + gain * operation(x,y,z,i))*thisScale
|
|
end
|
|
return totalValue/totalScale
|
|
end
|
|
|
|
|
|
local function mountainsOperation(x,y,z,i)
|
|
return ridgedFilter(getPerlin(x,y,z,100+i,(1/i)*160))
|
|
end
|
|
|
|
local canyonBandingMaterial = {rock,mud,sand,sand,sandstone,sandstone,sandstone,sandstone,sandstone,sandstone,}
|
|
|
|
local function findBiomeInfo(choiceBiome,x,y,z,verticalGradientTurbulence)
|
|
local choiceBiomeValue = .5
|
|
local choiceBiomeSurface = grass
|
|
local choiceBiomeFill = rock
|
|
if choiceBiome == 'City' then
|
|
choiceBiomeValue = .55
|
|
choiceBiomeSurface = concrete
|
|
choiceBiomeFill = slate
|
|
elseif choiceBiome == 'Water' then
|
|
choiceBiomeValue = .36+getPerlin(x,y,z,2,50)*.08
|
|
choiceBiomeSurface =
|
|
(1-verticalGradientTurbulence < .44 and slate)
|
|
or sand
|
|
elseif choiceBiome == 'Marsh' then
|
|
local preLedge = getPerlin(x+getPerlin(x,0,z,5,7,true)*10+getPerlin(x,0,z,6,30,true)*50,0,z+getPerlin(x,0,z,9,7,true)*10+getPerlin(x,0,z,10,30,true)*50,2,70) --could use some turbulence
|
|
local grassyLedge = thresholdFilter(preLedge,.65,0)
|
|
local largeGradient = getPerlin(x,y,z,4,100)
|
|
local smallGradient = getPerlin(x,y,z,3,20)
|
|
local smallGradientThreshold = thresholdFilter(smallGradient,.5,0)
|
|
choiceBiomeValue = waterLevel-.04
|
|
+preLedge*grassyLedge*.025
|
|
+largeGradient*.035
|
|
+smallGradient*.025
|
|
choiceBiomeSurface =
|
|
(grassyLedge >= 1 and grass)
|
|
or (1-verticalGradientTurbulence < waterLevel-.01 and mud)
|
|
or (1-verticalGradientTurbulence < waterLevel+.01 and ground)
|
|
or grass
|
|
choiceBiomeFill = slate
|
|
elseif choiceBiome == 'Plains' then
|
|
local rivulet = ridgedFlippedFilter(getPerlin(x+getPerlin(x,y,z,17,40)*25,0,z+getPerlin(x,y,z,19,40)*25,2,200))
|
|
local rivuletThreshold = thresholdFilter(rivulet,.01,0)
|
|
|
|
local rockMap = thresholdFilter(ridgedFlippedFilter(getPerlin(x,0,z,101,7)),.3,.7) --rocks
|
|
* thresholdFilter(getPerlin(x,0,z,102,50),.6,.05) --zoning
|
|
|
|
choiceBiomeValue = .5 --.51
|
|
+getPerlin(x,y,z,2,100)*.02 --.05
|
|
+rivulet*.05 --.02
|
|
+rockMap*.05 --.03
|
|
+rivuletThreshold*.005
|
|
|
|
local verticalGradient = 1-((y-1)/(mapHeight-1))
|
|
local surfaceGradient = verticalGradient*.5 + choiceBiomeValue*.5
|
|
local thinSurface = surfaceGradient > .5-surfaceThickness*.4 and surfaceGradient < .5+surfaceThickness*.4
|
|
choiceBiomeSurface =
|
|
(rockMap>0 and rock)
|
|
or (not thinSurface and mud)
|
|
or (thinSurface and rivuletThreshold <=0 and water)
|
|
or (1-verticalGradientTurbulence < waterLevel-.01 and sand)
|
|
or grass
|
|
choiceBiomeFill =
|
|
(rockMap>0 and rock)
|
|
or sandstone
|
|
elseif choiceBiome == 'Canyons' then
|
|
local canyonNoise = ridgedFlippedFilter(getPerlin(x,0,z,2,200))
|
|
local canyonNoiseTurbed = ridgedFlippedFilter(getPerlin(x+getPerlin(x,0,z,5,20,true)*20,0,z+getPerlin(x,0,z,9,20,true)*20,2,200))
|
|
local sandbank = thresholdFilter(canyonNoiseTurbed,0,.05)
|
|
local canyonTop = thresholdFilter(canyonNoiseTurbed,.125,0)
|
|
local mesaSlope = thresholdFilter(canyonNoise,.33,.12)
|
|
local mesaTop = thresholdFilter(canyonNoiseTurbed,.49,0)
|
|
choiceBiomeValue = .42
|
|
+getPerlin(x,y,z,2,70)*.05
|
|
+canyonNoise*.05
|
|
+sandbank*.04 --canyon bottom slope
|
|
+thresholdFilter(canyonNoiseTurbed,.05,0)*.08 --canyon cliff
|
|
+thresholdFilter(canyonNoiseTurbed,.05,.075)*.04 --canyon cliff top slope
|
|
+canyonTop*.01 --canyon cliff top ledge
|
|
|
|
+thresholdFilter(canyonNoiseTurbed,.0575,.2725)*.01 --plane slope
|
|
|
|
+mesaSlope*.06 --mesa slope
|
|
+thresholdFilter(canyonNoiseTurbed,.45,0)*.14 --mesa cliff
|
|
+thresholdFilter(canyonNoiseTurbed,.45,.04)*.025 --mesa cap
|
|
+mesaTop*.02 --mesa top ledge
|
|
choiceBiomeSurface =
|
|
(1-verticalGradientTurbulence < waterLevel+.015 and sand) --this for biome blending in to lakes
|
|
or (sandbank>0 and sandbank<1 and sand) --this for canyonbase sandbanks
|
|
--or (canyonTop>0 and canyonTop<=1 and mesaSlope<=0 and grass) --this for grassy canyon tops
|
|
--or (mesaTop>0 and mesaTop<=1 and grass) --this for grassy mesa tops
|
|
or sandstone
|
|
choiceBiomeFill = canyonBandingMaterial[ceil((1-getNoise(1,y,2))*10)]
|
|
elseif choiceBiome == 'Hills' then
|
|
local rivulet = ridgedFlippedFilter(getPerlin(x+getPerlin(x,y,z,17,20)*20,0,z+getPerlin(x,y,z,19,20)*20,2,200))^(1/2)
|
|
local largeHills = getPerlin(x,y,z,3,60)
|
|
choiceBiomeValue = .48
|
|
+largeHills*.05
|
|
+(.05
|
|
+largeHills*.1
|
|
+getPerlin(x,y,z,4,25)*.125)
|
|
*rivulet
|
|
local surfaceMaterialGradient = (1-verticalGradientTurbulence)*.9 + rivulet*.1
|
|
choiceBiomeSurface =
|
|
(surfaceMaterialGradient < waterLevel-.015 and mud)
|
|
or (surfaceMaterialGradient < waterLevel and ground)
|
|
or grass
|
|
choiceBiomeFill = slate
|
|
elseif choiceBiome == 'Dunes' then
|
|
local duneTurbulence = getPerlin(x,0,z,227,20)*24
|
|
local layer1 = ridgedFilter(getPerlin(x,0,z,201,40))
|
|
local layer2 = ridgedFilter(getPerlin(x/10+duneTurbulence,0,z+duneTurbulence,200,48))
|
|
choiceBiomeValue = .4+.1*(layer1 + layer2)
|
|
choiceBiomeSurface = sand
|
|
choiceBiomeFill = sandstone
|
|
elseif choiceBiome == 'Mountains' then
|
|
local rivulet = ridgedFlippedFilter(getPerlin(x+getPerlin(x,y,z,17,20)*20,0,z+getPerlin(x,y,z,19,20)*20,2,200))
|
|
choiceBiomeValue = -.4 --.3
|
|
+fractalize(mountainsOperation,x,y/20,z, 8, .65)*1.2
|
|
+rivulet*.2
|
|
choiceBiomeSurface =
|
|
(verticalGradientTurbulence < .275 and snow)
|
|
or (verticalGradientTurbulence < .35 and rock)
|
|
or (verticalGradientTurbulence < .4 and ground)
|
|
or (1-verticalGradientTurbulence < waterLevel and rock)
|
|
or (1-verticalGradientTurbulence < waterLevel+.01 and mud)
|
|
or (1-verticalGradientTurbulence < waterLevel+.015 and ground)
|
|
or grass
|
|
elseif choiceBiome == 'Lavaflow' then
|
|
local crackX = x+getPerlin(x,y*.25,z,21,8,true)*5
|
|
local crackY = y+getPerlin(x,y*.25,z,22,8,true)*5
|
|
local crackZ = z+getPerlin(x,y*.25,z,23,8,true)*5
|
|
local crack1 = ridgedFilter(getPerlin(crackX+getPerlin(x,y,z,22,30,true)*30,crackY,crackZ+getPerlin(x,y,z,24,30,true)*30,2,120))
|
|
local crack2 = ridgedFilter(getPerlin(crackX,crackY,crackZ,3,40))*(crack1*.25+.75)
|
|
local crack3 = ridgedFilter(getPerlin(crackX,crackY,crackZ,4,20))*(crack2*.25+.75)
|
|
|
|
local generalHills = thresholdFilter(getPerlin(x,y,z,9,40),.25,.5)*getPerlin(x,y,z,10,60)
|
|
|
|
local cracks = max(0,1-thresholdFilter(crack1,.975,0)-thresholdFilter(crack2,.925,0)-thresholdFilter(crack3,.9,0))
|
|
|
|
local spireVec = CFrame.Angles(.7,.7,0)*Vector3.new(crackX,crackY,crackZ)
|
|
local spires = thresholdFilter(getPerlin(spireVec.x/40,spireVec.y/300,spireVec.z/30,123,1),.6,.4)
|
|
|
|
choiceBiomeValue = waterLevel+.02
|
|
+cracks*(.5+generalHills*.5)*.02
|
|
+generalHills*.05
|
|
+spires*.3
|
|
+((1-verticalGradientTurbulence > waterLevel+.01 or spires>0) and .04 or 0) --This lets it lip over water
|
|
|
|
choiceBiomeFill = (spires>0 and rock) or (cracks<1 and lava) or basalt
|
|
choiceBiomeSurface = (choiceBiomeFill == lava and 1-verticalGradientTurbulence < waterLevel and basalt) or choiceBiomeFill
|
|
elseif choiceBiome == 'Arctic' then
|
|
local preBoundary = getPerlin(x+getPerlin(x,0,z,5,8,true)*5,y/8,z+getPerlin(x,0,z,9,8,true)*5,2,20)
|
|
--local cliffs = thresholdFilter(preBoundary,.5,0)
|
|
local boundary = ridgedFilter(preBoundary)
|
|
local roughChunks = getPerlin(x,y/4,z,436,2)
|
|
local boundaryMask = thresholdFilter(boundary,.8,.1) --,.7,.25)
|
|
local boundaryTypeMask = getPerlin(x,0,z,6,74)-.5
|
|
local boundaryComp = 0
|
|
if boundaryTypeMask < 0 then --divergent
|
|
boundaryComp = (boundary > (1+boundaryTypeMask*.5) and -.17 or 0)
|
|
--* boundaryTypeMask*-2
|
|
else --convergent
|
|
boundaryComp = boundaryMask*.1*roughChunks
|
|
* boundaryTypeMask
|
|
end
|
|
choiceBiomeValue = .55
|
|
+boundary*.05*boundaryTypeMask --.1 --soft slope up or down to boundary
|
|
+boundaryComp --convergent/divergent effects
|
|
+getPerlin(x,0,z,123,25)*.025 --*cliffs --gentle rolling slopes
|
|
|
|
choiceBiomeSurface = (1-verticalGradientTurbulence < waterLevel-.1 and ice) or (boundaryMask>.6 and boundaryTypeMask>.1 and roughChunks>.5 and ice) or snow
|
|
choiceBiomeFill = ice
|
|
end
|
|
return choiceBiomeValue, choiceBiomeSurface, choiceBiomeFill
|
|
end
|
|
|
|
function findBiomeTransitionValue(biome,weight,value,averageValue)
|
|
if biome == 'Arctic' then
|
|
return (weight>.2 and 1 or 0)*value
|
|
elseif biome == 'Canyons' then
|
|
return (weight>.7 and 1 or 0)*value
|
|
elseif biome == 'Mountains' then
|
|
local weight = weight^3 --This improves the ease of mountains transitioning to other biomes
|
|
return averageValue*(1-weight)+value*weight
|
|
else
|
|
return averageValue*(1-weight)+value*weight
|
|
end
|
|
end
|
|
|
|
function updatePausedButton()
|
|
pauseButton.Style = paused and 'RobloxRoundButton' or 'RobloxRoundDefaultButton'
|
|
pauseButton.Text = paused and 'Paused' or 'Pause'
|
|
end
|
|
|
|
function generate()
|
|
if not generating and not clearing then
|
|
generating = true
|
|
paused = false
|
|
updatePausedButton()
|
|
cancelIt = false
|
|
progressFrame.Visible = true
|
|
|
|
local mapWidth = mapWidth
|
|
local biomeSize = biomeSize
|
|
local biomeBlendPercent = .25 --(biomeSize==50 or biomeSize == 100) and .5 or .25
|
|
local biomeBlendPercentInverse = 1-biomeBlendPercent
|
|
local biomeBlendDistortion = biomeBlendPercent
|
|
local smoothScale = .5/mapHeight
|
|
|
|
local startTime = tick()
|
|
biomes = {}
|
|
for i,v in pairs(allBiomes) do
|
|
if v then
|
|
table.insert(biomes,i)
|
|
end
|
|
end
|
|
if #biomes<=0 then
|
|
table.insert(biomes,'Hills')
|
|
end
|
|
--local oMap = {}
|
|
--local mMap = {}
|
|
for x = 1, mapWidth do
|
|
local oMapX = {}
|
|
--oMap[x] = oMapX
|
|
local mMapX = {}
|
|
--mMap[x] = mMapX
|
|
for z = 1, mapWidth do
|
|
local biomeNoCave = false
|
|
local cellToBiomeX = x/biomeSize + getPerlin(x,0,z,233,biomeSize*.3)*.25 + getPerlin(x,0,z,235,biomeSize*.05)*.075
|
|
local cellToBiomeZ = z/biomeSize + getPerlin(x,0,z,234,biomeSize*.3)*.25 + getPerlin(x,0,z,236,biomeSize*.05)*.075
|
|
local closestPoint = Vector3.new(0,0,0)
|
|
local closestDistance = 1000000
|
|
local biomePoints = {}
|
|
for vx=-1,1 do
|
|
for vz=-1,1 do
|
|
local gridPointX = floor(cellToBiomeX+vx+.5)
|
|
local gridPointZ = floor(cellToBiomeZ+vz+.5)
|
|
--local pointX, pointZ = getBiomePoint(gridPointX,gridPointZ)
|
|
local pointX = gridPointX+(getNoise(gridPointX,gridPointZ,53)-.5)*.75 --de-uniforming grid for vornonoi
|
|
local pointZ = gridPointZ+(getNoise(gridPointX,gridPointZ,73)-.5)*.75
|
|
|
|
local dist = sqrt((pointX-cellToBiomeX)^2 + (pointZ-cellToBiomeZ)^2)
|
|
if dist < closestDistance then
|
|
closestPoint = Vector3.new(pointX,0,pointZ)
|
|
closestDistance = dist
|
|
end
|
|
table.insert(biomePoints,{
|
|
x = pointX,
|
|
z = pointZ,
|
|
dist = dist,
|
|
biomeNoise = getNoise(gridPointX,gridPointZ),
|
|
weight = 0
|
|
})
|
|
end
|
|
end
|
|
local weightTotal = 0
|
|
local weightPoints = {}
|
|
for _,point in pairs(biomePoints) do
|
|
local weight = point.dist == closestDistance and 1 or ((closestDistance / point.dist)-biomeBlendPercentInverse)/biomeBlendPercent
|
|
if weight > 0 then
|
|
local weight = weight^2.1 --this smooths the biome transition from linear to cubic InOut
|
|
weightTotal = weightTotal + weight
|
|
local biome = biomes[ceil(#biomes*(1-point.biomeNoise))] --inverting the noise so that it is limited as (0,1]. One less addition operation when finding a random list index
|
|
weightPoints[biome] = {
|
|
weight = weightPoints[biome] and weightPoints[biome].weight + weight or weight
|
|
}
|
|
end
|
|
end
|
|
for biome,info in pairs(weightPoints) do
|
|
info.weight = info.weight / weightTotal
|
|
if biome == 'Arctic' then --biomes that don't have caves that breach the surface
|
|
biomeNoCave = true
|
|
end
|
|
end
|
|
|
|
|
|
for y = 1, mapHeight do
|
|
local oMapY = oMapX[y] or {}
|
|
oMapX[y] = oMapY
|
|
local mMapY = mMapX[y] or {}
|
|
mMapX[y] = mMapY
|
|
|
|
--[[local oMapY = {}
|
|
oMapX[y] = oMapY
|
|
local mMapY = {}
|
|
mMapX[z] = mMapY]]
|
|
|
|
|
|
local verticalGradient = 1-((y-1)/(mapHeight-1))
|
|
local caves = 0
|
|
local verticalGradientTurbulence = verticalGradient*.9 + .1*getPerlin(x,y,z,107,15)
|
|
local choiceValue = 0
|
|
local choiceSurface = lava
|
|
local choiceFill = rock
|
|
|
|
if verticalGradient > .65 or verticalGradient < .1 then
|
|
--under surface of every biome; don't get biome data; waste of time.
|
|
choiceValue = .5
|
|
elseif #biomes == 1 then
|
|
choiceValue, choiceSurface, choiceFill = findBiomeInfo(biomes[1],x,y,z,verticalGradientTurbulence)
|
|
else
|
|
local averageValue = 0
|
|
--local findChoiceMaterial = -getNoise(x,y,z,19)
|
|
for biome,info in pairs(weightPoints) do
|
|
local biomeValue, biomeSurface, biomeFill = findBiomeInfo(biome,x,y,z,verticalGradientTurbulence)
|
|
info.biomeValue = biomeValue
|
|
info.biomeSurface = biomeSurface
|
|
info.biomeFill = biomeFill
|
|
local value = biomeValue * info.weight
|
|
averageValue = averageValue + value
|
|
--[[if findChoiceMaterial < 0 and findChoiceMaterial + weight >= 0 then
|
|
choiceMaterial = biomeMaterial
|
|
end
|
|
findChoiceMaterial = findChoiceMaterial + weight]]
|
|
end
|
|
for biome,info in pairs(weightPoints) do
|
|
local value = findBiomeTransitionValue(biome,info.weight,info.biomeValue,averageValue)
|
|
if value > choiceValue then
|
|
choiceValue = value
|
|
choiceSurface = info.biomeSurface
|
|
choiceFill = info.biomeFill
|
|
end
|
|
end
|
|
end
|
|
|
|
local preCaveComp = verticalGradient*.5 + choiceValue*.5
|
|
|
|
local surface = preCaveComp > .5-surfaceThickness and preCaveComp < .5+surfaceThickness
|
|
|
|
if generateCaves --user wants caves
|
|
and (not biomeNoCave or verticalGradient > .65) --biome allows caves or deep enough
|
|
and not (surface and (1-verticalGradient) < waterLevel+.005) --caves only breach surface above waterlevel
|
|
and not (surface and (1-verticalGradient) > waterLevel+.58) then --caves don't go too high so that they don't cut up mountain tops
|
|
local ridged2 = ridgedFilter(getPerlin(x,y,z,4,30))
|
|
local caves2 = thresholdFilter(ridged2,.84,.01)
|
|
local ridged3 = ridgedFilter(getPerlin(x,y,z,5,30))
|
|
local caves3 = thresholdFilter(ridged3,.84,.01)
|
|
local ridged4 = ridgedFilter(getPerlin(x,y,z,6,30))
|
|
local caves4 = thresholdFilter(ridged4,.84,.01)
|
|
local caveOpenings = (surface and 1 or 0) * thresholdFilter(getPerlin(x,0,z,143,62),.35,0) --.45
|
|
caves = caves2 * caves3 * caves4 - caveOpenings
|
|
caves = caves < 0 and 0 or caves > 1 and 1 or caves
|
|
end
|
|
|
|
local comp = preCaveComp - caves
|
|
|
|
local smoothedResult = thresholdFilter(comp,.5,smoothScale)
|
|
|
|
---below water level -above surface -no terrain
|
|
if 1-verticalGradient < waterLevel and preCaveComp <= .5 and smoothedResult <= 0 then
|
|
smoothedResult = 1
|
|
choiceSurface = water
|
|
choiceFill = water
|
|
surface = true
|
|
end
|
|
|
|
oMapY[z] = (y == 1 and 1) or smoothedResult
|
|
mMapY[z] = (y == 1 and lava) or (smoothedResult <= 0 and air) or (surface and choiceSurface) or choiceFill
|
|
end
|
|
end
|
|
|
|
local regionStart = Vector3.new(mapWidth*-2+(x-1)*4,mapHeight*-2,mapWidth*-2)
|
|
local regionEnd = Vector3.new(mapWidth*-2+x*4,mapHeight*2,mapWidth*2)
|
|
local mapRegion = Region3.new(regionStart, regionEnd)
|
|
terrain:WriteVoxels(mapRegion, 4, {mMapX}, {oMapX})
|
|
|
|
local completionPercent = x/mapWidth
|
|
barFill.Size = UDim2.new(completionPercent,0,1,0)
|
|
|
|
wait()
|
|
while paused and not cancelIt do
|
|
wait()
|
|
end
|
|
if cancelIt then
|
|
break
|
|
end
|
|
end
|
|
changeHistoryService:SetWaypoint('Terrain Generation')
|
|
progressFrame.Visible = false
|
|
generating = false
|
|
print('Generation Complete',tick()-startTime)
|
|
end
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------------------------------------------
|
|
------------------------------------------------Setup User Interface------------------------------------------------
|
|
|
|
local mapSizes = {128,256,512,1024}
|
|
local mapSizeChangeFunction = function(index,text)
|
|
mapWidth = mapSizes[index]
|
|
end
|
|
createMultiChoice('Map Size', 5, canvas, {'Small (128)','Medium (256)','Large (512)','Massive (1024)'}, 2, mapSizeChangeFunction)
|
|
|
|
local seedChangeFunction = function(text)
|
|
local compositeNumber = 0
|
|
for i=1,#text do
|
|
local character = string.sub(text,i,i)
|
|
local number = tonumber(character)
|
|
if number then
|
|
compositeNumber = (compositeNumber+6)*(number+5)
|
|
else
|
|
compositeNumber = (compositeNumber+7)*(string.byte(character)+3)
|
|
end
|
|
compositeNumber = compositeNumber%61803 --yes, this does need to be done after every character iteration, otherwise number loses precision by the end
|
|
end
|
|
masterSeed = compositeNumber
|
|
end
|
|
createTextBox('Seed', 65, canvas, masterSeed, seedChangeFunction)
|
|
|
|
local cavesChangeFunction = function(value)
|
|
generateCaves = value
|
|
end
|
|
local cavesCheckBox = createCheckBox('Caves', 100, canvas, generateCaves, cavesChangeFunction)
|
|
|
|
local biomeSizes = {50,100,200,500}
|
|
local biomeSizeChangeFunction = function(index,text)
|
|
biomeSize = biomeSizes[index]
|
|
end
|
|
createMultiChoice('Biome Size', 135, canvas, {'Small (50)','Medium (100)','Large (200)','Massive (500)'}, 2, biomeSizeChangeFunction)
|
|
|
|
local biomesSettingsButton, biomesFrame = createSection('Biomes',200,275,canvas)
|
|
|
|
local waterChangeFunction = function(value)
|
|
allBiomes['Water'] = value
|
|
end
|
|
local waterCheckBox = createCheckBox('Water', 5, biomesFrame, allBiomes['Water'], waterChangeFunction)
|
|
|
|
local marshChangeFunction = function(value)
|
|
allBiomes['Marsh'] = value
|
|
end
|
|
local marshCheckBox = createCheckBox('Marsh', 35, biomesFrame, allBiomes['Marsh'], marshChangeFunction)
|
|
|
|
local plainsChangeFunction = function(value)
|
|
allBiomes['Plains'] = value
|
|
end
|
|
local plainsCheckBox = createCheckBox('Plains', 65, biomesFrame, allBiomes['Plains'], plainsChangeFunction)
|
|
|
|
local hillsChangeFunction = function(value)
|
|
allBiomes['Hills'] = value
|
|
end
|
|
local hillsCheckBox = createCheckBox('Hills', 95, biomesFrame, allBiomes['Hills'], hillsChangeFunction)
|
|
|
|
local dunesChangeFunction = function(value)
|
|
allBiomes['Dunes'] = value
|
|
end
|
|
local dunesCheckBox = createCheckBox('Dunes', 125, biomesFrame, allBiomes['Dunes'], dunesChangeFunction)
|
|
|
|
local canyonsChangeFunction = function(value)
|
|
allBiomes['Canyons'] = value
|
|
end
|
|
local canyonsCheckBox = createCheckBox('Canyons', 155, biomesFrame, allBiomes['Canyons'], canyonsChangeFunction)
|
|
|
|
local mountainsChangeFunction = function(value)
|
|
allBiomes['Mountains'] = value
|
|
end
|
|
local mountainsCheckBox = createCheckBox('Mountains', 185, biomesFrame, allBiomes['Mountains'], mountainsChangeFunction)
|
|
|
|
local lavaflowChangeFunction = function(value)
|
|
allBiomes['Lavaflow'] = value
|
|
end
|
|
local lavaflowCheckBox = createCheckBox('Lavascape', 215, biomesFrame, allBiomes['Lavaflow'], lavaflowChangeFunction)
|
|
|
|
local arcticChangeFunction = function(value)
|
|
allBiomes['Arctic'] = value
|
|
end
|
|
local arcticCheckBox = createCheckBox('Arctic', 245, biomesFrame, allBiomes['Arctic'], arcticChangeFunction)
|
|
|
|
|
|
--------------------------------------------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
function On(mouseHandMeDown,turnOffHandMeDown)
|
|
gui.Parent = coreGui
|
|
on = true
|
|
if mouseHandMeDown then
|
|
mouse = mouseHandMeDown
|
|
end
|
|
if turnOffHandMeDown then
|
|
turnOff = turnOffHandMeDown
|
|
end
|
|
end
|
|
|
|
function Off()
|
|
closeMultiChoiceFrame()
|
|
if turnOff then
|
|
turnOff()
|
|
end
|
|
on = false
|
|
gui.Parent = nil
|
|
end
|
|
|
|
function clearTerrain()
|
|
if not generating and not clearing then
|
|
clearing = true
|
|
terrain:Clear()
|
|
changeHistoryService:SetWaypoint('Terrain Clear')
|
|
clearing = false
|
|
end
|
|
end
|
|
|
|
pauseButton.MouseButton1Down:connect(function()
|
|
paused = not paused
|
|
updatePausedButton()
|
|
end)
|
|
|
|
cancelButton.MouseButton1Down:connect(function()
|
|
if not cancelIt then
|
|
cancelIt = true
|
|
print('Canceled')
|
|
end
|
|
end)
|
|
|
|
mainFrame:WaitForChild('CloseButton').MouseButton1Down:connect(function()
|
|
Off()
|
|
end)
|
|
|
|
mainFrame:WaitForChild('GenerateButton').MouseButton1Down:connect(function()
|
|
generate()
|
|
end)
|
|
|
|
mainFrame:WaitForChild('ClearButton').MouseButton1Down:connect(function()
|
|
clearTerrain()
|
|
end)
|
|
|
|
|
|
return {
|
|
['On'] = On,
|
|
['Off'] = Off,
|
|
}
|
|
|
|
|
|
]]> </ProtectedString>
|
|
</Properties>
|
|
</Item>
|
|
</Item>
|
|
</roblox> |