200 lines
7.4 KiB
Lua
200 lines
7.4 KiB
Lua
c = require(_G.Modules.CharacterModule)
|
|
l = "Left Shoulder"
|
|
r = "Right Shoulder"
|
|
|
|
local lastShot = tick()
|
|
local input = game:GetService("UserInputService")
|
|
local bulletModule = nil
|
|
if script.Parent:FindFirstChild("BulletModule") then bulletModule = require(_G.Modules.BulletModule) end
|
|
function init(gun)
|
|
local fov = 60
|
|
local returnTable = {}
|
|
local la = {} -- states for the arm in different animations
|
|
local ra = {}
|
|
returnTable.la = la
|
|
returnTable.ra = ra
|
|
returnTable.maxRounds = 10
|
|
returnTable.shouldRest = true
|
|
returnTable.clock = 0.1
|
|
returnTable.rounds = returnTable.maxRounds
|
|
local aiming = false
|
|
local shootEvent
|
|
local cameraLast = game.Workspace.CurrentCamera.CFrame.Rotation
|
|
|
|
ra.aiming = CFrame.new(0,-1,-2)
|
|
ra.idling = CFrame.new(1,-1,-2) * CFrame.Angles(0,0,0.5)
|
|
ra.recoil = CFrame.new(0,0,1.5)
|
|
ra.sheath = CFrame.new(1.5,-4,0)*CFrame.Angles(-1.57,0,0)
|
|
ra.reload = {}
|
|
ra.reload.beforeSmashMagazine = CFrame.new(1,-0.5,-2)*CFrame.Angles(0.8,0.5,0)
|
|
ra.reload.smashingMagazine = CFrame.new(0.7,-0.9,-2)*CFrame.Angles(0.4,0.3,0)
|
|
ra.reload.beforeLoadingMagazine = CFrame.new(1,-0.5,-2)*CFrame.Angles(0.8,-0.5,0)
|
|
ra.reload.loadingMagazine = CFrame.new(1,-0.5,-2)*CFrame.Angles(0.8,-0.5,0)
|
|
ra.reload.beforePullBack = CFrame.new(2.2,-1,-2.5)*CFrame.Angles(-0.3,1.2,0.1)
|
|
ra.reload.pullBack = CFrame.new(1.7,-1,-2.5)*CFrame.Angles(-0.3,1.2,0.1)
|
|
|
|
la.idling = CFrame.new(-1.5,0,0)*CFrame.Angles(-1.57,0,0)
|
|
la.resting = CFrame.new(-1.5,0,0)*CFrame.Angles(-1.57,0,0)
|
|
la.aiming = CFrame.new(-0.5,-1.3,-2) * CFrame.Angles(0.3,-1,0)
|
|
la.recoil = CFrame.new(0.5,0,0.75)
|
|
la.sheath = CFrame.new(-1.5,-1.3,0)*CFrame.Angles(-1.57,0,0)
|
|
la.reload = {}
|
|
la.reload.beforeSmashMagazine = CFrame.new(-1.1,-1.5,0)*CFrame.Angles(-1.57,0,0)
|
|
la.reload.smashingMagazine = CFrame.new(-1.1,-1.5,0)*CFrame.Angles(-1.57,0,0)
|
|
la.reload.beforeLoadingMagazine = CFrame.new(0.3,-1.1,-2.5) * CFrame.Angles(0.4,-1,0)
|
|
la.reload.loadingMagazine = CFrame.new(0.6,-0.7,-2)*CFrame.Angles(0.6,-1,0)
|
|
la.reload.beforePullBack = CFrame.new(-1,-1,-2.6)*CFrame.Angles(0.4,0,0)
|
|
la.reload.pullBack = CFrame.new(0.5,-1,-2.4)*CFrame.Angles(0.4,0,0)
|
|
|
|
for name,cframe in pairs(la.reload) do
|
|
la.reload[name] = cframe + Vector3.new(-0.4,0,0)
|
|
end
|
|
for name,cframe in pairs(ra.reload) do
|
|
ra.reload[name] = cframe + Vector3.new(-0.4,0,0)
|
|
end
|
|
|
|
gun.Equipped:Connect(function()
|
|
if c.humanoid.SeatPart then return end
|
|
|
|
local rc = {} -- state for the arm
|
|
local lc = {}
|
|
|
|
local gc = {} -- state for gun pully thing
|
|
|
|
c.disableMotors()
|
|
|
|
rc.offset = CFrame.new(0,0,0)
|
|
rc.target = ra.idling
|
|
lc.offset = CFrame.new(0,0,0)
|
|
lc.target = la.resting
|
|
rc.janky = CFrame.new()
|
|
lc.janky = CFrame.new()
|
|
if not returnTable.shouldRest then lc.target = la.idling end
|
|
gc.target = CFrame.new(0,0,0)
|
|
c.cframes[r] = ra.sheath c.setArm(r)
|
|
if not returnTable.shouldRest then c.setArm(l) c.cframes[l] = la.sheath c.setArm(l)
|
|
else c.restArm(l) c.cframes[l] = la.resting c.restArm(l) end
|
|
|
|
c.run:UnbindFromRenderStep("GunMove")
|
|
c.run:UnbindFromRenderStep("Transparency")
|
|
|
|
local modes = {["idle"]=1,["reload"]=function()
|
|
local scale = game.Workspace.Scale.Value
|
|
rc.target = ra.reload.beforeSmashMagazine
|
|
lc.target = la.reload.beforeSmashMagazine
|
|
wait(0.3*scale)
|
|
gun.MagOut:Play()
|
|
rc.target = ra.reload.smashingMagazine
|
|
lc.target = la.reload.smashingMagazine
|
|
wait(0.4*scale)
|
|
rc.target = ra.reload.beforeLoadingMagazine
|
|
lc.target = la.reload.beforeLoadingMagazine
|
|
wait(0.5*scale)
|
|
rc.target = ra.reload.loadingMagazine
|
|
lc.target = la.reload.loadingMagazine
|
|
gun.MagIn:Play()
|
|
wait(0.3*scale)
|
|
rc.target = ra.reload.beforePullBack
|
|
lc.target = la.reload.beforePullBack
|
|
wait(0.4*scale)
|
|
gun.Reload:Play()
|
|
if gun:FindFirstChild("Slide") then gc.target = gun.Slide.Value end
|
|
rc.target = ra.reload.pullBack
|
|
lc.target = la.reload.pullBack
|
|
wait(0.3*scale)
|
|
gc.target = CFrame.new(0,0,0)
|
|
end,}
|
|
local mode = modes.idle
|
|
local reloading = false
|
|
|
|
if shootEvent then shootEvent:Disconnect() end
|
|
shootEvent = gun.Activated:Connect(function()
|
|
if not reloading and not c.running then
|
|
if returnTable.rounds == 0 and returnTable.maxRounds > 0 then
|
|
reloading = true
|
|
modes.reload()
|
|
reloading = false
|
|
returnTable.rounds = returnTable.maxRounds
|
|
return
|
|
end
|
|
if tick()-lastShot < returnTable.clock then return end
|
|
gun.Fired:Play()
|
|
lastShot = tick()
|
|
returnTable.rounds-=1
|
|
local rot = Vector3.new(0,0,math.random(-10,10)/10)
|
|
rc.offset = ra.recoil * CFrame.Angles(rot.x,rot.y,rot.z)
|
|
if aiming or not returnTable.shouldRest then lc.offset = la.recoil end
|
|
if gun.Gun:FindFirstChild("GunShot") then
|
|
gun.Gun.GunShot.ParticleEmitter.Transparency = NumberSequence.new(0)
|
|
end
|
|
if gun:FindFirstChild("Slide") then gc.target = gun.Slide.Value end
|
|
if bulletModule and gun.Gun:FindFirstChild("Barrel") then bulletModule.fire(gun.Gun.Barrel) end
|
|
wait()
|
|
if gun.Gun:FindFirstChild("GunShot") then
|
|
gun.Gun.GunShot.ParticleEmitter.Transparency = NumberSequence.new(1)
|
|
end
|
|
rc.offset = CFrame.new(0,0,0)
|
|
lc.offset = CFrame.new(0,0,0)
|
|
wait(returnTable.clock/2)
|
|
gc.target = CFrame.new(0,0,0)
|
|
end
|
|
end)
|
|
c.run:BindToRenderStep("GunMove",Enum.RenderPriority.Last.Value,function(delta)
|
|
if gun.Parent ~= c.model then c.enableMotors() return end
|
|
--game.Players.LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson
|
|
if not reloading then
|
|
if input:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) or input:IsKeyDown(Enum.KeyCode.Q) then
|
|
aiming = true
|
|
c.setRunning(false)
|
|
rc.target = ra.aiming
|
|
lc.target = la.aiming
|
|
fov = (fov+60)/2
|
|
else
|
|
aiming = false
|
|
fov = (fov+70)/2
|
|
rc.target = ra.idling
|
|
rc.janky = CFrame.new():Lerp(game.Workspace.CurrentCamera.CFrame.Rotation:ToObjectSpace(cameraLast),0.3)
|
|
cameraLast = game.Workspace.CurrentCamera.CFrame.Rotation
|
|
--if lc.target ~= la.resting then c.setArm(l) end
|
|
if returnTable.shouldRest then lc.target = la.resting
|
|
else lc.target = la.idling end
|
|
end
|
|
game.Workspace.CurrentCamera.FieldOfView = fov
|
|
if c.running then
|
|
rc.target = CFrame.new(1.5,-1,-1.5) * CFrame.Angles(1,0,0)
|
|
lc.target = la.resting
|
|
end
|
|
if not reloading and input:IsKeyDown(Enum.KeyCode.R) then
|
|
mode = modes.reload
|
|
reloading = true
|
|
modes.reload()
|
|
mode = modes.idle
|
|
reloading = false
|
|
returnTable.rounds = returnTable.maxRounds
|
|
end
|
|
end
|
|
if not c.humanoid.SeatPart then c.rotateCharacter() c.disableMotors() else --[[print("Enable")]] c.enableMotors() end
|
|
c.targets[r] = rc.target * rc.offset * rc.janky
|
|
c.targets[l] = lc.target * lc.offset * lc.janky
|
|
if gun.Gun:FindFirstChild("Slide") and gun.Gun.Slide:FindFirstChild("Motor6D") then
|
|
gun.Gun.Slide.Motor6D.C1 = gun.Gun.Slide.Motor6D.C1:Lerp(gc.target,0.5)
|
|
end
|
|
c.setArm(r,delta)
|
|
if lc.target == la.resting then
|
|
c.restArm(l,delta)
|
|
else
|
|
c.setArm(l,delta)
|
|
end
|
|
c.motors[r].Part1.LocalTransparencyModifier = 0
|
|
c.motors[l].Part1.LocalTransparencyModifier = 0
|
|
c.motors[r].Part1.CastShadow = false
|
|
c.motors[l].Part1.CastShadow = false
|
|
if math.abs(game.Workspace.CurrentCamera.CFrame:ToObjectSpace(c.head.CFrame).Position.Z) > 1 then c.cameraOffset = Vector3.new(1,0,0) end
|
|
end)
|
|
c.run:BindToRenderStep("Transparency",2,function()
|
|
--game.StarterPlayer.CameraMode = Enum.CameraMode.LockFirstPerson
|
|
end)
|
|
end)
|
|
return returnTable
|
|
end
|
|
return getfenv() |