Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local weaponClass = {}
- weaponClass.__index = weaponClass
- -- Setup
- local import = require(game:GetService("ReplicatedStorage"):WaitForChild("Import"))
- local network = import("Shared/Network")
- -- Constants
- local players = game:GetService("Players")
- local runService = game:GetService("RunService")
- local userInputService = game:GetService("UserInputService")
- local tweenService = game:GetService("TweenService")
- local player = players.LocalPlayer
- local camera = game.Workspace.CurrentCamera
- local weaponFolder = import("Client/Weapons")
- local springClass = import("Shared/Spring")
- local maidClass = import("Shared/Maid")
- -- Module
- function weaponClass.new(weaponName)
- local self = setmetatable({}, weaponClass)
- self.maid = maidClass.new()
- self.state = "idle"
- self.equipped = false
- self.inspecting = false
- self.ammo = 30
- self.maxAmmo = 90
- self.reloading = false
- self.folder = weaponFolder:FindFirstChild(weaponName)
- self.settings = require(self.folder.settings)
- self.maid.model = self.folder.weapon:Clone()
- self.maid.model.Parent = camera
- self.springs = {
- sway = springClass.new(Vector3.new(), Vector3.new(), Vector3.new(), 25, 1),
- tilt = springClass.new(0, 0, 0, 10, 1),
- recoil = springClass.new(Vector3.new(), Vector3.new(), Vector3.new(), 20, 1),
- }
- -- updating userInputService
- userInputService.MouseIconEnabled = false
- -- maid tasks
- self.maid:GiveTask(userInputService.InputChanged:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseMovement then
- local delta = userInputService:GetMouseDelta()
- self.springs.sway.target = Vector3.new(math.rad(delta.X * 0.05), math.rad(delta.Y * 0.05), 0)
- end
- end))
- self.maid:GiveTask(runService.RenderStepped:Connect(function(dt)
- self.springs["sway"]:update(dt)
- self.springs["tilt"]:update(dt)
- self.springs["recoil"]:update(dt)
- -- update tilt
- local moveDir = player.Character.Humanoid.MoveDirection
- local strafe = -player.Character.HumanoidRootPart.CFrame.rightVector:Dot(moveDir)
- self.springs.tilt.target = math.rad(5 * strafe)
- if self.state == "walk" then
- self.maid.model:SetPrimaryPartCFrame(camera.CFrame * CFrame.new( (math.sin(tick() * 9) * 0.03) , (math.sin(tick() * 16) * 0.02) , 0))
- elseif self.state == "run" then
- self.maid.model:SetPrimaryPartCFrame(camera.CFrame * CFrame.new( (math.sin(tick() * 12) * 0.03) , (math.sin(tick() * 16) * 0.03) , 0))
- elseif self.state == "idle" then
- self.maid.model:SetPrimaryPartCFrame(camera.CFrame * CFrame.new( (math.sin(tick() * 1) * 0.03) , (math.sin(tick() * 2) * 0.02) , 0))
- end
- self.maid.model:SetPrimaryPartCFrame(self.maid.model.PrimaryPart.CFrame
- * CFrame.Angles((self.springs["sway"].p.x * -1), (self.springs["sway"].p.x * -1), 0)
- * CFrame.new(0, 0, self.springs["recoil"].p.x)
- * CFrame.fromEulerAnglesYXZ(0, 0, self.springs["tilt"].p / 4))
- camera.CFrame = camera.CFrame * CFrame.fromEulerAnglesYXZ(self.springs["recoil"].p.y, self.springs["recoil"].p.z, 0)
- end))
- self.maid:GiveTask(player.Character.Humanoid.Running:Connect(function(speed)
- if speed > 0 and speed < 20 then
- if self.state ~= "walk" then
- self.state = "walk"
- end
- elseif speed == 0 then
- if self.state ~= "idle" then
- self.state = "idle"
- end
- else
- if self.state ~= "run" then
- self.state = "run"
- end
- end
- end))
- self.maid:GiveTask(userInputService.InputBegan:Connect(function(input, processed)
- if input.UserInputType == Enum.UserInputType.Keyboard then
- if input.KeyCode == Enum.KeyCode.LeftShift then
- local updateWalkspeed = network:GetEvent("UpdateWalkspeed")
- updateWalkspeed:Fire(22)
- self:AnimateKeyframe(self.settings.sprintPlacement)
- end
- end
- end))
- self.maid:GiveTask(userInputService.InputEnded:Connect(function(input, processed)
- if input.UserInputType == Enum.UserInputType.Keyboard then
- if input.KeyCode == Enum.KeyCode.LeftShift then
- local updateWalkspeed = network:GetEvent("UpdateWalkspeed")
- updateWalkspeed:Fire(16)
- self:AnimateKeyframe(self.settings.defaultPlacement)
- end
- end
- end))
- return self
- end
- function weaponClass:AnimateKeyframe(keyframeData, tweenTime)
- for i,v in pairs(self.maid.model:GetDescendants()) do
- if keyframeData[v.Name] and v:IsA("Motor6D") then
- tweenService:Create(v, TweenInfo.new(tweenTime or keyframeData.Time), {C1 = keyframeData[v.Name]}):Play()
- end
- end
- end
- function weaponClass:Destroy()
- self.maid:Destroy()
- end
- return weaponClass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement