Advertisement
HanzerCopy

Script 2

Jun 13th, 2025
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.92 KB | Source Code | 0 0
  1. local zona = script.Parent -- Mendapatkan referensi ke Part yang akan berfungsi sebagai zona hover
  2. local pemainDiZona = {} -- Tabel untuk melacak pemain yang sedang di dalam zona hover
  3. local Players = game:GetService("Players") -- Mendapatkan layanan Players
  4. local RunService = game:GetService("RunService") -- Mendapatkan layanan RunService untuk update game loop
  5.  
  6. -- Inisialisasi properti part zona
  7. zona.CanCollide = false -- Pemain bisa melewati zona ini tanpa bertabrakan
  8. zona.CanTouch = true -- Mengizinkan event Touched untuk mendeteksi pemain masuk
  9. zona.Anchored = true -- Memastikan zona tidak bergerak atau jatuh
  10.  
  11. -- Parameter Hover
  12. local HOVER_FORCE_MAX = math.huge -- Kekuatan maksimum yang bisa diterapkan oleh BodyVelocity. math.huge berarti kekuatan tidak terbatas, memastikan hover selalu bisa terjadi.
  13. local HOVER_P_GAIN_BV = 5000 -- Gain 'P' (Proportional) untuk BodyVelocity. Semakin tinggi nilainya, semakin kuat BodyVelocity mencoba mencapai kecepatan targetnya, membuat hover lebih responsif.
  14. local HOVER_HEIGHT_OFFSET = 100 -- Jarak vertikal (dalam stud) di atas posisi Y zona di mana pemain akan melayang. Jadi, jika zona berada di Y=0, pemain akan hover di Y=100.
  15. local HOVER_P_CONTROLLER_GAIN = 10 -- Gain 'P' untuk kontroler hover kustom. Ini menentukan seberapa cepat kecepatan vertikal pemain menyesuaikan diri dengan perbedaan antara ketinggian saat ini dan ketinggian target. Nilai lebih tinggi membuat penyesuaian lebih cepat.
  16. local HOVER_VELOCITY_MIN = -10 -- Kecepatan vertikal minimum (ke bawah) yang diizinkan untuk hover. Mencegah pemain jatuh terlalu cepat.
  17. local HOVER_VELOCITY_MAX = 25 -- Kecepatan vertikal maksimum (ke atas) yang diizinkan untuk hover. Mencegah pemain naik terlalu cepat.
  18. local SLOW_WALK_SPEED_FACTOR = 0.1 -- Faktor pengali untuk kecepatan berjalan pemain saat mereka melayang. 0.1 berarti kecepatan berjalan akan menjadi 10% dari kecepatan aslinya.
  19.  
  20.  
  21. -- Fungsi untuk menghapus efek hover dari karakter
  22. function HapusEfekHover(character)
  23.     local root = character:FindFirstChild("HumanoidRootPart") -- Mendapatkan HumanoidRootPart karakter
  24.     if root then
  25.         local efekHover = root:FindFirstChild("EfekHover") -- Mencari BodyVelocity bernama "EfekHover"
  26.         if efekHover then
  27.             efekHover:Destroy() -- Menghancurkan BodyVelocity untuk menghentikan efek hover
  28.         end
  29.     end
  30. end
  31.  
  32. -- Fungsi untuk menerapkan efek hover (angin) pada karakter
  33. function HoverAngin(character)
  34.     local root = character:FindFirstChild("HumanoidRootPart") -- Mendapatkan HumanoidRootPart
  35.     local humanoid = character:FindFirstChildOfClass("Humanoid") -- Mendapatkan Humanoid
  36.    
  37.     -- Memastikan HumanoidRootPart dan Humanoid ada, pemain masih hidup, dan belum ada efek hover
  38.     if root and humanoid and humanoid.Health > 0 and not root:FindFirstChild("EfekHover") then
  39.         local bv = Instance.new("BodyVelocity") -- Membuat BodyVelocity baru
  40.         bv.Name = "EfekHover" -- Memberi nama BodyVelocity agar mudah dicari dan dihapus
  41.         bv.MaxForce = Vector3.new(0, HOVER_FORCE_MAX, 0) -- Mengatur kekuatan maksimum (hanya pada sumbu Y)
  42.         bv.P = HOVER_P_GAIN_BV -- Mengatur gain 'P' untuk BodyVelocity
  43.         bv.Parent = root -- Menempatkan BodyVelocity di dalam HumanoidRootPart
  44.        
  45.         local targetHoverY = zona.Position.Y + HOVER_HEIGHT_OFFSET -- Menghitung ketinggian target hover
  46.         local hoverConnection -- Variabel untuk koneksi event Stepped
  47.        
  48.         -- Menyimpan data pemain (kecepatan jalan asli dan BodyVelocity)
  49.         pemainDiZona[character] = {
  50.             originalWalkSpeed = humanoid.WalkSpeed,
  51.             hoverEffect = bv
  52.         }
  53.         humanoid.WalkSpeed = humanoid.WalkSpeed * SLOW_WALK_SPEED_FACTOR -- Mengurangi kecepatan jalan pemain
  54.        
  55.         -- Menghubungkan fungsi ke event Stepped (berjalan setiap frame fisika)
  56.         hoverConnection = RunService.Stepped:Connect(function()
  57.             -- Memeriksa apakah efek hover masih valid (BodyVelocity, RootPart, Humanoid ada dan pemain hidup)
  58.             if not bv.Parent or not root.Parent or not humanoid or (humanoid and humanoid.Health <= 0) then
  59.                 if hoverConnection then hoverConnection:Disconnect() end -- Memutuskan koneksi jika tidak valid
  60.                 if pemainDiZona[character] then
  61.                     local currentHumanoid = character:FindFirstChildOfClass("Humanoid")
  62.                     if currentHumanoid and pemainDiZona[character].originalWalkSpeed then
  63.                         currentHumanoid.WalkSpeed = pemainDiZona[character].originalWalkSpeed -- Mengembalikan kecepatan jalan
  64.                     end
  65.                     HapusEfekHover(character) -- Menghapus efek hover
  66.                     pemainDiZona[character] = nil -- Menghapus pemain dari tabel
  67.                 end
  68.                 return -- Keluar dari fungsi
  69.             end
  70.                
  71.             local errorY = targetHoverY - root.Position.Y -- Menghitung selisih antara ketinggian target dan ketinggian saat ini
  72.             local desiredVelocityY = errorY * HOVER_P_CONTROLLER_GAIN -- Menghitung kecepatan vertikal yang diinginkan berdasarkan error
  73.             desiredVelocityY = math.clamp(desiredVelocityY, HOVER_VELOCITY_MIN, HOVER_VELOCITY_MAX) -- Membatasi kecepatan vertikal dalam rentang min/max
  74.             bv.Velocity = Vector3.new(0, desiredVelocityY, 0) -- Mengatur kecepatan BodyVelocity (hanya pada sumbu Y)
  75.         end)
  76.            
  77.         -- Menghubungkan fungsi ke event Humanoid.Died (ketika pemain mati)
  78.         humanoid.Died:Connect(function()
  79.             if hoverConnection then hoverConnection:Disconnect() end -- Memutuskan koneksi
  80.             if pemainDiZona[character] then
  81.                 local currentHumanoid = character:FindFirstChildOfClass("Humanoid")
  82.                 if currentHumanoid and pemainDiZona[character].originalWalkSpeed then
  83.                     currentHumanoid.WalkSpeed = pemainDiZona[character].originalWalkSpeed -- Mengembalikan kecepatan jalan
  84.                 end
  85.                 HapusEfekHover(character) -- Menghapus efek hover
  86.                 pemainDiZona[character] = nil -- Menghapus pemain dari tabel
  87.             end
  88.         end)
  89.     end
  90. end
  91.        
  92. -- Menghubungkan fungsi ke event Touched zona (ketika sesuatu menyentuh zona)
  93. zona.Touched:Connect(function(hit)
  94.     local character = hit.Parent -- Mendapatkan parent dari bagian yang menyentuh (biasanya karakter)
  95.     local humanoid = character:FindFirstChildOfClass("Humanoid") -- Mendapatkan Humanoid dari karakter
  96.        
  97.     -- Jika yang menyentuh adalah karakter yang hidup dan belum di zona hover
  98.     if humanoid and humanoid.Health > 0 then
  99.         if not pemainDiZona[character] then
  100.             HoverAngin(character) -- Menerapkan efek hover
  101.         end
  102.     end
  103. end)
  104.        
  105. -- Loop utama untuk memeriksa pemain yang keluar dari zona secara berkala
  106. while true do
  107.     task.wait(0.1) -- Menunggu sebentar agar tidak terlalu membebani CPU
  108.     for character, data in pairs(pemainDiZona) do -- Iterasi melalui semua pemain yang tercatat di zona
  109.         local root = character:FindFirstChild("HumanoidRootPart")
  110.         local humanoid = character:FindFirstChildOfClass("Humanoid")
  111.            
  112.         -- Jika karakter tidak lagi valid (misalnya dihapus atau mati)
  113.         if not root or not humanoid or (humanoid and humanoid.Health <= 0) then
  114.             if humanoid and data and data.originalWalkSpeed then
  115.                 humanoid.WalkSpeed = data.originalWalkSpeed -- Mengembalikan kecepatan jalan
  116.             end
  117.             HapusEfekHover(character) -- Menghapus efek hover
  118.             pemainDiZona[character] = nil -- Menghapus pemain dari tabel
  119.         else
  120.             local stillInZone = false
  121.             -- Memeriksa apakah HumanoidRootPart karakter masih menyentuh zona
  122.             for _, partInZone in ipairs(zona:GetTouchingParts()) do
  123.                 if partInZone.Parent == character and partInZone.Name == "HumanoidRootPart" then -- Periksa hanya HumanoidRootPart
  124.                     stillInZone = true
  125.                     break
  126.                 end
  127.             end
  128.                
  129.             -- Jika pemain tidak lagi menyentuh zona
  130.             if not stillInZone then
  131.                 if humanoid and data and data.originalWalkSpeed then
  132.                     humanoid.WalkSpeed = data.originalWalkSpeed -- Mengembalikan kecepatan jalan
  133.                 end
  134.                 HapusEfekHover(character) -- Menghapus efek hover
  135.                 pemainDiZona[character] = nil -- Menghapus pemain dari tabel
  136.             end
  137.         end
  138.     end
  139. end
  140.        
  141. -- Menghubungkan fungsi ke event PlayerRemoving (ketika pemain meninggalkan game)
  142. Players.PlayerRemoving:Connect(function(player)
  143.     local character = player.Character
  144.     if character and pemainDiZona[character] then -- Jika karakter ada dan tercatat di zona hover
  145.         local humanoid = character:FindFirstChildOfClass("Humanoid")
  146.         if humanoid and pemainDiZona[character].originalWalkSpeed then
  147.             humanoid.WalkSpeed = pemainDiZona[character].originalWalkSpeed -- Mengembalikan kecepatan jalan
  148.         end
  149.         HapusEfekHover(character) -- Menghapus efek hover
  150.         pemainDiZona[character] = nil -- Menghapus pemain dari tabel
  151.     end
  152. end)
  153.  
  154. -- PENJELASAN VARIABEL HOVER:
  155. -- =======================================
  156. -- HOVER_FORCE_MAX = math.huge
  157. --   Ini adalah kekuatan maksimum yang dapat diterapkan oleh "BodyVelocity" pada pemain.
  158. --   Nilai `math.huge` (tak terhingga) berarti tidak ada batasan kekuatan, sehingga
  159. --   pemain dapat selalu mencapai kecepatan yang diinginkan untuk melayang. Ini memastikan
  160. --   efek hover selalu bisa terjadi tanpa terhalang batasan kekuatan.
  161.  
  162. -- HOVER_P_GAIN_BV = 5000
  163. --   Ini adalah 'P' (Proportional) Gain untuk "BodyVelocity" itu sendiri.
  164. --   Dalam kontrol fisika, nilai ini menentukan seberapa agresif "BodyVelocity"
  165. --   mencoba mencapai kecepatan yang telah kita tetapkan (melalui `bv.Velocity`).
  166. --   Semakin tinggi nilai ini, semakin "kaku" atau responsif gerakan melayang.
  167. --   Jika terlalu rendah, pemain bisa jadi tidak stabil saat melayang atau melambat.
  168.  
  169. -- HOVER_HEIGHT_OFFSET = 100
  170. --   Ini adalah ketinggian di mana pemain akan melayang relatif terhadap
  171. --   posisi sumbu Y dari `zona` (part tempat script ini berada).
  172. --   Misalnya, jika `zona` Anda berada di Y=0, pemain akan melayang di Y=100.
  173. --   Jika `zona` berada di Y=50, pemain akan melayang di Y=150.
  174. --   Anda bisa mengubah nilai ini untuk menyesuaikan ketinggian hover.
  175.  
  176. -- HOVER_P_CONTROLLER_GAIN = 10
  177. --   Ini adalah 'P' (Proportional) Gain untuk "kontroler" hover kita sendiri,
  178. --   bukan untuk "BodyVelocity" secara langsung.
  179. --   Variabel ini digunakan untuk menghitung `desiredVelocityY` (kecepatan vertikal
  180. --   yang diinginkan) berdasarkan seberapa jauh pemain menyimpang dari
  181. --   ketinggian target (`errorY`).
  182. --   Semakin tinggi nilainya, semakin cepat pemain akan bergerak naik atau turun
  183. --   untuk kembali ke ketinggian targetnya. Ini mempengaruhi seberapa "cepat"
  184. --   pemain merespons perubahan ketinggian saat melayang.
  185.  
  186. -- HOVER_VELOCITY_MIN = -10
  187. --   Ini adalah batas kecepatan vertikal minimum (ke bawah) yang bisa diterapkan
  188. --   oleh kontroler hover. Ini mencegah pemain jatuh terlalu cepat
  189. --   saat mereka melayang. Jika pemain mulai melambat, kontroler
  190. --   akan memastikan mereka tidak turun lebih cepat dari nilai ini.
  191.  
  192. -- HOVER_VELOCITY_MAX = 25
  193. --   Ini adalah batas kecepatan vertikal maksimum (ke atas) yang bisa diterapkan
  194. --   oleh kontroler hover. Ini mencegah pemain naik terlalu cepat
  195. --   saat mereka melayang. Kontroler akan memastikan pemain tidak naik
  196. --   lebih cepat dari nilai ini.
  197.  
  198. -- SLOW_WALK_SPEED_FACTOR = 0.1
  199. --   Ini adalah faktor pengali untuk `WalkSpeed` (kecepatan berjalan) pemain
  200. --   saat mereka berada dalam efek hover.
  201. --   Nilai 0.1 berarti kecepatan berjalan pemain akan dikurangi menjadi 10%
  202. --   dari kecepatan aslinya. Ini biasanya digunakan untuk membuat
  203. --   gerakan saat melayang terasa lebih lambat atau terkontrol.
  204.  
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement