Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Script untuk memberikan efek slow motion kepada pemain ketika menyentuh Part
- dengan nama tertentu di seluruh Workspace.
- Letakkan Script ini di dalam ServerScriptService.
- --]]
- -- Variabel Konfigurasi --
- local namaBalokPemicu = "Slow" -- (string) Nama Part yang akan memicu slow motion
- local aktifkanSlowMotion = true -- (boolean) Ganti ke 'false' untuk menonaktifkan efek slow motion ini
- local kecepatanSlowMotion = 8 -- (number) Kecepatan berjalan saat slow motion (Normalnya 16)
- -------------------------------------------
- -- Jangan ubah kode di bawah ini kecuali Anda tahu apa yang Anda lakukan --
- -------------------------------------------
- local PlayersService = game:GetService("Players")
- local WorkspaceService = game:GetService("Workspace")
- local kecepatanNormalDefault = 16 -- Kecepatan berjalan standar Humanoid
- local pemainYangTersentuh = {} -- Tabel untuk melacak pemain { [Player] = { humanoid = Humanoid, kecepatanAsli = number, menyentuhPart = BasePart } }
- -- Fungsi yang dijalankan ketika sebuah objek menyentuh Part pemicu
- local function onTouch(triggerPart, otherPart)
- -- Periksa apakah fitur slow motion diaktifkan
- if not aktifkanSlowMotion then return end
- -- Periksa apakah 'otherPart' adalah bagian dari sebuah karakter (model)
- local characterModel = otherPart.Parent
- if not characterModel then return end
- -- Periksa apakah di dalam model karakter ada Humanoid
- local humanoid = characterModel:FindFirstChildWhichIsA("Humanoid")
- if not humanoid or humanoid:GetState() == Enum.HumanoidStateType.Dead then return end -- Abaikan jika mati
- -- Periksa apakah karakter ini adalah pemain
- local player = PlayersService:GetPlayerFromCharacter(characterModel)
- if not player then return end -- Abaikan jika bukan pemain (misalnya NPC)
- -- Jika Humanoid ditemukan dan belum dalam status slow motion OLEH PART INI
- -- (Penting: pemain bisa menyentuh *beberapa* part 'Slow' berbeda)
- if not pemainYangTersentuh[player] or pemainYangTersentuh[player].menyentuhPart ~= triggerPart then
- -- Jika pemain sudah tersentuh part lain, abaikan (biarkan efek part pertama)
- if pemainYangTersentuh[player] then return end
- print(player.Name .. " memasuki zona slow motion pada part: " .. triggerPart:GetFullName()) -- Pesan debug
- -- Simpan data pemain
- pemainYangTersentuh[player] = {
- humanoid = humanoid,
- kecepatanAsli = humanoid.WalkSpeed, -- Simpan kecepatan saat ini
- menyentuhPart = triggerPart -- Catat part mana yang disentuh pertama kali
- }
- -- Terapkan kecepatan slow motion
- humanoid.WalkSpeed = kecepatanSlowMotion
- end
- end
- -- Fungsi yang dijalankan ketika sebuah objek berhenti menyentuh Part pemicu
- local function onTouchEnded(triggerPart, otherPart)
- -- Periksa apakah 'otherPart' adalah bagian dari sebuah karakter (model)
- local characterModel = otherPart.Parent
- if not characterModel then return end
- -- Periksa apakah di dalam model karakter ada Humanoid
- local humanoid = characterModel:FindFirstChildWhichIsA("Humanoid")
- if not humanoid then return end
- -- Periksa apakah karakter ini adalah pemain
- local player = PlayersService:GetPlayerFromCharacter(characterModel)
- if not player then return end
- -- Periksa apakah pemain ini sebelumnya tercatat menyentuh PART INI
- if pemainYangTersentuh[player] and pemainYangTersentuh[player].menyentuhPart == triggerPart then
- -- Periksa apakah *ada bagian lain* dari karakter yang *masih* menyentuh PART INI?
- local masihMenyentuhPartIni = false
- local menyentuhParts = triggerPart:GetTouchingParts()
- for _, part in ipairs(menyentuhParts) do
- if part.Parent == characterModel then
- masihMenyentuhPartIni = true
- break
- end
- end
- -- Jika tidak ada bagian lain dari karakter yang masih menyentuh PART INI
- if not masihMenyentuhPartIni then
- print(player.Name .. " meninggalkan zona slow motion pada part: " .. triggerPart:GetFullName()) -- Pesan debug
- local dataPemain = pemainYangTersentuh[player]
- -- Kembalikan ke kecepatan asli yang disimpan sebelumnya
- -- Pastikan dataPemain dan humanoid masih valid
- if dataPemain and dataPemain.humanoid and dataPemain.humanoid.Parent then
- -- Hanya kembalikan jika kecepatan saat ini adalah kecepatan slow motion
- -- (Mencegah menimpa efek kecepatan lain yang mungkin terjadi saat disentuh)
- if dataPemain.humanoid.WalkSpeed == kecepatanSlowMotion then
- dataPemain.humanoid.WalkSpeed = dataPemain.kecepatanAsli
- end
- else
- -- Fallback jika ada masalah, kembalikan ke default
- if humanoid.Parent and humanoid.WalkSpeed == kecepatanSlowMotion then
- humanoid.WalkSpeed = kecepatanNormalDefault
- end
- end
- -- Hapus pemain dari tabel pelacakan
- pemainYangTersentuh[player] = nil
- end
- end
- end
- -- Fungsi untuk menghubungkan event ke sebuah Part
- local function setupPart(part)
- -- Pastikan itu adalah BasePart (bisa disentuh) dan namanya sesuai
- if part:IsA("BasePart") and part.Name == namaBalokPemicu then
- print("Menemukan dan menghubungkan event ke part:", part:GetFullName())
- part.Touched:Connect(function(otherPart)
- onTouch(part, otherPart) -- Mengirimkan referensi 'part' yang disentuh
- end)
- part.TouchEnded:Connect(function(otherPart)
- onTouchEnded(part, otherPart) -- Mengirimkan referensi 'part' yang disentuh
- end)
- end
- end
- -- Fungsi untuk membersihkan data pemain
- local function onPlayerRemoving(player)
- if pemainYangTersentuh[player] then
- local dataPemain = pemainYangTersentuh[player]
- -- Coba kembalikan kecepatan jika humanoid masih ada
- if dataPemain and dataPemain.humanoid and dataPemain.humanoid.Parent then
- if dataPemain.humanoid.WalkSpeed == kecepatanSlowMotion then
- dataPemain.humanoid.WalkSpeed = dataPemain.kecepatanAsli
- end
- end
- pemainYangTersentuh[player] = nil -- Hapus dari tabel
- print("Membersihkan data slow motion untuk pemain:", player.Name)
- end
- end
- -- Menghubungkan event saat pemain keluar
- PlayersService.PlayerRemoving:Connect(onPlayerRemoving)
- -- Memproses semua part yang sudah ada di Workspace saat script dimulai
- for _, descendant in ipairs(WorkspaceService:GetDescendants()) do
- setupPart(descendant)
- end
- -- Memproses part baru yang ditambahkan ke Workspace setelah script berjalan
- WorkspaceService.DescendantAdded:Connect(setupPart)
- print("Script Slow Motion Berbasis Nama (" .. namaBalokPemicu .. ") siap dijalankan dari ServerScriptService.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement