Guns
Guns
if Module.DualEnabled then
Handle2 = Tool:WaitForChild("Handle2",1)
if Handle2 == nil and Module.DualEnabled then error("\"Dual\" setting is
enabled but \"Handle2\" is missing!") end
end
ChangeAmmoAndClip.OnServerEvent:connect(function(Player,Ammo,Clips)
AmmoValue.Value = Ammo
ClipsValue.Value = Clips
end)
InflictTarget.OnServerEvent:connect(function(Player,TargetHumanoid,TargetTorso,Dama
ge,Direction,Knockback,Lifesteal,FlamingBullet)
if Player and TargetHumanoid and TargetHumanoid.Health ~= 0 and TargetTorso
then
while TargetHumanoid:FindFirstChild("creator") do
TargetHumanoid.creator:Destroy()
end
local creator = Instance.new("ObjectValue",TargetHumanoid)
creator.Name = "creator"
creator.Value = Player
game.Debris:AddItem(creator,5)
TargetHumanoid:TakeDamage(Damage)
if Knockback > 0 then
TargetTorso.Velocity = Direction * Knockback
end
if Lifesteal > 0 and Humanoid and Humanoid.Health ~= 0 then
Humanoid.Health = Humanoid.Health + (Damage*Lifesteal)
end
if FlamingBullet then
local Debuff =
TargetHumanoid.Parent:FindFirstChild("IgniteScript") or script.IgniteScript:Clone()
Debuff.creator.Value = Player
Debuff.Disabled = false
Debuff.Parent = TargetHumanoid.Parent
end
end
end)
Tool.Equipped:connect(function()
Player = game.Players:GetPlayerFromCharacter(Tool.Parent)
Character = Tool.Parent
Humanoid = Character:FindFirstChild("Humanoid")
--TEAM = Character:FindFirstChild("TEAM")
if Module.DualEnabled and Workspace.FilteringEnabled then
Handle2.CanCollide = false
local LeftArm = Tool.Parent:FindFirstChild("Left Arm")
local RightArm = Tool.Parent:FindFirstChild("Right Arm")
if RightArm then
local Grip = RightArm:WaitForChild("RightGrip",0.01)
if Grip then
Grip2 = Grip:Clone()
Grip2.Name = "LeftGrip"
Grip2.Part0 = LeftArm
Grip2.Part1 = Handle2
--Grip2.C1 = Grip2.C1:inverse()
Grip2.Parent = LeftArm
end
end
end
end)
Tool.Unequipped:connect(function()
if Module.DualEnabled and Workspace.FilteringEnabled then
Handle2.CanCollide = true
if Grip2 then Grip2:Destroy() end
end
end)
RE:FireClient(TruePlayer,Player,Handle,MuzzleOffset,EndPos,MuzzleEffect,HitEffect,H
itSound,ExplosiveData,BulletData,VisualizeExplosion,VisualizeEnabled)
end
end)
local BE = script:WaitForChild("Visualize")
local RE = script.Parent:WaitForChild("VisualizeBullet")
function
VisualizeBullet(Player,Handle,MuzzleOffset,EndPos,MuzzleEffect,HitEffect,HitSound,E
xplosiveData,BulletData,VisualizeExplosion,VisualizeEnabled)
if Player ~= game.Players.LocalPlayer then
if Handle then
local MuzzlePos = (Handle.CFrame *
CFrame.new(MuzzleOffset.X,MuzzleOffset.Y,MuzzleOffset.Z)).p
local Distance = (MuzzlePos-EndPos).magnitude/2
BE.Event:connect(VisualizeBullet)
RE.OnClientEvent:connect(VisualizeBullet)
--BE.Event:connect(function() print("Bindable Firing") end)
--RE.OnClientEvent:connect(function() print("Remote Firing") end)
if Module.DualEnabled then
Handle2 = Tool:WaitForChild("Handle2",2)
if Handle2 == nil and Module.DualEnabled then error("\"Dual\" setting is
enabled but \"Handle2\" is missing!") end
end
function wait(TimeToWait)
if TimeToWait ~= nil then
local TotalTime = 0
TotalTime = TotalTime + game:GetService("RunService").Heartbeat:wait()
while TotalTime < TimeToWait do
TotalTime = TotalTime +
game:GetService("RunService").Heartbeat:wait()
end
else
game:GetService("RunService").Heartbeat:wait()
end
end
function RayCast(Start,Direction,Range,Ignore)
local Hit,EndPos =
game.Workspace:FindPartOnRay(Ray.new(Start,Direction*Range),Ignore)
if Hit then
if (Hit.Transparency > 0.75
or Hit.Name == "Handle"
or Hit.Name == "Effect"
or Hit.Name == "Bullet"
or Hit.Name == "Laser"
or string.lower(Hit.Name) == "water"
or Hit.Name == "Rail"
or Hit.Name == "Arrow"
or (Hit.Parent:FindFirstChild("Humanoid") and
Hit.Parent.Humanoid.Health == 0)
or (Hit.Parent:FindFirstChild("Humanoid") and
Hit.Parent:FindFirstChild("TEAM") and TEAM and Hit.Parent.TEAM.Value ==
TEAM.Value))
or (Hit.Parent:FindFirstChild("Humanoid") and
PiercedHumanoid[Hit.Parent.Humanoid]) then
Hit,EndPos = RayCast(EndPos+(Direction*.01),Direction,Range-
((Start-EndPos).magnitude),Ignore)
end
end
return Hit,EndPos
end
function ShakeCamera()
if Module.CameraShakingEnabled then
local Intensity = Module.Intensity/(AimDown and Module.MouseSensitive
or 1)
for i = 1, 10 do
local cam_rot = Camera.CoordinateFrame - Camera.CoordinateFrame.p
local cam_scroll = (Camera.CoordinateFrame.p -
Camera.Focus.p).magnitude
local ncf =
CFrame.new(Camera.Focus.p)*cam_rot*CFrame.fromEulerAnglesXYZ((-Intensity+
(math.random()*(Intensity*2)))/100, (-Intensity+(math.random()*(Intensity*2)))/100,
0)
Camera.CoordinateFrame = ncf*CFrame.new(0, 0, cam_scroll)
wait()
end
end
end
function Fire(ShootingHandle)
local PierceAvailable = Module.Piercing
PiercedHumanoid = {}
if FireAnim then FireAnim:Play(nil,nil,Module.FireAnimationSpeed) end
if not ShootingHandle.FireSound.Playing or not
ShootingHandle.FireSound.Looped then ShootingHandle.FireSound:Play()
script.Parent.Model.casing:FireServer() end
local Start = (Humanoid.Torso.CFrame * CFrame.new(0,1.5,0)).p--(Handle.CFrame
* CFrame.new(Module.MuzzleOffset.X,Module.MuzzleOffset.Y,Module.MuzzleOffset.Z)).p
local Spread = Module.Spread*(AimDown and 1-Module.SpreadRedution or 1)
local Direction = (CFrame.new(Start,Mouse.Hit.p) * CFrame.Angles(math.rad(-
Spread+(math.random()*(Spread*2))),math.rad(-Spread+
(math.random()*(Spread*2))),0)).lookVector
while PierceAvailable >= 0 do
local Hit,EndPos = RayCast(Start,Direction,5000,Character)
if not Module.ExplosiveEnabled then
if Hit and Hit.Parent then
local TargetHumanoid =
Hit.Parent:FindFirstChild("Humanoid")
local TargetTorso =
Hit.Parent:FindFirstChild("HumanoidRootPart")
--local TargetTEAM = Hit.Parent:FindFirstChild("TEAM")
if TargetHumanoid and TargetHumanoid.Health > 0 and
TargetTorso then
--if TargetTEAM and TargetTEAM.Value ~= TEAM.Value
then
InflictTarget:FireServer(TargetHumanoid,
TargetTorso,
(Hit.Name ==
"Head" and Module.HeadshotEnabled) and Module.BaseDamage *
Module.HeadshotDamageMultiplier or Module.BaseDamage,
Direction,
Module.Knockback,
Module.Lifesteal,
Module.FlamingBullet)
PiercedHumanoid[TargetHumanoid] = true
--end
else
PierceAvailable = 0
end
end
else
local Explosion = Instance.new("Explosion")
Explosion.BlastRadius = Module.Radius
Explosion.BlastPressure = 0
Explosion.Position = EndPos
Explosion.Parent = Workspace.CurrentCamera
Explosion.Hit:connect(function(Hit)
if Hit and Hit.Parent and Hit.Name == "Torso" then
local TargetHumanoid =
Hit.Parent:FindFirstChild("Humanoid")
local TargetTorso =
Hit.Parent:FindFirstChild("Torso")
--local TargetTEAM =
Hit.Parent:FindFirstChild("TEAM")
if TargetHumanoid and TargetHumanoid.Health > 0 and
TargetTorso then
--if TargetTEAM and TargetTEAM.Value ~=
TEAM.Value then
InflictTarget:FireServer(TargetHumanoid,
TargetTorso,
Direction,
Module.Knockback,
Module.Lifesteal,
Module.FlamingBullet)
--end
end
end
end)
PierceAvailable = 0
end
PierceAvailable = Hit and (PierceAvailable - 1) or -1
script.Parent.BulletVisualizerScript.Visualize:Fire(nil,ShootingHandle,
Module.MuzzleOffset,
EndPos,
script.MuzzleEffect,
script.HitEffect,
Module.HitSoundIDs[math.random(1,#Module.HitSoundIDs)],
{Module.ExplosiveEnabled,Module.BlastRadius,Module.BlastPressure},
{Module.BulletSpeed,Module.BulletSize,Module.BulletColor,Module.BulletTransparency,
Module.BulletMaterial,Module.FadeTime},
false,
Module.MuzzleOffset,
EndPos,
script.MuzzleEffect,
script.HitEffect,
Module.HitSoundIDs[math.random(1,#Module.HitSoundIDs)],
{Module.ExplosiveEnabled,Module.BlastRadius,Module.BlastPressure},
{Module.BulletSpeed,Module.BulletSize,Module.BulletColor,Module.BulletTransparency,
Module.BulletMaterial,Module.FadeTime},
true,
function Reload()
if Enabled and not Reloading and (Clips > 0 or not Module.LimitedClipEnabled)
and Ammo < Module.AmmoPerClip then
Reloading = true
if AimDown then
Workspace.CurrentCamera.FieldOfView = 70
--[[local GUI =
game.Players.LocalPlayer.PlayerGui:FindFirstChild("ZoomGui")
if GUI then GUI:Destroy() end]]
GUI.Scope.Visible = false
game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic
script["Mouse Sensitivity"].Disabled = true
AimDown = false
Mouse.Icon = "rbxassetid://"..Module.MouseIconID
end
UpdateGUI()
if Module.ShotgunReload then
for i = 1,(Module.AmmoPerClip - Ammo) do
if ShotgunClipinAnim then
ShotgunClipinAnim:Play(nil,nil,Module.ShotgunClipinAnimationSpeed) end
Handle.ShotgunClipin:Play()
wait(Module.ShellClipinSpeed)
end
end
if ReloadAnim then ReloadAnim:Play(nil,nil,Module.ReloadAnimationSpeed)
end
Handle.ReloadSound:Play() script.Parent.Model.reload:FireServer()
wait(Module.ReloadTime)
if Module.LimitedClipEnabled then Clips = Clips - 1 end
Ammo = Module.AmmoPerClip
ChangeAmmoAndClip:FireServer(Ammo,Clips)
Reloading = false
UpdateGUI()
end
end
function UpdateGUI()
GUI.Frame.Ammo.Fill:TweenSizeAndPosition(UDim2.new(Ammo/Module.AmmoPerClip,0,1,0),
UDim2.new(0,0,0,0), Enum.EasingDirection.Out, Enum.EasingStyle.Quint, 0.25, true)
GUI.Frame.Clips.Fill:TweenSizeAndPosition(UDim2.new(Clips/Module.MaxClip,0,1,0),
UDim2.new(0,0,0,0), Enum.EasingDirection.Out, Enum.EasingStyle.Quint, 0.25, true)
GUI.Frame.Ammo.Current.Text = Ammo
GUI.Frame.Ammo.Max.Text = Module.AmmoPerClip
GUI.Frame.Clips.Current.Text = Clips
GUI.Frame.Clips.Max.Text = Module.MaxClip
GUI.Frame.Clips.Visible = Module.LimitedClipEnabled
GUI.Frame.Size = Module.LimitedClipEnabled and UDim2.new(0,250,0,100) or
UDim2.new(0,250,0,55)
GUI.Frame.Position = Module.LimitedClipEnabled and UDim2.new(1,-260,1,-110)or
UDim2.new(1,-260,1,-65)
end
Mouse.Button1Down:connect(function()
Down = true
local IsChargedShot = false
if Equipped and Enabled and Down and not Reloading and Ammo > 0 and
Humanoid.Health > 0 then
Enabled = false
if Module.ChargedShotEnabled then
if HandleToFire:FindFirstChild("ChargeSound") then
HandleToFire.ChargeSound:Play() end
wait(Module.ChargingTime)
IsChargedShot = true
end
if Module.MinigunEnabled then
if HandleToFire:FindFirstChild("WindUp") then
HandleToFire.WindUp:Play() end
wait(Module.DelayBeforeFiring)
end
while Equipped and not Reloading and (Down or IsChargedShot) and Ammo >
0 and Humanoid.Health > 0 do
IsChargedShot = false
for i = 1,(Module.BurstFireEnabled and Module.BulletPerBurst or
1) do
Spawn(ShakeCamera)
for x = 1,(Module.ShotgunEnabled and Module.BulletPerShot
or 1) do
Fire(HandleToFire)
end
Ammo = Ammo - 1
ChangeAmmoAndClip:FireServer(Ammo,Clips)
UpdateGUI()
if Module.BurstFireEnabled then wait(Module.BurstRate) end
if Ammo <= 0 then break end
end
HandleToFire = (HandleToFire == Handle and Module.DualEnabled)
and Handle2 or Handle
wait(Module.FireRate)
if not Module.Auto then break end
end
if HandleToFire.FireSound.Playing and HandleToFire.FireSound.Looped
then HandleToFire.FireSound:Stop() end
if Module.MinigunEnabled then
if HandleToFire:FindFirstChild("WindDown") then
HandleToFire.WindDown:Play() end
wait(Module.DelayAfterFiring)
end
Enabled = true
if Ammo <= 0 then Reload() end
end
end)
Mouse.Button1Up:connect(function()
Down = false
end)
ChangeAmmoAndClip.OnClientEvent:connect(function(ChangedAmmo,ChangedClips)
Ammo = ChangedAmmo
Clips = ChangedClips
UpdateGUI()
end)
Tool.Equipped:connect(function(TempMouse)
Equipped = true
UpdateGUI()
if Module.AmmoPerClip ~= math.huge then GUI.Parent = Player.PlayerGui end
TempMouse.Icon = "rbxassetid://"..Module.MouseIconID
if IdleAnim then IdleAnim:Play(nil,nil,Module.IdleAnimationSpeed) end
TempMouse.KeyDown:connect(function(Key)
if string.lower(Key) == "r" then
Reload()
elseif string.lower(Key) == "e" then
if not Reloading and AimDown == false and Module.SniperEnabled
then
Workspace.CurrentCamera.FieldOfView = Module.FieldOfView
--[[local GUI =
game.Players.LocalPlayer.PlayerGui:FindFirstChild("ZoomGui") or
Tool.ZoomGui:Clone()
GUI.Parent = game.Players.LocalPlayer.PlayerGui]]
GUI.Scope.Visible = true
game.Players.LocalPlayer.CameraMode =
Enum.CameraMode.LockFirstPerson
script["Mouse Sensitivity"].Disabled = false
AimDown = true
Mouse.Icon="http://www.roblox.com/asset?id=187746799"
else
Workspace.CurrentCamera.FieldOfView = 70
--[[local GUI =
game.Players.LocalPlayer.PlayerGui:FindFirstChild("ZoomGui")
if GUI then GUI:Destroy() end]]
GUI.Scope.Visible = false
game.Players.LocalPlayer.CameraMode =
Enum.CameraMode.Classic
script["Mouse Sensitivity"].Disabled = true
AimDown = false
Mouse.Icon = "rbxassetid://"..Module.MouseIconID
end
end
end)
if Module.DualEnabled and not Workspace.FilteringEnabled then
Handle2.CanCollide = false
local LeftArm = Tool.Parent:FindFirstChild("Left Arm")
local RightArm = Tool.Parent:FindFirstChild("Right Arm")
if RightArm then
local Grip = RightArm:WaitForChild("RightGrip",0.01)
if Grip then
Grip2 = Grip:Clone()
Grip2.Name = "LeftGrip"
Grip2.Part0 = LeftArm
Grip2.Part1 = Handle2
--Grip2.C1 = Grip2.C1:inverse()
Grip2.Parent = LeftArm
end
end
end
end)
Tool.Unequipped:connect(function()
Equipped = false
GUI.Parent = script
if IdleAnim then IdleAnim:Stop() end
if AimDown then
Workspace.CurrentCamera.FieldOfView = 70
--[[local GUI =
game.Players.LocalPlayer.PlayerGui:FindFirstChild("ZoomGui")
if GUI then GUI:Destroy() end]]
GUI.Scope.Visible = false
game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic
script["Mouse Sensitivity"].Disabled = true
AimDown = false
Mouse.Icon = "rbxassetid://"..Module.MouseIconID
end
if Module.DualEnabled and not Workspace.FilteringEnabled then
Handle2.CanCollide = true
if Grip2 then Grip2:Destroy() end
end
end)
Humanoid.Died:connect(function()
Equipped = false
GUI.Parent = script
if IdleAnim then IdleAnim:Stop() end
if AimDown then
Workspace.CurrentCamera.FieldOfView = 70
--[[local GUI =
game.Players.LocalPlayer.PlayerGui:FindFirstChild("ZoomGui")
if GUI then GUI:Destroy() end]]
GUI.Scope.Visible = false
game.Players.LocalPlayer.CameraMode = Enum.CameraMode.Classic
script["Mouse Sensitivity"].Disabled = true
AimDown = false
Mouse.Icon = "rbxassetid://"..Module.MouseIconID
end
if Module.DualEnabled and not Workspace.FilteringEnabled then
Handle2.CanCollide = true
if Grip2 then Grip2:Destroy() end
end
end)
Features:
- FilteringEnabled support
- Easy to edit with a bunch of settings
- No delays between Mouse Click and Gun Fire
===================================================================================
=================
]]
local Module = {
-- ====================
-- BASIC
-- A basic settings for the gun
-- ====================
Auto = false;
MuzzleOffset = Vector3.new(0, 0.625, 1.25);
BaseDamage = 26;
FireRate = 0.10 ; --In second
ReloadTime = 2; --In second
AmmoPerClip = 30; --Put "math.huge" to make this gun has infinite ammo
and never reload
Spread = 1.25; --In degree
HeadshotEnabled = true; --Enable the gun to do extra damage on headshot
HeadshotDamageMultiplier = 4;
MouseIconID = "316279304";
HitSoundIDs = {186809061,186809249,186809250,186809252};
IdleAnimationID = 94242777; --Set to "nil" if you don't want to animate
IdleAnimationSpeed = 1;
FireAnimationID = 94332152; --Set to "nil" if you don't want to animate
FireAnimationSpeed = 6;
ReloadAnimationID = 95384819;
ReloadAnimationSpeed = 3;
-- ====================
-- LIMITED CLIP
-- Make a gun has a limit clip
-- ====================
LimitedClipEnabled = false;
Clips = 10;
MaxClip = 10; --Put "math.huge" to allow user to carry unlimited clip
-- ====================
-- SHOTGUN
-- Enable the gun to fire multiple bullet in one shot
-- ====================
ShotgunEnabled = false;
BulletPerShot = 8;
-- ====================
-- BURST FIRE
-- Enable the gun to do burst firing like Assault Rifle
-- ====================
BurstFireEnabled = true;
BulletPerBurst = 3;
BurstRate = 0.075; --In second
-- ====================
-- SNIPER
-- Enable user to use scope
-- ====================
SniperEnabled = false;
FieldOfView = 12.5;
MouseSensitive = 0.05; --In percent
SpreadRedution = 1; --In percent.
-- ====================
-- CAMERA SHAKING
-- Make user's camera shaking when shooting
-- ====================
CameraShakingEnabled = true;
Intensity = 0.5; --In degree
-- ====================
-- EXPLOSIVE
-- Make a bullet explosive so user can deal a damage to multiple enemy in single
shot. NOTE: Explosion won't break joints
-- ====================
ExplosiveEnabled = false;
Radius = 8;
-- ====================
-- BULLET VISUALIZER
-- Enabled the gun to display a fake travelling bullet
-- ====================
VisualizerEnabled = true;
BulletSpeed = 25;
BulletSize = Vector3.new(0.25,0.25,100);
BulletColor = BrickColor.new("Bright yellow");
BulletTransparency = 0.25;
BulletMaterial = Enum.Material.SmoothPlastic;
FadeTime = 0.25; --Only work when bullet travel instantly. For this,
you have to set BulletSpeed to "math.huge"
-- ====================
-- CHARGED SHOT
-- Make a gun charging before firing. Useful for a gun like "Railgun" or "Laser
Cannon"
-- ====================
ChargedShotEnabled = false;
ChargingTime = 1;
-- ====================
-- MINIGUN
-- Make a gun delay before/after firing
-- ====================
MinigunEnabled = false;
DelayBeforeFiring = 1;
DelayAfterFiring = 1;
-- ====================
-- MISCELLANEOUS
-- Etc. settings for the gun
-- ====================
-- ====================
-- END OF SETTING
-- ====================
}
return Module