185 lines
5.8 KiB
Lua
185 lines
5.8 KiB
Lua
local UserInputService = game:GetService("UserInputService")
|
|
local ContextActionService = game:GetService("ContextActionService")
|
|
local Debris = game:GetService("Debris")
|
|
|
|
local gateway = script.Parent
|
|
local tool = gateway.Parent
|
|
local remote = gateway:WaitForChild("Gateway")
|
|
local player = game.Players.LocalPlayer
|
|
local mouse = player:GetMouse()
|
|
local isActive = false
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Standard Input
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local function activate(active,cf)
|
|
isActive = active
|
|
remote:FireServer("SetActive",active,cf)
|
|
while isActive do
|
|
wait(.1)
|
|
remote:FireServer("SetTarget",mouse.Hit)
|
|
end
|
|
end
|
|
|
|
local function onKey(input)
|
|
local keyCode = input.KeyCode.Name
|
|
local down = (input.UserInputState.Name == "Begin")
|
|
remote:FireServer("KeyEvent",keyCode,down)
|
|
end
|
|
|
|
local function onInputBegan(input,gameProcessed)
|
|
if not gameProcessed then
|
|
local name = input.UserInputType.Name
|
|
if name == "MouseButton1" then
|
|
activate(true,mouse.Hit)
|
|
elseif name == "Touch" then
|
|
wait(.1)
|
|
local state = input.UserInputState.Name
|
|
if state == "End" or state == "Cancel" then
|
|
activate(true,mouse.Hit)
|
|
end
|
|
elseif name == "Gamepad1" then
|
|
local keyCode = input.KeyCode.Name
|
|
if keyCode == "ButtonR2" then
|
|
activate(true,mouse.Hit)
|
|
end
|
|
elseif name == "Keyboard" then
|
|
onKey(input)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function onInputEnded(input,gameProcessed)
|
|
if not gameProcessed and isActive then
|
|
local name = input.UserInputType.Name
|
|
if name == "MouseButton1" or name == "Touch" or name == "Gamepad1" then
|
|
activate(false,mouse.Hit)
|
|
elseif name == "Keyboard" then
|
|
onKey(input)
|
|
end
|
|
end
|
|
end
|
|
|
|
UserInputService.InputBegan:Connect(onInputBegan)
|
|
UserInputService.InputEnded:Connect(onInputEnded)
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
-- Special case Input
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local mControlScheme = tool:WaitForChild("ControlScheme",5)
|
|
|
|
if mControlScheme then
|
|
local controlSchemeData = require(mControlScheme)
|
|
local controlScheme = controlSchemeData.Buttons
|
|
local activateContext = controlSchemeData.ActivateContext
|
|
local keyEvent = tool:WaitForChild("KeyEvent")
|
|
local callbacks = {}
|
|
|
|
local hands = { L = "Left", R = "Right" }
|
|
local handTypes = {"Bumper","Trigger","Joystick (Press)"}
|
|
|
|
local schemeDocs =
|
|
{
|
|
Keyboard = {"Hold Left Mouse Button - " .. activateContext};
|
|
Gamepad = {"Hold Right Trigger - " .. activateContext};
|
|
}
|
|
|
|
for key,data in pairs(controlScheme) do
|
|
local down = false
|
|
callbacks[key] = function (actionName,inputState,inputObject)
|
|
if (inputState.Name == "Begin") and not down then
|
|
down = true
|
|
if data.Client then
|
|
keyEvent:Fire(key,true)
|
|
else
|
|
remote:FireServer("KeyEvent",key,true)
|
|
end
|
|
elseif (inputState.Name == "End") and down then
|
|
down = false
|
|
if data.Client then
|
|
keyEvent:Fire(key,false)
|
|
else
|
|
remote:FireServer("KeyEvent",key,false)
|
|
end
|
|
end
|
|
end
|
|
|
|
local xBtn = data.XboxButton:gsub("Button","")
|
|
if #xBtn == 2 then
|
|
local handId,hTypeId = xBtn:match("(%u)(%d)")
|
|
local hand = hands[handId]
|
|
local hType = handTypes[tonumber(hTypeId)]
|
|
xBtn = hand .. " " .. hType
|
|
else
|
|
xBtn = "(" .. xBtn .. ")"
|
|
end
|
|
table.insert(schemeDocs.Keyboard,key .. " - " .. data.Label)
|
|
table.insert(schemeDocs.Gamepad,xBtn .. " - " .. data.Label)
|
|
end
|
|
|
|
local currentSchemeDocMsg
|
|
|
|
local function onLastInputTypeChanged(inputType)
|
|
if currentSchemeDocMsg and not UserInputService.TouchEnabled and not controlSchemeData.HideControls then
|
|
local schemeDoc
|
|
if inputType.Name:find("Gamepad") then
|
|
schemeDoc = "Gamepad"
|
|
else
|
|
schemeDoc = "Keyboard"
|
|
end
|
|
currentSchemeDocMsg.Text = schemeDoc .. " Controls:\n\n" .. table.concat(schemeDocs[schemeDoc],"\n")
|
|
end
|
|
end
|
|
|
|
local diedCon
|
|
local equipped = false
|
|
|
|
local function onUnequipped()
|
|
if equipped then
|
|
equipped = false
|
|
for key,data in pairs(controlScheme) do
|
|
ContextActionService:UnbindAction(data.Label)
|
|
end
|
|
currentSchemeDocMsg:Destroy()
|
|
currentSchemeDocMsg = nil
|
|
end
|
|
end
|
|
|
|
local function onEquipped()
|
|
if not equipped then
|
|
equipped = true
|
|
for key,data in pairs(controlScheme) do
|
|
ContextActionService:BindAction(data.Label,callbacks[key],true,Enum.KeyCode[data.XboxButton])
|
|
ContextActionService:SetTitle(data.Label,data.Label)
|
|
end
|
|
if UserInputService.TouchEnabled then
|
|
spawn(function ()
|
|
local playerGui = player:WaitForChild("PlayerGui")
|
|
local contextActionGui = playerGui:WaitForChild("ContextActionGui")
|
|
local contextButtonFrame = contextActionGui:WaitForChild("ContextButtonFrame")
|
|
contextButtonFrame.Size = UDim2.new(3/8,0,3/8,0)
|
|
contextButtonFrame.AnchorPoint = Vector2.new(1,1)
|
|
contextButtonFrame.Position = UDim2.new(1,0,1,0)
|
|
end)
|
|
end
|
|
currentSchemeDocMsg = Instance.new("Message")
|
|
currentSchemeDocMsg.Parent = player
|
|
onLastInputTypeChanged(UserInputService:GetLastInputType())
|
|
if not diedCon then
|
|
local char = tool.Parent
|
|
if char then
|
|
local humanoid = char:FindFirstChildWhichIsA("Humanoid")
|
|
if humanoid then
|
|
diedCon = humanoid.Died:Connect(onUnequipped)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
tool.Equipped:Connect(onEquipped)
|
|
tool.Unequipped:Connect(onUnequipped)
|
|
UserInputService.LastInputTypeChanged:Connect(onLastInputTypeChanged)
|
|
end |