Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Players = game:GetService("Players")
- local TweenService = game:GetService("TweenService")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- local RunService = game:GetService("RunService")
- local player = Players.LocalPlayer
- local remotes = ReplicatedStorage:WaitForChild("Remotes")
- local despawnedDrops = ReplicatedStorage:WaitForChild("DespawnedDrops")
- local playersFolder = workspace.Players
- local drops = workspace:WaitForChild("Drops")
- local UX = ReplicatedStorage.UserExperience
- -- niech zmienna attackTarget wskazuje na parametr skryptu
- -- DropsClient nazwany AttackTarget
- local attackTarget = script.AttackTarget
- -- Napisz funkcję GetPlayerPets() zwracającą aktualną liczbę petów gracza
- local function GetPlayerPets()
- return playersFolder[player.Name]:GetChildren()
- end
- -- Napisz funkcję CheckIfDropAvailable(drop) która sprawdzi czy gracz ma odblokowany
- -- obszar w którym znajduje się drop podany w argumencie
- -- aby to zrobić poszukaj czy w lokalnym graczu w folderze Areas znajduje się obiekt
- -- o takiej samej nazwie jak rodzic dropu
- local function CheckIfDropAvailable(drop)
- return player.Areas:FindFirstChild(drop.Parent.Name)
- end
- -- Napisz funkcję SetAttackTarget(attackTarget) która będzie ustawiać wszystkim petom
- -- niech przechodzi po wszystkich petach gracza i ustawia parametrowi Attack wartość
- -- podaną w nawiasie
- local function SetAttackTarget(attackTarget)
- for _, pet in ipairs(GetPlayerPets()) do
- pet.Attack.Value = attackTarget
- end
- end
- -- pętla przechodząca po wszystkich obiektach w folderze drops
- for _, drop in ipairs(drops:GetDescendants()) do
- -- sprawdzamy czy obiekt jest Modelem czyli faktycznym dropem
- if drop:IsA("Model") then
- -- ustaw wartość aktualnego życia dropu (CurrentPoint)
- -- na wartość maksymalną (MaxPoints)
- drop.CurrentPoints.Value = drop.MaxPoints.Value
- -- dodaj funkcję przyjmującą parametr player do obsługi kliknięcia
- -- myszką do ClickDetectors dodanego do dropa
- drop.ClickDetector.MouseClick:Connect(function(player)
- -- pobierz aktualną liczbę petów gracza
- local currentPlayerPets = GetPlayerPets()
- -- sprawdź czy gracz ma jakieś wyjęte pety (liczba petów > 0)
- if #currentPlayerPets > 0 then
- -- sprawdź czy drop jest dostępny dla gracza
- if CheckIfDropAvailable(drop) then
- -- jeśli attackTarget jest ustawiony na właśnie PrimaryPart
- -- kliknięt dropu (czyli atakujemy już ten drop)
- -- ustaw attackTarget na pusty
- -- w przeciwnym wypadku ustaw go na PrimaryPart klikniętego drppu
- if attackTarget.Value == drop.PrimaryPart then
- attackTarget.Value = nil
- else
- attackTarget.Value = drop.PrimaryPart
- end
- -- ustaw cel ataku dla petów
- SetAttackTarget(attackTarget.Value)
- end
- end
- end)
- end
- end
- local function destroyDrop(drop)
- task.spawn(function()
- -- zapamiętaj obszar z którego pochodzi drop
- local oldParent = drop.Parent
- -- przenieś drop do folderu despawnedDrops
- drop.Parent = despawnedDrops
- for i, item in pairs(drop:GetChildren()) do
- if item.Name == "Reward" then
- remotes.Bank:FireServer("+", item.Value, item.Amount.Value)
- end
- end
- local lucky = false -- przygotowujemy się do UX
- local reward = 0
- local random = math.random(1,100)
- local loot = require(drops.Loot)
- local name = drop.Name
- local shardDrop = loot.drop
- for i, v in pairs(shardDrop) do
- if name == i then
- if v.chance >= random then
- reward = v.reward
- remotes.Bank:FireServer("+", "Shards", reward)
- lucky = true -- przygotowanie do UX
- break
- end
- end
- end
- if drop.Name == "BigChest" then
- local counter = UX.Counter
- local text = counter.CounterDisplay.CounterFrame.CounterText
- local spawnTime = 10
- counter.Position = drop:FindFirstChildWhichIsA("MeshPart").Position
- counter.Parent = oldParent
- for zegar = 0, spawnTime do
- local timer = spawnTime - zegar
- local minutes = math.floor(timer/60)
- local seconds = timer%60
- text.Text = string.format("Skrzynia pojawi się za %02d:%02d", minutes, seconds)
- wait(1)
- end
- counter.Parent = UX
- else
- wait(4)
- end
- -- ustaw życie dropu na wartość maksymalną
- drop.CurrentPoints.Value = drop.MaxPoints.Value
- -- wstaw drop z powrotem do obszaru z którego pochodzi
- drop.Parent = oldParent
- end)
- end
- local function updateDamage()
- -- odczytaj aktualną listę petów gracza
- local playerPets = GetPlayerPets()
- -- pętla przechodząca po wszystkich petach gracza
- for _, pet in ipairs(playerPets) do
- -- ustaw ustaw target na cel ataku peta
- local target = pet.Attack.Value
- -- jeśli cel jest ustawiony (nie jest nil)
- if target then
- -- ustaw zmienną drop jako rodzica atakowego elementu
- -- (atakujemy PrimaryPart/model 3D naszego dropa)
- local drop = target.Parent
- -- ustaw zmienną currentPoints an aktualne punkty (życia) dropu
- local currentPoints = drop.CurrentPoints
- -- odejmij od punktów życia dropa wartość ataku peta
- -- jeśli wartość spadła poniżej zera - ustaw ją na z0
- currentPoints.Value = math.max(currentPoints.Value - pet.Damage.Value, 0)
- -- jeśli aktualne życie dropu jest równe 0:
- if currentPoints.Value == 0 then
- -- ustaw cel ataku petów jako pusty
- attackTarget.Value = nil
- SetAttackTarget(nil)
- -- usuń ten drop z planszy (za pomocą funkcji)
- destroyDrop(drop)
- end
- end
- end
- end
- -- funkcja aktualizująca paski życia dropów na scenie
- local function updateDropDisplay()
- -- pętla przechodząca po elementach w folderze drops
- for _, drop in pairs(drops:GetDescendants()) do
- -- jeśli obiekt jest modelem - czyli faktycznym dropem
- if drop:IsA("Model") then
- -- znajdź w dropie element o nazwie Display (jest to BilboardGui)
- local display = drop:FindFirstChild("Display")
- -- zmienna bar wskazuje na pasek w elemencie display
- local bar = display.Background.Bar
- -- zmienna displayText wskazuje na tekst z liczbą życia
- local displayText displayText = display.Background.Amount
- -- ustaw tekst displayText na wartość aktualnych punktów życia dropu
- displayText.Text = tostring(drop.CurrentPoints.Value)
- -- animacja paska z obecnej długości do tej
- -- przedstawianej przez punkty życia dropu
- bar:TweenSize(
- UDim2.fromScale(drop.CurrentPoints.Value / drop.MaxPoints.Value, 1),
- Enum.EasingDirection.Out,
- Enum.EasingStyle.Sine,
- 0.3)
- end
- end
- end
- task.spawn(function()
- while task.wait(1) do
- -- uruchom aktualizację obrażeń
- updateDamage()
- -- uruchom aktualizację pasków życia dropóW
- updateDropDisplay()
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement