Untitled
unknown
lua
9 months ago
3.5 kB
9
Indexable
-- ===================================================================
-- ClientScript (Skrypt Lokalny)
-- Lokalizacja: Tool.ClientScript
-- Cel: Obsługa efektów wizualnych, dźwięku i odrzutu kamery.
-- ===================================================================
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
-- === Zmienne lokalne ===
local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
local tool = script.Parent
-- === Komponenty narzędzia (zgodnie z Twoją strukturą) ===
local handle = tool:WaitForChild("Handle")
local nozzle = handle:WaitForChild("Nozzle")
local spraySound = handle:WaitForChild("SpraySound")
local particleEmitter = nozzle:WaitForChild("SprayParticle")
-- === Komunikacja z serwerem ===
local serverScript = tool:WaitForChild("ServerScript")
local startEvent = serverScript:WaitForChild("Start")
local stopEvent = serverScript:WaitForChild("Stop")
-- === Konfiguracja Odrzutu (Recoil) ===
local RECOIL_INTENSITY = 0.25 -- Jak mocno "kopie" w górę (w stopniach)
local RECOIL_SHAKE = 0.15 -- Jak mocno trzęsie na boki
local RECOIL_SPRINGINESS = 10 -- Jak szybko kamera wraca na miejsce (wyższy = szybszy)
-- Zmienne śledzące stan
local isShooting = false
local currentRecoil = CFrame.new() -- Aktualne przesunięcie CFrame kamery
-- === Główna pętla (Heartbeat) ===
-- Ta pętla stale aktualizuje odrzut kamery, aby był płynny
RunService.Heartbeat:Connect(function(deltaTime)
local targetRecoil -- Cel, do którego dąży nasz odrzut
if isShooting then
-- A. Odrzut
-- Obliczamy losowe drżenie na boki
local shake = CFrame.Angles(
math.rad((math.random() - 0.5) * RECOIL_SHAKE * 2),
math.rad((math.random() - 0.5) * RECOIL_SHAKE * 2),
0
)
-- Celujemy w CFrame, który jest "kopnięciem" w górę + losowym drżeniem
targetRecoil = CFrame.Angles(math.rad(RECOIL_INTENSITY), 0, 0) * shake
-- B. Pętlenie dźwięku (jeśli dźwięk nie ma właściwości Looped)
if not spraySound.Looped and spraySound.TimePosition > spraySound.TimeLength - 0.2 then
spraySound:Play() -- Odtwórz ponownie, zanim się skończy
end
else
-- A. Odrzut
-- Celem jest brak odrzutu (powrót do normalnej pozycji)
targetRecoil = CFrame.new() -- CFrame.new() to CFrame tożsamościowy
end
-- Płynne przejście kamery do docelowego odrzutu (daje "żywy" efekt)
currentRecoil = currentRecoil:Lerp(targetRecoil, deltaTime * RECOIL_SPRINGINESS)
-- Zastosowanie odrzutu do kamery (tylko jeśli nie jest zablokowana)
if UserInputService:GetMouseBehavior() ~= Enum.MouseBehavior.LockCurrentPosition then
camera.CFrame = camera.CFrame * currentRecoil
end
end)
-- === Obsługa aktywacji narzędzia ===
tool.Activated:Connect(function()
isShooting = true
-- Włącz efekty
particleEmitter.Enabled = true
if not spraySound.Playing then
spraySound:Play()
end
-- Poinformuj serwer
startEvent:FireServer()
end)
-- === Obsługa deaktywacji narzędzia ===
tool.Deactivated:Connect(function()
isShooting = false
-- Wyłącz efekty
particleEmitter.Enabled = false
spraySound:Stop()
-- Poinformuj serwer
stopEvent:FireServer()
end)
-- Dodatkowe zabezpieczenie: zatrzymaj strzelanie, gdy narzędzie jest zdejmowane
tool.Unequipped:Connect(function()
if isShooting then
isShooting = false
-- Wyłącz efekty
particleEmitter.Enabled = false
spraySound:Stop()
-- Poinformuj serwer
stopEvent:FireServer()
end
end)Editor is loading...
Leave a Comment