1153 lines
36 KiB
Text
1153 lines
36 KiB
Text
|
--[[
|
|||
|
Smith and Wesson M&P 45, chambered in .45 ACP ammunition.
|
|||
|
The standard magazine holds 10 rounds, although magazines that could hold 14 rounds were also made but looked incredibly stupid.
|
|||
|
Credit to litozinnamon for the crosshairs and bullethole decals. I used them without permission. Not like I asked him, anyhow.
|
|||
|
]]
|
|||
|
|
|||
|
plr=game:service'Players'.LocalPlayer
|
|||
|
ch,char=plr.Character,plr.Character
|
|||
|
hum=ch.Humanoid
|
|||
|
tor,torso,rootpart,rj=ch.Torso,ch.Torso,ch.HumanoidRootPart,ch.HumanoidRootPart.RootJoint
|
|||
|
m,mouse=plr:GetMouse(),plr:GetMouse()
|
|||
|
cfn,ang,mr,int=CFrame.new,CFrame.Angles,math.rad,Instance.new
|
|||
|
bc=BrickColor.new
|
|||
|
head=ch.Head
|
|||
|
cam=workspace.CurrentCamera
|
|||
|
|
|||
|
rj.C0=cfn()
|
|||
|
rj.C1=cfn()
|
|||
|
|
|||
|
sheathed=false
|
|||
|
jammed=false
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
local minimumsize = Vector3.new(0.7,0.7,0.7) --Minimumsize for a part to get divided,higher numbers = less detailed and bigger/less bricks
|
|||
|
local surface_between_splitted_parts = 'SmoothNoOutlines' --the surface between splitted parts
|
|||
|
--local fragmented = workspace:FindFirstChild("Fragmented")
|
|||
|
local fragmentable = workspace --all fragmentable objects should be stored in here
|
|||
|
local list = {}
|
|||
|
local brickcount = 0
|
|||
|
--local m = Instance.new("Hint",workspace)
|
|||
|
local storage = {}
|
|||
|
local fillup = 1000 --it constantly generates new parts until it reaches this number(hacky way to prevent lagspikes if there is a large explosion),change it to 0 if you don<6F>t want it to generate (useless) parts.
|
|||
|
local maximumstorage = 2000 --it will recycle parts if the number of parts in the storage doesnt exceed this number
|
|||
|
local storage_position = Vector3.new(0,0,5000) --place them somewhere off the map
|
|||
|
local stored_partsize = Vector3.new(1,1,1) --make them small
|
|||
|
local parts_created_per_frame = 5 --number of parts being created per frame to fill up the storage
|
|||
|
|
|||
|
|
|||
|
function fragmentate(cframe,size,color,explosion_position,explosion_blastradius,backsurface,bottomsurface,frontsurface,leftsurface,rightsurface,topsurface,transparency,reflectance)
|
|||
|
local xi = size.X >= minimumsize.X*(1+explosion_blastradius/16) and 2 or 1 --to reduce the lagg in large explosions we increase minimumsize based on the explosionradius...
|
|||
|
local yi = size.Y >= minimumsize.Y*(1+explosion_blastradius/16) and 2 or 1
|
|||
|
local zi = size.Z >= minimumsize.Z*(1+explosion_blastradius/16) and 2 or 1
|
|||
|
if xi == 1 and yi == 1 and zi == 1 or (cframe.p-explosion_position).magnitude > size.magnitude/2 + explosion_blastradius then --don<6F>t fragmentate parts, that are too small to fragmentate or too far away from the explosion
|
|||
|
if xi == 1 and yi == 1 and zi == 1 then return end --optional
|
|||
|
if #storage > 0 then
|
|||
|
local p = storage[1]
|
|||
|
p.BrickColor = color
|
|||
|
p.Size = size
|
|||
|
p.BackSurface = backsurface
|
|||
|
p.BottomSurface = bottomsurface
|
|||
|
p.FrontSurface = frontsurface
|
|||
|
p.LeftSurface = leftsurface
|
|||
|
p.RightSurface = rightsurface
|
|||
|
p.TopSurface = topsurface
|
|||
|
p.Transparency = transparency
|
|||
|
p.CFrame = cframe
|
|||
|
p.Reflectance = reflectance
|
|||
|
table.remove(storage,1)
|
|||
|
else
|
|||
|
local p = Instance.new("Part",fragmentable)
|
|||
|
p.BrickColor = color
|
|||
|
p.FormFactor = "Custom"
|
|||
|
p.Size = size
|
|||
|
p.BackSurface = backsurface
|
|||
|
p.BottomSurface = bottomsurface
|
|||
|
p.FrontSurface = frontsurface
|
|||
|
p.LeftSurface = leftsurface
|
|||
|
p.RightSurface = rightsurface
|
|||
|
p.TopSurface = topsurface
|
|||
|
p.Transparency = transparency
|
|||
|
if p.Transparency>0.285 then
|
|||
|
p.Anchored = false
|
|||
|
else
|
|||
|
p.Anchored=true
|
|||
|
p.Material='Wood'
|
|||
|
end
|
|||
|
p.CFrame = cframe
|
|||
|
p.Reflectance = reflectance
|
|||
|
end
|
|||
|
--p:MakeJoints()
|
|||
|
-- m.Text = m.Text+1
|
|||
|
return --stop the function
|
|||
|
end
|
|||
|
local mody = math.random(-125,125)/1000 --some randomization
|
|||
|
for y = 1,yi do
|
|||
|
if math.random()> 0.5 then
|
|||
|
local modx = math.random(-125,125)/1000
|
|||
|
for x = 1,xi do
|
|||
|
local modz = math.random(-125,125)/1000
|
|||
|
for z = 1,zi do --offset = x/xi-0.75+modx)
|
|||
|
fragmentate(cframe*CFrame.new(size.X*(xi==1 and 0 or x/xi-0.75+modx),size.Y*(yi==1 and 0 or y/yi-0.75+mody),size.Z*(zi==1 and 0 or z/zi-0.75+modz)), --maths
|
|||
|
Vector3.new(xi == 2 and size.X*(1-2*math.abs(x/xi-0.75+modx)) or size.X,yi == 2 and size.Y*(1-2*math.abs(y/yi-0.75+mody)) or size.Y,
|
|||
|
zi == 2 and size.Z*(1-2*math.abs(z/zi-0.75+modz)) or size.Z or agent767_was_here),color,explosion_position,explosion_blastradius,
|
|||
|
z~=zi and surface_between_splitted_parts or backsurface,y==2 and surface_between_splitted_parts or bottomsurface,
|
|||
|
z==2 and surface_between_splitted_parts or frontsurface,x==2 and surface_between_splitted_parts or leftsurface,x~=xi and surface_between_splitted_parts or rightsurface,
|
|||
|
y~=yi and surface_between_splitted_parts or topsurface,transparency,reflectance)
|
|||
|
end
|
|||
|
|
|||
|
end
|
|||
|
else
|
|||
|
local modz = math.random(-125,125)/1000
|
|||
|
for z = 1,zi do
|
|||
|
local modx = math.random(-125,125)/1000
|
|||
|
for x = 1,xi do
|
|||
|
fragmentate(cframe*CFrame.new(size.X*(xi==1 and 0 or x/xi-0.75+modx),size.Y*(yi==1 and 0 or y/yi-0.75+mody),size.Z*(zi==1 and 0 or z/zi-0.75+modz)),
|
|||
|
Vector3.new(xi == 2 and size.X*(1-2*math.abs(x/xi-0.75+modx)) or size.X,yi == 2 and size.Y*(1-2*math.abs(y/yi-0.75+mody)) or size.Y,
|
|||
|
zi == 2 and size.Z*(1-2*math.abs(z/zi-0.75+modz)) or size.Z),color,explosion_position,explosion_blastradius,
|
|||
|
z~=zi and surface_between_splitted_parts or backsurface,y==2 and surface_between_splitted_parts or bottomsurface,
|
|||
|
z==2 and surface_between_splitted_parts or frontsurface,x==2 and surface_between_splitted_parts or leftsurface,x~=xi and surface_between_splitted_parts or rightsurface,
|
|||
|
y~=yi and surface_between_splitted_parts or topsurface,transparency,reflectance)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function start_fragmentation(position,radius)
|
|||
|
local search = Region3.new(position-Vector3.new(radius,radius,radius)*1.1,position+Vector3.new(radius,radius,radius)*1.1)
|
|||
|
repeat
|
|||
|
local finish = false
|
|||
|
local parts = workspace:FindPartsInRegion3WithIgnoreList(search,list,100) --maximum number of parts that FindPartsInRegion3 can find is 100, so we have to do this to find them all
|
|||
|
for i = 1,#parts do
|
|||
|
table.insert(list,1,parts[i])
|
|||
|
end
|
|||
|
finish = true
|
|||
|
until #parts < 100 and finish
|
|||
|
print(#list)
|
|||
|
local t = tick()
|
|||
|
for i = 1,#list do
|
|||
|
local p = list[i]
|
|||
|
if p:IsDescendantOf(fragmentable) and p:GetMass()<3000 and p.Transparency>0.285 and p.Name~='Base' and p:IsDescendantOf(ch)==false then
|
|||
|
fragmentate(p.CFrame,p.Size,p.BrickColor,position,radius,p.BackSurface,p.BottomSurface,p.FrontSurface,p.LeftSurface,p.RightSurface,p.TopSurface,p.Transparency,p.Reflectance)
|
|||
|
if #storage < maximumstorage and p.Shape == "Block" then --recycle them
|
|||
|
p.Anchored = false
|
|||
|
p.FormFactor = "Custom"
|
|||
|
p.Size = stored_partsize
|
|||
|
p.Position = storage_position
|
|||
|
table.insert(storage,1,p)
|
|||
|
else --storage is full
|
|||
|
p:Destroy()
|
|||
|
end
|
|||
|
-- m.Text = m.Text-1
|
|||
|
end
|
|||
|
if p:IsDescendantOf(fragmentable) and p:GetMass()<53000 and p.Transparency<0.05 and p.Name~='Base' and tostring(p.Material)=='Enum.Material.Wood' and p:IsDescendantOf(ch)==false then
|
|||
|
fragmentate(p.CFrame,p.Size,p.BrickColor,position,radius,p.BackSurface,p.BottomSurface,p.FrontSurface,p.LeftSurface,p.RightSurface,p.TopSurface,p.Transparency,p.Reflectance)
|
|||
|
if #storage < maximumstorage and p.Shape == "Block" then --recycle them
|
|||
|
p.Anchored = true
|
|||
|
p.Material='Wood'
|
|||
|
p.FormFactor = "Custom"
|
|||
|
p.Size = stored_partsize
|
|||
|
p.Position = storage_position
|
|||
|
table.insert(storage,1,p)
|
|||
|
else --storage is full
|
|||
|
p:Destroy()
|
|||
|
end
|
|||
|
-- m.Text = m.Text-1
|
|||
|
end
|
|||
|
end
|
|||
|
list = {}
|
|||
|
-- print(tick()-t)
|
|||
|
end
|
|||
|
|
|||
|
--[[
|
|||
|
spawn(function()
|
|||
|
while wait() do --oh noes,a loop! So inefficient!
|
|||
|
if #storage < fillup then
|
|||
|
for i = 1, parts_created_per_frame do --creates parts to fill up the storage
|
|||
|
local p = Instance.new("Part",fragmentable)
|
|||
|
p.Anchored = false
|
|||
|
p.FormFactor = "Custom"
|
|||
|
p.Size = stored_partsize
|
|||
|
p.Position = storage_position
|
|||
|
table.insert(storage,1,p)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end)
|
|||
|
]]
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
--local blankn=22416261
|
|||
|
|
|||
|
--172121567
|
|||
|
|
|||
|
crosshairs={
|
|||
|
{38140824};
|
|||
|
{38140833};
|
|||
|
{38140839};
|
|||
|
{38140843};
|
|||
|
{38140852};
|
|||
|
{38140910};
|
|||
|
{38140915};
|
|||
|
{38140923};
|
|||
|
{38140928};
|
|||
|
{38140931};
|
|||
|
{38208259};
|
|||
|
{38208275};
|
|||
|
{38208284};
|
|||
|
{38208303};
|
|||
|
{38208310};
|
|||
|
{38208325};
|
|||
|
{38208330};
|
|||
|
{38208352};
|
|||
|
{38208359};
|
|||
|
{38208377}
|
|||
|
}
|
|||
|
|
|||
|
bulletholes={
|
|||
|
172274695;
|
|||
|
172274721
|
|||
|
}
|
|||
|
|
|||
|
for _,v in pairs(crosshairs) do
|
|||
|
game:service'ContentProvider':Preload('rbxassetid://' .. tostring(v[1]-1))
|
|||
|
end
|
|||
|
|
|||
|
currentIco=2
|
|||
|
switchIco=function(num)
|
|||
|
if num<20 then
|
|||
|
else
|
|||
|
num=20
|
|||
|
end
|
|||
|
mouse.Icon='rbxassetid://' .. tostring(crosshairs[num][1]-1)
|
|||
|
currentIco=num
|
|||
|
end
|
|||
|
|
|||
|
switchIco(currentIco)
|
|||
|
|
|||
|
heldDown=false
|
|||
|
|
|||
|
spreadint=1
|
|||
|
--[[Settings]]--
|
|||
|
recoil=false -- Set to true for added realism
|
|||
|
magCapacity=20 -- How much a magazine can hold at once
|
|||
|
magAmmo=20 -- How much ammo is in the mag
|
|||
|
crosshairSpread=5
|
|||
|
spread=1
|
|||
|
pAmmunition=true -- more damage if true
|
|||
|
|
|||
|
|
|||
|
jamRate=500 -- How often the gun jams(the more the less) (no less than 1)
|
|||
|
|
|||
|
primaryColor='Really black'
|
|||
|
secondaryColor='Really black'
|
|||
|
|
|||
|
slideReflectance=0.01
|
|||
|
slideMaterial='Plastic'
|
|||
|
|
|||
|
--[[Attachments]]--
|
|||
|
|
|||
|
silencer=true
|
|||
|
highCapMag=false -- High capacity magazine
|
|||
|
laser=true
|
|||
|
automatic=false
|
|||
|
grip=true
|
|||
|
|
|||
|
|
|||
|
getSound=function(id)
|
|||
|
game:service'ContentProvider':Preload('rbxassetid'..tostring(id))
|
|||
|
local s=int("Sound",ch.Head)
|
|||
|
s.SoundId='rbxassetid://' .. tostring(id)
|
|||
|
s.Volume=1
|
|||
|
return s
|
|||
|
end
|
|||
|
|
|||
|
local fireSound=getSound(151997297--[[10209842]])
|
|||
|
fireSound.Pitch=1.3
|
|||
|
--1.8
|
|||
|
|
|||
|
local releaseSound=getSound(10209813)
|
|||
|
releaseSound.Pitch=4
|
|||
|
|
|||
|
local reloadSound=getSound(10209636)
|
|||
|
reloadSound.Pitch=3
|
|||
|
|
|||
|
local magazinelockSound=getSound(152206337)
|
|||
|
magazinelockSound.Pitch=1.4
|
|||
|
|
|||
|
local slideBackSound=getSound(152206263)
|
|||
|
slideBackSound.Pitch=2.5
|
|||
|
|
|||
|
local slideForwardSound=getSound(152206302)
|
|||
|
slideForwardSound.Pitch=2.5
|
|||
|
|
|||
|
local emptySound=getSound(2697295)
|
|||
|
emptySound.Pitch=5
|
|||
|
|
|||
|
local glassBreakSound=getSound(144884907)
|
|||
|
|
|||
|
local woodImpact=getSound(142082171)
|
|||
|
|
|||
|
local fleshImpact=getSound(144884872)
|
|||
|
fleshImpact.Pitch=1.7
|
|||
|
|
|||
|
if ch:findFirstChild("Tec-99") then
|
|||
|
ch['Tec-99']:Destroy()
|
|||
|
end
|
|||
|
|
|||
|
local tube=int("Model",ch)
|
|||
|
tube.Name='Tec-99'
|
|||
|
local hopper=Instance.new('HopperBin',plr.Backpack)
|
|||
|
hopper.Name=tube.Name
|
|||
|
Weld = function(p0,p1,x,y,z,rx,ry,rz,par)--recommend to use this with my weld. use this function only with arm lockers.
|
|||
|
p0.Position = p1.Position
|
|||
|
local w = Instance.new('Motor',par or p0)
|
|||
|
w.Part0 = p1
|
|||
|
w.Part1 = p0
|
|||
|
w.C0 = CFrame.new(x or 0,y or 0,z or 0)*CFrame.Angles(rx or 0,ry or 0,rz or 0)
|
|||
|
w.MaxVelocity = .1
|
|||
|
return w
|
|||
|
end
|
|||
|
function clerp(c1,c2,sp)
|
|||
|
local R1,R2,R3 = c1:toEulerAnglesXYZ()
|
|||
|
local R21,R22,R23 = c2:toEulerAnglesXYZ()
|
|||
|
return CFrame.new(
|
|||
|
c1.X + (c2.X-c1.X)*sp,
|
|||
|
c1.Y + (c2.Y-c1.Y)*sp,
|
|||
|
c1.Z + (c2.Z-c1.Z)*sp)*CFrame.Angles(
|
|||
|
R1 + (R21-R1)*sp,
|
|||
|
R2 + (R22-R2)*sp,
|
|||
|
R3 + (R23-R3)*sp
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
tweenTable={}
|
|||
|
Tween = function(Weld, Stop, Step,a)
|
|||
|
ypcall(function()
|
|||
|
local func = function()
|
|||
|
local Start = Weld.C1
|
|||
|
local X1, Y1, Z1 = Start:toEulerAnglesXYZ()
|
|||
|
local Stop = Stop
|
|||
|
local X2, Y2, Z2 = Stop:toEulerAnglesXYZ()
|
|||
|
if not Step then Step=0.1 end
|
|||
|
table.insert(tweenTable,{th=0,Weld=Weld,Step=Step,Start=Start,X1=X1,Y1=Y1,Z1=Z1,Stop=Stop,X2=X2,Y2=Y2,Z2=Z2})
|
|||
|
end
|
|||
|
if a then coroutine.wrap(func)() else func() end
|
|||
|
end)
|
|||
|
end
|
|||
|
weld=function(p0,p1,c0)
|
|||
|
local w=Instance.new("Weld",p0)
|
|||
|
w.Part0=p0
|
|||
|
w.Part1=p1
|
|||
|
w.C0=c0
|
|||
|
return w
|
|||
|
end
|
|||
|
cp=function(parent,color,size,anchored,cancollide)
|
|||
|
local newp=Instance.new("Part",parent)
|
|||
|
newp.TopSurface='SmoothNoOutlines'
|
|||
|
newp.BottomSurface='SmoothNoOutlines'
|
|||
|
newp.FrontSurface='SmoothNoOutlines'
|
|||
|
newp.BackSurface='SmoothNoOutlines'
|
|||
|
newp.RightSurface='SmoothNoOutlines'
|
|||
|
newp.LeftSurface='SmoothNoOutlines'
|
|||
|
newp.FormFactor="Custom"
|
|||
|
newp.BrickColor=bc(color)
|
|||
|
newp.Size=size
|
|||
|
newp.Anchored=anchored
|
|||
|
newp.CanCollide=cancollide
|
|||
|
newp:BreakJoints()
|
|||
|
return newp
|
|||
|
end
|
|||
|
|
|||
|
initializeJoints=function()
|
|||
|
rabr = cp(tube,'White',Vector3.new(1,1,1),false,false) rabr.Transparency = 1 rabr.Name='Locker'
|
|||
|
rabr.Position = torso.Position
|
|||
|
rw = Weld(rabr,torso,1.5,.5,0,0,0,0) rw.Parent = tube rw.Name = 'rw'
|
|||
|
w = Instance.new("Weld",tube)
|
|||
|
w.Part0,w.Part1 = ch['Right Arm'],rabr
|
|||
|
w.C1 = CFrame.new(0,-.5,0)
|
|||
|
labr = cp(tube,'White',Vector3.new(1,1,1),false,false) labr.Transparency = 1 labr.Name='Locker'
|
|||
|
labr.Position = torso.Position
|
|||
|
lw = Weld(labr,torso,-1.5,.5,0,0,0,0) lw.Parent = tube lw.Name = 'lw'
|
|||
|
ww = Instance.new("Weld",tube)
|
|||
|
ww.Part0,ww.Part1 = ch['Left Arm'],labr
|
|||
|
ww.C1 = CFrame.new(0,-.5,0)
|
|||
|
end
|
|||
|
|
|||
|
initializeJoints()
|
|||
|
|
|||
|
--[[ leg locks
|
|||
|
rabl = cp(tube,'White',Vector3.new(1,1,1),false,false) rabl.Transparency = 1 rabl.Name='Locker'
|
|||
|
rabl.Position = torso.Position
|
|||
|
rwl = Weld(rabl,torso,0.5,-1.5,0,0,0,0) rwl.Parent = tube rwl.Name = 'rwl'
|
|||
|
wl = Instance.new("Weld",tube)
|
|||
|
wl.Part0,wl.Part1 = ch['Right Leg'],rabl
|
|||
|
wl.C1 = CFrame.new(0,-.5,0)
|
|||
|
labl = cp(tube,'White',Vector3.new(1,1,1),false,false) labl.Transparency = 1 labl.Name='Locker'
|
|||
|
labl.Position = torso.Position
|
|||
|
lwl = Weld(labl,torso,-0.5,-1.5,0,0,0,0) lwl.Parent = tube lwl.Name = 'lwl'
|
|||
|
wwl = Instance.new("Weld",tube)
|
|||
|
wwl.Part0,wwl.Part1 = ch['Left Leg'],labl
|
|||
|
wwl.C1 = CFrame.new(0,-.5,0)
|
|||
|
]]
|
|||
|
--weld(ch['HumanoidRootPart'],torso,cfn())
|
|||
|
|
|||
|
|
|||
|
local counter=Instance.new('ScreenGui',plr.PlayerGui)
|
|||
|
local frame=Instance.new('Frame',counter)
|
|||
|
frame.Size=UDim2.new(0.25,0,0.3,0)
|
|||
|
|
|||
|
frame.Position=UDim2.new(0.1,0,0.4,0)
|
|||
|
frame.BackgroundTransparency=1
|
|||
|
|
|||
|
local ammocounter=Instance.new('TextLabel',frame)
|
|||
|
ammocounter.Size=UDim2.new(1,0,0.3,0)
|
|||
|
ammocounter.Position=UDim2.new(0,0,0.2,0)
|
|||
|
ammocounter.BackgroundTransparency=1
|
|||
|
ammocounter.TextColor3=BrickColor.new('White').Color
|
|||
|
ammocounter.Font='SourceSansBold'
|
|||
|
ammocounter.FontSize='Size18'
|
|||
|
ammocounter.Text=''
|
|||
|
ammocounter.TextXAlignment='Left'
|
|||
|
|
|||
|
|
|||
|
local bg = Instance.new("BodyGyro",rootpart)
|
|||
|
bg.maxTorque = Vector3.new(math.huge,math.huge,math.huge)
|
|||
|
bg.P = 10000
|
|||
|
bg.D = 100
|
|||
|
|
|||
|
|
|||
|
cyl=function(prt)
|
|||
|
local c=int("CylinderMesh",prt)
|
|||
|
return c
|
|||
|
end
|
|||
|
blo=function(prt)
|
|||
|
local c=int("BlockMesh",prt)
|
|||
|
return c
|
|||
|
end
|
|||
|
|
|||
|
if laser then
|
|||
|
aLaser=cp(tube,'Really red',Vector3.new(0.2,0.2,0.2))
|
|||
|
aLaser.Transparency=1
|
|||
|
cyl(aLaser).Scale=Vector3.new(0.25,1,0.25)
|
|||
|
aLaser.Anchored=true
|
|||
|
end
|
|||
|
|
|||
|
local handle=cp(tube,primaryColor,Vector3.new(0.2,0.6,0.3))
|
|||
|
blo(handle).Scale=Vector3.new(1.15,0.9,1)
|
|||
|
local mw=weld(ch['Right Arm'],handle,cfn(-0.4,-1,-0.19)*ang(mr(-101.5),0,0)*cfn()*ang(0,mr(-30),mr(-5)))
|
|||
|
|
|||
|
local framepiece1=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.9))
|
|||
|
blo(framepiece1).Scale=Vector3.new(1.15,0.5,1)
|
|||
|
weld(handle,framepiece1,cfn(0,0.354,-0.3)*ang(mr(11.5),0,0))
|
|||
|
|
|||
|
local barrel=cp(tube,'Medium stone grey',Vector3.new(0.2,0.2,0.2))
|
|||
|
cyl(barrel).Scale=Vector3.new(0.7,1.2,0.7)
|
|||
|
weld(framepiece1,barrel,cfn(0,0.15,-0.1)*ang(mr(-90),0,0))
|
|||
|
|
|||
|
local sbarrel=cp(tube,'Really black',Vector3.new(0.2,0.3,0.2))
|
|||
|
cyl(sbarrel).Scale=Vector3.new(0.7,1.5,0.7)
|
|||
|
weld(barrel,sbarrel,cfn(0,0.35,0))
|
|||
|
local hole=cp(tube,'White',Vector3.new(0.2,0.2,0.2))
|
|||
|
hole.Transparency=1
|
|||
|
weld(sbarrel,hole,cfn(0,0.2,0))
|
|||
|
local flash=int('PointLight',hole)
|
|||
|
flash.Enabled=false
|
|||
|
flash.Range=10
|
|||
|
flash.Color=BrickColor.new('Neon orange').Color
|
|||
|
|
|||
|
|
|||
|
local slide1=cp(tube,secondaryColor,Vector3.new(0.2,0.2,0.4))
|
|||
|
slide1.CanCollide=false
|
|||
|
blo(slide1).Scale=Vector3.new(0.7,1,1.1)
|
|||
|
slideweld1=weld(framepiece1,slide1,cfn(0,0.15,0.23))
|
|||
|
slide1.Reflectance=slideReflectance
|
|||
|
slide1.Material=slideMaterial
|
|||
|
|
|||
|
local slide2=cp(tube,secondaryColor,Vector3.new(0.2,0.2,0.4))
|
|||
|
slide2.CanCollide=false
|
|||
|
blo(slide2).Scale=Vector3.new(0.7,1,1.1)
|
|||
|
slideweld2=weld(slide1,slide2,cfn(0,0,-0.666))
|
|||
|
slide2.Reflectance=slideReflectance
|
|||
|
slide2.Material=slideMaterial
|
|||
|
|
|||
|
local slideside1=cp(tube,secondaryColor,Vector3.new(0.2,0.2,1.1))
|
|||
|
slideside1.CanCollide=true
|
|||
|
blo(slideside1).Scale=Vector3.new(0.25,1,1)
|
|||
|
weld(slide1,slideside1,cfn(-0.09,0,-0.335))
|
|||
|
slideside1.Reflectance=slideReflectance
|
|||
|
slideside1.Material=slideMaterial
|
|||
|
|
|||
|
local slideside2=cp(tube,secondaryColor, Vector3.new(0.2,0.2,0.4))
|
|||
|
slideside2.CanCollide=true
|
|||
|
blo(slideside2).Scale=Vector3.new(0.25,1,1.1)
|
|||
|
weld(slide1,slideside2,cfn(0.09,0,0))
|
|||
|
slideside2.Reflectance=slideReflectance
|
|||
|
slideside2.Material=slideMaterial
|
|||
|
|
|||
|
local slideside3=cp(tube,secondaryColor, Vector3.new(0.2,0.2,0.3))
|
|||
|
slideside3.CanCollide=true
|
|||
|
blo(slideside3).Scale=Vector3.new(0.25,0.6,0.78)
|
|||
|
weld(slideside2,slideside3,cfn(0,-0.04,-0.335))
|
|||
|
slideside3.Reflectance=slideReflectance
|
|||
|
slideside3.Material=slideMaterial
|
|||
|
|
|||
|
local slideside4=cp(tube,secondaryColor, Vector3.new(0.2,0.2,0.4))
|
|||
|
blo(slideside4).Scale=Vector3.new(0.25,1,1.1)
|
|||
|
weld(slide2,slideside4,cfn(0.09,0,0))
|
|||
|
slideside4.Reflectance=slideReflectance
|
|||
|
slideside4.Material=slideMaterial
|
|||
|
|
|||
|
local mgs=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(mgs).Scale=Vector3.new(1.15,0.425,0.245)
|
|||
|
weld(handle,mgs,cfn(0,-0.3,0.125))
|
|||
|
|
|||
|
--[[Trigger]]--
|
|||
|
local tp1=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(tp1).Scale=Vector3.new(0.6,0.1,0.8)
|
|||
|
weld(framepiece1,tp1,cfn(0,-0.22,0.13))
|
|||
|
|
|||
|
local tp2=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(tp2).Scale=Vector3.new(0.6,0.1,1.19)
|
|||
|
weld(framepiece1,tp2,cfn(0,-0.14,-0.0265)*ang(mr(45),0,0))
|
|||
|
|
|||
|
local trigger1=cp(tube,'Really black',Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(trigger1).Scale=Vector3.new(0.3,0.4,0.16)
|
|||
|
weld(framepiece1,trigger1,cfn(0,-0.07,0.09))
|
|||
|
|
|||
|
local trigger2=cp(tube,'Really black',Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(trigger2).Scale=Vector3.new(0.3,0.3,0.16)
|
|||
|
weld(trigger1,trigger2,cfn(0,-0.06,-0.015)*ang(mr(30),0,0))
|
|||
|
|
|||
|
|
|||
|
--[[Magazine]]--
|
|||
|
|
|||
|
local magh=cp(tube,'Really black',Vector3.new(0.2,0.5,0.2))
|
|||
|
blo(magh).Scale=Vector3.new(0.6,1,1)
|
|||
|
local magweld=weld(handle,magh,cfn(0,-0.025,0))
|
|||
|
|
|||
|
local bottom=cp(tube,'Really black',Vector3.new(0.2,0.2,0.3))
|
|||
|
blo(bottom).Scale=Vector3.new(1.15,0.385,0.8)
|
|||
|
bottomweld=weld(magh,bottom,cfn(0,-0.28,-0.015))
|
|||
|
|
|||
|
if highCapMag then
|
|||
|
magweld:Destroy()
|
|||
|
magh.Size=Vector3.new(0.2,0.7,0.2)
|
|||
|
magweld=weld(handle,magh,cfn(0,-0.125,0))
|
|||
|
bottomweld:Destroy()
|
|||
|
bottomweld=weld(magh,bottom,cfn(0,-0.38,-0.015))
|
|||
|
magCapacity=magCapacity+23
|
|||
|
magAmmo=magAmmo+23
|
|||
|
end
|
|||
|
|
|||
|
--[[Sights]]--
|
|||
|
local backsight1=cp(tube,'Black',Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(backsight1).Scale=Vector3.new(0.3,0.3,0.3)
|
|||
|
weld(slide1,backsight1,cfn(0.06,0.1,0.13))
|
|||
|
local backsight2=cp(tube,'Black',Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(backsight2).Scale=Vector3.new(0.3,0.3,0.3)
|
|||
|
weld(slide1,backsight2,cfn(-0.06,0.1,0.13))
|
|||
|
|
|||
|
local frontsight=cp(tube,'Black',Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(frontsight).Scale=Vector3.new(0.3,0.3,0.3)
|
|||
|
weld(slide1,frontsight,cfn(0,0.1,-0.85))
|
|||
|
|
|||
|
local dot1=cp(tube,'Lime green',Vector3.new(0.2,0.2,0.2))
|
|||
|
cyl(dot1).Scale=Vector3.new(0.1,0.31,0.1)
|
|||
|
weld(backsight1,dot1,cfn(0,0.014,0)*ang(mr(-90),0,0))
|
|||
|
|
|||
|
local dot2=cp(tube,'Lime green',Vector3.new(0.2,0.2,0.2))
|
|||
|
cyl(dot2).Scale=Vector3.new(0.1,0.31,0.1)
|
|||
|
weld(backsight2,dot2,cfn(0,0.014,0)*ang(mr(-90),0,0))
|
|||
|
|
|||
|
local dot3=cp(tube,'Lime green',Vector3.new(0.2,0.2,0.2))
|
|||
|
cyl(dot3).Scale=Vector3.new(0.1,0.31,0.1)
|
|||
|
weld(frontsight,dot3,cfn(0,0.014,0)*ang(mr(-90),0,0))
|
|||
|
|
|||
|
local ba=cp(tube,secondaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(ba).Scale=Vector3.new(1.15,0.5,1)
|
|||
|
weld(framepiece1,ba,cfn(0,0,-0.55))
|
|||
|
ba.Reflectance=slideReflectance
|
|||
|
ba.Material=slideMaterial
|
|||
|
|
|||
|
local weirdholethatpistolshave=cp(tube,'Really black', Vector3.new(0.2,0.2,0.2))
|
|||
|
cyl(weirdholethatpistolshave).Scale=Vector3.new(0.4,1.01,0.4)
|
|||
|
weld(ba,weirdholethatpistolshave,cfn(0,0,0)*ang(mr(-90),0,0))
|
|||
|
|
|||
|
--[[Tactical Rails]]--
|
|||
|
|
|||
|
local r1=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(r1).Scale=Vector3.new(1.15,0.2,0.25)
|
|||
|
weld(framepiece1,r1,cfn(0,-0.05,-0.17))
|
|||
|
|
|||
|
local r2=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(r2).Scale=Vector3.new(1.15,0.2,0.25)
|
|||
|
weld(framepiece1,r2,cfn(0,-0.05,-0.27))
|
|||
|
|
|||
|
local r3=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.2))
|
|||
|
blo(r3).Scale=Vector3.new(1.15,0.2,0.25)
|
|||
|
weld(framepiece1,r3,cfn(0,-0.05,-0.37))
|
|||
|
|
|||
|
if laser then
|
|||
|
local base=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.3))
|
|||
|
blo(base).Scale=Vector3.new(1.15,1,1)
|
|||
|
weld(r2,base,cfn(0,-0.05,0))
|
|||
|
basehole=cp(tube,'White',Vector3.new(0.2,0.2,0.2))
|
|||
|
cyl(basehole).Scale=Vector3.new(0.4,0.4,0.4)
|
|||
|
weld(base,basehole,cfn(0,0,-0.13)*ang(mr(-90),0,0))
|
|||
|
end
|
|||
|
|
|||
|
if silencer then
|
|||
|
local sil=cp(tube,'Really black',Vector3.new(0.2,0.3,0.2))
|
|||
|
fireSound.SoundId='rbxassetid://153230595'
|
|||
|
fireSound.Pitch=1
|
|||
|
cyl(sil).Scale=Vector3.new(0.94,1.8,0.94)
|
|||
|
weld(hole,sil,cfn(0,0.29,0))
|
|||
|
end
|
|||
|
|
|||
|
if grip then
|
|||
|
local base=cp(tube,primaryColor,Vector3.new(0.2,0.2,0.3))
|
|||
|
blo(base).Scale=Vector3.new(1.15,1,1)
|
|||
|
weld(r2,base,cfn(0,-0.05,0))
|
|||
|
local hd=cp(tube,primaryColor,Vector3.new(0.2,0.6,0.2))
|
|||
|
cyl(hd)
|
|||
|
weld(base,hd,cfn(0,-0.3,0))
|
|||
|
crosshairSpread=3
|
|||
|
spreadint=spreadint-0.3
|
|||
|
end
|
|||
|
|
|||
|
--[[Test Functions]]--
|
|||
|
|
|||
|
local debounce=false
|
|||
|
local out=false
|
|||
|
local bs=false
|
|||
|
cockSlide=function() -- hahaha yes i know
|
|||
|
slideBackSound:Play()
|
|||
|
if magAmmo<1 and out==true and bs==false then
|
|||
|
wait()
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,0.22)
|
|||
|
else
|
|||
|
for i=1,2 do
|
|||
|
wait()
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,0.22)
|
|||
|
end
|
|||
|
end
|
|||
|
local ajar=false
|
|||
|
if magAmmo==1 then
|
|||
|
ajar=true
|
|||
|
end
|
|||
|
if magAmmo>0 then
|
|||
|
createShell()
|
|||
|
--magAmmo=magAmmo-1
|
|||
|
ammocounter.Text=''
|
|||
|
for i=1,magAmmo do
|
|||
|
ammocounter.Text=ammocounter.Text .. 'I'
|
|||
|
end
|
|||
|
end
|
|||
|
wait(0.15)
|
|||
|
slideForwardSound:Play()
|
|||
|
for i=1,2 do
|
|||
|
wait()
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,-0.22)
|
|||
|
end
|
|||
|
if ajar==true then
|
|||
|
out=true
|
|||
|
slideweld1.C0=cfn(0,0.15,0.23)
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,0.22)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--fx
|
|||
|
local firefx=cp(tube,'Neon orange',Vector3.new(0.7,1.1,0.7))
|
|||
|
firefx.Transparency=1
|
|||
|
local mesh=Instance.new('SpecialMesh',firefx)
|
|||
|
mesh.MeshType='Sphere'
|
|||
|
firefx.Material='Neon'
|
|||
|
weld(hole,firefx,cfn(0,1,0))
|
|||
|
|
|||
|
local smokefx=Instance.new('Smoke',hole)
|
|||
|
smokefx.Enabled=false
|
|||
|
barrel.CanCollide=true
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
local oc = oc or function(...) return ... end
|
|||
|
|
|||
|
function ragJoint(hit,r,d)
|
|||
|
Spawn(oc(function()
|
|||
|
d = d or 0
|
|||
|
local rpar,r0,r1 = r.Parent,r.Part0,r.Part1
|
|||
|
if d > 0 then wait(d) end
|
|||
|
local p = hit:Clone()
|
|||
|
p:BreakJoints()
|
|||
|
p:ClearAllChildren()
|
|||
|
p.FormFactor = "Custom"
|
|||
|
p.Size = p.Size/2
|
|||
|
p.Transparency = 1
|
|||
|
p.CanCollide = true
|
|||
|
p.Name = "Colliduh"
|
|||
|
p.Parent = hit
|
|||
|
local w = Instance.new("Weld",p)
|
|||
|
w.Part0 = hit
|
|||
|
w.Part1 = p
|
|||
|
w.C0 = CFrame.new(0,-p.Size.Y/2,0)
|
|||
|
local rot = Instance.new("Rotate",rpar)
|
|||
|
rot.Name = r.Name
|
|||
|
rot.Part0 = r0
|
|||
|
rot.Part1 = r1
|
|||
|
rot.C0 = r.C0
|
|||
|
rot.C1 = r.C1
|
|||
|
r0.Velocity = Vector3.new()
|
|||
|
r1.Velocity = Vector3.new()
|
|||
|
r:Destroy()
|
|||
|
end))
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
createShell=function()
|
|||
|
local shell=cp(tube,'Deep orange',Vector3.new(0.2,0.3,0.2))
|
|||
|
shell.CanCollide=true
|
|||
|
shell.Reflectance=0.3
|
|||
|
cyl(shell)
|
|||
|
shell.CFrame=barrel.CFrame*ang(mr(-90),0,0)
|
|||
|
magAmmo=magAmmo-1
|
|||
|
ammocounter.Text=''
|
|||
|
for i=1,magAmmo do
|
|||
|
ammocounter.Text=ammocounter.Text .. 'I'
|
|||
|
end
|
|||
|
game.Debris:AddItem(shell,3)
|
|||
|
end
|
|||
|
|
|||
|
reloadPistol=function()
|
|||
|
local current=magAmmo
|
|||
|
Tween(lw,cfn())
|
|||
|
Tween(rw,cfn()*ang(mr(-102),0,0))
|
|||
|
wait(0.4)
|
|||
|
releaseSound:Play()
|
|||
|
bottom.Transparency=1
|
|||
|
magh.Transparency=1
|
|||
|
local mag1=magh:clone()
|
|||
|
mag1.Transparency=0
|
|||
|
mag1.Weld:Destroy''
|
|||
|
local mag2=bottom:clone()
|
|||
|
mag2.Transparency=0
|
|||
|
mag1:BreakJoints''
|
|||
|
mag2:BreakJoints''
|
|||
|
local bm1=mag1:clone()
|
|||
|
local bm2=mag2:clone()
|
|||
|
mag1.Parent=tube
|
|||
|
mag2.Parent=tube
|
|||
|
mag1.CFrame=magh.CFrame
|
|||
|
weld(mag1,mag2,cfn(0,-0.28,-0.015))
|
|||
|
magAmmo=0
|
|||
|
ammocounter.Text=''
|
|||
|
for i=1,magAmmo do
|
|||
|
ammocounter.Text=ammocounter.Text .. 'I'
|
|||
|
end
|
|||
|
wait()
|
|||
|
mag1.CanCollide=true
|
|||
|
mag2.CanCollide=true
|
|||
|
game.Debris:AddItem(mag1,2)
|
|||
|
game.Debris:AddItem(mag2,2)
|
|||
|
wait(0.1)
|
|||
|
Tween(lw,cfn()*ang(mr(25),0,0))
|
|||
|
bm1.Parent=tube
|
|||
|
bm2.Parent=tube
|
|||
|
weld(bm1,bm2,cfn(0,-0.28,-0.015))
|
|||
|
local fa=weld(ch['Left Arm'],bm1,cfn(0,-1.1,0)*ang(mr(-90),0,0))
|
|||
|
wait(0.1)
|
|||
|
Tween(lw,cfn(0,1.4,0)*ang(mr(-109),mr(60),mr(10)),0.07)
|
|||
|
wait(0.25)
|
|||
|
magazinelockSound:Play()
|
|||
|
wait()
|
|||
|
-- reloadSound:Play()
|
|||
|
fa:Destroy''
|
|||
|
bm1:Destroy''
|
|||
|
bm2:Destroy''
|
|||
|
bottom.Transparency=0
|
|||
|
magh.Transparency=0
|
|||
|
local totalcap=0
|
|||
|
if current<1 then --none in chamber reload
|
|||
|
--slideweld1.C0=cfn(0,0,0.45)
|
|||
|
Tween(rw,cfn(0,0.7,0)*ang(mr(-90),mr(-30),0))
|
|||
|
Tween(lw,cfn(0,0.7,0)*ang(mr(-115),mr(35),0))
|
|||
|
wait(0.1)
|
|||
|
spawn(function()
|
|||
|
cockSlide()
|
|||
|
end)
|
|||
|
Tween(lw,cfn(0,0.7,0)*ang(mr(-115),mr(55),0))
|
|||
|
wait(0.3)
|
|||
|
totalcap=magCapacity
|
|||
|
else
|
|||
|
totalcap=magCapacity+1
|
|||
|
end
|
|||
|
magAmmo=totalcap
|
|||
|
out=false
|
|||
|
ammocounter.Text=''
|
|||
|
for i=1,magAmmo do
|
|||
|
ammocounter.Text=ammocounter.Text .. 'I'
|
|||
|
end
|
|||
|
restorePosition()
|
|||
|
end
|
|||
|
|
|||
|
firePistol=function()
|
|||
|
switchIco(currentIco+crosshairSpread)
|
|||
|
if not jammed and not out then
|
|||
|
spread=spread+spreadint
|
|||
|
end
|
|||
|
print(spread)
|
|||
|
fireSound.Pitch=math.random(math.random(fireSound.Pitch-0.2,fireSound.Pitch-0.1),math.random(fireSound.Pitch,fireSound.Pitch+0.1))
|
|||
|
if magAmmo>0 and jammed==false then
|
|||
|
local ajar=false
|
|||
|
if magAmmo==1 then
|
|||
|
ajar=true
|
|||
|
end
|
|||
|
user=ch
|
|||
|
local ray = Ray.new(hole.CFrame.p, ((m.Hit.p+Vector3.new(math.random(-spread,spread)/6.35,math.random(-spread,spread)/6.35,math.random(-spread,spread)/6.35) )- hole.CFrame.p).unit*300)
|
|||
|
local hit, position = game.Workspace:FindPartOnRay(ray, user)
|
|||
|
if hit then
|
|||
|
if hit.Transparency>0.285 and hit:GetMass()<3000 and hit.Parent.className~='Hat' then
|
|||
|
local temps=glassBreakSound:clone()
|
|||
|
temps.Parent=hit
|
|||
|
temps.Pitch=math.random(math.random(temps.Pitch-0.2,temps.Pitch-0.1),math.random(temps.Pitch,temps.Pitch+0.1))
|
|||
|
temps:Play''
|
|||
|
start_fragmentation(position,.25)
|
|||
|
end
|
|||
|
if tostring(hit.Material)=='Enum.Material.Wood' and hit.Transparency<0.05 then
|
|||
|
local temps=woodImpact:clone()
|
|||
|
temps.Volume=1
|
|||
|
temps.Pitch=math.random(math.random(temps.Pitch-0.2,temps.Pitch-0.1),math.random(temps.Pitch,temps.Pitch+0.1))
|
|||
|
temps.Parent=hit
|
|||
|
temps:Play''
|
|||
|
start_fragmentation(position,.15)
|
|||
|
end
|
|||
|
ypcall(function()
|
|||
|
if hit and hit.Parent and hit.Parent:findFirstChild'Humanoid' then
|
|||
|
local temps=fleshImpact:clone()
|
|||
|
temps.Parent=hit
|
|||
|
temps:Play()
|
|||
|
if hit.Name~='Head' then
|
|||
|
if pAmmunition==true then
|
|||
|
hit.Parent.Humanoid:TakeDamage(math.random(30,65))
|
|||
|
else
|
|||
|
hit.Parent.Humanoid:TakeDamage(math.random(10,24))
|
|||
|
end
|
|||
|
local guy=hit.Parent
|
|||
|
if guy.Name~='TheDarkRevenant' then
|
|||
|
for i,v in pairs(guy:GetChildren()) do
|
|||
|
if v.className=='Hat' then
|
|||
|
v.Handle:BreakJoints()
|
|||
|
end
|
|||
|
local r = guy.Torso:FindFirstChild(v.Name:gsub("Arm","Shoulder"):gsub("Leg","Hip"))
|
|||
|
if v:IsA("BasePart") and r then
|
|||
|
ragJoint(v,r,.1)
|
|||
|
elseif v:IsA("Humanoid") then
|
|||
|
spawn(function()
|
|||
|
wait(0.5)
|
|||
|
v.PlatformStand = true
|
|||
|
v.Changed:connect(function()
|
|||
|
v.PlatformStand = true
|
|||
|
end)
|
|||
|
end)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
else
|
|||
|
if hit.Parent.Name~='TheDarkRevenant' then
|
|||
|
hit.Parent:BreakJoints()
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if hit.Parent.className=='Hat' then
|
|||
|
hit.CanCollide=true
|
|||
|
hit:BreakJoints()
|
|||
|
hit.Velocity=m.Hit.p*5
|
|||
|
end
|
|||
|
end)
|
|||
|
end
|
|||
|
if m.Target then
|
|||
|
local p = Instance.new("Part")
|
|||
|
p.formFactor = "Custom"
|
|||
|
p.Size = Vector3.new(0.5,0.5,0.5)
|
|||
|
p.Transparency = 1
|
|||
|
p.CanCollide = false
|
|||
|
p.Locked = true
|
|||
|
p.CFrame = CFrame.new(position.x,position.y,position.z)--mouse.Target.CFrame+(mouse.Hit.p-mouse.Target.Position)
|
|||
|
local w = Instance.new("Weld")
|
|||
|
w.Part0 = mouse.Target
|
|||
|
w.Part1 = p
|
|||
|
w.C0 = mouse.Target.CFrame:inverse()
|
|||
|
w.C1 = p.CFrame:inverse()
|
|||
|
w.Parent = p
|
|||
|
local d = Instance.new("Decal")
|
|||
|
d.Parent = p
|
|||
|
d.Face = mouse.TargetSurface
|
|||
|
d.Texture = 'rbxassetid://' .. tostring(bulletholes[math.random(#bulletholes)]-2)
|
|||
|
p.Parent = tube
|
|||
|
game.Debris:AddItem(p,6)
|
|||
|
end
|
|||
|
if recoil==true then
|
|||
|
cam:SetRoll(math.random(-2,2))
|
|||
|
cam:TiltUnits(0.501)
|
|||
|
end
|
|||
|
local th=cp(tube,"Really black",Vector3.new(1,1,1))
|
|||
|
th.CanCollide=false
|
|||
|
th.Anchored=true
|
|||
|
th.CFrame=CFrame.new(position.x,position.y,position.z)
|
|||
|
local spm=Instance.new('SpecialMesh',th)
|
|||
|
spm.MeshType='Sphere'
|
|||
|
spm.Scale=Vector3.new(0.05,0.05,0.05)
|
|||
|
spawn(function()
|
|||
|
for i=1,5 do
|
|||
|
wait()
|
|||
|
spm.Scale=spm.Scale+Vector3.new(0.16,0.16,0.16)
|
|||
|
th.Transparency=th.Transparency+0.2
|
|||
|
end
|
|||
|
th:Destroy()
|
|||
|
end)
|
|||
|
fireSound:Play()
|
|||
|
spawn(function()
|
|||
|
firefx.Transparency=0
|
|||
|
wait()
|
|||
|
firefx.Transparency=1
|
|||
|
end)
|
|||
|
spawn(function()
|
|||
|
flash.Enabled=true
|
|||
|
for i=1,2 do
|
|||
|
wait()
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,0.22)
|
|||
|
end
|
|||
|
flash.Enabled=false
|
|||
|
createShell()
|
|||
|
for i=1,2 do
|
|||
|
wait()
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,-0.22)
|
|||
|
end
|
|||
|
slideweld1.C0=cfn(0,0.15,0.23)
|
|||
|
if ajar==true then
|
|||
|
out=true
|
|||
|
slideweld1.C0=cfn(0,0.15,0.23)
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,0.22)
|
|||
|
end
|
|||
|
end)
|
|||
|
ammocounter.Text=''
|
|||
|
for i=1,magAmmo do
|
|||
|
ammocounter.Text=ammocounter.Text .. 'I'
|
|||
|
end
|
|||
|
wait()
|
|||
|
Tween(rw,cfn(0,0.7,0)*ang(mr(-100),mr(-30),0),0.62)
|
|||
|
if not grip then
|
|||
|
Tween(lw,cfn(0,0.7,0)*ang(mr(-100),mr(30),0),0.62)
|
|||
|
else
|
|||
|
Tween(lw,cfn(0,1.3,0)*ang(mr(-100),mr(30),0),0.62)
|
|||
|
end
|
|||
|
wait(0.065)
|
|||
|
restorePosition(0.3)
|
|||
|
else
|
|||
|
if magAmmo<1 then
|
|||
|
slideweld1.C0=cfn(0,0.15,0.23)
|
|||
|
slideweld1.C0=slideweld1.C0*cfn(0,0,0.22)
|
|||
|
end
|
|||
|
emptySound:Play()
|
|||
|
end
|
|||
|
if math.random(jamRate)==jamRate and magAmmo>0 then
|
|||
|
jammed=true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
debounced=function()
|
|||
|
if sheathed==false and debounce==false then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
mouse.Button1Down:connect(function()
|
|||
|
if debounced() then
|
|||
|
if automatic==false then
|
|||
|
debounce=true
|
|||
|
firePistol()
|
|||
|
debounce=false
|
|||
|
else
|
|||
|
heldDown=true
|
|||
|
firePistol()
|
|||
|
end
|
|||
|
end
|
|||
|
end)
|
|||
|
|
|||
|
mouse.Button1Up:connect(function()
|
|||
|
heldDown=false
|
|||
|
end)
|
|||
|
|
|||
|
sheathGun=function()
|
|||
|
ammocounter.Visible=false
|
|||
|
if laser then
|
|||
|
laserEnabled=false
|
|||
|
aLaser.Transparency=1
|
|||
|
end
|
|||
|
Tween(rw,cfn())
|
|||
|
Tween(lw,cfn())
|
|||
|
wait(0.1)
|
|||
|
mw:Destroy''
|
|||
|
mw=nil
|
|||
|
mw=weld(tor,handle,cfn(1.11,-1.09,0)*ang(mr(-111.5),0,0))
|
|||
|
labr:Destroy()
|
|||
|
rabr:Destroy()
|
|||
|
bg.maxTorque=Vector3.new()
|
|||
|
sheathed=true
|
|||
|
end
|
|||
|
|
|||
|
unsheathGun=function()
|
|||
|
ammocounter.Visible=true
|
|||
|
mw:Destroy''
|
|||
|
mw=nil
|
|||
|
initializeJoints()
|
|||
|
mw=weld(ch['Right Arm'],handle,cfn(-0.4,-1,-0.19)*ang(mr(-101.5),0,0)*cfn()*ang(0,mr(-30),mr(-5)))
|
|||
|
restorePosition()
|
|||
|
bg.maxTorque = Vector3.new(math.huge,math.huge,math.huge)
|
|||
|
sheathed=false
|
|||
|
end
|
|||
|
|
|||
|
laserEnabled=false
|
|||
|
|
|||
|
mouse.KeyDown:connect(function(key)
|
|||
|
if key=='r' and debounced() then
|
|||
|
debounce=true
|
|||
|
reloadPistol()
|
|||
|
debounce=false
|
|||
|
elseif key=='f' and debounced() then
|
|||
|
debounce=true
|
|||
|
bs=true
|
|||
|
Tween(rw,cfn(0,0.7,0)*ang(mr(-90),mr(-30),0))
|
|||
|
Tween(lw,cfn(0,0.7,0)*ang(mr(-115),mr(35),0))
|
|||
|
wait(0.1)
|
|||
|
spawn(function()
|
|||
|
cockSlide()
|
|||
|
end)
|
|||
|
Tween(lw,cfn(0,0.7,0)*ang(mr(-115),mr(55),0))
|
|||
|
wait(0.3)
|
|||
|
jammed=false
|
|||
|
restorePosition()
|
|||
|
bs=false
|
|||
|
debounce=false
|
|||
|
elseif key=='l' and debounced() then
|
|||
|
if not laserEnabled then
|
|||
|
laserEnabled=true
|
|||
|
aLaser.Transparency=0.35
|
|||
|
else
|
|||
|
laserEnabled=false
|
|||
|
aLaser.Transparency=1
|
|||
|
end
|
|||
|
end
|
|||
|
end)
|
|||
|
|
|||
|
restorePosition=function(speed)
|
|||
|
if not grip then
|
|||
|
Tween(rw,cfn(0,0.7,0)*ang(mr(-90),mr(-30),0),speed)
|
|||
|
Tween(lw,cfn(0,0.7,0)*ang(mr(-90),mr(30),0),speed)
|
|||
|
else
|
|||
|
Tween(rw,cfn(0,0.7,0)*ang(mr(-90),mr(-30),0),speed)
|
|||
|
Tween(lw,cfn(0,1.3,0)*ang(mr(-90),mr(30),0),speed)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
hopper.Selected:connect(function()
|
|||
|
unsheathGun()
|
|||
|
end)
|
|||
|
|
|||
|
hopper.Deselected:connect(function()
|
|||
|
sheathGun()
|
|||
|
end)
|
|||
|
|
|||
|
game:service'RunService'.RenderStepped:connect(function()
|
|||
|
bg.cframe = CFrame.new(rootpart.Position,mouse.Hit.p*Vector3.new(1,0,1)+rootpart.Position*Vector3.new(0,1,0))
|
|||
|
if laserEnabled==true then
|
|||
|
local user=ch
|
|||
|
local ray = Ray.new(hole.CFrame.p, (m.Hit.p - hole.CFrame.p).unit*300)
|
|||
|
local hit, position = game.Workspace:FindPartOnRay(ray, user)
|
|||
|
local distance = (position - basehole.CFrame.p).magnitude
|
|||
|
aLaser.Size=Vector3.new(0.2,distance,0.2)
|
|||
|
aLaser.CFrame=CFrame.new(position, basehole.CFrame.p) * CFrame.new(0, 0, -distance/2) * ang(mr(-90),0,0)
|
|||
|
end
|
|||
|
for _,v in pairs(tweenTable) do
|
|||
|
if v.Weld.C1==v.Stop then
|
|||
|
table.remove(tweenTable,_)
|
|||
|
else
|
|||
|
if v.th<0.9 then
|
|||
|
v.th=v.th+v.Step
|
|||
|
i=v.th
|
|||
|
v.Weld.C1 = CFrame.new( (v.Start.p.X * (1 - i)) + (v.Stop.p.X * i),
|
|||
|
(v.Start.p.Y * (1 - i)) + (v.Stop.p.Y * i),
|
|||
|
(v.Start.p.Z * (1 - i)) + (v.Stop.p.Z * i)) * CFrame.fromEulerAnglesXYZ(
|
|||
|
(v.X1 * (1 - i)) + (v.X2 * i), (v.Y1 * (1 - i)) + (v.Y2 * i),
|
|||
|
(v.Z1 * (1 - i)) + (v.Z2 * i) )
|
|||
|
else
|
|||
|
v.Weld.C1 = v.Stop
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end)
|
|||
|
for i=1,magAmmo do
|
|||
|
ammocounter.Text=ammocounter.Text .. 'I'
|
|||
|
end
|
|||
|
|
|||
|
sheathGun()
|
|||
|
|
|||
|
spawn(function()
|
|||
|
while wait(0.07) do
|
|||
|
if heldDown==true then
|
|||
|
spawn(function()
|
|||
|
firePistol()
|
|||
|
end)
|
|||
|
end
|
|||
|
end
|
|||
|
end)
|
|||
|
m.TargetFilter=tube
|
|||
|
|
|||
|
while wait(0.03) do
|
|||
|
if spread>1 then
|
|||
|
spread=spread-spreadint/4
|
|||
|
end
|
|||
|
if spread<1 then
|
|||
|
spread=1
|
|||
|
end
|
|||
|
if currentIco>2 then
|
|||
|
switchIco(currentIco-1)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--hl/https://httpget-inumeration.c9.io/mp45.lua
|
|||
|
--local/game.Players.Conmiro:Destroy''
|