forked from aya/aya
Initial commit
This commit is contained in:
476
client/common/content/scripts/AvatarView.lua
Normal file
476
client/common/content/scripts/AvatarView.lua
Normal file
@@ -0,0 +1,476 @@
|
||||
local avatarViewService = game:GetService('AvatarViewService')
|
||||
local ayaService = game:GetService('AyaService')
|
||||
local runService = game:GetService('RunService')
|
||||
local userInputService = game:GetService('UserInputService')
|
||||
userInputService.MouseIconEnabled = false
|
||||
game:GetService("ScriptContext").ScriptsDisabled = true
|
||||
game:GetService("ChangeHistoryService"):SetEnabled(false)
|
||||
|
||||
local wornAssets = {}
|
||||
|
||||
local Settings = UserSettings()
|
||||
local GameSettings = Settings.GameSettings
|
||||
local wornAssets = {}
|
||||
game:SetPlaceID(1818, false)
|
||||
local plr = game.Players:CreateLocalPlayer(0)
|
||||
plr:LoadCharacter()
|
||||
|
||||
local character = plr.Character
|
||||
|
||||
avatarViewService.AssetWorn:Connect(function(assetId, assetCategory)
|
||||
if wornAssets[assetId] then
|
||||
for _, child in pairs(character:GetChildren()) do
|
||||
local assetIntValue = child:FindFirstChild("AssetId")
|
||||
if assetIntValue and assetIntValue:IsA("IntValue") and assetIntValue.Value == assetId then
|
||||
child:Destroy()
|
||||
break
|
||||
end
|
||||
end
|
||||
wornAssets[assetId] = nil
|
||||
else
|
||||
print('lua assetid: ' .. assetId)
|
||||
|
||||
local model = game:GetObjects("ayaassetid://" .. assetId)[1]
|
||||
|
||||
if assetCategory == "face" then
|
||||
for _, child in ipairs(character.Head:GetChildren()) do
|
||||
if child:IsA("Decal") or child:IsA("Texture") then
|
||||
child:Destroy()
|
||||
end
|
||||
end
|
||||
model.Parent = character.Head
|
||||
else
|
||||
model.Parent = character
|
||||
end
|
||||
|
||||
local assetIntValue = Instance.new("IntValue")
|
||||
assetIntValue.Name = "AssetId"
|
||||
assetIntValue.Value = assetId
|
||||
assetIntValue.Parent = model
|
||||
|
||||
wornAssets[assetId] = model
|
||||
end
|
||||
end)
|
||||
|
||||
local character = plr.Character
|
||||
local rootPart = character:WaitForChild("HumanoidRootPart")
|
||||
local mouse = game:GetService('Players').LocalPlayer:GetMouse()
|
||||
local isRotating = false
|
||||
local isPanning = false
|
||||
local lastMousePos = Vector2.new()
|
||||
local rotationSpeed = 0.8
|
||||
local panSpeed = 0.02
|
||||
local currentOrbitAngles = Vector2.new(0, 0) -- (vertical, horizontal)
|
||||
local currentPanOffset = Vector3.new(0, 0, 0)
|
||||
local minVerticalAngle = math.rad(-180)
|
||||
local maxVerticalAngle = math.rad(180)
|
||||
|
||||
local initialPos = CFrame.new(0, 3, 0)
|
||||
local savedCamera = workspace.CurrentCamera.CFrame
|
||||
rootPart.CFrame = initialPos
|
||||
local basePosition = initialPos.p
|
||||
|
||||
-- body color begin
|
||||
|
||||
local function getHatsToIgnore(character)
|
||||
local ignoreList = {}
|
||||
for _, item in pairs(character:GetChildren()) do
|
||||
if item:IsA("Accessory") then
|
||||
table.insert(ignoreList, item)
|
||||
print(item.Name)
|
||||
end
|
||||
end
|
||||
if game.Workspace:FindFirstChild("FocusPart") then
|
||||
table.insert(ignoreList, game.Workspace.FocusPart)
|
||||
end
|
||||
return ignoreList
|
||||
end
|
||||
|
||||
local playerGui = game.Players.LocalPlayer.PlayerGui
|
||||
local character = game.Players.LocalPlayer.Character
|
||||
|
||||
local screenGui = Instance.new("ScreenGui")
|
||||
screenGui.Name = "ColorPickerBucket"
|
||||
screenGui.Parent = playerGui
|
||||
|
||||
local selectedButtonTable = {}
|
||||
local button = Instance.new("ImageButton")
|
||||
button.Parent = screenGui
|
||||
button.Image = "ayaasset://textures/paint.png"
|
||||
button.Size = UDim2.new(0, 21, 0, 21);
|
||||
button.Position = UDim2.new(0.94, -14, 0.02, 0);
|
||||
|
||||
button.BackgroundColor3 = Color3.new(1, 1, 1);
|
||||
button.BorderColor3 = Color3.new(0, 0, 0);
|
||||
|
||||
button.MouseEnter:Connect(function()
|
||||
button.BackgroundColor3 = Color3.new(0.431373, 0.6, 0.788235);
|
||||
end)
|
||||
|
||||
button.MouseLeave:Connect(function()
|
||||
button.BackgroundColor3 = Color3.new(1, 1, 1);
|
||||
end)
|
||||
|
||||
local selectionBox
|
||||
local selectionLasso
|
||||
local inGui = false
|
||||
local inPalette = false
|
||||
|
||||
local selectedButtonTable = {}
|
||||
local currentColor = BrickColor.new(1)
|
||||
local oldButton = nil
|
||||
|
||||
local player = game.Players.LocalPlayer
|
||||
|
||||
function onMouseLeave(hoverSelection)
|
||||
if oldButton ~= nil then
|
||||
local notSelected = true
|
||||
local selectionText = ""
|
||||
for key, value in pairs(selectedButtonTable) do
|
||||
if oldButton == value then
|
||||
notSelected = false
|
||||
else
|
||||
selectionText = value.BackgroundColor.Name
|
||||
end
|
||||
end
|
||||
if notSelected then
|
||||
hoverSelection.Text = selectionText
|
||||
oldButton.Parent.BackgroundColor = BrickColor.Black()
|
||||
end
|
||||
end
|
||||
oldButton = nil
|
||||
end
|
||||
|
||||
function onMouseEnter(hoverSelection, guiButton)
|
||||
onMouseLeave(hoverSelection)
|
||||
hoverSelection.Text = guiButton.BackgroundColor.Name
|
||||
if guiButton ~= selectedButton then
|
||||
guiButton.Parent.BackgroundColor = BrickColor.White()
|
||||
oldButton = guiButton
|
||||
end
|
||||
end
|
||||
|
||||
function onMouseUp(colorHolder, paletteFrame, guiButton)
|
||||
if selectedButtonTable[colorHolder] ~= nil then
|
||||
selectedButtonTable[colorHolder].Parent.BackgroundColor = BrickColor.Black()
|
||||
end
|
||||
guiButton.Parent.BackgroundColor = BrickColor.Yellow()
|
||||
colorHolder.BackgroundColor = guiButton.BackgroundColor
|
||||
selectionBox.Color = guiButton.BackgroundColor
|
||||
selectionLasso.Color = guiButton.BackgroundColor
|
||||
currentColor = guiButton.BackgroundColor
|
||||
selectedButtonTable[colorHolder] = guiButton
|
||||
|
||||
onMouseLeavePalette(paletteFrame)
|
||||
|
||||
print("Selected Color: " .. guiButton.BackgroundColor.Name)
|
||||
end
|
||||
|
||||
function onShowColorDialog(paletteFrame)
|
||||
paletteFrame.Visible = true
|
||||
end
|
||||
|
||||
function setSelectionBox(part)
|
||||
unsetSelectionBox()
|
||||
selectionBox.Adornee = part
|
||||
selectionLasso.Part = part
|
||||
end
|
||||
|
||||
function unsetSelectionBox()
|
||||
selectionBox.Adornee = nil
|
||||
selectionLasso.Part = nil
|
||||
end
|
||||
|
||||
function onMouseEnterGui(mouse)
|
||||
unsetSelectionBox()
|
||||
inGui = true
|
||||
end
|
||||
|
||||
function onMouseLeaveGui(mouse)
|
||||
inGui = false
|
||||
end
|
||||
|
||||
function onMouseEnterPalette(mouse)
|
||||
unsetSelectionBox()
|
||||
inPalette = true
|
||||
end
|
||||
|
||||
function onMouseLeavePalette(paletteFrame, mouse)
|
||||
paletteFrame.Visible = false
|
||||
inPalette = false
|
||||
end
|
||||
|
||||
local primaryColor = nil
|
||||
function buildGui(root, mouse)
|
||||
local mainFrame = Instance.new("Frame")
|
||||
mainFrame.Name = "MainFrame"
|
||||
mainFrame.Position = UDim2.new(0.0, 0, 1.0, -248)
|
||||
mainFrame.Size = UDim2.new(0.0, 200, 0.0, 250)
|
||||
mainFrame.Transparency = 1.0
|
||||
mainFrame.BackgroundColor = BrickColor.White()
|
||||
mainFrame.Parent = root
|
||||
|
||||
local paletteFrame = Instance.new("Frame")
|
||||
paletteFrame.Position = UDim2.new(0.0, 0, 0.0, -50)
|
||||
paletteFrame.Size = UDim2.new(1.0, 0, 4.0/5, 0)
|
||||
paletteFrame.BackgroundColor = BrickColor.White()
|
||||
paletteFrame.Visible = false
|
||||
paletteFrame.Parent = mainFrame
|
||||
paletteFrame.MouseEnter:Connect(function() print("EnterPalette") onMouseEnterPalette(mouse) end)
|
||||
paletteFrame.MouseLeave:Connect(function() print("LeavePalette") onMouseLeavePalette(paletteFrame, mouse) end)
|
||||
|
||||
local sideBar = Instance.new("Frame")
|
||||
sideBar.Position = UDim2.new(0.0, 0, 4.0/5, 0)
|
||||
sideBar.Size = UDim2.new(1.0, 0, 1.0/5, 0)
|
||||
sideBar.BackgroundColor = BrickColor.White()
|
||||
sideBar.Parent = mainFrame
|
||||
sideBar.MouseEnter:Connect(function() onMouseEnterGui(mouse) end)
|
||||
sideBar.MouseLeave:Connect(function() onMouseLeaveGui(mouse) end)
|
||||
|
||||
primaryColor = Instance.new("TextButton")
|
||||
primaryColor.Position = UDim2.new(0.75, 1, 0.0, 0)
|
||||
primaryColor.Size = UDim2.new(0.25, -1, 1.0, 0)
|
||||
primaryColor.Text = ""
|
||||
primaryColor.BackgroundColor = BrickColor.White()
|
||||
primaryColor.BorderColor = BrickColor.Black()
|
||||
primaryColor.BorderSizePixel = 1
|
||||
primaryColor.Parent = sideBar
|
||||
primaryColor.MouseButton1Down:Connect(function() print("Showdialog") onShowColorDialog(paletteFrame) end)
|
||||
|
||||
local hoverSelection = Instance.new("TextLabel")
|
||||
hoverSelection.Position = UDim2.new(0.0, 0, 0.0, 0)
|
||||
hoverSelection.Size = UDim2.new(0.75, 0, 1.0, 0)
|
||||
hoverSelection.BackgroundColor = BrickColor.White()
|
||||
hoverSelection.TextColor = BrickColor.Black()
|
||||
hoverSelection.TextSize = 16
|
||||
hoverSelection.Text = primaryColor.BackgroundColor.Name
|
||||
hoverSelection.Parent = sideBar
|
||||
|
||||
for xOffset = 0, 9 do
|
||||
for yOffset = 0,9 do
|
||||
local guiFrame = Instance.new("Frame")
|
||||
guiFrame.Position = UDim2.new(1.0/8 * xOffset, 0, 1.0/8*yOffset, 0)
|
||||
guiFrame.Size = UDim2.new(1.0/8, 0, 1.0/8, 0)
|
||||
guiFrame.BackgroundColor = BrickColor.Black()
|
||||
guiFrame.BorderSizePixel = 0
|
||||
guiFrame.Parent = paletteFrame
|
||||
|
||||
local guiButton = Instance.new("TextButton")
|
||||
guiButton.Position = UDim2.new(0.0, 2, 0.0, 2)
|
||||
guiButton.Size = UDim2.new(1.0, -4, 1.0, -4)
|
||||
guiButton.Text = ""
|
||||
guiButton.BorderSizePixel = 0
|
||||
guiButton.AutoButtonColor = false
|
||||
guiButton.BackgroundColor = BrickColor.palette(xOffset + yOffset*8)
|
||||
guiButton.MouseEnter:Connect(function() onMouseEnter(hoverSelection, guiButton) end)
|
||||
guiButton.MouseButton1Up:Connect(function() onMouseUp(primaryColor, paletteFrame, guiButton) end)
|
||||
guiButton.Parent = guiFrame
|
||||
|
||||
if guiButton.BackgroundColor == primaryColor.BackgroundColor then
|
||||
guiFrame.BackgroundColor = BrickColor.White()
|
||||
selectedButtonTable[primaryColor] = guiButton
|
||||
end
|
||||
end
|
||||
end
|
||||
mainFrame.MouseLeave:Connect(function() onMouseLeave(hoverSelection) end)
|
||||
end
|
||||
|
||||
function onPlayerSpawn()
|
||||
|
||||
end
|
||||
|
||||
player.CharacterAdded:Connect(onPlayerSpawn)
|
||||
|
||||
if player.Character then
|
||||
onPlayerSpawn()
|
||||
end
|
||||
|
||||
local HttpService = game:GetService("HttpService")
|
||||
|
||||
local function getBodyPartsAsJSON(character)
|
||||
local bodyParts = {}
|
||||
|
||||
for _, part in pairs(character:GetChildren()) do
|
||||
if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" then
|
||||
local bodyPartInfo = {
|
||||
name = part.Name,
|
||||
brickColor = part.BrickColor.Number
|
||||
}
|
||||
table.insert(bodyParts, bodyPartInfo)
|
||||
end
|
||||
end
|
||||
|
||||
local jsonBodyParts = HttpService:JSONEncode(bodyParts)
|
||||
return jsonBodyParts
|
||||
end
|
||||
|
||||
local isShowing = false
|
||||
local camera = workspace.CurrentCamera
|
||||
|
||||
mouse.Button1Down:Connect(function()
|
||||
if isShowing then
|
||||
local mousePosition = mouse.Hit.p
|
||||
|
||||
local origin = camera.CFrame.p
|
||||
|
||||
local direction = (mousePosition - origin).unit * 500
|
||||
local ray = Ray.new(origin, direction)
|
||||
|
||||
local ignoreList = getHatsToIgnore(player.Character)
|
||||
|
||||
local part, position = workspace:FindPartOnRayWithIgnoreList(ray, ignoreList)
|
||||
|
||||
if part and part:IsDescendantOf(player.Character) then
|
||||
print("Hit part: " .. part.Name)
|
||||
part.BrickColor = currentColor
|
||||
print(getBodyPartsAsJSON(character))
|
||||
avatarViewService:SetColor(getBodyPartsAsJSON(character)) -- : (
|
||||
else
|
||||
print("No valid body part hit")
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
local function applyBodyColorsToCharacter(character, jsonString)
|
||||
local bodyPartsColors = HttpService:JSONDecode(jsonString)
|
||||
|
||||
for _, bodyPartData in pairs(bodyPartsColors) do
|
||||
local bodyPartName = bodyPartData.name
|
||||
local brickColorValue = bodyPartData.brickColor
|
||||
|
||||
local bodyPart = character:FindFirstChild(bodyPartName)
|
||||
if bodyPart and bodyPart:IsA("BasePart") then
|
||||
bodyPart.BrickColor = BrickColor.new(brickColorValue)
|
||||
print("Applied color to " .. bodyPartName .. ": " .. tostring(brickColorValue))
|
||||
else
|
||||
print("Body part not found: " .. bodyPartName)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
button.MouseButton1Down:Connect(function()
|
||||
if isShowing == false then
|
||||
local mouse = player:GetMouse()
|
||||
|
||||
local guiMain = Instance.new("ScreenGui")
|
||||
guiMain.Parent = player:WaitForChild("PlayerGui")
|
||||
|
||||
inGui = false
|
||||
inPalette = false
|
||||
|
||||
buildGui(guiMain, mouse)
|
||||
|
||||
selectionBox = Instance.new("SelectionBox")
|
||||
selectionBox.Adornee = nil
|
||||
selectionBox.Parent = player.PlayerGui
|
||||
|
||||
selectionLasso = Instance.new("SelectionPartLasso")
|
||||
selectionLasso.Name = "Model Selection Lasso"
|
||||
selectionLasso.Humanoid = player.Character:WaitForChild("Humanoid")
|
||||
selectionLasso.Part = nil
|
||||
selectionLasso.Visible = true
|
||||
selectionLasso.Archivable = false
|
||||
selectionLasso.Parent = game.Workspace
|
||||
|
||||
selectionBox.Color = primaryColor.BackgroundColor
|
||||
selectionLasso.Color = primaryColor.BackgroundColor
|
||||
isShowing = true
|
||||
|
||||
else
|
||||
-- MainFrame
|
||||
for _, item in ipairs(player.PlayerGui:GetChildren()) do
|
||||
print(item.Name)
|
||||
end
|
||||
player.PlayerGui:WaitForChild("ScreenGui"):Destroy()
|
||||
print("asdkasojkdjioasdjoisdjoai")
|
||||
isShowing = false
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
-- body color end
|
||||
|
||||
local function clamp(value, min, max)
|
||||
return math.min(math.max(value, min), max)
|
||||
end
|
||||
|
||||
mouse.Button1Down:connect(function()
|
||||
isRotating = true
|
||||
lastMousePos = Vector2.new(mouse.X, mouse.Y)
|
||||
end)
|
||||
|
||||
mouse.Button1Up:connect(function()
|
||||
isRotating = false
|
||||
end)
|
||||
|
||||
mouse.Button2Down:connect(function()
|
||||
isPanning = true
|
||||
lastMousePos = Vector2.new(mouse.X, mouse.Y)
|
||||
end)
|
||||
|
||||
mouse.Button2Up:connect(function()
|
||||
isPanning = false
|
||||
end)
|
||||
|
||||
runService:BindToRenderStep("CharacterViewer", Enum.RenderPriority.Camera.Value + 1, function()
|
||||
local mouseDelta = Vector2.new(mouse.X, mouse.Y) - lastMousePos
|
||||
|
||||
if isRotating then
|
||||
currentOrbitAngles = Vector2.new(
|
||||
clamp(
|
||||
currentOrbitAngles.X - mouseDelta.Y * rotationSpeed * math.pi/180,
|
||||
minVerticalAngle,
|
||||
maxVerticalAngle
|
||||
),
|
||||
currentOrbitAngles.Y - mouseDelta.X * rotationSpeed * math.pi/180
|
||||
)
|
||||
elseif isPanning then
|
||||
local rightVector = Vector3.new(
|
||||
math.cos(currentOrbitAngles.Y - math.pi/2),
|
||||
0,
|
||||
math.sin(currentOrbitAngles.Y - math.pi/2)
|
||||
)
|
||||
local upVector = Vector3.new(0, 1, 0)
|
||||
|
||||
currentPanOffset = currentPanOffset +
|
||||
rightVector * (-mouseDelta.X * panSpeed) +
|
||||
upVector * (-mouseDelta.Y * panSpeed)
|
||||
end
|
||||
|
||||
if isRotating or isPanning then
|
||||
local targetPos = basePosition + currentPanOffset
|
||||
|
||||
local finalTransform = CFrame.new(targetPos) *
|
||||
CFrame.Angles(0, currentOrbitAngles.Y, 0) *
|
||||
CFrame.Angles(currentOrbitAngles.X, 0, 0)
|
||||
|
||||
rootPart.CFrame = finalTransform
|
||||
|
||||
lastMousePos = Vector2.new(mouse.X, mouse.Y)
|
||||
end
|
||||
end)
|
||||
|
||||
local function resetView()
|
||||
currentOrbitAngles = Vector2.new(0, 0)
|
||||
currentPanOffset = Vector3.new(0, 0, 0)
|
||||
rootPart.CFrame = initialPos
|
||||
workspace.CurrentCamera.CFrame = savedCamera
|
||||
end
|
||||
|
||||
userInputService.InputBegan:Connect(function(input)
|
||||
if input.KeyCode == Enum.KeyCode.R then
|
||||
resetView()
|
||||
end
|
||||
end)
|
||||
|
||||
-- Clean up function
|
||||
local function cleanup()
|
||||
runService:UnbindFromRenderStep("CharacterViewer")
|
||||
end
|
||||
|
||||
game.Close:connect(cleanup)
|
||||
|
||||
Spawn(function()
|
||||
wait(0.01)
|
||||
savedCamera = workspace.CurrentCamera.CFrame
|
||||
end)
|
||||
Reference in New Issue
Block a user