Super-Nostalgia-Zone/Server/Scripts/BuildTools/Dragger/init.client.lua

256 lines
6.6 KiB
Lua

local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SoundService = game:GetService("SoundService")
local Dragger = Instance.new("Dragger")
local tool = script.Parent
local selection = Instance.new("SelectionBox")
selection.Parent = tool
selection.Transparency = 1
local icon = Instance.new("StringValue")
icon.Name = "IconOverride"
icon.Parent = tool
local mode = tool.Name
local draggerService = ReplicatedStorage:WaitForChild("DraggerService")
local gateway = draggerService:WaitForChild("DraggerGateway")
local submitUpdate = draggerService:WaitForChild("SubmitUpdate")
----------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Connections
----------------------------------------------------------------------------------------------------------------------------------------------------------------
local cons = {}
local function addConnections(connections)
for event, func in pairs(connections) do
local con = event:Connect(func)
table.insert(cons, con)
end
end
local function clearCons()
while #cons > 0 do
local connection = table.remove(cons)
connection:Disconnect()
end
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Keys
----------------------------------------------------------------------------------------------------------------------------------------------------------------
local keyLocks = {}
local function onInputEnded(input)
if keyLocks[input.KeyCode.Name] then
keyLocks[input.KeyCode.Name] = nil
end
end
local function isKeyDown(key)
if UserInputService:IsKeyDown(key) and not keyLocks[key] then
keyLocks[key] = true
return true
end
return false
end
UserInputService.InputEnded:Connect(onInputEnded)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Tool Style
----------------------------------------------------------------------------------------------------------------------------------------------------------------
local style =
{
GameTool =
{
Icon = "rbxassetid://1048129653";
HoverColor = Color3.fromRGB(25,153,255);
Cursors =
{
Idle = "";
Hover = "rbxasset://textures/DragCursor.png";
Grab = "rbxasset://textures/GrabRotateCursor.png";
};
};
Clone =
{
Icon = "rbxasset://textures/Clone.png";
HoverColor = Color3.fromRGB(25,153,255);
Cursors =
{
Idle = "rbxasset://textures/CloneCursor.png";
Hover = "rbxassetid://1048136830";
Grab = "rbxasset://textures/GrabRotateCursor.png";
}
};
Delete =
{
Icon = "rbxasset://textures/Hammer.png";
HoverColor = Color3.new(1,0.5,0);
CanShowWithHover = true;
Cursors =
{
Idle = "rbxasset://textures/HammerCursor.png";
Hover = "rbxasset://textures/HammerOverCursor.png";
}
}
}
local function getIcon(iconType)
return style[mode].Cursors[iconType]
end
tool.TextureId = style[mode].Icon
selection.Color3 = style[mode].HoverColor
if style[mode].CanShowWithHover then
selection.Transparency = 0
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Dragger
----------------------------------------------------------------------------------------------------------------------------------------------------------------
local mouse
local currentKey
local down = false
local debounce = false
local function onIdle()
if not down and mouse then
local mousePart = mouse.Target
if mousePart and not mousePart.Locked then
selection.Adornee = mousePart
icon.Value = getIcon("Hover")
return
end
selection.Adornee = nil
icon.Value = getIcon("Idle")
end
end
local function draggerRotate(axis)
if down then
Dragger:AxisRotate(axis)
end
end
local function startDraggerAction(mPart)
if mode == "Delete" then
gateway:InvokeServer("RequestDelete",mPart)
return
end
local pointOnMousePart = mPart.CFrame:ToObjectSpace(mouse.Hit).Position
local canDrag, dragKey, mousePart = gateway:InvokeServer("GetKey", mPart, mode == "Clone")
if canDrag then
selection.Adornee = mousePart
selection.Transparency = 0
down = true
currentKey = dragKey
icon.Value = getIcon("Grab")
Dragger:MouseDown(mousePart, pointOnMousePart, {mousePart})
local lastSubmit = 0
while down do
local now = tick()
local joints = {}
for _,joint in pairs(mousePart:GetJoints()) do
if CollectionService:HasTag(joint, "GorillaGlue") then
joints[joint] = joint.Parent
joint.Parent = nil
end
end
--local mousePart = selection.Adornee
if down then
Dragger:MouseMove(mouse.UnitRay)
end
if mousePart and currentKey then
if isKeyDown("R") then
draggerRotate("Z")
elseif isKeyDown("T") then
draggerRotate("X")
end
if now - lastSubmit > 0.03 then
submitUpdate:FireServer(currentKey, mousePart.CFrame)
lastSubmit = now
end
end
for joint, parent in pairs(joints) do
joint.Parent = parent
end
RunService.Heartbeat:Wait()
end
selection.Transparency = 1
gateway:InvokeServer("ClearKey", dragKey)
currentKey = nil
end
end
local function onButton1Down()
if not debounce then
debounce = true
local mousePart = selection.Adornee
if mousePart and not down then
startDraggerAction(mousePart)
end
debounce = false
end
end
local function onButton1Up()
if down then
down = false
Dragger:MouseUp()
end
end
----------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Tool
----------------------------------------------------------------------------------------------------------------------------------------------------------------
local function onEquipped(newMouse)
mouse = newMouse
addConnections
{
[mouse.Button1Down] = onButton1Down;
[mouse.Button1Up] = onButton1Up;
[mouse.Idle] = onIdle;
}
end
local function onUnequipped()
onButton1Up()
clearCons()
selection.Adornee = nil
mouse = nil
end
tool.Equipped:Connect(onEquipped)
tool.Unequipped:Connect(onUnequipped)
----------------------------------------------------------------------------------------------------------------------------------------------------------------