mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-06 13:47:48 +00:00
GEEKING
This commit is contained in:
@@ -0,0 +1,772 @@
|
||||
-- we'll load this later; workaround for strange crash
|
||||
local RbxStamper = nil
|
||||
|
||||
local stampControl = nil
|
||||
local stampingCon = nil
|
||||
|
||||
|
||||
-----------------
|
||||
--DEFAULT VALUES-
|
||||
-----------------
|
||||
local on = false
|
||||
local loaded = false
|
||||
local selectionConnection = nil
|
||||
local myModel = nil
|
||||
local whichStep = 1
|
||||
|
||||
local backEnabled = false
|
||||
local continueEnabled = false
|
||||
|
||||
local bbPreviewCoroutine = nil
|
||||
local facePreviewCoroutine = nil
|
||||
|
||||
local bbPreview = Instance.new("Part")
|
||||
bbPreview.Name = "SideSelectionBox"
|
||||
bbPreview.Transparency = .7
|
||||
bbPreview.formFactor = "Custom"
|
||||
bbPreview.Size = Vector3.new(4, 4, 4)
|
||||
bbPreview.Transparency = 1
|
||||
bbPreview.CanCollide = false
|
||||
bbPreview.Anchored = true
|
||||
bbPreview.CFrame = CFrame.new(0, 0, 0)
|
||||
bbPreview.TopSurface = "Smooth"
|
||||
bbPreview.BottomSurface = "Smooth"
|
||||
|
||||
local alignmentVect = Vector3.new(0, 0, 0)
|
||||
local alignToFaceText = "[None]"
|
||||
local unstampableFacesText = "[None]"
|
||||
local unstampableFaces = {false, false, false, false, false, false}
|
||||
local unjoinableFacesText = "[None]"
|
||||
local unjoinableFaces = {false, false, false, false, false, false}
|
||||
|
||||
local SURFACE_FROM_NUMBER = {Enum.NormalId.Back, Enum.NormalId.Bottom, Enum.NormalId.Front, Enum.NormalId.Left, Enum.NormalId.Right, Enum.NormalId.Top}
|
||||
local ALIGN_TO_FACE_MAPPING = {1, nil, 3, 2, 0, nil}
|
||||
local UNSTAMPABLE_FACE_MAPPING = {"3", "-2", "-3", "-1", "1", "2"}
|
||||
local SURFACE_TO_NUMBER = {}
|
||||
local REVERSE_ALIGN_TO_FACE_MAPPING = {}
|
||||
local REVERSE_UNSTAMPABLE_FACE_MAPPING = {}
|
||||
|
||||
for i = 1, #SURFACE_FROM_NUMBER do
|
||||
SURFACE_TO_NUMBER[SURFACE_FROM_NUMBER[i]] = i
|
||||
end
|
||||
for i = 1, #ALIGN_TO_FACE_MAPPING do
|
||||
if ALIGN_TO_FACE_MAPPING[i] then REVERSE_ALIGN_TO_FACE_MAPPING[ALIGN_TO_FACE_MAPPING[i]] = SURFACE_FROM_NUMBER[i] end
|
||||
end
|
||||
for i = 1, #UNSTAMPABLE_FACE_MAPPING do
|
||||
REVERSE_UNSTAMPABLE_FACE_MAPPING[tonumber(UNSTAMPABLE_FACE_MAPPING[i])] = i
|
||||
end
|
||||
---------------
|
||||
--PLUGIN SETUP-
|
||||
---------------
|
||||
|
||||
self = PluginManager():CreatePlugin()
|
||||
mouse = self:GetMouse()
|
||||
mouse.Button1Down:connect(function() onClicked(mouse) end)
|
||||
self.Deactivation:connect(function()
|
||||
Off()
|
||||
end)
|
||||
toolbar = self:CreateToolbar("Utilities")
|
||||
toolbarbutton = toolbar:CreateButton("", "Stamper Wizard: Make models you can stamp out!", "stampwizard.png")
|
||||
toolbarbutton.Click:connect(function()
|
||||
if on then
|
||||
Off()
|
||||
elseif loaded then
|
||||
On()
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
|
||||
|
||||
-----------------------
|
||||
--FUNCTION DEFINITIONS-
|
||||
-----------------------
|
||||
|
||||
function roundToGrid(vect)
|
||||
return Vector3.new(math.ceil(vect.X/4)*4, math.ceil(vect.Y/4)*4, math.ceil(vect.Z/4)*4)
|
||||
end
|
||||
|
||||
function toAlignmentString(vect)
|
||||
local aString = ""
|
||||
aString = aString .. tostring(math.floor(vect.X*100 + .5) / 100) .. ", "
|
||||
aString = aString .. tostring(math.floor(vect.Y*100 + .5) / 100) .. ", "
|
||||
aString = aString .. tostring(math.floor(vect.Z*100 + .5) / 100)
|
||||
return aString
|
||||
end
|
||||
|
||||
function updateBBPreview()
|
||||
while bbPreviewBox.Visible do
|
||||
myModel:SetIdentityOrientation()
|
||||
local myModelSize = myModel:GetModelSize()
|
||||
bbPreview.Size = roundToGrid(myModelSize)
|
||||
bbPreview.CFrame = myModel:GetModelCFrame() + alignmentVect*(bbPreview.Size - myModelSize)*.5
|
||||
if whichStep == 3 then selectedLabel.Text = "Size: " .. tostring(bbPreview.Size)
|
||||
elseif whichStep == 4 then selectedLabel.Text = "Alignment: " .. toAlignmentString(alignmentVect)
|
||||
elseif whichStep == 5 then selectedLabel.Text = alignToFaceText
|
||||
elseif whichStep == 6 then selectedLabel.Text = unjoinableFacesText
|
||||
elseif whichStep == 7 then selectedLabel.Text = unstampableFacesText end
|
||||
wait(.1)
|
||||
end
|
||||
bbPreviewCoroutine = nil
|
||||
end
|
||||
|
||||
function getFaceArrayText(array)
|
||||
local currText = ""
|
||||
local foundOne = false
|
||||
for i = 1, 6 do
|
||||
if array[i] then
|
||||
if foundOne then currText = currText .. ", " end
|
||||
currText = currText .. string.gsub(tostring(SURFACE_FROM_NUMBER[i]), "Enum.NormalId.", "")
|
||||
foundOne = true
|
||||
end
|
||||
end
|
||||
if not foundOne then return "[None]" else return currText end
|
||||
end
|
||||
|
||||
|
||||
function loadMetaData(myModel)
|
||||
if not myModel or not myModel:IsA("Model") then return end
|
||||
|
||||
if myModel.PrimaryPart then myPrimaryPart = myModel.PrimaryPart end
|
||||
|
||||
local jTag = myModel:FindFirstChild("Justification")
|
||||
local aTag = myModel:FindFirstChild("AutoAlignToFace")
|
||||
local usTag = myModel:FindFirstChild("UnstampableFaces")
|
||||
local ujTag = myModel:FindFirstChild("UnjoinableFaces")
|
||||
if jTag then
|
||||
alignmentVect = -jTag.Value + Vector3.new(1, 1, 1)
|
||||
end
|
||||
if aTag then
|
||||
alignToFaceSelection.TargetSurface = REVERSE_ALIGN_TO_FACE_MAPPING[aTag.Value]
|
||||
alignToFaceText = string.gsub(tostring(alignToFaceSelection.TargetSurface), "Enum.NormalId.", "")
|
||||
end
|
||||
if usTag then
|
||||
local uString = usTag.Value
|
||||
for i = 1, 6 do unstampableFaces[i] = false end
|
||||
|
||||
for w in string.gmatch(uString, "[^,]*") do
|
||||
if tonumber(w) then unstampableFaces[REVERSE_UNSTAMPABLE_FACE_MAPPING[tonumber(w)]] = true end
|
||||
end
|
||||
unstampableFacesText = getFaceArrayText(unstampableFaces)
|
||||
end
|
||||
if ujTag then
|
||||
local uString = ujTag.Value
|
||||
for i = 1, 6 do unjoinableFaces[i] = false end
|
||||
|
||||
for w in string.gmatch(uString, "[^,]*") do
|
||||
if tonumber(w) then unjoinableFaces[REVERSE_UNSTAMPABLE_FACE_MAPPING[tonumber(w)]] = true end
|
||||
end
|
||||
unjoinableFacesText = getFaceArrayText(unjoinableFaces)
|
||||
end
|
||||
end
|
||||
|
||||
function setupStamper(stampModel)
|
||||
if stampControl then stampControl.Destroy() end
|
||||
if stampingCon then
|
||||
stampingCon:disconnect()
|
||||
stampingCon = nil
|
||||
end
|
||||
|
||||
stampControl = RbxStamper.SetupStamperDragger(stampModel, mouse)
|
||||
stampingCon = stampControl.Stamped.Changed:connect(function()
|
||||
if stampControl and stampControl.Stamped.Value then
|
||||
stampControl.ReloadModel()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local stampTesting = false
|
||||
function testStamperModel()
|
||||
if stampTesting then
|
||||
stopStampTest()
|
||||
else
|
||||
startStampTest()
|
||||
end
|
||||
end
|
||||
|
||||
local stampedModelListener = nil
|
||||
local stampedModels = {}
|
||||
|
||||
|
||||
function listenForStampedModels(childAdded)
|
||||
if childAdded and childAdded.Parent == game.Workspace and childAdded:FindFirstChild("RobloxStamper", true) then
|
||||
table.insert(stampedModels, childAdded)
|
||||
end
|
||||
end
|
||||
|
||||
function insertStamperTags(parentModel)
|
||||
local stampTag = parentModel:FindFirstChild("RobloxStamper")
|
||||
if not stampTag then
|
||||
stampTag = Instance.new("BoolValue")
|
||||
stampTag.Name = "RobloxStamper"
|
||||
stampTag.Parent = parentModel
|
||||
end
|
||||
|
||||
local modelTag = parentModel:FindFirstChild("RobloxModel")
|
||||
if not modelTag then
|
||||
modelTag = Instance.new("BoolValue")
|
||||
modelTag.Name = "RobloxModel"
|
||||
modelTag.Parent = parentModel
|
||||
end
|
||||
end
|
||||
|
||||
function startStampTest()
|
||||
stampTesting = true
|
||||
testButton.Text = "Stop testing"
|
||||
|
||||
-- start listening for all models stamped via testing mechanism
|
||||
stampedModelListener = game.Workspace.ChildAdded:connect(listenForStampedModels)
|
||||
|
||||
local cloneInstance = myModel:Clone()
|
||||
finishModel(cloneInstance)
|
||||
insertStamperTags(cloneInstance)
|
||||
cloneInstance:ResetOrientationToIdentity()
|
||||
cloneInstance:BreakJoints()
|
||||
setupStamper(cloneInstance)
|
||||
end
|
||||
|
||||
function stopStampTest()
|
||||
stampTesting = false
|
||||
testButton.Text = "Test it!"
|
||||
|
||||
if stampControl then
|
||||
stampControl.Destroy()
|
||||
end
|
||||
|
||||
-- remove all models stamped via testing mechanism
|
||||
if stampedModelListener then stampedModelListener:disconnect() end
|
||||
for i = 1, #stampedModels do stampedModels[i]:Remove() end
|
||||
stampedModels = {}
|
||||
end
|
||||
|
||||
|
||||
-- just returns the first ancestor of type "Model", but nil if that model is a direct parent of the game (like game.Workspace)
|
||||
function getModelFromPart(part)
|
||||
if not part then return {} end
|
||||
if part.Parent == game then return {} end
|
||||
if part:IsA("Model") then
|
||||
return {part}
|
||||
else
|
||||
return getModelFromPart(part.Parent)
|
||||
end
|
||||
end
|
||||
|
||||
function onClicked(mouse)
|
||||
if surfaceSelection.Visible then
|
||||
if whichStep == 5 then
|
||||
if alignToFaceSelection.Visible and alignToFaceSelection.TargetSurface == surfaceSelection.TargetSurface then
|
||||
-- turn off that face
|
||||
alignToFaceText = "[None]"
|
||||
alignToFaceSelection.Visible = false
|
||||
else
|
||||
alignToFaceSelection.TargetSurface = surfaceSelection.TargetSurface
|
||||
alignToFaceSelection.Visible = true
|
||||
alignToFaceText = string.gsub(tostring(alignToFaceSelection.TargetSurface), "Enum.NormalId.", "")
|
||||
end
|
||||
elseif whichStep == 6 then
|
||||
local whichFace = SURFACE_TO_NUMBER[surfaceSelection.TargetSurface]
|
||||
local unjoinableFaceSelector = unjoinableFaceSelections[whichFace]
|
||||
if unjoinableFaceSelector.Visible then
|
||||
unjoinableFaceSelector.Visible = false
|
||||
unjoinableFaces[whichFace] = false
|
||||
unjoinableFacesText = getFaceArrayText(unjoinableFaces)
|
||||
else
|
||||
unjoinableFaceSelector.Visible = true
|
||||
unjoinableFaces[whichFace] = true
|
||||
unjoinableFacesText = getFaceArrayText(unjoinableFaces)
|
||||
end
|
||||
elseif whichStep == 7 then
|
||||
local whichFace = SURFACE_TO_NUMBER[surfaceSelection.TargetSurface]
|
||||
local unstampableFaceSelector = unstampableFaceSelections[whichFace]
|
||||
if unstampableFaceSelector.Visible then
|
||||
unstampableFaceSelector.Visible = false
|
||||
unstampableFaces[whichFace] = false
|
||||
unstampableFacesText = getFaceArrayText(unstampableFaces)
|
||||
else
|
||||
unstampableFaceSelector.Visible = true
|
||||
unstampableFaces[whichFace] = true
|
||||
unstampableFacesText = getFaceArrayText(unstampableFaces)
|
||||
end
|
||||
end
|
||||
elseif whichStep == 1 then
|
||||
-- allow them to click directly on the model they want to choose
|
||||
if mouse.Target then game.Selection:Set(getModelFromPart(mouse.Target)) end
|
||||
elseif whichStep == 2 then
|
||||
-- allow them to click directly on the part they want to choose
|
||||
if mouse.Target then game.Selection:Set({mouse.Target}) end
|
||||
end
|
||||
end
|
||||
|
||||
function updateFacePreview()
|
||||
while bbPreview.Parent do
|
||||
if mouse.Target == bbPreview and (whichStep ~= 5 or (mouse.TargetSurface ~= Enum.NormalId.Top and mouse.TargetSurface ~= Enum.NormalId.Bottom)) then
|
||||
surfaceSelection.TargetSurface = mouse.TargetSurface
|
||||
surfaceSelection.Visible = true
|
||||
if (whichStep == 5 and alignToFaceSelection.Visible and alignToFaceSelection.TargetSurface == surfaceSelection.TargetSurface) then surfaceSelection.Color = BrickColor.new("Toothpaste")
|
||||
elseif (whichStep == 6 and unjoinableFaces[SURFACE_TO_NUMBER[surfaceSelection.TargetSurface]]) then surfaceSelection.Color = BrickColor.new("New Yeller")
|
||||
elseif (whichStep == 7 and unstampableFaces[SURFACE_TO_NUMBER[surfaceSelection.TargetSurface]]) then surfaceSelection.Color = BrickColor.new("Really red")
|
||||
else surfaceSelection.Color = BrickColor.new("Light stone grey") end
|
||||
else
|
||||
surfaceSelection.Visible = false
|
||||
end
|
||||
|
||||
wait(.1)
|
||||
end
|
||||
facePreviewCoroutine = nil
|
||||
end
|
||||
|
||||
function alignmentTruncate(num)
|
||||
if num < -1 then return -1
|
||||
elseif num > 1 then return 1
|
||||
else return num end
|
||||
end
|
||||
|
||||
function dragBB(face, dist)
|
||||
if face == Enum.NormalId.Front then
|
||||
alignmentVect = Vector3.new(alignmentVect.X, alignmentVect.Y, alignmentTruncate(math.ceil(-dist/20)))
|
||||
elseif face == Enum.NormalId.Back then
|
||||
alignmentVect = Vector3.new(alignmentVect.X, alignmentVect.Y, alignmentTruncate(math.floor(dist/20)))
|
||||
elseif face == Enum.NormalId.Bottom then
|
||||
alignmentVect = Vector3.new(alignmentVect.X, alignmentTruncate(math.ceil(-dist/20)), alignmentVect.Z)
|
||||
elseif face == Enum.NormalId.Top then
|
||||
alignmentVect = Vector3.new(alignmentVect.X, alignmentTruncate(math.floor(dist/20)), alignmentVect.Z)
|
||||
elseif face == Enum.NormalId.Left then
|
||||
alignmentVect = Vector3.new(alignmentTruncate(math.ceil(-dist/20)), alignmentVect.Y, alignmentVect.Z)
|
||||
elseif face == Enum.NormalId.Right then
|
||||
alignmentVect = Vector3.new(alignmentTruncate(math.floor(dist/20)), alignmentVect.Y, alignmentVect.Z)
|
||||
else return end
|
||||
end
|
||||
|
||||
|
||||
function refreshPage(whichPage)
|
||||
print("refresh")
|
||||
if whichPage == 1 then
|
||||
-- Select Model
|
||||
continueButton.Text = "Continue"
|
||||
infoBox.Text = "Select the model you want to turn into a stamper part."
|
||||
if myModel then selectedLabel.Text = myModel.Name setContinueEnabled(true) if #game.Selection:Get() ~= 1 or game.Selection:Get()[1] ~= myModel then game.Selection:Set({myModel}) end else selectedLabel.Text = "[None]" setContinueEnabled(false) end
|
||||
elseif whichPage == 2 then
|
||||
-- Select Primary Part
|
||||
bbPreviewBox.Visible = false
|
||||
infoBox.Text = "Select one part inside your model to be the \"key part\"."
|
||||
if myPrimaryPart then selectedLabel.Text = myPrimaryPart.Name setContinueEnabled(true) if #game.Selection:Get() ~= 1 or game.Selection:Get()[1] ~= myPrimaryPart then game.Selection:Set({myPrimaryPart}) end else selectedLabel.Text = "[None]" setContinueEnabled(false) end
|
||||
elseif whichPage == 3 then
|
||||
-- Create Bounding Box
|
||||
alignmentHandles.Visible = false
|
||||
myModel.PrimaryPart = myPrimaryPart
|
||||
infoBox.Text = "Rotate and adjust the model so the green bounding box looks good."
|
||||
if #game.Selection:Get() ~= 1 or game.Selection:Get()[1] ~= myModel then game.Selection:Set({myModel}) end
|
||||
|
||||
setContinueEnabled(true)
|
||||
elseif whichPage == 4 then
|
||||
-- Set Alignment Within Bounding Box
|
||||
infoBox.Text = "Move the green bounding box so your model is aligned correctly inside it."
|
||||
alignToFaceSelection.Visible = false
|
||||
surfaceSelection.Visible = false
|
||||
alignmentHandles.Visible = true
|
||||
if #game.Selection:Get() ~= 1 or game.Selection:Get()[1] ~= myModel then game.Selection:Set({myModel}) end
|
||||
bbPreview.Parent = nil
|
||||
setContinueEnabled(true)
|
||||
elseif whichPage == 5 then
|
||||
-- AutoAlignToFace
|
||||
alignmentHandles.Visible = false
|
||||
if (alignToFaceText ~= "[None]") then alignToFaceSelection.Visible = true end
|
||||
for i = 1, 6 do unjoinableFaceSelections[i].Visible = false end
|
||||
infoBox.Text = "[Optional Step]: Select a side to be \"always facing the wall\"."
|
||||
if #game.Selection:Get() ~= 0 then game.Selection:Set({}) end
|
||||
setContinueEnabled(true)
|
||||
elseif whichPage == 6 then
|
||||
-- Unjoinable Faces
|
||||
alignToFaceSelection.Visible = false
|
||||
for i = 1, 6 do unjoinableFaceSelections[i].Visible = unjoinableFaces[i] end
|
||||
for i = 1, 6 do unstampableFaceSelections[i].Visible = false end
|
||||
infoBox.Text = "[Optional Step]: Select any sides you don't want things to join to when stamping."
|
||||
if #game.Selection:Get() ~= 0 then game.Selection:Set({}) end
|
||||
setContinueEnabled(true)
|
||||
elseif whichPage == 7 then
|
||||
-- Unstampable Faces
|
||||
for i = 1, 6 do unstampableFaceSelections[i].Visible = unstampableFaces[i] end
|
||||
for i = 1, 6 do unjoinableFaceSelections[i].Visible = false end
|
||||
infoBox.Text = "[Optional Step]: Select any sides you don't want to be stampable or have things stamp to."
|
||||
continueButton.Text = "Continue"
|
||||
testButton.Visible = false
|
||||
if #game.Selection:Get() ~= 0 then game.Selection:Set({}) end
|
||||
setContinueEnabled(true)
|
||||
stopStampTest()
|
||||
elseif whichPage == 8 then
|
||||
-- Test it out!
|
||||
for i = 1, 6 do unstampableFaceSelections[i].Visible = false end
|
||||
bbPreview.Parent = nil
|
||||
selectedLabel.Text = myModel.Name
|
||||
infoBox.Text = "Test it out! Click \"Finish\" when it's ready to publish!"
|
||||
continueButton.Text = "Finish"
|
||||
testButton.Visible = true
|
||||
setContinueEnabled(true)
|
||||
end
|
||||
|
||||
if whichPage >=3 and whichPage <= 7 then
|
||||
bbPreviewBox.Visible = true
|
||||
|
||||
if not bbPreviewCoroutine then
|
||||
bbPreviewCoroutine = coroutine.create(updateBBPreview)
|
||||
coroutine.resume(bbPreviewCoroutine)
|
||||
end
|
||||
|
||||
if whichPage > 4 then
|
||||
bbPreview.Parent = game.Workspace
|
||||
if not facePreviewCoroutine then
|
||||
facePreviewCoroutine = coroutine.create(updateFacePreview)
|
||||
coroutine.resume(facePreviewCoroutine)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
stepText.Text = "Step " .. tostring(whichPage) .. " of 8"
|
||||
end
|
||||
|
||||
|
||||
function setContinueEnabled(isEnabled)
|
||||
if isEnabled then
|
||||
continueButton.TextColor3 = Color3.new(1, 1, 1)
|
||||
else
|
||||
continueButton.TextColor3 = Color3.new(.5, .5, .5)
|
||||
end
|
||||
continueEnabled = isEnabled
|
||||
end
|
||||
|
||||
function setBackEnabled(isEnabled)
|
||||
if isEnabled then
|
||||
backButton.TextColor3 = Color3.new(1, 1, 1)
|
||||
else
|
||||
backButton.TextColor3 = Color3.new(.5, .5, .5)
|
||||
end
|
||||
backEnabled = isEnabled
|
||||
end
|
||||
|
||||
function onSelect()
|
||||
print("onSelect")
|
||||
local selected = game.Selection:Get()
|
||||
|
||||
if whichStep == 1 then -- looking for a single model to be selected
|
||||
if #selected == 1 and selected[1] == myModel then return end
|
||||
|
||||
if #selected == 1 and selected[1]:IsA("Model") and selected[1] ~= game.Workspace then
|
||||
myModel = selected[1]
|
||||
myPrimaryPart = nil
|
||||
else
|
||||
myModel = nil
|
||||
myPrimaryPart = nil
|
||||
end
|
||||
refreshPage(1)
|
||||
elseif whichStep == 2 then
|
||||
if #selected == 1 and selected[1] == myPrimaryPart then return end
|
||||
|
||||
if #selected == 1 and selected[1]:IsA("BasePart") and selected[1].Parent == myModel then
|
||||
myPrimaryPart = selected[1]
|
||||
else
|
||||
myPrimaryPart = nil
|
||||
end
|
||||
refreshPage(2)
|
||||
end
|
||||
end
|
||||
|
||||
function On()
|
||||
self:Activate(true)
|
||||
toolbarbutton:SetActive(true)
|
||||
frame.Visible = true
|
||||
|
||||
for w = 0, 0.6, 0.12 do
|
||||
frame.Size = UDim2.new(w, 0, 2*w/3, 0)
|
||||
wait()
|
||||
end
|
||||
|
||||
on = true
|
||||
|
||||
-- connect to the game's selection
|
||||
selectionConnection = game.Selection.SelectionChanged:connect(onSelect)
|
||||
|
||||
refreshPage(whichStep)
|
||||
end
|
||||
|
||||
function Off()
|
||||
toolbarbutton:SetActive(false)
|
||||
|
||||
for w = 0.6, 0, -0.12 do
|
||||
frame.Size = UDim2.new(w, 0, 2*w/3, 0)
|
||||
wait()
|
||||
end
|
||||
|
||||
frame.Visible = false
|
||||
on = false
|
||||
|
||||
if selectionConnection then selectionConnection:disconnect() selectionConnection = nil end
|
||||
|
||||
alignmentHandles.Visible = false
|
||||
surfaceSelection.Visible = false
|
||||
alignToFaceSelection.Visible = false
|
||||
for i = 1, 6 do unstampableFaceSelections[i].Visible = false end
|
||||
for i = 1, 6 do unjoinableFaceSelections[i].Visible = false end
|
||||
|
||||
stopStampTest()
|
||||
|
||||
if whichStep ~= 3 then bbPreviewBox.Visible = false end
|
||||
bbPreview.Parent = nil
|
||||
end
|
||||
|
||||
function resetWizard()
|
||||
bbPreview.Parent = nil
|
||||
bbPreviewBox.Visible = false
|
||||
wait(.5) -- so that we can kill our coroutines safely
|
||||
|
||||
myModel = nil
|
||||
myPrimaryPart = nil
|
||||
whichStep = 1
|
||||
for i = 1, 6 do unstampableFaces[i] = false end
|
||||
for i = 1, 6 do unjoinableFaces[i] = false end
|
||||
alignToFaceText = "[None]"
|
||||
alignmentVect = Vector3.new(0, 0, 0)
|
||||
testButton.Visible = false
|
||||
|
||||
setBackEnabled(false)
|
||||
setContinueEnabled(false)
|
||||
|
||||
alignmentHandles.Visible = false
|
||||
surfaceSelection.Visible = false
|
||||
alignToFaceSelection.Visible = false
|
||||
for i = 1, 6 do unstampableFaceSelections[i].Visible = false unstampableFaces[i] = false end
|
||||
for i = 1, 6 do unjoinableFaceSelections[i].Visible = false unjoinableFaces[i] = false end
|
||||
|
||||
refreshPage(whichStep)
|
||||
end
|
||||
|
||||
function finishModel(model)
|
||||
if alignmentVect.magnitude > .04 then
|
||||
local alignTag = model:FindFirstChild("Justification")
|
||||
if not alignTag then alignTag = Instance.new("Vector3Value") end
|
||||
alignTag.Name = "Justification"
|
||||
alignTag.Value = -alignmentVect + Vector3.new(1, 1, 1)
|
||||
alignTag.Parent = model
|
||||
elseif model:FindFirstChild("Justification") then model.Justification:Remove() end
|
||||
|
||||
if alignToFaceText ~= "[None]" then
|
||||
local autoAlignToFaceTag = model:FindFirstChild("AutoAlignToFace")
|
||||
if not autoAlignToFaceTag then autoAlignToFaceTag = Instance.new("NumberValue") end
|
||||
autoAlignToFaceTag.Name = "AutoAlignToFace"
|
||||
autoAlignToFaceTag.Value = ALIGN_TO_FACE_MAPPING[SURFACE_TO_NUMBER[alignToFaceSelection.TargetSurface]]
|
||||
autoAlignToFaceTag.Parent = model
|
||||
elseif model:FindFirstChild("AutoAlignToFace") then model.AutoAlignToFace:Remove() end
|
||||
|
||||
local unstampableFaceString = ""
|
||||
local foundOne = false
|
||||
for i = 1, #unstampableFaces do
|
||||
if unstampableFaces[i] then
|
||||
if foundOne then unstampableFaceString = unstampableFaceString .. ", " end
|
||||
unstampableFaceString = unstampableFaceString .. UNSTAMPABLE_FACE_MAPPING[i]
|
||||
foundOne = true
|
||||
end
|
||||
end
|
||||
if foundOne then
|
||||
local unstampableFaceTag = model:FindFirstChild("UnstampableFaces")
|
||||
if not unstampableFaceTag then unstampableFaceTag = Instance.new("StringValue") end
|
||||
unstampableFaceTag.Name = "UnstampableFaces"
|
||||
unstampableFaceTag.Value = unstampableFaceString
|
||||
unstampableFaceTag.Parent = model
|
||||
elseif model:FindFirstChild("UnstampableFaces") then model.UnstampableFaces:Remove() end
|
||||
|
||||
local unjoinableFaceString = ""
|
||||
foundOne = false
|
||||
for i = 1, #unjoinableFaces do
|
||||
if unjoinableFaces[i] then
|
||||
if foundOne then unjoinableFaceString = unjoinableFaceString .. ", " end
|
||||
unjoinableFaceString = unjoinableFaceString .. UNSTAMPABLE_FACE_MAPPING[i]
|
||||
foundOne = true
|
||||
end
|
||||
end
|
||||
if foundOne then
|
||||
local unjoinableFaceTag = model:FindFirstChild("UnjoinableFaces")
|
||||
if not unjoinableFaceTag then unjoinableFaceTag = Instance.new("StringValue") end
|
||||
unjoinableFaceTag.Name = "UnjoinableFaces"
|
||||
unjoinableFaceTag.Value = unjoinableFaceString
|
||||
unjoinableFaceTag.Parent = model
|
||||
elseif model:FindFirstChild("UnjoinableFaces") then model.UnjoinableFaces:Remove() end
|
||||
end
|
||||
|
||||
function goBack()
|
||||
if backEnabled then
|
||||
whichStep = whichStep - 1
|
||||
if whichStep == 1 then setBackEnabled(false) end
|
||||
setContinueEnabled(true)
|
||||
refreshPage(whichStep)
|
||||
end
|
||||
end
|
||||
|
||||
function goForwards()
|
||||
if continueEnabled then
|
||||
whichStep = whichStep + 1
|
||||
setContinueEnabled(false)
|
||||
setBackEnabled(true)
|
||||
if whichStep == 9 then
|
||||
stopStampTest()
|
||||
finishModel(myModel)
|
||||
resetWizard()
|
||||
--Off() -- if we want to auto-close the wizard after we finish
|
||||
else
|
||||
if whichStep == 2 then
|
||||
-- upon selecting a model, we propagate all other values with the current model's values
|
||||
loadMetaData(myModel)
|
||||
end
|
||||
|
||||
refreshPage(whichStep)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
------
|
||||
--GUI-
|
||||
------
|
||||
--screengui
|
||||
g = Instance.new("ScreenGui", game:GetService("CoreGui"))
|
||||
|
||||
--frame
|
||||
frame = Instance.new("Frame", g)
|
||||
frame.Position = UDim2.new(0.2, 20, 0, 0)
|
||||
frame.Size = UDim2.new(0.6, -40, .4, 0)
|
||||
frame.Style = Enum.FrameStyle.RobloxRound
|
||||
frame.BackgroundTransparency = 0.5
|
||||
frame.Visible = false
|
||||
|
||||
titleText = Instance.new("TextLabel", frame)
|
||||
titleText.Name = "Title"
|
||||
titleText.BackgroundTransparency = 1
|
||||
titleText.Font = Enum.Font.ArialBold
|
||||
titleText.FontSize = Enum.FontSize.Size24
|
||||
titleText.Size = UDim2.new(1, 0, 0, 24)
|
||||
titleText.Text = "Stamper Model Maker"
|
||||
titleText.TextColor3 = Color3.new(1,1,1)
|
||||
titleText.TextYAlignment = Enum.TextYAlignment.Center
|
||||
|
||||
stepText = titleText:Clone()
|
||||
stepText.Name = "StepsLabel"
|
||||
stepText.Text = "Step 1 of 6"
|
||||
stepText.Position = UDim2.new(0, -5, .81, 0)
|
||||
stepText.Font = Enum.Font.Arial
|
||||
stepText.Parent = frame
|
||||
|
||||
infoBox = Instance.new("TextLabel", frame)
|
||||
infoBox.Name = "InfoBox"
|
||||
infoBox.Font = Enum.Font.Arial
|
||||
infoBox.FontSize = Enum.FontSize.Size24
|
||||
infoBox.Size = UDim2.new(1,0,0,24)
|
||||
infoBox.Position = UDim2.new(0, 0, 0.15, 0)
|
||||
infoBox.BackgroundTransparency = 0.75
|
||||
infoBox.TextColor3 = Color3.new(1,1,1)
|
||||
infoBox.Text = "Select the model you want to turn into a stamper part."
|
||||
infoBox.TextWrap = false
|
||||
infoBox.TextXAlignment = Enum.TextXAlignment.Left
|
||||
infoBox.TextYAlignment = Enum.TextYAlignment.Top
|
||||
infoBox.Visible = true
|
||||
|
||||
modelInfoFrame = Instance.new("Frame", frame)
|
||||
modelInfoFrame.Style = Enum.FrameStyle.RobloxRound
|
||||
modelInfoFrame.Name = "ModelInfo"
|
||||
modelInfoFrame.Position = UDim2.new(.395, 0, .325, 0)
|
||||
modelInfoFrame.Size = UDim2.new(.2, 0, .4, 0)
|
||||
|
||||
selectedLabel = stepText:Clone()
|
||||
selectedLabel.Name = "SelectionLabel"
|
||||
selectedLabel.Text = "[None]"
|
||||
selectedLabel.Position = UDim2.new(0, 0, .35, 0)
|
||||
selectedLabel.Parent = modelInfoFrame
|
||||
|
||||
backButton = Instance.new("TextButton", frame)
|
||||
backButton.Name = "Back"
|
||||
backButton.Font = Enum.Font.Arial
|
||||
backButton.FontSize = Enum.FontSize.Size18
|
||||
backButton.Size = UDim2.new(0, 200, 0, 50)
|
||||
backButton.Position = UDim2.new(0, 1, 1, -55)
|
||||
backButton.BackgroundTransparency = 1
|
||||
backButton.Style = Enum.ButtonStyle.RobloxButtonDefault
|
||||
backButton.Text = "Back"
|
||||
backButton.TextColor3 = Color3.new(0.5, 0.5, 0.5)
|
||||
backButton.MouseButton1Click:connect(goBack)
|
||||
|
||||
continueButton = backButton:Clone()
|
||||
continueButton.Name = "Continue"
|
||||
continueButton.Text = "Continue"
|
||||
continueButton.Position = UDim2.new(1, -200, 1, -55)
|
||||
continueButton.MouseButton1Click:connect(goForwards)
|
||||
continueButton.Parent = frame
|
||||
|
||||
testButton = backButton:Clone()
|
||||
testButton.Name = "Test"
|
||||
testButton.Text = "Test it!"
|
||||
testButton.TextColor3 = Color3.new(1, 1, 1)
|
||||
testButton.Position = UDim2.new(1, -200, 1, -110)
|
||||
testButton.MouseButton1Click:connect(testStamperModel)
|
||||
testButton.Visible = false
|
||||
testButton.Parent = frame
|
||||
|
||||
bbPreviewBox = Instance.new("SelectionBox")
|
||||
bbPreviewBox.Color = BrickColor.new("Lime green")
|
||||
bbPreviewBox.Adornee = bbPreview
|
||||
bbPreviewBox.Visible = false
|
||||
bbPreviewBox.Parent = frame
|
||||
|
||||
alignmentHandles = Instance.new("Handles")
|
||||
alignmentHandles.Visible = false
|
||||
alignmentHandles.Adornee = bbPreview
|
||||
alignmentHandles.Parent = frame
|
||||
alignmentHandles.MouseDrag:connect(dragBB)
|
||||
alignmentHandles.Color = BrickColor.new("Lime green")
|
||||
|
||||
surfaceSelection = Instance.new("SurfaceSelection")
|
||||
surfaceSelection.Name = "SurfaceSelection"
|
||||
surfaceSelection.Color = BrickColor.new("White")
|
||||
surfaceSelection.Transparency = .8
|
||||
surfaceSelection.Visible = false
|
||||
surfaceSelection.Adornee = bbPreview
|
||||
|
||||
alignToFaceSelection = surfaceSelection:Clone()
|
||||
alignToFaceSelection.Name = "AlignToFaceSelection"
|
||||
alignToFaceSelection.Color = BrickColor.new("Cyan")
|
||||
|
||||
unstampableFaceSelections = {}
|
||||
for i = 1, 6 do
|
||||
local newUnstampableFaceSelection = alignToFaceSelection:Clone()
|
||||
newUnstampableFaceSelection.Name = "UnstampableFaceSelection"
|
||||
newUnstampableFaceSelection.Color = BrickColor.new("Bright red")
|
||||
newUnstampableFaceSelection.TargetSurface = SURFACE_FROM_NUMBER[i]
|
||||
newUnstampableFaceSelection.Parent = frame
|
||||
table.insert(unstampableFaceSelections, newUnstampableFaceSelection)
|
||||
end
|
||||
|
||||
unjoinableFaceSelections = {}
|
||||
for i = 1, 6 do
|
||||
local newUnjoinableFaceSelection = alignToFaceSelection:Clone()
|
||||
newUnjoinableFaceSelection.Name = "UnjoinableFaceSelection"
|
||||
newUnjoinableFaceSelection.Color = BrickColor.new("Deep orange")
|
||||
newUnjoinableFaceSelection.TargetSurface = SURFACE_FROM_NUMBER[i]
|
||||
newUnjoinableFaceSelection.Parent = frame
|
||||
table.insert(unjoinableFaceSelections, newUnjoinableFaceSelection)
|
||||
end
|
||||
|
||||
alignToFaceSelection.Parent = frame
|
||||
surfaceSelection.Parent = frame
|
||||
|
||||
|
||||
-- load the lib'ary!
|
||||
RbxStamper = LoadLibrary("RbxStamper")
|
||||
|
||||
if not RbxStamper then
|
||||
print("Error: RbxStamper Library Load Fail! Returning")
|
||||
return nil
|
||||
end
|
||||
|
||||
|
||||
--------------------------
|
||||
--SUCCESSFUL LOAD MESSAGE-
|
||||
--------------------------
|
||||
loaded = true
|
||||
print("StamperWizard Plugin Loaded")
|
||||
Reference in New Issue
Block a user