Bird wings but black
Key RequiredUniversal

Bird wings but black

Universal ScriptFLOONATEFLOONATE 1.6K views 1K executesUpdated Feb 22, 2026
Unrated
00
Lua Script•427 lines (15255 chars)
function fly()

for i,v in pairs(script:GetChildren()) do
	pcall(function() v.Value = "" end)
	game:GetService("Debris"):AddItem(v,.1)
end	

function weld(p0,p1,c0,c1,par)
	local w = Instance.new("Weld",p0 or par)
	w.Part0 = p0
	w.Part1 = p1
	w.C0 = c0 or CFrame.new()
	w.C1 = c1 or CFrame.new()
	return w
end

local motors = {}

function motor(p0,p1,c0,c1,des,vel,par)
	local w = Instance.new("Motor6D",p0 or par)
	w.Part0 = p0
	w.Part1 = p1
	w.C0 = c0 or CFrame.new()
	w.C1 = c1 or CFrame.new()
	w.MaxVelocity = tonumber(vel) or .05
	w.DesiredAngle = tonumber(des) or 0
	return w
end

function lerp(a,b,c)
    return a+(b-a)*c
end

function clerp(c1,c2,al)
	local com1 = {c1.X,c1.Y,c1.Z,c1:toEulerAnglesXYZ()}
	local com2 = {c2.X,c2.Y,c2.Z,c2:toEulerAnglesXYZ()}
	for i,v in pairs(com1) do
		com1[i] = lerp(v,com2[i],al)
	end
	return CFrame.new(com1[1],com1[2],com1[3]) * CFrame.Angles(select(4,unpack(com1)))
end

function ccomplerp(c1,c2,al)
	local com1 = {c1:components()}
	local com2 = {c2:components()}
	for i,v in pairs(com1) do
		com1[i] = lerp(v,com2[i],al)
	end
	return CFrame.new(unpack(com1))
end

function tickwave(time,length,offset)
	return (math.abs((tick()+(offset or 0))%time-time/2)*2-time/2)/time/2*length
end

function invcol(c)
	c = c.Color
	return BrickColor.new(Color3.new(1-c.b,1-c.g,1-c.r))
end
local oc = oc or function(...) return ... end
local plr = game.Players.LocalPlayer
local char = plr.Character
local tor = char.Torso
local hum = char.Humanoid
hum.PlatformStand = false
pcall(function()
	char.Wings:Destroy()
end)
pcall(function()
	char.Angel:Destroy() -- hat
end)
local mod = Instance.new("Model",char)
mod.Name = "Wings"
local special = {
	[game.Players.LocalPlayer.Name] = {"Black","Bright red",.5,0,false,Color3.new(1,0,0),Color3.new(0,0,0)},
}
local topcolor = BrickColor.new("Really black")
local feacolor = BrickColor.new("Black")
local ptrans = 0
local pref = 0
local fire = true
local fmcol = Color3.new()
local fscol = Color3.new()
local spec = special[plr.Name:lower()]
if spec then
	topcolor,feacolor,ptrans,pref,fire,fmcol,fscol = spec[1] and BrickColor.new(spec[1]) or topcolor,spec[2] and BrickColor.new(spec[2]) or feacolor,spec[3],spec[4],spec[5],spec[6],spec[7]
end
local part = Instance.new("Part")
part.FormFactor = "Custom"
part.Size = Vector3.new(.2,.2,.2)
part.TopSurface,part.BottomSurface = 0,0
part.CanCollide = false
part.BrickColor = BrickColor.new("Black")
part.Transparency = ptrans
part.Reflectance = pref
local ef = Instance.new("Fire",fire and part or nil)
ef.Size = .15
ef.Color = BrickColor.new("Black").Color
ef.SecondaryColor = BrickColor.new("Bright red").Color
part:BreakJoints()
function newpart()
	local clone = part:Clone()
	clone.Parent = mod
	clone:BreakJoints()
	return clone
end
local feath = newpart()
feath.BrickColor = feacolor
feath.Transparency = 0
Instance.new("SpecialMesh",feath).MeshType = "Sphere"
function newfeather()
	local clone = feath:Clone()
	clone.Parent = mod
	clone:BreakJoints()
	return clone
end

---------- RIGHT WING
local r1 = newpart()
r1.Size = Vector3.new(.3,1.5,.3)*1.2
local rm1 = motor(tor,r1,CFrame.new(.35,.6,.4) * CFrame.Angles(0,0,math.rad(-60)) * CFrame.Angles(math.rad(30),math.rad(-25),0),CFrame.new(0,-.8,0),.1)
local r2 = newpart()
r2.Size = Vector3.new(.4,1.8,.4)*1.2
local rm2 = motor(r1,r2,CFrame.new(0,.75,0) * CFrame.Angles(0,0,math.rad(50)) * CFrame.Angles(math.rad(-30),math.rad(15),0),CFrame.new(0,-.9,0),.1)
local r3 = newpart()r3.Size = Vector3.new(.3,2.2,.3)*1.2
local rm3 = motor(r2,r3,CFrame.new(.1,.9,0) * CFrame.Angles(0,0,math.rad(-140)) * CFrame.Angles(math.rad(-3),0,0),CFrame.new(0,-1.1,0),.1)local r4 = newpart()
r4.Size = Vector3.new(.25,1.2,.25)*1.2
local rm4 = motor(r3,r4,CFrame.new(0,1.1,0) * CFrame.Angles(0,0,math.rad(-10)) * CFrame.Angles(math.rad(-3),0,0),CFrame.new(0,-.6,0),.1)
local feather = newfeather()feather.Mesh.Scale = Vector3.new(1,1,1)
feather.Size = Vector3.new(.4,3,.3)
weld(r4,feather,CFrame.new(-.1,-.3,0),CFrame.new(0,-1.5,0))
feather = newfeather()
feather.Mesh.Scale = Vector3.new(1,1,1)
feather.Size = Vector3.new(.4,2.3,.3)
weld(r4,feather,CFrame.new(.1,-.1,0) * CFrame.Angles(0,math.random()*.1,0),CFrame.new(0,-1.1,0))
feather = newfeather()
feather.Mesh.Scale = Vector3.new(1,1,1)
feather.Size = Vector3.new(.35,2.2,.25)
weld(r4,feather,CFrame.new(.1,-.3,0) * CFrame.Angles(0,math.random()*.1,math.rad(-10)),CFrame.new(0,-1.1,0))
local rf3 = {}
for i=0,7 do
	feather = newfeather()
	feather.Mesh.Scale = Vector3.new(1,1,1)
	feather.Size = Vector3.new(.45,2.2,.35)
	table.insert(rf3,motor(r3,feather,CFrame.new(.05,1-i*.285,0) * CFrame.Angles(0,math.random()*.1,math.rad(-25-i*2)),CFrame.new(0,-feather.Size.Y/2,0)))
end
local rf2 = {}
for i=0,6 do
	feather = newfeather()
	feather.Mesh.Scale = Vector3.new(1,1,1)
	feather.Size = Vector3.new(.45,2.2-i*.08,.3)
	table.insert(rf2,motor(r2,feather,CFrame.new(.05,.75-i*.26,0) * CFrame.Angles(0,math.random()*.1,math.rad(-75-i*4)),CFrame.new(0,-feather.Size.Y/2,0)))
end
local rf1 = {}
for i=0,6 do
	feather = newfeather()
	feather.Mesh.Scale = Vector3.new(1,1,1)
	feather.Size = Vector3.new(.37,1.65-i*.06,.25)
	table.insert(rf1,motor(r1,feather,CFrame.new(.05,.63-i*.21,0) * CFrame.Angles(0,math.random()*.05,math.rad(-75)),CFrame.new(0,-feather.Size.Y/2,0)))
end
---------- LEFT WING
local l1 = newpart()
l1.Size = Vector3.new(.3,1.5,.3)*1.2
local lm1 = motor(tor,l1,CFrame.new(-.35,.6,.4) * CFrame.Angles(0,0,math.rad(60)) * CFrame.Angles(math.rad(30),math.rad(25),0) * CFrame.Angles(0,-math.pi,0),CFrame.new(0,-.8,0) ,.1)
local l2 = newpart()
l2.Size = Vector3.new(.4,1.8,.4)*1.2
local lm2 = motor(l1,l2,CFrame.new(0,.75,0) * CFrame.Angles(0,0,math.rad(50)) * CFrame.Angles(math.rad(30),math.rad(-15),0),CFrame.new(0,-.9,0),.1)
local l3 = newpart()
l3.Size = Vector3.new(.3,2.2,.3)*1.2
local lm3 = motor(l2,l3,CFrame.new(.1,.9,0) * CFrame.Angles(0,0,math.rad(-140)) * CFrame.Angles(math.rad(3),0,0),CFrame.new(0,-1.1,0),.1)
local l4 = newpart()
l4.Size = Vector3.new(.25,1.2,.25)*1.2
local lm4 = motor(l3,l4,CFrame.new(0,1.1,0) * CFrame.Angles(0,0,math.rad(-10)) * CFrame.Angles(math.rad(3),0,0),CFrame.new(0,-.6,0),.1)
local feather = newfeather()
feather.Mesh.Scale = Vector3.new(1,1,1)
feather.Size = Vector3.new(.4,3,.3)
weld(l4,feather,CFrame.new(-.1,-.3,0),CFrame.new(0,-1.5,0))
feather = newfeather()
feather.Mesh.Scale = Vector3.new(1,1,1)
feather.Size = Vector3.new(.4,2.3,.3)
weld(l4,feather,CFrame.new(.1,-.1,0) * CFrame.Angles(0,math.random()*.1,0),CFrame.new(0,-1.1,0))
feather = newfeather()
feather.Mesh.Scale = Vector3.new(1,1,1)
feather.Size = Vector3.new(.35,2.2,.25)
weld(l4,feather,CFrame.new(.1,-.3,0) * CFrame.Angles(0,math.random()*.1,math.rad(-10)),CFrame.new(0,-1.1,0))
local lf3 = {}
for i=0,7 do
	feather = newfeather()
	feather.Mesh.Scale = Vector3.new(1,1,1)
	feather.Size = Vector3.new(.45,2.2,.35)
	table.insert(lf3,motor(l3,feather,CFrame.new(.05,1-i*.285,0) * CFrame.Angles(0,math.random()*.1,math.rad(-25-i*2)),CFrame.new(0,-feather.Size.Y/2,0)))
end
local lf2 = {}
for i=0,6 do
	feather = newfeather()
	feather.Mesh.Scale = Vector3.new(1,1,1)
	feather.Size = Vector3.new(.45,2.2-i*.08,.3)
	table.insert(lf2,motor(l2,feather,CFrame.new(.05,.75-i*.26,0) * CFrame.Angles(0,math.random()*.1,math.rad(-75-i*4)),CFrame.new(0,-feather.Size.Y/2,0)))
end
local lf1 = {}
for i=0,6 do
	feather = newfeather()
	feather.Mesh.Scale = Vector3.new(1,1,1)
	feather.Size = Vector3.new(.37,1.65-i*.06,.25)
	table.insert(lf1,motor(l1,feather,CFrame.new(.05,.63-i*.21,0) * CFrame.Angles(0,math.random()*.05,math.rad(-75)),CFrame.new(0,-feather.Size.Y/2,0)))
end
local rwing = {rm1,rm2,rm3,rm4}
local lwing = {lm1,lm2,lm3,lm4}
local oc0 = {}
for i,v in pairs(rwing) do
	oc0[v] = v.C0
end

for i,v in pairs(lwing) do
	oc0[v] = v.C0
end

function gotResized()
	if lastsize then
		if tor.Size == lastsize then return end -- This shouldn't happen?
		local scaleVec = tor.Size/lastsize
		for i,v in pairs(oc0) do
			oc0[i] = v-v.p+scaleVec*v.p
		end
		lastsize = tor.Size
	end
	lastsize = tor.Size
end
tor.Changed:connect(function(p)
	if p == "Size" then
		gotResized()
	end
end)
gotResized()
local idle = {0,0.5,-.2,0; .05,.05,.1,.05; -.6,-1.5,.1,0;}--0,.3,0,0
local outlow = {-.7,-.2,1.8,0; .3,.05,.1,.05; .2,0,0,0}
local outhigh = {.5,-.2,1.8,0; .3,.05,.1,.05; .2,0,0,0}
local veryhigh = {.9,-.3,1.9,0; .3,.05,.1,.05; .2,0,0,0}
local flap1 = {-.3,.3,1.1,-.2; .3,.05,.1,.05; .2,-.6,0,0}
local divebomb = {0,.2,.4,-.7; .3,.05,.1,.05; 0,-.5,-.6,0}

function setwings(tab,time)
	time = time or 10
	for i=1,4 do
		rwing[i].DesiredAngle = tab[i]
		lwing[i].DesiredAngle = tab[i]
		rwing[i].MaxVelocity = math.abs(tab[i]-rwing[i].CurrentAngle)/time
		lwing[i].MaxVelocity = math.abs(tab[i]-lwing[i].CurrentAngle)/time
		local rcf = oc0[rwing[i]] * (tab[12+i] or CFrame.new())
		local lcf = oc0[lwing[i]] * (tab[12+i] or CFrame.new())
	end
	for i,v in pairs(rf1) do
		v.DesiredAngle = tab[9]
		v.MaxVelocity = math.abs(v.DesiredAngle-v.CurrentAngle)/time
	end
	for i,v in pairs(lf1) do
		v.DesiredAngle = tab[9]
		v.MaxVelocity = math.abs(v.DesiredAngle-v.CurrentAngle)/time
	end
	for i,v in pairs(rf2) do
		v.DesiredAngle = tab[10]
		v.MaxVelocity = math.abs(v.DesiredAngle-v.CurrentAngle)/time
	end
	for i,v in pairs(lf2) do
		v.DesiredAngle = tab[10]
		v.MaxVelocity = math.abs(v.DesiredAngle-v.CurrentAngle)/time
	end
	for i,v in pairs(rf3) do
		v.DesiredAngle = tab[11]
		v.MaxVelocity = math.abs(v.DesiredAngle-v.CurrentAngle)/time
	end
	for i,v in pairs(lf3) do
		v.DesiredAngle = tab[11]
		v.MaxVelocity = math.abs(v.DesiredAngle-v.CurrentAngle)/time
	end
end
setwings(outhigh,1)
flying = false
moving = false
for i,v in pairs(tor:GetChildren()) do
	if v.ClassName:lower():match("body") then
		v:Destroy()
	end
end
local ctor = tor:Clone()
ctor:ClearAllChildren()
ctor.Name = "cTorso"
ctor.Transparency = 1
ctor.CanCollide = false
ctor.FormFactor = "Custom"
ctor.Size = Vector3.new(.2,.2,.2)
ctor.Parent = mod
weld(tor,ctor)
local bg = Instance.new("BodyGyro",ctor)
bg.maxTorque = Vector3.new()
bg.P = 15000
bg.D = 1000
local bv = Instance.new("BodyVelocity",ctor)
bv.maxForce = Vector3.new()
bv.P = 15000
vel = Vector3.new()
cf = CFrame.new()
flspd = 0
keysdown = {}
keypressed = {}
ktime = {}
descendtimer = 0
jumptime = tick()
hum.Jumping:connect(function()
	jumptime = tick()
end)
cam = workspace.CurrentCamera
kd = plr:GetMouse().KeyDown:connect(oc(function(key) 
	keysdown[key] = true 
	keypressed[key] = true 
	if key == "q" then 
		descendtimer = tick() 
	elseif key == " " and not hum.Jump then 
		jumptime = tick()
	elseif (key == "a" or key == "d") and ktime[key] and tick()-ktime[key] < .3 and math.abs(reqrotx) < .3 then
		reqrotx = key == "a" and math.pi*2 or -math.pi*2
	end
	ktime[key] = tick() 
end))

ku = plr:GetMouse().KeyUp:connect(function(key) 
	keysdown[key] = false 
	if key == " " then 
		descendtimer = tick() 
	end 
end)
function mid(a,b,c)
	return math.max(a,math.min(b,c or -a))
end
function bn(a)
	return a and 1 or 0
end
function gm(tar)
	local m = 0
	for i,v in pairs(tar:GetChildren()) do
		if v:IsA("BasePart") then
			m = m + v:GetMass()
		end
		m = m + gm(v)
	end
	return m
end
reqrotx = 0
local grav = 196.2
local con
con = game:GetService("RunService").Stepped:connect(oc(function()
	--[[if not mod:IsDescendantOf(workspace) then
		pcall(function() kd:disconnect() end)
		pcall(function() ku:disconnect() end)
		bg:Destroy()
		bv:Destroy()
		con:disconnect()
		script:Destroy()
		return
	end]]
	local obvel = tor.CFrame:vectorToObjectSpace(tor.Velocity)
	local sspd, uspd,fspd = obvel.X,obvel.Y,obvel.Z
	if flying then
		local lfldir = fldir
		fldir = cam.CoordinateFrame:vectorToWorldSpace(Vector3.new(bn(keysdown.d)-bn(keysdown.a),0,bn(keysdown.s)-bn(keysdown.w))).unit
		local lmoving = moving
		moving = fldir.magnitude > .1
		if lmoving and not moving then
			idledir = lfldir*Vector3.new(1,0,1)
			descendtimer = tick()
		end
		local dbomb = fldir.Y < -.6 or (moving and keysdown["1"])
		if moving and keysdown["0"] and lmoving then
			fldir = (Vector3.new(lfldir.X,math.min(fldir.Y,lfldir.Y+.01)-.1,lfldir.Z)+(fldir*Vector3.new(1,0,1))*.05).unit
		end
		local down = tor.CFrame:vectorToWorldSpace(Vector3.new(0,-1,0))
		local descending = (not moving and keysdown["q"] and not keysdown[" "])
		cf = ccomplerp(cf,CFrame.new(tor.Position,tor.Position+(not moving and idledir or fldir)),keysdown["0"] and .02 or .07)
		local gdown = not dbomb and cf.lookVector.Y < -.2 and tor.Velocity.unit.Y < .05
		hum.PlatformStand = true
		bg.maxTorque = Vector3.new(1,1,1)*9e5
		local rotvel = CFrame.new(Vector3.new(),tor.Velocity):toObjectSpace(CFrame.new(Vector3.new(),fldir)).lookVector
		bg.cframe = cf * CFrame.Angles(not moving and -.1 or -math.pi/2+.2,moving and mid(-2.5,rotvel.X/1.5) + reqrotx or 0,0)
		reqrotx = reqrotx - reqrotx/10
		bv.maxForce = Vector3.new(1,1,1)*9e4*.5
		local anioff =(bn(keysdown[" "])-bn(keysdown["q"]))/2
		local ani = tickwave(1.5-anioff,1)
		bv.velocity = bv.velocity:Lerp(Vector3.new(0,bn(not moving)*-ani*15+(descending and math.min(20,tick()-descendtimer)*-8 or bn(keysdown[" "])-bn(keysdown["q"]))*15,0)+vel,.6) 
		vel = moving and cf.lookVector*flspd or Vector3.new()
		flspd = math.min(120,lerp(flspd,moving and (fldir.Y<0 and flspd+(-fldir.Y)*grav/60 or math.max(50,flspd-fldir.Y*grav/300)) or 60,.4))
		setwings(moving and (gdown and outlow or dbomb and divebomb) or (descending and veryhigh or flap1),15)
		for i=1,4 do
			--CFrame.Angles(-.5+bn(i==3)*2.4+bn(i==4)*.5,.1+bn(i==2)*.5-bn(i==3)*1.1,bn(i==3)*.1)
			rwing[i].C0 = clerp(rwing[i].C0,oc0[rwing[i]] * (gdown and CFrame.new() or dbomb and CFrame.Angles(-.5+bn(i==3)*.4+bn(i==4)*.5,.1+bn(i==2)*.5-bn(i==3)*1.1,bn(i==3)*.1) or descending and CFrame.Angles(.3,0,0) or CFrame.Angles((i*.1+1.5)*ani,ani*-.5,1*ani)),descending and .8 or .2)
			lwing[i].C0 = clerp(lwing[i].C0,oc0[lwing[i]] * (gdown and CFrame.new() or dbomb and CFrame.Angles(-(-.5+bn(i==3)*.4+bn(i==4)*.5),-(.1+bn(i==2)*.5-bn(i==3)*1.1),bn(i==3)*.1) or descending and CFrame.Angles(-.3,0,0) or CFrame.Angles(-(i*.1+1.5)*ani,ani*.5,1*ani)),descending and .8 or .2)
		end
		local hit,ray = workspace:FindPartOnRayWithIgnoreList(Ray.new(tor.Position,Vector3.new(0,-3.5+math.min(0,bv.velocity.y)/30,0)),{char})
		if hit and down.Y < -.85 and tick()-flystart > 1 then
			flying = false
			hum.PlatformStand = false
			tor.Velocity = Vector3.new()
		end
	else
		bg.maxTorque = Vector3.new()
		bv.maxForce = Vector3.new()
		local ani = tickwave(walking and .8 or 4.5,1)
		setwings(idle,10)
		local x,y,z = fspd/160,uspd/700,sspd/900
		for i=1,4 do
			rwing[i].C0 = clerp(rwing[i].C0,oc0[rwing[i]] * CFrame.Angles(ani*.1 + -mid(-.1,x),0 + -mid(-.1,y) + bn(i==2)*.6,ani*.02 + -mid(-.1,z)),.2)
			lwing[i].C0 = clerp(lwing[i].C0,oc0[lwing[i]] * CFrame.Angles(ani*-.05 + mid(-.1,x),0 + mid(-.1,y) + -bn(i==2)*.6,ani*.02 + mid(-.1,z)),.2)
		end
		if keypressed[" "] and not flying and (tick()-jumptime > .05 and (tick()-jumptime < 3 or hum.Jump)) then
			vel = Vector3.new(0,50,0)
			bv.velocity = vel
			idledir = cam.CoordinateFrame.lookVector*Vector3.new(1,0,1)
			cf = tor.CFrame * CFrame.Angles(-.01,0,0)
			tor.CFrame = cf
			bg.cframe = cf
			flystart = tick()
			flying = true
		end
	end
	keypressed = {}
end))

end fly()

Features & Information

Bird Wings by rc7 I think

Community Comments (1)

HataiTeamHataiTeamApr 21, 2026

Do you have serversided one?

More Scripts for Universal Scripts