Untitled

 avatar
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