TP Script By BriefBassoon117
Key RequiredUniversal

TP Script By BriefBassoon117

Universal ScriptBriefBassoon117BriefBassoon117 3K views 178 executesUpdated Mar 5, 2025
Unrated
00
Lua Script•795 lines (24786 chars)
-- PlayerListTeleport.lua
-- Place this script in StarterGui

local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")

-- 動畫設置
local SPRING_SETTINGS = {
    dampingRatio = 0.75,
    frequency = 4
}

-- 顏色設置
local COLORS = {
    background = Color3.fromRGB(35, 35, 35),
    backgroundLight = Color3.fromRGB(45, 45, 45),
    backgroundDark = Color3.fromRGB(30, 30, 30), -- New color
    accent = Color3.fromRGB(66, 134, 245),
    accentLight = Color3.fromRGB(86, 154, 255), -- New color
    accentDark = Color3.fromRGB(46, 114, 225), -- New color
    text = Color3.fromRGB(255, 255, 255),
    textDim = Color3.fromRGB(200, 200, 200),
    success = Color3.fromRGB(46, 184, 87),
    error = Color3.fromRGB(235, 69, 69),
    gradient1 = Color3.fromRGB(66, 134, 245), -- New color
    gradient2 = Color3.fromRGB(83, 91, 230)  -- New color
}

-- Wait for player to load
if not LocalPlayer then
    Players:GetPropertyChangedSignal("LocalPlayer"):Wait()
    LocalPlayer = Players.LocalPlayer
end

-- Create UI
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "TeleportGui"
ScreenGui.ResetOnSpawn = false
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
ScreenGui.Parent = PlayerGui

-- 創建彈簧動畫函數
local function createSpring(initial)
    local spring = {}
    spring.target = initial or 0
    spring.position = spring.target
    spring.velocity = 0

    function spring:step(dt)
        local f = SPRING_SETTINGS.frequency * 2 * math.pi
        local d = SPRING_SETTINGS.dampingRatio
        local r = self.target - self.position
        local sp = r * f * f
        local sv = self.velocity * f * d * 2
        local acc = sp - sv

        self.velocity = self.velocity + acc * dt
        self.position = self.position + self.velocity * dt

        return self.position
    end

    return spring
end

-- Main Container (最小化時的容器)
local MinContainer = Instance.new("Frame")
MinContainer.Name = "MinContainer"
MinContainer.BackgroundTransparency = 1
MinContainer.Size = UDim2.new(0, 60, 0, 60)
MinContainer.Position = UDim2.new(1, -70, 0.5, -30)
MinContainer.Parent = ScreenGui

-- 最小化按鈕
local MinButton = Instance.new("ImageButton")
MinButton.Name = "MinButton"
MinButton.BackgroundColor3 = COLORS.background
MinButton.Size = UDim2.new(0, 50, 0, 50)
MinButton.Position = UDim2.new(0.5, -25, 0.5, -25)
MinButton.Image = "rbxassetid://7072718840" -- 用戶圖標
MinButton.ImageColor3 = COLORS.accent
MinButton.ImageTransparency = 0.1
MinButton.Parent = MinContainer

-- 最小化按鈕圓角和效果
local MinButtonCorner = Instance.new("UICorner")
MinButtonCorner.CornerRadius = UDim.new(1, 0)
MinButtonCorner.Parent = MinButton

local MinButtonStroke = Instance.new("UIStroke")
MinButtonStroke.Color = COLORS.accent
MinButtonStroke.Thickness = 2
MinButtonStroke.Parent = MinButton

-- 最小化按鈕陰影
local MinButtonShadow = Instance.new("ImageLabel")
MinButtonShadow.Name = "Shadow"
MinButtonShadow.BackgroundTransparency = 1
MinButtonShadow.Position = UDim2.new(0, -15, 0, -15)
MinButtonShadow.Size = UDim2.new(1, 30, 1, 30)
MinButtonShadow.ZIndex = -1
MinButtonShadow.Image = "rbxassetid://6014261993"
MinButtonShadow.ImageColor3 = Color3.fromRGB(0, 0, 0)
MinButtonShadow.ImageTransparency = 0.5
MinButtonShadow.ScaleType = Enum.ScaleType.Slice
MinButtonShadow.SliceCenter = Rect.new(49, 49, 450, 450)
MinButtonShadow.Parent = MinButton

-- Main Frame
local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.BackgroundColor3 = COLORS.background
MainFrame.BorderSizePixel = 0
MainFrame.ClipsDescendants = true -- 防止內容溢出
MainFrame.Parent = ScreenGui

-- Glassmorphism effect
local BlurEffect = Instance.new("ImageLabel")
BlurEffect.Name = "BlurEffect"
BlurEffect.BackgroundTransparency = 1
BlurEffect.Size = UDim2.new(1, 0, 1, 0)
BlurEffect.Image = "rbxassetid://8275353455"
BlurEffect.ImageColor3 = COLORS.background
BlurEffect.ImageTransparency = 0.9
BlurEffect.Parent = MainFrame

local MainCorner = Instance.new("UICorner")
MainCorner.CornerRadius = UDim.new(0, 20)
MainCorner.Parent = MainFrame

-- 主窗口陰影
local MainShadow = Instance.new("ImageLabel")
MainShadow.Name = "Shadow"
MainShadow.BackgroundTransparency = 1
MainShadow.Position = UDim2.new(0, -15, 0, -15)
MainShadow.Size = UDim2.new(1, 30, 1, 30)
MainShadow.ZIndex = -1
MainShadow.Image = "rbxassetid://6014261993"
MainShadow.ImageColor3 = Color3.fromRGB(0, 0, 0)
MainShadow.ImageTransparency = 0.5
MainShadow.ScaleType = Enum.ScaleType.Slice
MainShadow.SliceCenter = Rect.new(49, 49, 450, 450)
MainShadow.Parent = MainFrame

-- Title Bar
local TitleBar = Instance.new("Frame")
TitleBar.Name = "TitleBar"
TitleBar.BackgroundColor3 = COLORS.backgroundDark -- Updated color
TitleBar.BorderSizePixel = 0
TitleBar.Size = UDim2.new(1, 0, 0, 50)
TitleBar.Parent = MainFrame

-- 添加漸變效果
local TitleGradient = Instance.new("UIGradient")
TitleGradient.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, COLORS.gradient1), -- New color
    ColorSequenceKeypoint.new(1, COLORS.gradient2)  -- New color
})
TitleGradient.Transparency = NumberSequence.new({
    NumberSequenceKeypoint.new(0, 0.8),
    NumberSequenceKeypoint.new(1, 0.9)
})
TitleGradient.Rotation = 45
TitleGradient.Parent = TitleBar

local TitleBarCorner = Instance.new("UICorner")
TitleBarCorner.CornerRadius = UDim.new(0, 20)
TitleBarCorner.Parent = TitleBar

-- 添加標題欄裝飾線
local TitleDecoration = Instance.new("Frame")
TitleDecoration.Name = "TitleDecoration"
TitleDecoration.BackgroundColor3 = COLORS.accent -- New color
TitleDecoration.BorderSizePixel = 0
TitleDecoration.Size = UDim2.new(0, 3, 0.6, 0)
TitleDecoration.Position = UDim2.new(0, 10, 0.2, 0)
TitleDecoration.Parent = TitleBar

local TitleDecorationCorner = Instance.new("UICorner")
TitleDecorationCorner.CornerRadius = UDim.new(1, 0)
TitleDecorationCorner.Parent = TitleDecoration

-- Title Text
local TitleText = Instance.new("TextLabel")
TitleText.Name = "TitleText"
TitleText.BackgroundTransparency = 1
TitleText.Position = UDim2.new(0, 25, 0, 0)
TitleText.Size = UDim2.new(1, -100, 1, 0)
TitleText.Font = Enum.Font.GothamBold
TitleText.Text = "玩家列表"
TitleText.TextColor3 = COLORS.text
TitleText.TextSize = 20
TitleText.TextXAlignment = Enum.TextXAlignment.Left
TitleText.Parent = TitleBar

-- 添加在線指示器
local OnlineIndicator = Instance.new("Frame")
OnlineIndicator.Name = "OnlineIndicator"
OnlineIndicator.BackgroundColor3 = COLORS.success
OnlineIndicator.BorderSizePixel = 0
OnlineIndicator.Size = UDim2.new(0, 6, 0, 6)
OnlineIndicator.Position = UDim2.new(0, 15, 0.5, 8)
OnlineIndicator.Parent = TitleBar

local OnlineIndicatorCorner = Instance.new("UICorner")
OnlineIndicatorCorner.CornerRadius = UDim.new(1, 0)
OnlineIndicatorCorner.Parent = OnlineIndicator

-- 添加呼吸動畫效果
local function createBreathingEffect(object)
    local tweenInfo = TweenInfo.new(
        1.5,
        Enum.EasingStyle.Sine,
        Enum.EasingDirection.InOut,
        -1,
        true
    )

    local tween = TweenService:Create(object, tweenInfo, {
        BackgroundTransparency = 0.5
    })

    tween:Play()
end

createBreathingEffect(OnlineIndicator)

-- Close Button
local CloseButton = Instance.new("ImageButton")
CloseButton.Name = "CloseButton"
CloseButton.BackgroundTransparency = 1
CloseButton.Position = UDim2.new(1, -45, 0, 5)
CloseButton.Size = UDim2.new(0, 40, 0, 40)
CloseButton.Image = "rbxassetid://7072725342" -- 最小化圖標
CloseButton.ImageColor3 = COLORS.text
CloseButton.ImageTransparency = 0.3
CloseButton.Parent = TitleBar

-- Player Count
local PlayerCount = Instance.new("TextLabel")
PlayerCount.Name = "PlayerCount"
PlayerCount.BackgroundTransparency = 1
PlayerCount.Position = UDim2.new(0, 20, 0, 50)
PlayerCount.Size = UDim2.new(1, -40, 0, 30)
PlayerCount.Font = Enum.Font.GothamSemibold
PlayerCount.TextColor3 = COLORS.textDim
PlayerCount.TextSize = 14
PlayerCount.TextXAlignment = Enum.TextXAlignment.Left
PlayerCount.Parent = MainFrame

-- Search Bar
local SearchBar = Instance.new("Frame")
SearchBar.Name = "SearchBar"
SearchBar.BackgroundColor3 = COLORS.backgroundLight
SearchBar.Position = UDim2.new(0, 20, 0, 90)
SearchBar.Size = UDim2.new(1, -40, 0, 40)
SearchBar.Parent = MainFrame

local SearchBarCorner = Instance.new("UICorner")
SearchBarCorner.CornerRadius = UDim.new(0, 12)
SearchBarCorner.Parent = SearchBar

local SearchIcon = Instance.new("ImageLabel")
SearchIcon.Name = "SearchIcon"
SearchIcon.BackgroundTransparency = 1
SearchIcon.Position = UDim2.new(0, 10, 0, 10)
SearchIcon.Size = UDim2.new(0, 20, 0, 20)
SearchIcon.Image = "rbxassetid://7072721559" -- 搜索圖標
SearchIcon.ImageColor3 = COLORS.textDim
SearchIcon.Parent = SearchBar

local SearchBox = Instance.new("TextBox")
SearchBox.Name = "SearchBox"
SearchBox.BackgroundTransparency = 1
SearchBox.Position = UDim2.new(0, 40, 0, 0)
SearchBox.Size = UDim2.new(1, -50, 1, 0)
SearchBox.Font = Enum.Font.Gotham
SearchBox.PlaceholderText = "搜索玩家..."
SearchBox.Text = ""
SearchBox.TextColor3 = COLORS.text
SearchBox.TextSize = 14
SearchBox.TextXAlignment = Enum.TextXAlignment.Left
SearchBox.Parent = SearchBar

-- Scroll Frame
local ScrollFrame = Instance.new("ScrollingFrame")
ScrollFrame.Name = "ScrollFrame"
ScrollFrame.BackgroundTransparency = 1
ScrollFrame.Position = UDim2.new(0, 10, 0, 140)
ScrollFrame.Size = UDim2.new(1, -20, 1, -150)
ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0)
ScrollFrame.ScrollBarThickness = 4
ScrollFrame.ScrollBarImageColor3 = COLORS.accent
ScrollFrame.Parent = MainFrame

-- List Layout
local ListLayout = Instance.new("UIListLayout")
ListLayout.Name = "ListLayout"
ListLayout.Padding = UDim.new(0, 10)
ListLayout.SortOrder = Enum.SortOrder.Name
ListLayout.Parent = ScrollFrame

-- Variables
local playerButtons = {}
local isMinimized = false
local searchText = ""

-- 動畫系統
local animations = {
    minimizeSpring = createSpring(1),
    fadeSpring = createSpring(1)
}

-- 更新玩家數量顯示
local function updatePlayerCount()
    local count = #Players:GetPlayers()
    PlayerCount.Text = string.format("在線玩家: %d", count)
end

-- 創建玩家卡片
local function createPlayerCard(player)
    if playerButtons[player] then return end

    local PlayerCard = Instance.new("Frame")
    PlayerCard.Name = player.Name
    PlayerCard.BackgroundColor3 = COLORS.backgroundLight
    PlayerCard.Size = UDim2.new(1, -20, 0, 70)
    PlayerCard.Position = UDim2.new(0, 10, 0, 0)

    local CardCorner = Instance.new("UICorner")
    CardCorner.CornerRadius = UDim.new(0, 15)
    CardCorner.Parent = PlayerCard

    -- 玩家頭像
    local Avatar = Instance.new("ImageLabel")
    Avatar.Name = "Avatar"
    Avatar.BackgroundTransparency = 1
    Avatar.Position = UDim2.new(0, 10, 0, 10)
    Avatar.Size = UDim2.new(0, 50, 0, 50)
    Avatar.Parent = PlayerCard

    local AvatarCorner = Instance.new("UICorner")
    AvatarCorner.CornerRadius = UDim.new(1, 0)
    AvatarCorner.Parent = Avatar

    -- 安全地加載頭像
    pcall(function()
        Avatar.Image = Players:GetUserThumbnailAsync(
            player.UserId,
            Enum.ThumbnailType.HeadShot,
            Enum.ThumbnailSize.Size420x420
        )
    end)

    -- 玩家信息
    local InfoContainer = Instance.new("Frame")
    InfoContainer.Name = "InfoContainer"
    InfoContainer.BackgroundTransparency = 1
    InfoContainer.Position = UDim2.new(0, 70, 0, 10)
    InfoContainer.Size = UDim2.new(1, -160, 1, -20)
    InfoContainer.Parent = PlayerCard

    local DisplayName = Instance.new("TextLabel")
    DisplayName.Name = "DisplayName"
    DisplayName.BackgroundTransparency = 1
    DisplayName.Size = UDim2.new(1, 0, 0, 20)
    DisplayName.Font = Enum.Font.GothamBold
    DisplayName.Text = player.DisplayName
    DisplayName.TextColor3 = COLORS.text
    DisplayName.TextSize = 16
    DisplayName.TextXAlignment = Enum.TextXAlignment.Left
    DisplayName.Parent = InfoContainer

    local Username = Instance.new("TextLabel")
    Username.Name = "Username"
    Username.BackgroundTransparency = 1
    Username.Position = UDim2.new(0, 0, 0, 25)
    Username.Size = UDim2.new(1, 0, 0, 20)
    Username.Font = Enum.Font.Gotham
    Username.Text = "@" .. player.Name
    Username.TextColor3 = COLORS.textDim
    Username.TextSize = 14
    Username.TextXAlignment = Enum.TextXAlignment.Left
    Username.Parent = InfoContainer

    -- 傳送按鈕
    local TeleportButton = Instance.new("TextButton")
    TeleportButton.Name = "TeleportButton"
    TeleportButton.BackgroundColor3 = COLORS.accent
    TeleportButton.Position = UDim2.new(1, -80, 0.5, -20)
    TeleportButton.Size = UDim2.new(0, 70, 0, 40)
    TeleportButton.Font = Enum.Font.GothamBold
    TeleportButton.Text = "傳送"
    TeleportButton.TextColor3 = COLORS.text
    TeleportButton.TextSize = 14
    TeleportButton.Parent = PlayerCard

    local ButtonCorner = Instance.new("UICorner")
    ButtonCorner.CornerRadius = UDim.new(0, 12)
    ButtonCorner.Parent = TeleportButton

    -- 按鈕動畫
    local buttonSpring = createSpring(1)
    local buttonScale = 1

    -- 按鈕懸停效果
    TeleportButton.MouseEnter:Connect(function()
        buttonSpring.target = 1.1
        TweenService:Create(TeleportButton, TweenInfo.new(0.3), {
            BackgroundColor3 = COLORS.accentHover
        }):Play()
    end)

    TeleportButton.MouseLeave:Connect(function()
        buttonSpring.target = 1
        TweenService:Create(TeleportButton, TweenInfo.new(0.3), {
            BackgroundColor3 = COLORS.accent
        }):Play()
    end)

    -- 更新按鈕大小動畫
    RunService.RenderStepped:Connect(function(dt)
        if not TeleportButton.Parent then return end
        buttonScale = buttonSpring:step(dt)
        TeleportButton.Size = UDim2.new(0, 70 * buttonScale, 0, 40 * buttonScale)
        TeleportButton.Position = UDim2.new(1, -80, 0.5, -20 * buttonScale)
    end)

    -- 傳送功能
    TeleportButton.MouseButton1Click:Connect(function()
        -- 視覺反饋
        buttonSpring.target = 0.9
        task.delay(0.1, function()
            buttonSpring.target = 1
        end)

        local originalColor = TeleportButton.BackgroundColor3
        local originalText = TeleportButton.Text

        TeleportButton.BackgroundColor3 = COLORS.success
        TeleportButton.Text = "傳送中"

        -- 檢查玩家
        if not player or not player:IsDescendantOf(Players) then
            TeleportButton.BackgroundColor3 = COLORS.error
            TeleportButton.Text = "錯誤"
            task.delay(1, function()
                TeleportButton.BackgroundColor3 = originalColor
                TeleportButton.Text = originalText
            end)
            return
        end

        -- 檢查角色
        if not LocalPlayer.Character or not LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
            TeleportButton.BackgroundColor3 = COLORS.error
            TeleportButton.Text = "錯誤"
            task.delay(1, function()
                TeleportButton.BackgroundColor3 = originalColor
                TeleportButton.Text = originalText
            end)
            return
        end

        -- 嘗試傳送
        local success = false

        -- 方法1:直接傳送
        if player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
            local targetPos = player.Character.HumanoidRootPart.Position
            LocalPlayer.Character:SetPrimaryPartCFrame(
                CFrame.new(targetPos + Vector3.new(0, 3, 3))
            )
            success = true
        end

        -- 方法2:備用傳送方法
        if not success then
            pcall(function()
                if player.Character and player.Character:FindFirstChild("HumanoidRootPart") then
                    LocalPlayer.Character.Humanoid.Sit = false
                    task.wait(0.1)
                    LocalPlayer.Character:SetPrimaryPartCFrame(
                        player.Character.HumanoidRootPart.CFrame * CFrame.new(0, 3, 3)
                    )
                    success = true
                end
            end)
        end

        -- 更新按鈕狀態
        if success then
            TeleportButton.BackgroundColor3 = COLORS.success
            TeleportButton.Text = "✓"
        else
            TeleportButton.BackgroundColor3 = COLORS.error
            TeleportButton.Text = "失敗"
        end

        -- 重置按鈕
        task.delay(1, function()
            TeleportButton.BackgroundColor3 = originalColor
            TeleportButton.Text = originalText
        end)
    end)

    -- 卡片懸停效果
    local cardSpring = createSpring(0)

    PlayerCard.MouseEnter:Connect(function()
        cardSpring.target = 1
    end)

    PlayerCard.MouseLeave:Connect(function()
        cardSpring.target = 0
    end)

    -- 更新卡片動畫
    RunService.RenderStepped:Connect(function(dt)
        if not PlayerCard.Parent then return end
        local elevation = cardSpring:step(dt)
        PlayerCard.Position = UDim2.new(0, 10, 0, -elevation * 2)
        PlayerCard.BackgroundColor3 = COLORS.backgroundLight:Lerp(
            Color3.fromRGB(60, 60, 60),
            elevation
        )
    end)

    PlayerCard.Parent = ScrollFrame
    playerButtons[player] = PlayerCard

    -- 更新滾動框大小
    ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, ListLayout.AbsoluteContentSize.Y + 10)
end

-- 移除玩家卡片
local function removePlayerCard(player)
    if playerButtons[player] then
        playerButtons[player]:Destroy()
        playerButtons[player] = nil
        ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, ListLayout.AbsoluteContentSize.Y + 10)
    end
end

-- 搜索功能
SearchBox.Changed:Connect(function(prop)
    if prop == "Text" then
        searchText = SearchBox.Text:lower()
        for player, card in pairs(playerButtons) do
            local name = player.Name:lower()
            local displayName = player.DisplayName:lower()
            local visible = name:find(searchText) or displayName:find(searchText)
            card.Visible = visible
        end
        ScrollFrame.CanvasSize = UDim2.new(0, 0, 0, ListLayout.AbsoluteContentSize.Y + 10)
    end
end)

-- 最小化/最大化動畫
local function toggleMinimize()
    isMinimized = not isMinimized
    animations.minimizeSpring.target = isMinimized and 0 or 1
    animations.fadeSpring.target = isMinimized and 0 or 1

    MinContainer.Visible = true
    MainFrame.Visible = true
end

-- 更新UI動畫
RunService.RenderStepped:Connect(function(dt)
    local scale = animations.minimizeSpring:step(dt)
    local fade = animations.fadeSpring:step(dt)

    MainFrame.Size = UDim2.new(0, 300 * scale, 0, 400 * scale)
    MainFrame.Position = UDim2.new(1, -320 * scale, 0.5, -200 * scale)
    MainFrame.BackgroundTransparency = 1 - fade

    MinContainer.Position = UDim2.new(1, -70 + (250 * scale), 0.5, -30)
    MinButton.ImageTransparency = fade

    if scale < 0.1 then
        MainFrame.Visible = false
    end
    if fade > 0.9 then
        MinContainer.Visible = false
    end
end)

-- 初始化玩家列表
for _, player in pairs(Players:GetPlayers()) do
    createPlayerCard(player)
end

-- 更新玩家列表
Players.PlayerAdded:Connect(function(player)
    createPlayerCard(player)
    updatePlayerCount()
end)

Players.PlayerRemoving:Connect(function(player)
    removePlayerCard(player)
    updatePlayerCount()
end)

-- 初始化玩家數量
updatePlayerCount()

-- 綁定最小化/最大化事件
CloseButton.MouseButton1Click:Connect(toggleMinimize)
MinButton.MouseButton1Click:Connect(toggleMinimize)

-- 使界面可拖動
local function enableDragging(gui, handle)
    local dragging
    local dragInput
    local dragStart
    local startPos

    -- 用於存儲初始觸摸位置的變量
    local lastTouchPosition
    local lastTouchTime = 0

    local function updateDrag(input)
        local delta = input.Position - dragStart
        local newPosition = UDim2.new(
            startPos.X.Scale,
            startPos.X.Offset + delta.X,
            startPos.Y.Scale,
            startPos.Y.Offset + delta.Y
        )

        -- 確保視窗不會完全離開屏幕
        local viewportSize = workspace.CurrentCamera.ViewportSize
        local guiSize = gui.AbsoluteSize

        local minX = -guiSize.X * 0.5
        local maxX = viewportSize.X - guiSize.X * 0.5
        local minY = 0
        local maxY = viewportSize.Y - guiSize.Y * 0.5

        newPosition = UDim2.new(
            newPosition.X.Scale,
            math.clamp(newPosition.X.Offset, minX, maxX),
            newPosition.Y.Scale,
            math.clamp(newPosition.Y.Offset, minY, maxY)
        )

        local tweenInfo = TweenInfo.new(0.1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
        TweenService:Create(gui, tweenInfo, {Position = newPosition}):Play()
    end

    handle.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = gui.Position

            -- 記錄觸摸開始的時間和位置
            if input.UserInputType == Enum.UserInputType.Touch then
                lastTouchPosition = input.Position
                lastTouchTime = tick()
            end

            input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                end
            end)
        end
    end)

    handle.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement
            or input.UserInputType == Enum.UserInputType.Touch then
            dragInput = input
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if input == dragInput and dragging then
            -- 檢查是否是觸摸輸入,並計算移動距離
            if input.UserInputType == Enum.UserInputType.Touch then
                local currentTime = tick()
                local timeDiff = currentTime - lastTouchTime
                local posDiff = (input.Position - lastTouchPosition).magnitude

                -- 如果移動太快或距離太短,忽略這次移動
                if timeDiff < 0.05 or posDiff < 5 then
                    return
                end

                lastTouchPosition = input.Position
                lastTouchTime = currentTime
            end

            updateDrag(input)
        end
    end)
end

-- 為 TitleBar 啟用拖動
enableDragging(MainFrame, TitleBar)

-- 鍵盤快捷鍵
UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if not gameProcessed and input.KeyCode == Enum.KeyCode.P then
        toggleMinimize()
    end
end)

-- 新的自適應尺寸計算函數
local function getAdaptiveSize()
    local viewportSize = workspace.CurrentCamera.ViewportSize
    local isMobile = UserInputService.TouchEnabled

    -- 移動端尺寸
    if isMobile then
        local width = math.min(viewportSize.X * 0.9, 400)
        local height = math.min(viewportSize.Y * 0.7, 500)
        return {
            width = width,
            height = height,
            buttonSize = 45,
            fontSize = 16,
            cornerRadius = 15,
            padding = 10
        }
    end

    -- 桌面端尺寸
    return {
        width = 300,
        height = 400,
        buttonSize = 40,
        fontSize = 14,
        cornerRadius = 12,
        padding = 8
    }
end

-- 更新 MainFrame 尺寸和位置
local adaptive = getAdaptiveSize()
MainFrame.Size = UDim2.new(0, adaptive.width, 0, adaptive.height)
MainFrame.Position = UDim2.new(0.5, -adaptive.width / 2, 0.5, -adaptive.height / 2)

-- 更新標題文字大小
TitleText.TextSize = adaptive.fontSize + 2

-- 更新搜索欄樣式
SearchBar.Size = UDim2.new(1, -adaptive.padding * 4, 0, adaptive.buttonSize)
SearchBox.TextSize = adaptive.fontSize
SearchBox.PlaceholderColor3 = COLORS.textDim

-- 更新玩家卡片樣式
local function updatePlayerCard(card)
    local cardSize = adaptive.height * 0.15
    card.Size = UDim2.new(1, -adaptive.padding * 2, 0, cardSize)

    -- 更新卡片內部元素大小
    local avatar = card:FindFirstChild("Avatar")
    if avatar then
        avatar.Size = UDim2.new(0, cardSize - adaptive.padding * 2, 0, cardSize - adaptive.padding * 2)
    end

    local teleportButton = card:FindFirstChild("TeleportButton")
    if teleportButton then
        teleportButton.Size = UDim2.new(0, cardSize * 1.2, 0, cardSize * 0.6)
        teleportButton.TextSize = adaptive.fontSize
    end
end

-- 監聽視窗大小變化
workspace.CurrentCamera:GetPropertyChangedSignal("ViewportSize"):Connect(function()
    local newAdaptive = getAdaptiveSize()

    -- 更新主視窗大小
    MainFrame.Size = UDim2.new(0, newAdaptive.width, 0, newAdaptive.height)
    MainFrame.Position = UDim2.new(0.5, -newAdaptive.width / 2, 0.5, -newAdaptive.height / 2) -- Also update position on resize

    -- 更新標題文字大小
    TitleText.TextSize = newAdaptive.fontSize + 2
    -- 更新搜索欄樣式
    SearchBar.Size = UDim2.new(1, -newAdaptive.padding * 4, 0, newAdaptive.buttonSize)
    SearchBox.TextSize = newAdaptive.fontSize

    -- 更新所有玩家卡片
    for _, card in pairs(playerButtons) do
        updatePlayerCard(card)
    end
end)

Features & Information

Mobile support

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts