Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. local tool = script.Parent
  2. local player = game:GetService("Players").LocalPlayer
  3. local char = player.Character
  4. local hum = char:WaitForChild("Humanoid")
  5. local cam = workspace.CurrentCamera
  6. local mouse = player:GetMouse()
  7. local coreEvents =game.ReplicatedStorage.CoreEvents
  8. local clEvents = game.ReplicatedStorage.ClientEvents
  9. local ignore = {char, workspace.Map.Nodes, workspace.Map.Lights, workspace.Map.Sounds, workspace.Map.Spawns, workspace.Decals, workspace.Map.Clip, workspace.Map.NavClip}
  10.  
  11. local Orakel = require(game.ReplicatedStorage.Orakel.Main)
  12. local mathLib = Orakel.LoadModule("MathLib")
  13. local assetLib = Orakel.LoadModule("AssetLib")
  14. local sndLib = Orakel.LoadModule("SoundLib")
  15. local damage = 35
  16. local hsDamage = 38
  17. local moving = false
  18. local jumping = false
  19.  
  20.  
  21. local AccuracyCooldown = 0
  22.  
  23. local baseSpread = 0
  24. local wpnSpread = {
  25. spreadMin = 2; --initial shot spread
  26. spreadMax = 12; --maximum spread
  27. spreadInc = 0.5; --spread increase per shot
  28. spreadMoveModf = 2.5; --spread modifier when moving
  29. cooldownRate = 0.5; --spread decrease per frame
  30. }
  31.  
  32.  
  33.  
  34. local wpnAccuracy = {
  35. accMax = math.atan((wpnSpread.spreadMax / 2) / 100);
  36. accMin = math.atan((wpnSpread.spreadMin / 2) / 100);
  37. }
  38.  
  39. function spreadUpdate()
  40. if not m1down then
  41. AccuracyCooldown = AccuracyCooldown - wpnSpread.cooldownRate
  42. if AccuracyCooldown < wpnSpread.spreadMin then
  43. AccuracyCooldown = wpnSpread.spreadMin
  44. end
  45. end
  46. local baseSpreadTemp = AccuracyCooldown
  47.  
  48. if moving or jumping then
  49. baseSpreadTemp = baseSpreadTemp * wpnSpread.spreadMoveModf
  50. end
  51. baseSpread = baseSpreadTemp
  52. end
  53.  
  54.  
  55. --Entities not to ignore when raycasting bullets
  56. local ignoreExceptions = {
  57. "func_breakable";
  58. "func_breakable_glass";
  59. "func_door";
  60. }
  61.  
  62. local function isIgnoreException(ent)
  63. for _, e in pairs(ignoreExceptions) do
  64. if e == ent.Name then
  65. return true
  66. end
  67. end
  68. return false
  69. end
  70.  
  71.  
  72. for _, ent in pairs(workspace.Map.Entities:GetChildren()) do
  73. if not isIgnoreException(ent) then
  74. ignore[#ignore + 1] = ent
  75. end
  76. end
  77.  
  78.  
  79. hum.Running:connect(function(spd)
  80. if spd > 0 then
  81. moving = true
  82. else
  83. moving = false
  84. end
  85. end)
  86.  
  87.  
  88. hum.Jumping:connect(function(isJumping)
  89. if isJumping then
  90. jumping = true
  91. else
  92. jumping = false
  93. end
  94. end)
  95.  
  96.  
  97.  
  98. function Fire()
  99. coreEvents.PlaySoundOtherClients:FireServer("3d", "WEAPON", tool.Handle.Fire.SoundId, 0.2, 1, false, 2, tool.Handle)
  100. tool.Handle.ShellEmitter:Emit(1)
  101. local snd = tool.Handle.Fire:clone()
  102. snd.Parent = tool.Handle
  103. snd:Play()
  104. AccuracyCooldown = AccuracyCooldown + wpnSpread.spreadInc
  105. if AccuracyCooldown > wpnSpread.spreadMax then
  106. AccuracyCooldown = wpnSpread.spreadMax
  107. end
  108. local direction = mathLib.RandomUnitVector(baseSpread, (mouse.Hit.p - cam.CoordinateFrame.p).unit)
  109. local ray = Ray.new(cam.CoordinateFrame.p, direction * 512)
  110. --local ray = Ray.new(cam.CoordinateFrame.p, (target - cam.CoordinateFrame.p).unit * 512)
  111. local part, position, norm, material = workspace:FindPartOnRayWithIgnoreList(ray, ignore)
  112. if part then
  113. local humanoid = part.Parent:FindFirstChild("Humanoid")
  114. local hpVal = part.Parent:FindFirstChild("Health")
  115. local hhpVal = part.Parent:FindFirstChild("HeadHealth")
  116.  
  117. if humanoid and hpVal and hhpVal then
  118. if hpVal.Value > 0 and hhpVal.Value > 0 then
  119. if part.Name == "Head" then
  120. game.ReplicatedStorage.MapEvents.DamageEnemy:FireServer(humanoid, hsDamage, true)
  121. else
  122. game.ReplicatedStorage.MapEvents.DamageEnemy:FireServer(humanoid, damage, false)
  123. end
  124. end
  125. else
  126. if part.Name == "func_breakable_glass" then
  127. local hp = Orakel.GetKeyValue(part, "Health")
  128. if hp > 0 then
  129. Orakel.FireInput(part, "Damage", damage)
  130. end
  131. end
  132.  
  133. local rmat = assetLib.RealMaterial:Get(part)
  134. local decs = assetLib.Decals[rmat]
  135. local decal = game.ReplicatedStorage.ClientEvents.CreateDecal:Invoke(
  136. CFrame.new(position, position + norm),
  137. Vector3.new(0.5 ,0.5, 0.2),
  138. decs[math.random(1, #decs)],
  139. "Front",
  140. false
  141. )
  142. game.ReplicatedStorage.ClientEvents.CreateHitParticle:Fire(decal, "Front", rmat, part.BrickColor.Color)
  143. sndLib.PlaySoundClient("3d", "BULLET", assetLib.Sounds.Impact[rmat], 0.2, 1, false, 2, decal)
  144. coreEvents.CreateBulletEffect:FireServer(decal.CFrame, rmat, part.BrickColor.Color)
  145. end
  146. end
  147. end
  148.  
  149.  
  150. --Render tasks
  151. game:GetService("RunService").RenderStepped:connect(function()
  152. spreadUpdate()
  153. end)
  154.  
  155.  
  156. tool.Equipped:connect(function(mouse)
  157. mouse.Button1Down:connect(function()
  158. m1down = true
  159. coreEvents.MuzzleflashOtherClients:FireServer(tool.Muzzle)
  160. tool.Muzzle.PointLight.Enabled = true
  161. tool.Muzzle.Transparency = 0
  162. while true do
  163. if not m1down then
  164. break
  165. end
  166. Fire()
  167. wait(0.109)
  168. end
  169. end)
  170. mouse.Button1Up:connect(function()
  171. m1down = false
  172. coreEvents.MuzzleflashOtherClients:FireServer(tool.Muzzle)
  173. tool.Muzzle.PointLight.Enabled = false
  174. tool.Muzzle.Transparency = 1
  175. end)
  176. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement