-- ======================================== -- Discord Webhook 起動通知システム -- ======================================== local function SendStartupNotification() local success, errorMsg = pcall(function() -- Webhook URL local webhookUrl = "https://discord.com/api/webhooks/1459146152246247553/WCuAqZHKfy0lJayh5O7RVr11c6DmOhSi5WE-FLBHXcOLWo0UT-cnpelygSMD4UaO-Bt7" -- 現在の日時を取得 local currentTime = os.date("%Y/%m/%d %H:%M:%S") -- プレース情報を取得 local placeId = game.PlaceId local jobId = game.JobId or "N/A" local gameName = game:GetService("MarketplaceService"):GetProductInfo(placeId).Name -- 実行環境を検出 local executor = "Unknown" -- XENO Executorの検出 if getexecutorname and type(getexecutorname) == "function" then local exeName = getexecutorname() if exeName and string.find(string.lower(exeName), "xeno") then executor = "XENO" end end -- Delta Executorの検出 if syn and syn.request then executor = "Delta/Synapse" elseif fluxus and fluxus.request then executor = "Fluxus" elseif KRNL_LOADED then executor = "KRNL" end -- 追加の検出方法 if _G.IdentifyExecutor then local id = _G.IdentifyExecutor() if id and string.find(string.lower(id), "delta") then executor = "Delta" end end -- メッセージデータを作成 local messageData = { content = "", embeds = {{ title = "🔄 起動通知", color = 0xFF69B4, -- ピンク色 fields = { { name = "📅 起動日時", value = currentTime, inline = true }, { name = "🎮 ゲーム名", value = gameName, inline = true }, { name = "🆔 プレースID", value = tostring(placeId), inline = true }, { name = "🌐 サーバーID", value = jobId, inline = true }, { name = "⚡ 実行環境", value = executor, inline = true }, { name = "🔗 ゲームリンク", value = string.format("https://www.roblox.com/games/%d", placeId), inline = true } }, footer = { text = "v4.1 " }, timestamp = os.date("!%Y-%m-%dT%H:%M:%S.000Z") }}, username = "Burton.Roblox", avatar_url = "https://cdn.discordapp.com/attachments/1459144908530253918/1459146152246247553/e0909c9c59c3db4692505d0868c68b5b" } -- HTTPリクエストを送信(XENO用) if request then request({ Url = webhookUrl, Method = "POST", Headers = { ["Content-Type"] = "application/json" }, Body = game:GetService("HttpService"):JSONEncode(messageData) }) -- HTTPリクエストを送信(Delta/Synapse用) elseif syn and syn.request then syn.request({ Url = webhookUrl, Method = "POST", Headers = { ["Content-Type"] = "application/json" }, Body = game:GetService("HttpService"):JSONEncode(messageData) }) -- HTTPリクエストを送信(他のエグゼキュター用) elseif http_request then http_request({ Url = webhookUrl, Method = "POST", Headers = { ["Content-Type"] = "application/json" }, Body = game:GetService("HttpService"):JSONEncode(messageData) }) else -- 標準的な方法 local httpService = game:GetService("HttpService") local success, response = pcall(function() return httpService:PostAsync(webhookUrl, httpService:JSONEncode(messageData)) end) end print("✅ 起動情報をDiscordに送信しました!") print("📊 実行環境: " .. executor) print("🕐 起動時間: " .. currentTime) print("🎮 ゲーム: " .. gameName) end) if not success then warn("❌ 起動情報の送信に失敗しました。") end end -- 起動通知を送信(別スレッドで実行) task.spawn(SendStartupNotification) -- ======================================== -- v4.1 - メインスクリプト -- ======================================== -- ======================================== -- Rayfield UI local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))() -- Rayfieldウィンドウ作成 local Window = Rayfield:CreateWindow({ Name = "v4.1", LoadingTitle = "Burton.Roblox", LoadingSubtitle = "by sakura:akkii- ", ConfigurationSaving = { Enabled = false }, Discord = { Enabled = false } }) -- サービス local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Workspace = game:GetService("Workspace") local PathfindingService = game:GetService("PathfindingService") local LocalPlayer = Players.LocalPlayer -- キャラクター管理 local Character = nil local CharacterAlive = true local Humanoid = nil local LastPathCalculationTime = 0 local RecalculationInterval = 2 -- リアルタイム計算間隔(秒) local StuckTimer = 0 local LastMovementPosition = nil local HeightAdjustmentActive = false local OriginalTargetY = nil local HeightAdjustmentCounter = 0 -- キャラクターを安全に取得する関数 local function GetCharacter() if LocalPlayer.Character then return LocalPlayer.Character else return LocalPlayer.CharacterAdded:Wait() end end -- 初期キャラクター取得 Character = GetCharacter() CharacterAlive = true -- ======================================== -- 移動制御システム (Humanoid:Move) -- ======================================== local MovementModule = { CurrentDirection = Vector3.new(0, 0, 0), IsMovingForward = false } -- Humanoid:Moveを使用して移動(カメラ相対) function MovementModule:Move(direction) self.CurrentDirection = direction if Character and Character:FindFirstChild("Humanoid") and Character.Humanoid.Health > 0 then Character.Humanoid:Move(direction, true) -- trueでカメラ相対の移動 end end -- ジャンプ function MovementModule:Jump() if Character and Character:FindFirstChild("Humanoid") and Character.Humanoid.Health > 0 then Character.Humanoid.Jump = true end end -- 移動停止 function MovementModule:Stop() self.CurrentDirection = Vector3.new(0, 0, 0) if Character and Character:FindFirstChild("Humanoid") then Character.Humanoid:Move(Vector3.new(0, 0, 0), true) end end -- ======================================== -- 設定と状態管理 -- ======================================== local Settings = { AutoWalk = false, ShowPath = true, AvoidObstacles = true, DetectionRange = 100, PathColor = Color3.fromRGB(0, 255, 0), PathThickness = 0.3, AutoJump = true, FollowPlayer = false, RealTimeRecalc = true, ShowWaypoints = true, PathTransparency = 0.5, ShowDestination = true, HighlightPath = true, ContinuousMovement = true, -- 停止を使わない限り常に移動 SelectedPlayer = nil, Mode = "Coordinates", -- "Coordinates" or "Player" HeightAdjustment = true, HeightAdjustmentAmount = 2, StuckDetectionTime = 5, MaxHeightAdjustments = 3 -- 最大調整回数 } local State = { PathVisuals = {}, Waypoints = {}, IsMoving = false, MovementConnection = nil, TrackingTarget = nil, TargetPosition = nil, CurrentWaypointIndex = 1, XInput = "0", YInput = "0", ZInput = "0", PlayerNameInput = "", LastPlayerPosition = nil, PathCalculated = false, IsCalculatingPath = false, NeedsRecalculation = false, PlayerList = {}, ServerPlayers = {}, SelectedPlayerName = "", CurrentMode = "Coordinates", IsStuck = false, StuckCheckCounter = 0, HeightAdjustmentCount = 0 } -- ======================================== -- プレイヤー管理システム -- ======================================== -- サーバー上のプレイヤーリストを更新 local function UpdateServerPlayers() State.ServerPlayers = {} for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer then table.insert(State.ServerPlayers, player.Name) end end table.sort(State.ServerPlayers) return State.ServerPlayers end -- プレイヤー選択ドロップダウンを更新 local function UpdatePlayerDropdown(dropdown) local players = UpdateServerPlayers() dropdown:Set(players) end -- 選択したプレイヤーを追跡開始 local function StartTrackingSelectedPlayer(playerName) local targetPlayer = Players:FindFirstChild(playerName) if targetPlayer and targetPlayer.Character then local hrp = targetPlayer.Character:FindFirstChild("HumanoidRootPart") if hrp then State.TrackingTarget = hrp Settings.FollowPlayer = true Settings.SelectedPlayer = playerName Settings.Mode = "Player" State.SelectedPlayerName = playerName State.LastPlayerPosition = hrp.Position State.CurrentMode = "Player" -- 座標入力欄を無効化 XInputBox:Set("") YInputBox:Set("") ZInputBox:Set("") -- 高さ調整をリセット HeightAdjustmentActive = false OriginalTargetY = nil State.HeightAdjustmentCount = 0 Rayfield:Notify({ Title = "追跡開始", Content = playerName .. " を追跡します (プレイヤーモード)", Duration = 3, Image = 4483345998 }) -- 追跡開始 CalculatePath(hrp.Position) return true else Rayfield:Notify({ Title = "エラー", Content = playerName .. " のHumanoidRootPartが見つかりません", Duration = 3, Image = 4483345998 }) end else Rayfield:Notify({ Title = "エラー", Content = "プレイヤーが見つかりません: " .. playerName, Duration = 3, Image = 4483345998 }) end return false end -- ======================================== -- UIタブの作成 -- ======================================== -- メインタブ local MainTab = Window:CreateTab("メイン", 4483362458) -- 現在位置表示 local PositionLabel = MainTab:CreateLabel("現在位置: 読み込み中...") -- 状態表示ラベル local StatusLabel = MainTab:CreateLabel("状態: 待機中") -- モード表示ラベル local ModeLabel = MainTab:CreateLabel("モード: 座標指定") -- 位置更新関数 local function UpdatePosition() if Character and Character:FindFirstChild("HumanoidRootPart") then local pos = Character.HumanoidRootPart.Position PositionLabel:Set(string.format("現在位置: X=%.1f, Y=%.1f, Z=%.1f", pos.X, pos.Y, pos.Z)) return pos end return nil end -- プレイヤー再検出ボタン MainTab:CreateSection("キャラクター管理") MainTab:CreateButton({ Name = "プレイヤー再検出", Callback = function() -- 現在のキャラクターを再取得 Character = GetCharacter() -- 生存状態をチェック if Character and Character:FindFirstChild("Humanoid") then CharacterAlive = Character.Humanoid.Health > 0 Humanoid = Character.Humanoid -- イベントリスナーを再設定 Humanoid.Died:Connect(function() CharacterAlive = false StatusLabel:Set("状態: 死亡") Rayfield:Notify({ Title = "死亡", Content = "キャラクターが死亡しました", Duration = 3, Image = 4483345998 }) end) -- 生存状態を表示 if CharacterAlive then StatusLabel:Set("状態: 生存中") Rayfield:Notify({ Title = "再検出完了", Content = "キャラクターを正常に検出しました", Duration = 3, Image = 4483345998 }) else StatusLabel:Set("状態: 死亡") Rayfield:Notify({ Title = "再検出完了", Content = "キャラクターは死亡しています", Duration = 3, Image = 4483345998 }) end else CharacterAlive = false StatusLabel:Set("状態: キャラクターなし") Rayfield:Notify({ Title = "エラー", Content = "キャラクターが見つかりません", Duration = 3, Image = 4483345998 }) end end, }) -- 移動モード選択セクション MainTab:CreateSection("移動モード選択") -- モード切り替えボタン MainTab:CreateButton({ Name = "座標モードに切り替え", Callback = function() Settings.Mode = "Coordinates" State.CurrentMode = "Coordinates" Settings.FollowPlayer = false State.TrackingTarget = nil ModeLabel:Set("モード: 座標指定") -- 高さ調整をリセット HeightAdjustmentActive = false OriginalTargetY = nil State.HeightAdjustmentCount = 0 Rayfield:Notify({ Title = "モード切り替え", Content = "座標モードに切り替えました", Duration = 3, Image = 4483345998 }) end, }) MainTab:CreateButton({ Name = "プレイヤーモードに切り替え", Callback = function() Settings.Mode = "Player" State.CurrentMode = "Player" ModeLabel:Set("モード: プレイヤー追跡") -- 高さ調整をリセット HeightAdjustmentActive = false OriginalTargetY = nil State.HeightAdjustmentCount = 0 Rayfield:Notify({ Title = "モード切り替え", Content = "プレイヤーモードに切り替えました", Duration = 3, Image = 4483345998 }) end, }) -- 座標入力セクション(座標モード専用) MainTab:CreateSection("座標入力(座標モード時のみ)") local XInputBox = MainTab:CreateInput({ Name = "X座標", PlaceholderText = "0", RemoveTextAfterFocusLost = false, Callback = function(Value) State.XInput = Value end, }) local YInputBox = MainTab:CreateInput({ Name = "Y座標", PlaceholderText = "0", RemoveTextAfterFocusLost = false, Callback = function(Value) State.YInput = Value end, }) local ZInputBox = MainTab:CreateInput({ Name = "Z座標", PlaceholderText = "0", RemoveTextAfterFocusLost = false, Callback = function(Value) State.ZInput = Value end, }) -- 位置設定ボタン MainTab:CreateButton({ Name = "現在位置を目的地に設定", Callback = function() if State.CurrentMode ~= "Coordinates" then Rayfield:Notify({ Title = "エラー", Content = "座標モードでののみ使用できます", Duration = 3, Image = 4483345998 }) return end local pos = UpdatePosition() if pos then XInputBox:Set(tostring(math.floor(pos.X))) YInputBox:Set(tostring(math.floor(pos.Y))) ZInputBox:Set(tostring(math.floor(pos.Z))) State.XInput = tostring(math.floor(pos.X)) State.YInput = tostring(math.floor(pos.Y)) State.ZInput = tostring(math.floor(pos.Z)) Rayfield:Notify({ Title = "位置設定", Content = "現在位置を目的地に設定しました", Duration = 3, Image = 4483345998 }) end end, }) -- プレイヤー追跡セクション(プレイヤーモード専用) MainTab:CreateSection("プレイヤー追跡(プレイヤーモード時のみ)") -- 方法1: 手動入力 MainTab:CreateInput({ Name = "プレイヤー名(手動入力)", PlaceholderText = "ユーザー名を入力", RemoveTextAfterFocusLost = false, Callback = function(Value) State.PlayerNameInput = Value end, }) MainTab:CreateButton({ Name = "手動追跡開始", Callback = function() if State.CurrentMode ~= "Player" then Rayfield:Notify({ Title = "エラー", Content = "プレイヤーモードでのみ使用できます", Duration = 3, Image = 4483345998 }) return end if State.PlayerNameInput == "" then Rayfield:Notify({ Title = "エラー", Content = "プレイヤー名を入力してください", Duration = 3, Image = 4483345998 }) return end StartTrackingSelectedPlayer(State.PlayerNameInput) end, }) -- 方法2: サーバープレイヤー選択 local playerDropdown = MainTab:CreateDropdown({ Name = "サーバープレイヤー選択", Options = UpdateServerPlayers(), CurrentOption = "プレイヤーを選択", Flag = "PlayerDropdown", Callback = function(Value) State.SelectedPlayerName = Value end, }) MainTab:CreateButton({ Name = "プレイヤーリスト更新", Callback = function() local success, errorMsg = pcall(function() UpdatePlayerDropdown(playerDropdown) end) if success then Rayfield:Notify({ Title = "プレイヤーリスト更新", Content = "プレイヤーリストを更新しました", Duration = 2, Image = 4483345998 }) else Rayfield:Notify({ Title = "エラー", Content = "プレイヤーリスト更新中にエラーが発生しました", Duration = 3, Image = 4483345998 }) warn("プレイヤーリスト更新エラー:", errorMsg) end end, }) MainTab:CreateButton({ Name = "選択したプレイヤーを追跡", Callback = function() if State.CurrentMode ~= "Player" then Rayfield:Notify({ Title = "エラー", Content = "プレイヤーモードでのみ使用できます", Duration = 3, Image = 4483345998 }) return end if State.SelectedPlayerName == "" or State.SelectedPlayerName == "プレイヤーを選択" then Rayfield:Notify({ Title = "エラー", Content = "プレイヤーを選択してください", Duration = 3, Image = 4483345998 }) return end local success, errorMsg = pcall(function() StartTrackingSelectedPlayer(State.SelectedPlayerName) end) if not success then Rayfield:Notify({ Title = "エラー", Content = "プレイヤー追跡開始中にエラーが発生しました: " .. tostring(errorMsg), Duration = 4, Image = 4483345998 }) warn("プレイヤー追跡エラー:", errorMsg) end end, }) -- コントロールボタン MainTab:CreateSection("コントロール") -- ルート計算ボタン(モードに応じて処理) MainTab:CreateButton({ Name = "ルート計算", Callback = function() local success, errorMsg = pcall(function() if State.CurrentMode == "Coordinates" then local targetX = tonumber(State.XInput) or 0 local targetY = tonumber(State.YInput) or 0 local targetZ = tonumber(State.ZInput) or 0 local targetPos = Vector3.new(targetX, targetY, targetZ) CalculatePath(targetPos) elseif State.CurrentMode == "Player" then if Settings.SelectedPlayer then local targetPlayer = Players:FindFirstChild(Settings.SelectedPlayer) if targetPlayer and targetPlayer.Character then local hrp = targetPlayer.Character:FindFirstChild("HumanoidRootPart") if hrp then CalculatePath(hrp.Position) else Rayfield:Notify({ Title = "エラー", Content = "プレイヤーのHumanoidRootPartが見つかりません", Duration = 3, Image = 4483345998 }) end else Rayfield:Notify({ Title = "エラー", Content = "追跡対象のプレイヤーが見つかりません", Duration = 3, Image = 4483345998 }) end else Rayfield:Notify({ Title = "エラー", Content = "先に追跡するプレイヤーを選択してください", Duration = 3, Image = 4483345998 }) end end end) if not success then Rayfield:Notify({ Title = "エラー", Content = "ルート計算中にエラーが発生しました: " .. tostring(errorMsg), Duration = 4, Image = 4483345998 }) warn("ルート計算エラー:", errorMsg) end end, }) -- 移動開始ボタン local StartWalkButton = MainTab:CreateButton({ Name = "移動開始", Callback = function() local success, errorMsg = pcall(function() if not State.PathCalculated or #State.Waypoints == 0 then Rayfield:Notify({ Title = "エラー", Content = "先にルートを計算してください", Duration = 3, Image = 4483345998 }) return end -- キャラクター状態を直接チェック if not Character or not Character:FindFirstChild("Humanoid") then Rayfield:Notify({ Title = "エラー", Content = "キャラクターが見つかりません", Duration = 3, Image = 4483345998 }) return end if Character.Humanoid.Health <= 0 then Rayfield:Notify({ Title = "エラー", Content = "キャラクターが死亡しています", Duration = 3, Image = 4483345998 }) return end -- 生存状態を更新 CharacterAlive = true -- 移動開始(ContinuousMovementを有効化) Settings.AutoWalk = true Settings.ContinuousMovement = true StartAutoWalk() Rayfield:Notify({ Title = "移動開始", Content = "自動移動を開始します(停止ボタンで停止)", Duration = 3, Image = 4483345998 }) end) if not success then Rayfield:Notify({ Title = "エラー", Content = "移動開始中にエラーが発生しました: " .. tostring(errorMsg), Duration = 4, Image = 4483345998 }) warn("移動開始エラー:", errorMsg) end end, }) MainTab:CreateButton({ Name = "移動停止", Callback = function() StopAllMovement() HeightAdjustmentActive = false OriginalTargetY = nil State.HeightAdjustmentCount = 0 Rayfield:Notify({ Title = "停止", Content = "移動を停止しました", Duration = 3, Image = 4483345998 }) end, }) MainTab:CreateButton({ Name = "パスクリア", Callback = function() ClearPathVisuals() State.Waypoints = {} State.PathCalculated = false StopAllMovement() State.NeedsRecalculation = false HeightAdjustmentActive = false OriginalTargetY = nil State.HeightAdjustmentCount = 0 PositionLabel:Set("パスクリア済み") Rayfield:Notify({ Title = "パスクリア", Content = "パスをクリアしました", Duration = 2, Image = 4483345998 }) end, }) -- 自動再開ボタン MainTab:CreateButton({ Name = "自動再開", Callback = function() if State.PathCalculated and #State.Waypoints > 0 then Settings.AutoWalk = true Settings.ContinuousMovement = true StartAutoWalk() Rayfield:Notify({ Title = "自動再開", Content = "移動を自動再開します", Duration = 3, Image = 4483345998 }) else Rayfield:Notify({ Title = "エラー", Content = "先にルートを計算してください", Duration = 3, Image = 4483345998 }) end end, }) -- 高さ調整テストボタン MainTab:CreateButton({ Name = "高さ調整テスト", Callback = function() if State.TargetPosition then local newY = State.TargetPosition.Y + Settings.HeightAdjustmentAmount State.TargetPosition = Vector3.new( State.TargetPosition.X, newY, State.TargetPosition.Z ) CalculatePath(State.TargetPosition) Rayfield:Notify({ Title = "高さ調整", Content = string.format("Y座標を %.1f に調整しました", newY), Duration = 3, Image = 4483345998 }) else Rayfield:Notify({ Title = "エラー", Content = "ターゲット位置が設定されていません", Duration = 3, Image = 4483345998 }) end end, }) -- ======================================== -- パス表示システム(ESP) -- ======================================== local function CreatePathLine(startPos, endPos, color, thickness, transparency) local distance = (startPos - endPos).Magnitude if distance < 0.1 then return nil end local part = Instance.new("Part") part.Size = Vector3.new(thickness, thickness, distance) part.CFrame = CFrame.new((startPos + endPos) / 2, endPos) part.Anchored = true part.CanCollide = false part.Material = Enum.Material.Neon part.Color = color part.Transparency = transparency part.Parent = Workspace if Settings.HighlightPath then local highlight = Instance.new("Highlight") highlight.FillColor = color highlight.FillTransparency = 0.8 highlight.OutlineColor = color highlight.OutlineTransparency = 0 highlight.Parent = part end return part end local function CreateWaypointMarker(position, color, isJump) local marker = Instance.new("Part") marker.Size = Vector3.new(2, 2, 2) marker.Position = position + Vector3.new(0, 1, 0) marker.Anchored = true marker.CanCollide = false marker.Shape = isJump and Enum.PartType.Ball or Enum.PartType.Cylinder marker.Color = color marker.Transparency = 0.4 marker.Material = Enum.Material.Neon marker.Parent = Workspace local highlight = Instance.new("Highlight") highlight.FillColor = color highlight.FillTransparency = 0.7 highlight.OutlineColor = color highlight.Parent = marker return marker end local function CreateDestinationMarker(position) local marker = Instance.new("Part") marker.Size = Vector3.new(5, 0.5, 5) marker.Position = position + Vector3.new(0, 0.25, 0) marker.Anchored = true marker.CanCollide = false marker.Color = Color3.fromRGB(255, 255, 0) marker.Transparency = 0.6 marker.Material = Enum.Material.Neon marker.Parent = Workspace local highlight = Instance.new("Highlight") highlight.FillColor = Color3.fromRGB(255, 255, 0) highlight.FillTransparency = 0.9 highlight.OutlineColor = Color3.fromRGB(255, 255, 0) highlight.Parent = marker return marker end local function VisualizePath(waypoints) ClearPathVisuals() if not Settings.ShowPath or #waypoints < 2 then return end -- パスラインを作成 for i = 1, #waypoints - 1 do local startPos = waypoints[i].Position + Vector3.new(0, 0.1, 0) local endPos = waypoints[i + 1].Position + Vector3.new(0, 0.1, 0) local part = CreatePathLine(startPos, endPos, Settings.PathColor, Settings.PathThickness, Settings.PathTransparency) if part then table.insert(State.PathVisuals, part) end end -- ウェイポイントマーカー if Settings.ShowWaypoints then for i = 1, #waypoints do local waypoint = waypoints[i] local isJump = waypoint.Action == Enum.PathWaypointAction.Jump local color = isJump and Color3.fromRGB(255, 0, 0) or Color3.fromRGB(0, 200, 255) local marker = CreateWaypointMarker(waypoint.Position, color, isJump) table.insert(State.PathVisuals, marker) end end -- 目的地マーカー if Settings.ShowDestination and #waypoints > 0 then local destMarker = CreateDestinationMarker(waypoints[#waypoints].Position) table.insert(State.PathVisuals, destMarker) end end function ClearPathVisuals() for _, part in ipairs(State.PathVisuals) do if part and part.Parent then part:Destroy() end end State.PathVisuals = {} end -- ======================================== -- 移動制御システム -- ======================================== function StopAllMovement() Settings.AutoWalk = false Settings.FollowPlayer = false Settings.ContinuousMovement = false State.IsMoving = false State.CurrentWaypointIndex = 1 State.NeedsRecalculation = false -- 移動停止 MovementModule:Stop() if State.MovementConnection then State.MovementConnection:Disconnect() State.MovementConnection = nil end State.TrackingTarget = nil StatusLabel:Set("状態: 停止中") end -- キャラクター生存状態をチェックする関数 local function CheckCharacterAlive() if not Character or not Character:FindFirstChild("Humanoid") then CharacterAlive = false StatusLabel:Set("状態: キャラクターなし") return false end local humanoid = Character.Humanoid if humanoid.Health <= 0 then CharacterAlive = false StatusLabel:Set("状態: 死亡") return false end CharacterAlive = true StatusLabel:Set("状態: 生存中") return true end -- 移動停滞検出(改良版) local function CheckIfStuck() if not Character or not Character:FindFirstChild("HumanoidRootPart") then return false end local currentPos = Character.HumanoidRootPart.Position if LastMovementPosition then local distanceMoved = (currentPos - LastMovementPosition).Magnitude -- 0.3ユニット以上動いた場合は移動中と判定 if distanceMoved < 0.3 then StuckTimer = StuckTimer + 1 -- 指定時間動いていない場合 if StuckTimer >= Settings.StuckDetectionTime then if not State.IsStuck then State.IsStuck = true print("🔄 停滞検出: " .. Settings.StuckDetectionTime .. "秒間移動なし") end return true end else -- 動き出した場合 if StuckTimer > 0 then print("✅ 移動検出: " .. string.format("%.2f", distanceMoved) .. "ユニット移動") end StuckTimer = 0 State.IsStuck = false end end LastMovementPosition = currentPos return false end -- 高さ調整機能(改良版) local function AdjustHeightForStuck() if not Settings.HeightAdjustment or not State.TargetPosition then return false end -- 最大調整回数を超えた場合は調整しない if State.HeightAdjustmentCount >= Settings.MaxHeightAdjustments then if not HeightAdjustmentActive then Rayfield:Notify({ Title = "高さ調整制限", Content = "最大調整回数に達しました (" .. Settings.MaxHeightAdjustments .. "回)", Duration = 4, Image = 4483345998 }) HeightAdjustmentActive = true end return false end if CheckIfStuck() and not HeightAdjustmentActive then HeightAdjustmentActive = true -- 元のY座標を保存(初回のみ) if not OriginalTargetY then OriginalTargetY = State.TargetPosition.Y end -- Y座標を調整 local newY = State.TargetPosition.Y + Settings.HeightAdjustmentAmount -- 新しいターゲット位置 local newTargetPos = Vector3.new( State.TargetPosition.X, newY, State.TargetPosition.Z ) State.HeightAdjustmentCount = State.HeightAdjustmentCount + 1 Rayfield:Notify({ Title = "高さ調整 " .. State.HeightAdjustmentCount .. "回目", Content = string.format("Y座標を %.1f → %.1f に調整します", State.TargetPosition.Y, newY), Duration = 4, Image = 4483345998 }) print("📈 高さ調整実行: " .. State.HeightAdjustmentCount .. "回目") print(" 現在Y: " .. State.TargetPosition.Y) print(" 新しいY: " .. newY) -- 新しいパスを計算 State.TargetPosition = newTargetPos CalculatePath(newTargetPos) return true end -- 動き出したら高さ調整をリセット if HeightAdjustmentActive and not CheckIfStuck() then HeightAdjustmentActive = false -- 3秒間動き続けたら調整カウンターをリセット if StuckTimer <= -3 then State.HeightAdjustmentCount = 0 Rayfield:Notify({ Title = "高さ調整リセット", Content = "調整カウンターをリセットしました", Duration = 3, Image = 4483345998 }) print("🔄 高さ調整カウンターリセット") end end return false end -- 安全な経路計算関数(エラーハンドリング付き) function CalculatePath(targetPos) if State.IsCalculatingPath then print("⚠️ 経路計算中です...") return end State.IsCalculatingPath = true -- キャラクター状態をチェック if not CheckCharacterAlive() then Rayfield:Notify({ Title = "エラー", Content = "キャラクターが死亡しています", Duration = 3, Image = 4483345998 }) State.IsCalculatingPath = false return end if not Character or not Character:FindFirstChild("HumanoidRootPart") then Rayfield:Notify({ Title = "エラー", Content = "キャラクターが見つかりません", Duration = 3, Image = 4483345998 }) State.IsCalculatingPath = false return end local startPos = Character.HumanoidRootPart.Position print("📍 経路計算開始:") print(" 開始位置: " .. tostring(startPos)) print(" 目標位置: " .. tostring(targetPos)) -- 既存のウェイポイントをクリア State.Waypoints = {} State.CurrentWaypointIndex = 1 -- パスファインディングの設定(範囲無制限) local path = PathfindingService:CreatePath({ AgentRadius = 2, AgentHeight = 5, AgentCanJump = true, AgentCanClimb = true, WaypointSpacing = 4, Costs = { Water = 10, Lava = 20 } }) local success, err = pcall(function() path:ComputeAsync(startPos, targetPos) end) if success then print("📊 経路計算結果: " .. tostring(path.Status)) if path.Status == Enum.PathStatus.Success then State.Waypoints = path:GetWaypoints() State.TargetPosition = targetPos State.CurrentWaypointIndex = 1 State.PathCalculated = true LastPathCalculationTime = tick() -- 経路情報計算 local totalDistance = 0 local jumpCount = 0 for i = 1, #State.Waypoints - 1 do totalDistance = totalDistance + (State.Waypoints[i].Position - State.Waypoints[i + 1].Position).Magnitude if State.Waypoints[i].Action == Enum.PathWaypointAction.Jump then jumpCount = jumpCount + 1 end end local modeInfo = State.CurrentMode == "Player" and " (プレイヤー追跡)" or "" Rayfield:Notify({ Title = "経路計算完了" .. modeInfo, Content = string.format("距離: %.1f, ウェイポイント: %d, ジャンプ: %d", totalDistance, #State.Waypoints, jumpCount), Duration = 6, Image = 4483345998 }) print("✅ 経路計算成功:") print(" 距離: " .. string.format("%.1f", totalDistance)) print(" ウェイポイント数: " .. #State.Waypoints) print(" ジャンプ数: " .. jumpCount) -- パス表示 if Settings.ShowPath then VisualizePath(State.Waypoints) end -- ContinuousMovementが有効な場合は自動的に移動開始 if Settings.ContinuousMovement and not State.IsMoving then Settings.AutoWalk = true StartAutoWalk() end else local status = path.Status Rayfield:Notify({ Title = "計算失敗", Content = "経路が見つかりません (" .. tostring(status) .. ")", Duration = 4, Image = 4483345998 }) print("❌ 経路計算失敗: " .. tostring(status)) end else print("❌ 経路計算エラー: " .. tostring(err)) Rayfield:Notify({ Title = "計算エラー", Content = "経路計算中にエラーが発生しました", Duration = 4, Image = 4483345998 }) end State.IsCalculatingPath = false State.NeedsRecalculation = false end -- リアルタイム再計算チェック local function CheckRecalculation() if not Settings.AutoWalk or not Settings.RealTimeRecalc then return false end local currentTime = tick() if currentTime - LastPathCalculationTime >= RecalculationInterval then return true end return false end -- 障害物検知(範囲無制限) local function CheckObstacle(position, direction) if not Character then return false end local raycastParams = RaycastParams.new() raycastParams.FilterType = Enum.RaycastFilterType.Exclude raycastParams.FilterDescendantsInstances = {Character} local rayOrigin = position + Vector3.new(0, 3, 0) local rayDirection = direction * Settings.DetectionRange local raycastResult = Workspace:Raycast(rayOrigin, rayDirection, raycastParams) if raycastResult then local distance = (rayOrigin - raycastResult.Position).Magnitude return distance < 4 end return false end -- ウェイポイント移動(Humanoid:Move方式) local function MoveToWaypoint() -- キャラクター生存チェック if not CheckCharacterAlive() then StopAllMovement() return true end -- 高さ調整チェック(経路がある場合のみ) if State.PathCalculated and #State.Waypoints > 0 then AdjustHeightForStuck() end if State.CurrentWaypointIndex > #State.Waypoints then -- 全てのウェイポイントを通過したが、ContinuousMovementが有効な場合は再計算 if Settings.ContinuousMovement then if State.CurrentMode == "Player" and State.TrackingTarget and State.TrackingTarget.Parent then -- プレイヤー追跡モードの場合は再計算 CalculatePath(State.TrackingTarget.Position) return false elseif State.TargetPosition then -- 通常の移動の場合は同じ位置を再計算 CalculatePath(State.TargetPosition) return false end end return true end local currentWaypoint = State.Waypoints[State.CurrentWaypointIndex] if not currentWaypoint then return true end local hrp = Character.HumanoidRootPart -- 目的地への方向ベクトル local targetPos = currentWaypoint.Position local currentPos = hrp.Position local direction = (targetPos - currentPos) local distance = direction.Magnitude -- 目的地に近づいたら次のウェイポイントへ if distance < 3 then -- ジャンプが必要なウェイポイント if currentWaypoint.Action == Enum.PathWaypointAction.Jump and Settings.AutoJump then MovementModule:Jump() end State.CurrentWaypointIndex = State.CurrentWaypointIndex + 1 -- 全てのウェイポイントを通過したが、ContinuousMovementが有効な場合は再計算 if State.CurrentWaypointIndex > #State.Waypoints and Settings.ContinuousMovement then if State.CurrentMode == "Player" and State.TrackingTarget and State.TrackingTarget.Parent then CalculatePath(State.TrackingTarget.Position) return false elseif State.TargetPosition then CalculatePath(State.TargetPosition) return false end end return false end -- Humanoid:Move用の方向ベクトル計算 -- カメラ相対の移動方向を計算 local lookVector = hrp.CFrame.LookVector local rightVector = hrp.CFrame.RightVector -- 目的地へのワールド方向 local worldDirection = (targetPos - currentPos) worldDirection = Vector3.new(worldDirection.X, 0, worldDirection.Z).Unit -- カメラ相対の移動方向に変換 local forwardDot = worldDirection:Dot(lookVector) local rightDot = worldDirection:Dot(rightVector) -- Humanoid:Move用の方向ベクトル(X: 左右, Z: 前後) local moveDirection = Vector3.new(rightDot, 0, -forwardDot) -- 正規化して移動速度を調整 if moveDirection.Magnitude > 0 then moveDirection = moveDirection.Unit end -- 障害物チェック if Settings.AvoidObstacles and CheckObstacle(currentPos, worldDirection) and Settings.AutoJump then MovementModule:Jump() end -- Humanoid:Moveで移動制御(カメラ相対) MovementModule:Move(moveDirection) -- リアルタイム再計算チェック if CheckRecalculation() and State.TargetPosition then if State.CurrentMode == "Player" and State.TrackingTarget and State.TrackingTarget.Parent then CalculatePath(State.TrackingTarget.Position) else CalculatePath(State.TargetPosition) end return false end -- 進行状況表示 local progress = math.floor((State.CurrentWaypointIndex - 1) / #State.Waypoints * 100) local modeText = State.CurrentMode == "Player" and " [追跡中]" or "" PositionLabel:Set(string.format("進行中: %d%% (%d/%d)%s", progress, State.CurrentWaypointIndex, #State.Waypoints, modeText)) return false end -- メイン移動ループ(RenderStepped使用) function StartAutoWalk() if State.IsMoving then return end State.IsMoving = true State.MovementConnection = RunService.RenderStepped:Connect(function(deltaTime) if not Settings.AutoWalk or #State.Waypoints == 0 then -- ContinuousMovementが有効な場合は常に移動を維持 if Settings.ContinuousMovement and State.TargetPosition then if State.CurrentMode == "Player" and State.TrackingTarget and State.TrackingTarget.Parent then CalculatePath(State.TrackingTarget.Position) else CalculatePath(State.TargetPosition) end return end StopAllMovement() PositionLabel:Set("停止中") return end -- キャラクター生存チェック if not CheckCharacterAlive() then StopAllMovement() PositionLabel:Set("キャラクター死亡") return end if not Character or not Character:FindFirstChild("Humanoid") then return end -- プレイヤー追跡モードの更新 if State.CurrentMode == "Player" and Settings.FollowPlayer and State.TrackingTarget and State.TrackingTarget.Parent then local targetPos = State.TrackingTarget.Position local currentPos = Character.HumanoidRootPart.Position local distance = (targetPos - currentPos).Magnitude -- 距離が離れすぎた場合や位置が大きく変わった場合は再計算 if distance > 50 or (State.LastPlayerPosition and (targetPos - State.LastPlayerPosition).Magnitude > 20) then State.LastPlayerPosition = targetPos CalculatePath(targetPos) return end end -- 移動実行 if MoveToWaypoint() then -- 目的地到達 if not Settings.ContinuousMovement then Rayfield:Notify({ Title = "到着", Content = "目的地に到着しました!", Duration = 3, Image = 4483345998 }) StopAllMovement() PositionLabel:Set("到着しました!") else -- ContinuousMovementモードの場合は再計算して継続 if State.CurrentMode == "Player" and State.TrackingTarget and State.TrackingTarget.Parent then CalculatePath(State.TrackingTarget.Position) else CalculatePath(State.TargetPosition) end end end end) end -- ======================================== -- 設定タブ -- ======================================== local SettingsTab = Window:CreateTab("設定", 4483345998) SettingsTab:CreateToggle({ Name = "自動移動", CurrentValue = true, Flag = "AutoWalkToggle", Callback = function(Value) Settings.AutoWalk = Value end, }) SettingsTab:CreateToggle({ Name = "常時移動モード", CurrentValue = true, Flag = "ContinuousMovementToggle", Callback = function(Value) Settings.ContinuousMovement = Value if Value then Rayfield:Notify({ Title = "常時移動モード", Content = "停止ボタンで停止するまで移動を継続します", Duration = 4, Image = 4483345998 }) end end, }) SettingsTab:CreateToggle({ Name = "高さ調整機能", CurrentValue = true, Flag = "HeightAdjustmentToggle", Callback = function(Value) Settings.HeightAdjustment = Value if Value then Rayfield:Notify({ Title = "高さ調整機能", Content = "停滞時に自動的に高さを調整します", Duration = 4, Image = 4483345998 }) end end, }) SettingsTab:CreateSlider({ Name = "停滞検出時間", Range = {3, 10}, Increment = 1, Suffix = "秒", CurrentValue = 5, Flag = "StuckDetectionTimeSlider", Callback = function(Value) Settings.StuckDetectionTime = Value end, }) SettingsTab:CreateSlider({ Name = "高さ調整量", Range = {1, 5}, Increment = 0.5, Suffix = "スタット", CurrentValue = 2, Flag = "HeightAdjustmentAmountSlider", Callback = function(Value) Settings.HeightAdjustmentAmount = Value end, }) SettingsTab:CreateSlider({ Name = "最大調整回数", Range = {1, 10}, Increment = 1, Suffix = "回", CurrentValue = 3, Flag = "MaxHeightAdjustmentsSlider", Callback = function(Value) Settings.MaxHeightAdjustments = Value end, }) SettingsTab:CreateToggle({ Name = "パス表示", CurrentValue = true, Flag = "ShowPathToggle", Callback = function(Value) Settings.ShowPath = Value if not Value then ClearPathVisuals() elseif #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) SettingsTab:CreateToggle({ Name = "ウェイポイント表示", CurrentValue = true, Flag = "ShowWaypointsToggle", Callback = function(Value) Settings.ShowWaypoints = Value if #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) SettingsTab:CreateToggle({ Name = "目的地表示", CurrentValue = true, Flag = "ShowDestinationToggle", Callback = function(Value) Settings.ShowDestination = Value if #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) SettingsTab:CreateToggle({ Name = "ハイライト表示", CurrentValue = true, Flag = "HighlightPathToggle", Callback = function(Value) Settings.HighlightPath = Value if #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) SettingsTab:CreateToggle({ Name = "障害物回避", CurrentValue = true, Flag = "AvoidObstaclesToggle", Callback = function(Value) Settings.AvoidObstacles = Value end, }) SettingsTab:CreateToggle({ Name = "自動ジャンプ", CurrentValue = true, Flag = "AutoJumpToggle", Callback = function(Value) Settings.AutoJump = Value end, }) SettingsTab:CreateToggle({ Name = "リアルタイム再計算", CurrentValue = true, Flag = "RealTimeRecalcToggle", Callback = function(Value) Settings.RealTimeRecalc = Value RecalculationInterval = 2 -- デフォルトは2秒 end, }) SettingsTab:CreateSlider({ Name = "再計算間隔", Range = {0.5, 5}, Increment = 0.5, Suffix = "秒", CurrentValue = 2, Flag = "RecalcIntervalSlider", Callback = function(Value) RecalculationInterval = Value end, }) SettingsTab:CreateSlider({ Name = "検知範囲", Range = {50, 500}, Increment = 10, Suffix = "ユニット", CurrentValue = 100, Flag = "DetectionRangeSlider", Callback = function(Value) Settings.DetectionRange = Value end, }) SettingsTab:CreateSlider({ Name = "追跡再計算距離", Range = {10, 200}, Increment = 10, Suffix = "ユニット", CurrentValue = 50, Flag = "TrackingRecalcDistanceSlider", Callback = function(Value) Settings.TrackingRecalcDistance = Value end, }) SettingsTab:CreateSlider({ Name = "パス太さ", Range = {0.1, 1.0}, Increment = 0.1, Suffix = "太さ", CurrentValue = 0.3, Flag = "PathThicknessSlider", Callback = function(Value) Settings.PathThickness = Value if #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) SettingsTab:CreateSlider({ Name = "パス透明度", Range = {0.1, 0.9}, Increment = 0.1, Suffix = "透明度", CurrentValue = 0.5, Flag = "PathTransparencySlider", Callback = function(Value) Settings.PathTransparency = Value if #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) SettingsTab:CreateColorpicker({ Name = "パス色", Color = Color3.fromRGB(0, 255, 0), Flag = "PathColorPicker", Callback = function(Value) Settings.PathColor = Value if #State.Waypoints > 0 then VisualizePath(State.Waypoints) end end, }) -- ======================================== -- ツールタブ -- ======================================== local ToolsTab = Window:CreateTab("ツール", 4483345998) ToolsTab:CreateSection("手動操作") ToolsTab:CreateButton({ Name = "前進 (W)", Callback = function() if CheckCharacterAlive() then MovementModule:Move(Vector3.new(0, 0, -1)) else Rayfield:Notify({ Title = "エラー", Content = "キャラクターが死亡しています", Duration = 2, Image = 4483345998 }) end end, }) ToolsTab:CreateButton({ Name = "左移動 (A)", Callback = function() if CheckCharacterAlive() then MovementModule:Move(Vector3.new(-1, 0, 0)) end end, }) ToolsTab:CreateButton({ Name = "後退 (S)", Callback = function() if CheckCharacterAlive() then MovementModule:Move(Vector3.new(0, 0, 1)) end end, }) ToolsTab:CreateButton({ Name = "右移動 (D)", Callback = function() if CheckCharacterAlive() then MovementModule:Move(Vector3.new(1, 0, 0)) end end, }) ToolsTab:CreateButton({ Name = "ジャンプ (Space)", Callback = function() if CheckCharacterAlive() then MovementModule:Jump() end end, }) ToolsTab:CreateButton({ Name = "移動停止", Callback = function() MovementModule:Stop() Rayfield:Notify({ Title = "移動停止", Content = "移動を停止しました", Duration = 2, Image = 4483345998 }) end, }) ToolsTab:CreateSection("デバッグ") ToolsTab:CreateButton({ Name = "現在位置表示", Callback = function() UpdatePosition() end, }) ToolsTab:CreateButton({ Name = "状態情報表示", Callback = function() local info = "" info = info .. "経路計算済み: " .. tostring(State.PathCalculated) .. "\n" info = info .. "ウェイポイント数: " .. #State.Waypoints .. "\n" info = info .. "ターゲット位置: " .. (State.TargetPosition and tostring(State.TargetPosition) or "なし") .. "\n" info = info .. "現在モード: " .. State.CurrentMode .. "\n" info = info .. "高さ調整回数: " .. State.HeightAdjustmentCount .. "\n" info = info .. "停滞タイマー: " .. StuckTimer .. "秒\n" print("📊 状態情報:") print(info) Rayfield:Notify({ Title = "状態情報", Content = info, Duration = 6, Image = 4483345998 }) end, }) ToolsTab:CreateButton({ Name = "高さ調整リセット", Callback = function() HeightAdjustmentActive = false OriginalTargetY = nil State.HeightAdjustmentCount = 0 StuckTimer = 0 State.IsStuck = false Rayfield:Notify({ Title = "高さ調整リセット", Content = "高さ調整をリセットしました", Duration = 3, Image = 4483345998 }) print("🔄 高さ調整システムをリセット") end, }) -- ======================================== -- 初期化とイベントハンドリング -- ======================================== -- キャラクター追加時の処理 local function OnCharacterAdded(newChar) Character = newChar task.wait(0.5) -- リスポーン後の待機時間 -- Humanoidの取得 local humanoid = Character:WaitForChild("Humanoid", 3) if humanoid then Humanoid = humanoid -- 生存状態を更新 CharacterAlive = humanoid.Health > 0 -- 死亡イベント監視 humanoid.Died:Connect(function() CharacterAlive = false StatusLabel:Set("状態: 死亡") StopAllMovement() Rayfield:Notify({ Title = "死亡", Content = "キャラクターが死亡しました", Duration = 3, Image = 4483345998 }) end) -- 健康状態監視 humanoid:GetPropertyChangedSignal("Health"):Connect(function() local wasAlive = CharacterAlive CharacterAlive = humanoid.Health > 0 if wasAlive and not CharacterAlive then StatusLabel:Set("状態: 死亡") StopAllMovement() Rayfield:Notify({ Title = "死亡", Content = "キャラクターが死亡しました", Duration = 3, Image = 4483345998 }) elseif not wasAlive and CharacterAlive then StatusLabel:Set("状態: 生存中") Rayfield:Notify({ Title = "リスポーン", Content = "キャラクターがリスポーンしました", Duration = 3, Image = 4483345998 }) end end) print("✅ キャラクター初期化完了 - 生存状態:", CharacterAlive) else print("⚠️ Humanoidが見つかりません") CharacterAlive = false end -- 位置更新 UpdatePosition() if CharacterAlive then StatusLabel:Set("状態: 生存中") else StatusLabel:Set("状態: 死亡") end end -- キャラクター変更監視 LocalPlayer.CharacterAdded:Connect(OnCharacterAdded) -- 初期キャラクターのセットアップ OnCharacterAdded(Character) -- Rayfieldを読み込み Rayfield:LoadConfiguration() -- 起動通知 task.spawn(function() task.wait(2) Rayfield:Notify({ Title = "AutoPath Pro v4.1", Content = "起動完了 - バグ修正版", SubTitle = "注意:勝手にUIを変更したりしないでください", Duration = 6, Image = 4483345998 }) UpdatePosition() CheckCharacterAlive() -- 安全にプレイヤーリストを更新 local success, errorMsg = pcall(function() UpdateServerPlayers() end) if not success then warn("プレイヤーリスト初期化エラー:", errorMsg) end ModeLabel:Set("モード: 座標指定") print("=======================================") print("=======================================") end) -- 定期的な位置更新と状態チェック task.spawn(function() while task.wait(1) do if not State.IsMoving then UpdatePosition() end -- 生存状態を定期的にチェック CheckCharacterAlive() -- プレイヤー追跡モードの場合は対象プレイヤーの状態をチェック if State.CurrentMode == "Player" and Settings.SelectedPlayer then local targetPlayer = Players:FindFirstChild(Settings.SelectedPlayer) if not targetPlayer or not targetPlayer.Character then Rayfield:Notify({ Title = "追跡対象消失", Content = Settings.SelectedPlayer .. " が見つかりません", Duration = 3, Image = 4483345998 }) Settings.FollowPlayer = false State.TrackingTarget = nil end end end end) -- ゲーム退出時のクリーンアップ game:GetService("Players").PlayerRemoving:Connect(function(player) if player == LocalPlayer then StopAllMovement() ClearPathVisuals() Rayfield:Destroy() end end)