Advertisement
drakon-firestone

Untitled

Jan 5th, 2024
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.70 KB | None | 0 0
  1. local Players = game:GetService("Players")
  2. local TweenService = game:GetService("TweenService")
  3. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  4. local RunService = game:GetService("RunService")
  5. local player = Players.LocalPlayer
  6. local remotes = ReplicatedStorage:WaitForChild("Remotes")
  7. local despawnedDrops = ReplicatedStorage:WaitForChild("DespawnedDrops")
  8. local playersFolder = workspace.Players
  9. local drops = workspace:WaitForChild("Drops")
  10. local UX = ReplicatedStorage.UserExperience
  11.  
  12. -- niech zmienna attackTarget wskazuje na parametr skryptu
  13. -- DropsClient nazwany AttackTarget
  14. local attackTarget = script.AttackTarget
  15.  
  16.  
  17. -- Napisz funkcję GetPlayerPets() zwracającą aktualną liczbę petów gracza
  18. local function GetPlayerPets()
  19. return playersFolder[player.Name]:GetChildren()
  20. end
  21.  
  22.  
  23. -- Napisz funkcję CheckIfDropAvailable(drop) która sprawdzi czy gracz ma odblokowany
  24. -- obszar w którym znajduje się drop podany w argumencie
  25. -- aby to zrobić poszukaj czy w lokalnym graczu w folderze Areas znajduje się obiekt
  26. -- o takiej samej nazwie jak rodzic dropu
  27. local function CheckIfDropAvailable(drop)
  28. return player.Areas:FindFirstChild(drop.Parent.Name)
  29. end
  30.  
  31.  
  32.  
  33.  
  34. -- Napisz funkcję SetAttackTarget(attackTarget) która będzie ustawiać wszystkim petom
  35. -- niech przechodzi po wszystkich petach gracza i ustawia parametrowi Attack wartość
  36. -- podaną w nawiasie
  37. local function SetAttackTarget(attackTarget)
  38. for _, pet in ipairs(GetPlayerPets()) do
  39. pet.Attack.Value = attackTarget
  40. end
  41. end
  42.  
  43.  
  44.  
  45.  
  46. -- pętla przechodząca po wszystkich obiektach w folderze drops
  47. for _, drop in ipairs(drops:GetDescendants()) do
  48. -- sprawdzamy czy obiekt jest Modelem czyli faktycznym dropem
  49. if drop:IsA("Model") then
  50. -- ustaw wartość aktualnego życia dropu (CurrentPoint)
  51. -- na wartość maksymalną (MaxPoints)
  52. drop.CurrentPoints.Value = drop.MaxPoints.Value
  53. -- dodaj funkcję przyjmującą parametr player do obsługi kliknięcia
  54. -- myszką do ClickDetectors dodanego do dropa
  55. drop.ClickDetector.MouseClick:Connect(function(player)
  56. -- pobierz aktualną liczbę petów gracza
  57. local currentPlayerPets = GetPlayerPets()
  58. -- sprawdź czy gracz ma jakieś wyjęte pety (liczba petów > 0)
  59. if #currentPlayerPets > 0 then
  60. -- sprawdź czy drop jest dostępny dla gracza
  61. if CheckIfDropAvailable(drop) then
  62. -- jeśli attackTarget jest ustawiony na właśnie PrimaryPart
  63. -- kliknięt dropu (czyli atakujemy już ten drop)
  64. -- ustaw attackTarget na pusty
  65. -- w przeciwnym wypadku ustaw go na PrimaryPart klikniętego drppu
  66. if attackTarget.Value == drop.PrimaryPart then
  67. attackTarget.Value = nil
  68. else
  69. attackTarget.Value = drop.PrimaryPart
  70. end
  71. -- ustaw cel ataku dla petów
  72. SetAttackTarget(attackTarget.Value)
  73. end
  74. end
  75. end)
  76. end
  77. end
  78.  
  79. local function destroyDrop(drop)
  80. task.spawn(function()
  81. -- zapamiętaj obszar z którego pochodzi drop
  82. local oldParent = drop.Parent
  83. -- przenieś drop do folderu despawnedDrops
  84. drop.Parent = despawnedDrops
  85.  
  86. for i, item in pairs(drop:GetChildren()) do
  87. if item.Name == "Reward" then
  88. remotes.Bank:FireServer("+", item.Value, item.Amount.Value)
  89. end
  90. end
  91.  
  92. local lucky = false -- przygotowujemy się do UX
  93. local reward = 0
  94. local random = math.random(1,100)
  95. local loot = require(drops.Loot)
  96. local name = drop.Name
  97. local shardDrop = loot.drop
  98. for i, v in pairs(shardDrop) do
  99. if name == i then
  100. if v.chance >= random then
  101. reward = v.reward
  102.  
  103. remotes.Bank:FireServer("+", "Shards", reward)
  104. lucky = true -- przygotowanie do UX
  105. break
  106. end
  107. end
  108. end
  109.  
  110.  
  111. if drop.Name == "BigChest" then
  112. local counter = UX.Counter
  113. local text = counter.CounterDisplay.CounterFrame.CounterText
  114. local spawnTime = 10
  115. counter.Position = drop:FindFirstChildWhichIsA("MeshPart").Position
  116. counter.Parent = oldParent
  117. for zegar = 0, spawnTime do
  118. local timer = spawnTime - zegar
  119. local minutes = math.floor(timer/60)
  120. local seconds = timer%60
  121. text.Text = string.format("Skrzynia pojawi się za %02d:%02d", minutes, seconds)
  122. wait(1)
  123. end
  124. counter.Parent = UX
  125. else
  126. wait(4)
  127. end
  128.  
  129. -- ustaw życie dropu na wartość maksymalną
  130. drop.CurrentPoints.Value = drop.MaxPoints.Value
  131. -- wstaw drop z powrotem do obszaru z którego pochodzi
  132. drop.Parent = oldParent
  133. end)
  134. end
  135. local function updateDamage()
  136. -- odczytaj aktualną listę petów gracza
  137. local playerPets = GetPlayerPets()
  138. -- pętla przechodząca po wszystkich petach gracza
  139. for _, pet in ipairs(playerPets) do
  140. -- ustaw ustaw target na cel ataku peta
  141. local target = pet.Attack.Value
  142. -- jeśli cel jest ustawiony (nie jest nil)
  143. if target then
  144. -- ustaw zmienną drop jako rodzica atakowego elementu
  145. -- (atakujemy PrimaryPart/model 3D naszego dropa)
  146. local drop = target.Parent
  147. -- ustaw zmienną currentPoints an aktualne punkty (życia) dropu
  148. local currentPoints = drop.CurrentPoints
  149. -- odejmij od punktów życia dropa wartość ataku peta
  150. -- jeśli wartość spadła poniżej zera - ustaw ją na z0
  151. currentPoints.Value = math.max(currentPoints.Value - pet.Damage.Value, 0)
  152.  
  153. -- jeśli aktualne życie dropu jest równe 0:
  154.  
  155. if currentPoints.Value == 0 then
  156. -- ustaw cel ataku petów jako pusty
  157. attackTarget.Value = nil
  158. SetAttackTarget(nil)
  159. -- usuń ten drop z planszy (za pomocą funkcji)
  160. destroyDrop(drop)
  161. end
  162. end
  163. end
  164. end
  165.  
  166.  
  167. -- funkcja aktualizująca paski życia dropów na scenie
  168. local function updateDropDisplay()
  169. -- pętla przechodząca po elementach w folderze drops
  170. for _, drop in pairs(drops:GetDescendants()) do
  171. -- jeśli obiekt jest modelem - czyli faktycznym dropem
  172. if drop:IsA("Model") then
  173. -- znajdź w dropie element o nazwie Display (jest to BilboardGui)
  174. local display = drop:FindFirstChild("Display")
  175. -- zmienna bar wskazuje na pasek w elemencie display
  176. local bar = display.Background.Bar
  177. -- zmienna displayText wskazuje na tekst z liczbą życia
  178. local displayText displayText = display.Background.Amount
  179. -- ustaw tekst displayText na wartość aktualnych punktów życia dropu
  180. displayText.Text = tostring(drop.CurrentPoints.Value)
  181. -- animacja paska z obecnej długości do tej
  182. -- przedstawianej przez punkty życia dropu
  183. bar:TweenSize(
  184. UDim2.fromScale(drop.CurrentPoints.Value / drop.MaxPoints.Value, 1),
  185. Enum.EasingDirection.Out,
  186. Enum.EasingStyle.Sine,
  187. 0.3)
  188. end
  189. end
  190. end
  191.  
  192. task.spawn(function()
  193. while task.wait(1) do
  194. -- uruchom aktualizację obrażeń
  195. updateDamage()
  196. -- uruchom aktualizację pasków życia dropóW
  197. updateDropDisplay()
  198. end
  199. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement