Advertisement
HanzerCopy

Slow motion, Cukup masukkan 1 script

Apr 6th, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.36 KB | None | 0 0
  1. --[[
  2. Script untuk memberikan efek slow motion kepada pemain ketika menyentuh Part
  3. dengan nama tertentu di seluruh Workspace.
  4. Letakkan Script ini di dalam ServerScriptService.
  5. --]]
  6.  
  7. -- Variabel Konfigurasi --
  8. local namaBalokPemicu = "Slow"   -- (string) Nama Part yang akan memicu slow motion
  9. local aktifkanSlowMotion = true  -- (boolean) Ganti ke 'false' untuk menonaktifkan efek slow motion ini
  10. local kecepatanSlowMotion = 8    -- (number) Kecepatan berjalan saat slow motion (Normalnya 16)
  11.  
  12. -------------------------------------------
  13. -- Jangan ubah kode di bawah ini kecuali Anda tahu apa yang Anda lakukan --
  14. -------------------------------------------
  15.  
  16. local PlayersService = game:GetService("Players")
  17. local WorkspaceService = game:GetService("Workspace")
  18.  
  19. local kecepatanNormalDefault = 16 -- Kecepatan berjalan standar Humanoid
  20. local pemainYangTersentuh = {} -- Tabel untuk melacak pemain { [Player] = { humanoid = Humanoid, kecepatanAsli = number, menyentuhPart = BasePart } }
  21.  
  22. -- Fungsi yang dijalankan ketika sebuah objek menyentuh Part pemicu
  23. local function onTouch(triggerPart, otherPart)
  24.     -- Periksa apakah fitur slow motion diaktifkan
  25.     if not aktifkanSlowMotion then return end
  26.  
  27.     -- Periksa apakah 'otherPart' adalah bagian dari sebuah karakter (model)
  28.     local characterModel = otherPart.Parent
  29.     if not characterModel then return end
  30.  
  31.     -- Periksa apakah di dalam model karakter ada Humanoid
  32.     local humanoid = characterModel:FindFirstChildWhichIsA("Humanoid")
  33.     if not humanoid or humanoid:GetState() == Enum.HumanoidStateType.Dead then return end -- Abaikan jika mati
  34.  
  35.     -- Periksa apakah karakter ini adalah pemain
  36.     local player = PlayersService:GetPlayerFromCharacter(characterModel)
  37.     if not player then return end -- Abaikan jika bukan pemain (misalnya NPC)
  38.  
  39.     -- Jika Humanoid ditemukan dan belum dalam status slow motion OLEH PART INI
  40.     -- (Penting: pemain bisa menyentuh *beberapa* part 'Slow' berbeda)
  41.     if not pemainYangTersentuh[player] or pemainYangTersentuh[player].menyentuhPart ~= triggerPart then
  42.         -- Jika pemain sudah tersentuh part lain, abaikan (biarkan efek part pertama)
  43.         if pemainYangTersentuh[player] then return end
  44.  
  45.         print(player.Name .. " memasuki zona slow motion pada part: " .. triggerPart:GetFullName()) -- Pesan debug
  46.  
  47.         -- Simpan data pemain
  48.         pemainYangTersentuh[player] = {
  49.             humanoid = humanoid,
  50.             kecepatanAsli = humanoid.WalkSpeed, -- Simpan kecepatan saat ini
  51.             menyentuhPart = triggerPart         -- Catat part mana yang disentuh pertama kali
  52.         }
  53.  
  54.         -- Terapkan kecepatan slow motion
  55.         humanoid.WalkSpeed = kecepatanSlowMotion
  56.     end
  57. end
  58.  
  59. -- Fungsi yang dijalankan ketika sebuah objek berhenti menyentuh Part pemicu
  60. local function onTouchEnded(triggerPart, otherPart)
  61.     -- Periksa apakah 'otherPart' adalah bagian dari sebuah karakter (model)
  62.     local characterModel = otherPart.Parent
  63.     if not characterModel then return end
  64.  
  65.     -- Periksa apakah di dalam model karakter ada Humanoid
  66.     local humanoid = characterModel:FindFirstChildWhichIsA("Humanoid")
  67.     if not humanoid then return end
  68.  
  69.     -- Periksa apakah karakter ini adalah pemain
  70.     local player = PlayersService:GetPlayerFromCharacter(characterModel)
  71.     if not player then return end
  72.  
  73.     -- Periksa apakah pemain ini sebelumnya tercatat menyentuh PART INI
  74.     if pemainYangTersentuh[player] and pemainYangTersentuh[player].menyentuhPart == triggerPart then
  75.  
  76.         -- Periksa apakah *ada bagian lain* dari karakter yang *masih* menyentuh PART INI?
  77.         local masihMenyentuhPartIni = false
  78.         local menyentuhParts = triggerPart:GetTouchingParts()
  79.         for _, part in ipairs(menyentuhParts) do
  80.             if part.Parent == characterModel then
  81.                 masihMenyentuhPartIni = true
  82.                 break
  83.             end
  84.         end
  85.  
  86.         -- Jika tidak ada bagian lain dari karakter yang masih menyentuh PART INI
  87.         if not masihMenyentuhPartIni then
  88.             print(player.Name .. " meninggalkan zona slow motion pada part: " .. triggerPart:GetFullName()) -- Pesan debug
  89.             local dataPemain = pemainYangTersentuh[player]
  90.  
  91.             -- Kembalikan ke kecepatan asli yang disimpan sebelumnya
  92.             -- Pastikan dataPemain dan humanoid masih valid
  93.             if dataPemain and dataPemain.humanoid and dataPemain.humanoid.Parent then
  94.                 -- Hanya kembalikan jika kecepatan saat ini adalah kecepatan slow motion
  95.                 -- (Mencegah menimpa efek kecepatan lain yang mungkin terjadi saat disentuh)
  96.                 if dataPemain.humanoid.WalkSpeed == kecepatanSlowMotion then
  97.                     dataPemain.humanoid.WalkSpeed = dataPemain.kecepatanAsli
  98.                 end
  99.             else
  100.                 -- Fallback jika ada masalah, kembalikan ke default
  101.                 if humanoid.Parent and humanoid.WalkSpeed == kecepatanSlowMotion then
  102.                     humanoid.WalkSpeed = kecepatanNormalDefault
  103.                 end
  104.             end
  105.  
  106.             -- Hapus pemain dari tabel pelacakan
  107.             pemainYangTersentuh[player] = nil
  108.         end
  109.     end
  110. end
  111.  
  112. -- Fungsi untuk menghubungkan event ke sebuah Part
  113. local function setupPart(part)
  114.     -- Pastikan itu adalah BasePart (bisa disentuh) dan namanya sesuai
  115.     if part:IsA("BasePart") and part.Name == namaBalokPemicu then
  116.         print("Menemukan dan menghubungkan event ke part:", part:GetFullName())
  117.         part.Touched:Connect(function(otherPart)
  118.             onTouch(part, otherPart) -- Mengirimkan referensi 'part' yang disentuh
  119.         end)
  120.         part.TouchEnded:Connect(function(otherPart)
  121.             onTouchEnded(part, otherPart) -- Mengirimkan referensi 'part' yang disentuh
  122.         end)
  123.     end
  124. end
  125.  
  126. -- Fungsi untuk membersihkan data pemain
  127. local function onPlayerRemoving(player)
  128.     if pemainYangTersentuh[player] then
  129.         local dataPemain = pemainYangTersentuh[player]
  130.         -- Coba kembalikan kecepatan jika humanoid masih ada
  131.         if dataPemain and dataPemain.humanoid and dataPemain.humanoid.Parent then
  132.             if dataPemain.humanoid.WalkSpeed == kecepatanSlowMotion then
  133.                 dataPemain.humanoid.WalkSpeed = dataPemain.kecepatanAsli
  134.             end
  135.         end
  136.         pemainYangTersentuh[player] = nil -- Hapus dari tabel
  137.         print("Membersihkan data slow motion untuk pemain:", player.Name)
  138.     end
  139. end
  140.  
  141. -- Menghubungkan event saat pemain keluar
  142. PlayersService.PlayerRemoving:Connect(onPlayerRemoving)
  143.  
  144. -- Memproses semua part yang sudah ada di Workspace saat script dimulai
  145. for _, descendant in ipairs(WorkspaceService:GetDescendants()) do
  146.     setupPart(descendant)
  147. end
  148.  
  149. -- Memproses part baru yang ditambahkan ke Workspace setelah script berjalan
  150. WorkspaceService.DescendantAdded:Connect(setupPart)
  151.  
  152. print("Script Slow Motion Berbasis Nama (" .. namaBalokPemicu .. ") siap dijalankan dari ServerScriptService.")
  153.  
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement