Free T-shirt Cannon: Shoots real free T-shirts!

Background

I had the fun idea to make a T-shirt cannon that shoots real T-shirt avatar items. In the past, Roblox allowed users to set T-shirt prices to 0 R$, so all the avatar items are totally free!

Screenshot 2024-08-15 at 8.15.16 PMScreenshot 2024-08-15 at 8.15.02 PMScreenshot 2024-08-15 at 8.21.31 PMScreenshot 2024-08-15 at 8.22.35 PMScreenshot 2024-08-15 at 8.15.47 PM

I found an old Roblox gear of a T-shirt cannon–which is now broken–and used that as the 3DM for my tool!

(The T-shirt cannon gear in question)

I then made some minor modifications to @TheNexusAvenger’s amazing remade classic weapons with their clever projectile buffer to create the T-shirt cannon functionality!

The Cannon

And, what you’ve all been waiting for: the final result!

The T-shirt cannon fires T-shirt projectiles with latency free physics, and NPCs and players equip T-shirts they get hit by:

Demo1 Demo2

When players get hit by T-shirts, they also get a prompt to get the free T-shirt:

Demo3

You can try out the T-shirt cannon for yourself in the test game I made:

T-Shirt Cannon Battlegrounds

And you can get the model here:

https://create.roblox.com/store/asset/18965706440/Free-TShirt-Cannon

Notable Assets and Changes

The Free T-Shirt Cannon

The main thing of this post, the free T-shirt cannon, can be found here:

https://create.roblox.com/store/asset/18965706440/Free-TShirt-Cannon

You can try out the model in the test game here:

Free T-Shirt Cannon Battlegrounds - Roblox


Classic T-Shirt Data Module

I also compiled a list of free classic t-shirts with relevant data like the ID, formatted names, texture ID, and (mostly) ideal torso color.

Here is that module:

-- By BendsSpace
-- A bunch of data about classic T-Shirts

local FreeTShirtData = {
	{
		Id = 1597982,
		Name = "Homestar Runner",
		Texture = "http://www.roblox.com/asset/?id=1597981",
		Color = Color3.fromRGB(220,29,0)
	},
	
	{
		Id = 1627363,
		Name = "Wool Hood So Cute X3",
		Texture = "http://www.roblox.com/asset/?id=1627362",
		Color = Color3.fromRGB(255,244,4)
	},
	
	{
		Id = 1803351,
		Name = "Captain Robomilo",
		Texture = "http://www.roblox.com/asset/?id=1803350",
		Color = Color3.fromRGB(8,4,4)
	},
	
	{
		Id = 1639361,
		Name = "Cyber Suit 30",
		Texture = "http://www.roblox.com/asset/?id=1639360",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1701747,
		Name = "Cute Shirt",
		Texture = "http://www.roblox.com/asset/?id=1701746",
		Color = Color3.fromRGB(18,191,77)
	},
	
	{
		Id = 1381009,
		Name = "Superman Shirt",
		Texture = "http://www.roblox.com/asset/?id=1381008",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1638304,
		Name = "Transparent Bomber Jacket",
		Texture = "http://www.roblox.com/asset/?id=1638304",
		Color = Color3.fromRGB(150, 162, 171)
	},
	
	{
		Id = 1749694,
		Name = "Striped Suit",
		Texture = "http://www.roblox.com/asset/?id=1749693",
		Color = Color3.fromRGB(16, 17, 17)
	},
	
	{
		Id = 1756326,
		Name = "Red Tux Shirt",
		Texture = "http://www.roblox.com/asset/?id=1756325",
		Color = Color3.fromRGB(127,12,0)
	},
	
	{
		Id = 1324798,
		Name = "Are92 Ninja",
		Texture = "http://www.roblox.com/asset/?id=1324797",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1639359,
		Name = "Cyber Suit 31",
		Texture = "http://www.roblox.com/asset/?id=1639358",
		Color = Color3.fromRGB(102,235,244)
	},
	
	{
		Id = 1693848,
		Name = "Red and Blue Shirt",
		Texture = "http://www.roblox.com/asset/?id=1693847",
		Color = Color3.fromRGB(128,12,0)
	},
	
	{
		Id = 1779882,
		Name = "Half-Life Icon T-Shirt [Transparent]",
		Texture = "http://www.roblox.com/asset/?id=1779881",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1791752,
		Name = "Stealth Pilot's Jacket",
		Texture = "http://www.roblox.com/asset/?id=1791751",
		Color = Color3.fromRGB(66, 33, 0)
	},
	
	{
		Id = 1036727,
		Name = "Erik Is My Hero",
		Texture = "http://www.roblox.com/asset/?id=1036726",
		Color = Color3.fromRGB(251, 92, 44)
	},
	
	{
		Id = 1672991,
		Name = "Jester Shirt",
		Texture = "http://www.roblox.com/asset/?id=1672990",
		Color = Color3.fromRGB(69, 0, 193)
	},
	
	{
		Id = 1639334,
		Name = "Cyber Suit 34",
		Texture = "http://www.roblox.com/asset/?id=1639333",
		Color = Color3.fromRGB(209, 207, 212)
	},
	
	{
		Id = 1603782,
		Name = "OMG PURPLE Admin Badge",
		Texture = "http://www.roblox.com/asset/?id=1603781",
		Color = Color3.fromRGB(155, 74, 203)
	},
	
	{
		Id = 1639327,
		Name = "Cyber Suit 35",
		Texture = "http://www.roblox.com/asset/?id=1639326",
		Color = Color3.fromRGB(215, 235, 246)
	},
	
	{
		Id = 1579093,
		Name = "Checkmate Noob >:D",
		Texture = "http://www.roblox.com/asset/?id=1579092",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1760683,
		Name = "Tux Penguin Shirt",
		Texture = "http://www.roblox.com/asset/?id=1760682",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1376925,
		Name = "Penguin Hoodie",
		Texture = "http://www.roblox.com/asset/?id=1376924",
		Color = Color3.fromRGB(132,198,222)
	},
	
	{
		Id = 1668535,
		Name = "ROBLOX in The Deep Blue",
		Texture = "http://www.roblox.com/asset/?id=1668534",
		Color = Color3.fromRGB(0,0,0)
	},
	
	{
		Id = 1546452,
		Name = "ROBLOX Band Fan Shirt",
		Texture = "http://www.roblox.com/asset/?id=1546451",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1740755,
		Name = "Get a Suit",
		Texture = "http://www.roblox.com/asset/?id=1740754",
		Color = Color3.fromRGB(0,0,0)
	},
	
	{
		Id = 1736470,
		Name = "Link",
		Texture = "http://www.roblox.com/asset/?id=1736469",
		Color = Color3.fromRGB(2, 128, 1)
	},
	
	{
		Id = 1604952,
		Name = "Happyface",
		Texture = "http://www.roblox.com/asset/?id=1604951",
		Color = Color3.fromRGB(74, 206, 181)
	},
	
	{
		Id = 1124654,
		Name = "Marshtomp",
		Texture = "http://www.roblox.com/asset/?id=1124653",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1570430,
		Name = "Struggle",
		Texture = "http://www.roblox.com/asset/?id=1570429",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1757720,
		Name = "C3PO Shirt",
		Texture = "http://www.roblox.com/asset/?id=1757719",
		Color = Color3.fromRGB(196, 150, 89)
	},
	
	{
		Id = 1605563,
		Name = "Green iPod",
		Texture = "http://www.roblox.com/asset/?id=1605562",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1612420,
		Name = "Good Void Star Drone",
		Texture = "http://www.roblox.com/asset/?id=1612419",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1649952,
		Name = "Robe",
		Texture = "http://www.roblox.com/asset/?id=1649951",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607351,
		Name = "Football 10",
		Texture = "http://www.roblox.com/asset/?id=1607350",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1280475,
		Name = "Ticket",
		Texture = "http://www.roblox.com/asset/?id=1280474",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1563394,
		Name = "Staff Shirt (Telamon)",
		Texture = "http://www.roblox.com/asset/?id=1563393",
		Color = Color3.fromRGB(0,0,0)
	},
	
	{
		Id = 1305394,
		Name = "Jedi Suit",
		Texture = "http://www.roblox.com/asset/?id=1305393",
		Color = Color3.fromRGB(232, 196, 164)
	},
	
	{
		Id = 1607317,
		Name = "Football 2",
		Texture = "http://www.roblox.com/asset/?id=1607316",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607357,
		Name = "Football 12",
		Texture = "http://www.roblox.com/asset/?id=1607356",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1636113,
		Name = "Ninja Drone of Shadows",
		Texture = "http://www.roblox.com/asset/?id=1636112",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1796994,
		Name = "R which = ROBLOX",
		Texture = "http://www.roblox.com/asset/?id=1796993",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1730055,
		Name = "Robot Drone Shirt",
		Texture = "http://www.roblox.com/asset/?id=1730054",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1612398,
		Name = "Evil Void Star Drone",
		Texture = "http://www.roblox.com/asset/?id=1612397",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1746211,
		Name = "This Color Pwns!",
		Texture = "http://www.roblox.com/asset/?id=1746210",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1690636,
		Name = "1 Brick Missing!",
		Texture = "http://www.roblox.com/asset/?id=1690635",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1745856,
		Name = "Veteran Suit Shirt",
		Texture = "http://www.roblox.com/asset/?id=1745855",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1090385,
		Name = "Super Brick",
		Texture = "http://www.roblox.com/asset/?id=1090384",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1666359,
		Name = "Jet Pack Strap",
		Texture = "http://www.roblox.com/asset/?id=1666358",
		Color = Color3.fromRGB(27, 44, 54)
	},
	
	{
		Id = 1741453,
		Name = "Austin",
		Texture = "http://www.roblox.com/asset/?id=1741452",
		Color = Color3.fromRGB(46, 54, 153)
	},
	
	{
		Id = 1639393,
		Name = "Cyber Suit 25",
		Texture = "http://www.roblox.com/asset/?id=1639392",
		Color = Color3.fromRGB(248, 169, 93)
	},
	
	{
		Id = 1685088,
		Name = "Crosshair",
		Texture = "http://www.roblox.com/asset/?id=1685087",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1719066,
		Name = "Homestar",
		Texture = "http://www.roblox.com/asset/?id=1719065",
		Color = Color3.fromRGB(237, 32, 36)
	},
	
	{
		Id = 1713985,
		Name = "King Dedee",
		Texture = "http://www.roblox.com/asset/?id=1713984",
		Color = Color3.fromRGB(252, 254, 139)
	},
	
	{
		Id = 1599089,
		Name = "Verified Shirt",
		Texture = "http://www.roblox.com/asset/?id=1599088",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607439,
		Name = "Football 6",
		Texture = "http://www.roblox.com/asset/?id=1607438",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1521989,
		Name = "Shadow Military Lvl 1",
		Texture = "http://www.roblox.com/asset/?id=1521988",
		Color = Color3.fromRGB(128, 128, 0)
	},
	
	{
		Id = 1689534,
		Name = "God of Heights",
		Texture = "http://www.roblox.com/asset/?id=1689533",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1643723,
		Name = "It's Transparent",
		Texture = "http://www.roblox.com/asset/?id=1643722",
		Color = Color3.fromRGB(255, 188, 53)
	},
	
	{
		Id = 1648783,
		Name = "Drone in Disguise",
		Texture = "http://www.roblox.com/asset/?id=1648782",
		Color = Color3.fromRGB(16, 17, 17)
	},
	
	{
		Id = 1649596,
		Name = "Who Ever Bot This Shirt",
		Texture = "http://www.roblox.com/asset/?id=1649595",
		Color = Color3.fromRGB(10, 17, 71)
	},
	
	{
		Id = 1639368,
		Name = "Cyber Suit 29",
		Texture = "http://www.roblox.com/asset/?id=1639367",
		Color = Color3.fromRGB(199, 183, 198)
	},
	
	{
		Id = 1758540,
		Name = "D",
		Texture = "http://www.roblox.com/asset/?id=1758539",
		Color = Color3.fromRGB(237, 32, 36)
	},
	
	{
		Id = 1635952,
		Name = "Teapot Drone",
		Texture = "http://www.roblox.com/asset/?id=1635951",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1700545,
		Name = "Knight Armor",
		Texture = "http://www.roblox.com/asset/?id=1700544",
		Color = Color3.fromRGB(107, 107, 100)
	},
	
	{
		Id = 1728370,
		Name = "\"Feeear Me\"",
		Texture = "http://www.roblox.com/asset/?id=1728369",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1636932,
		Name = "Guitar",
		Texture = "http://www.roblox.com/asset/?id=1636931",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1603736,
		Name = "Stone Admin Badge",
		Texture = "http://www.roblox.com/asset/?id=1603735",
		Color = Color3.fromRGB(128, 128, 128)
	},
	
	{
		Id = 1639438,
		Name = "Cyber Suit 18",
		Texture = "http://www.roblox.com/asset/?id=1639437",
		Color = Color3.fromRGB(37, 50, 73)
	},
	
	{
		Id = 1592931,
		Name = "Red Biggerhead Drone Shirt",
		Texture = "http://www.roblox.com/asset/?id=1592930",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1635884,
		Name = "Yellow Biggerhead Drone Shirt",
		Texture = "http://www.roblox.com/asset/?id=1635883",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1737189,
		Name = "Drone (My Version)",
		Texture = "http://www.roblox.com/asset/?id=1737188",
		Color = Color3.fromRGB(180, 180, 180)
	},
	
	{
		Id = 1639414,
		Name = "Drone (My Version)",
		Texture = "http://www.roblox.com/asset/?id=1639413",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607321,
		Name = "Football 3",
		Texture = "http://www.roblox.com/asset/?id=1607320",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607325,
		Name = "Football 4",
		Texture = "http://www.roblox.com/asset/?id=1607324",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1728031,
		Name = "BIONICLE",
		Texture = "http://www.roblox.com/asset/?id=1728030",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607344,
		Name = "Football 8",
		Texture = "http://www.roblox.com/asset/?id=1607343",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1607353,
		Name = "Football 11",
		Texture = "http://www.roblox.com/asset/?id=1607352",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1576264,
		Name = "Stick Battle!!!",
		Texture = "http://www.roblox.com/asset/?id=1576263",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1753596,
		Name = "Cowboy Neck Hat",
		Texture = "http://www.roblox.com/asset/?id=1753595",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1612113,
		Name = "Void Star Drone",
		Texture = "http://www.roblox.com/asset/?id=1612112",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1608965,
		Name = "Teapot Drone",
		Texture = "http://www.roblox.com/asset/?id=1608964",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1689597,
		Name = "U Have Been Targeted",
		Texture = "http://www.roblox.com/asset/?id=1689596",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1475509,
		Name = "FBI",
		Texture = "http://www.roblox.com/asset/?id=1475508",
		Color = Color3.fromRGB(0,0,0)
	},
	
	{
		Id = 1566344,
		Name = "Buy BC 6 Months",
		Texture = "http://www.roblox.com/asset/?id=1566343",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1425245,
		Name = "Builder's Club Shirt",
		Texture = "http://www.roblox.com/asset/?id=1425244",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1737826,
		Name = "PWNIED!",
		Texture = "http://www.roblox.com/asset/?id=1737825",
		Color = Color3.fromRGB(0,0,0)
	},

	{
		Id = 1679189,
		Name = "Spring Blox Party! (Tranparent)",
		Texture = "http://www.roblox.com/asset/?id=1679188",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1491622,
		Name = "Shield",
		Texture = "http://www.roblox.com/asset/?id=1491621",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1608932,
		Name = "Teakettle Drone",
		Texture = "http://www.roblox.com/asset/?id=1608931",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1633121,
		Name = "Smart Bomb",
		Texture = "http://www.roblox.com/asset/?id=1633120",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1639408,
		Name = "Cyber Suit 23",
		Texture = "http://www.roblox.com/asset/?id=1639407",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1735992,
		Name = "Atomic's Loss",
		Texture = "http://www.roblox.com/asset/?id=1735991",
		Color = Color3.fromRGB(10, 0, 81)
	},
	
	{
		Id = 1746232,
		Name = "COMIC STRIP",
		Texture = "http://www.roblox.com/asset/?id=1746231",
		Color = Color3.fromRGB(251, 255, 0)
	},
	
	{
		Id = 1639373,
		Name = "Cyber Suit 28",
		Texture = "http://www.roblox.com/asset/?id=1639372",
		Color = Color3.fromRGB(121, 254, 226)
	},
	
	{
		Id = 1600565,
		Name = "Football Uniform",
		Texture = "http://www.roblox.com/asset/?id=1600564",
		Color = Color3.fromRGB(192, 192, 192)
	},
	
	{
		Id = 1641890,
		Name = "Smudged Army Torso of Protection",
		Texture = "http://www.roblox.com/asset/?id=1641889",
		Color = Color3.fromRGB(251, 34, 0)
	},
	
	{
		Id = 1649892,
		Name = "Blox Scout Uniform",
		Texture = "http://www.roblox.com/asset/?id=1649891",
		Color = Color3.fromRGB(252, 255, 127)
	},
	
	{
		Id = 1677244,
		Name = "Spring Block Party Sandy Version",
		Texture = "http://www.roblox.com/asset/?id=1677243",
		Color = Color3.fromRGB(246, 204, 131)
	},
	
	{
		Id = 1802285,
		Name = "Quiggles The Great's Shirt",
		Texture = "http://www.roblox.com/asset/?id=1802284",
		Color = Color3.fromRGB(127, 106, 0)
	},
	
	{
		Id = 1643470,
		Name = "Linear Design",
		Texture = "http://www.roblox.com/asset/?id=1643469",
		Color = Color3.fromRGB(107, 43, 225)
	},
	
	{
		Id = 1740013,
		Name = "I'm HUGE in Japan",
		Texture = "http://www.roblox.com/asset/?id=1740012",
		Color = Color3.fromRGB(71, 38, 28)
	},
	
	{
		Id = 1643522,
		Name = "I'm as Good as You Are!",
		Texture = "http://www.roblox.com/asset/?id=1643521",
		Color = Color3.fromRGB(251, 34, 0)
	},
	
	{
		Id = 1706146,
		Name = "School's Out (Party!)",
		Texture = "http://www.roblox.com/asset/?id=1706145",
		Color = Color3.fromRGB(251, 34, 0)
	},
	
	{
		Id = 1639671,
		Name = "Cyber Suit",
		Texture = "http://www.roblox.com/asset/?id=1639670",
		Color = Color3.fromRGB(56, 253, 254)
	},
	
	{
		Id = 1733590,
		Name = "Zora Link",
		Texture = "http://www.roblox.com/asset/?id=1733589",
		Color = Color3.fromRGB(127, 254, 254)
	},
	
	{
		Id = 1590319,
		Name = "Johnson 48",
		Texture = "http://www.roblox.com/asset/?id=1590318",
		Color = Color3.fromRGB(22, 1, 128)
	},
	
	{
		Id = 1590319,
		Name = "WINCORP WORLD Employee",
		Texture = "http://www.roblox.com/asset/?id=1590318",
		Color = Color3.fromRGB(77, 110, 243)
	},
	
	{
		Id = 1634247,
		Name = "Mr. Game and Watch",
		Texture = "http://www.roblox.com/asset/?id=1634246",
		Color = Color3.fromRGB(28, 95, 153)
	},
	
	{
		Id = 1639382,
		Name = "Cyber Suit ???",
		Texture = "http://www.roblox.com/asset/?id=1639381",
		Color = Color3.fromRGB(244, 204, 145)
	},
	
	{
		Id = 1559058,
		Name = "Stationary Drone of Boring",
		Texture = "http://www.roblox.com/asset/?id=1559057",
		Color = Color3.fromRGB(84, 108, 142)
	},
	
	{
		Id = 1573738,
		Name = "Cake.",
		Texture = "http://www.roblox.com/asset/?id=1573737",
		Color = Color3.fromRGB(255,255,255)
	},
	
	{
		Id = 1648160,
		Name = "Ninja",
		Texture = "http://www.roblox.com/asset/?id=1648159",
		Color = Color3.fromRGB(0,0,0)
	},
	
	{
		Id = 1736633,
		Name = "Game Pad",
		Texture = "http://www.roblox.com/asset/?id=1736632",
		Color = Color3.fromRGB(0,0,0)
	},
	
	{
		Id = 1407195,
		Name = "Dragon Shirt",
		Texture = "http://www.roblox.com/asset/?id=1407194",
		Color = Color3.fromRGB(23, 73, 133)
	},
	
	{
		Id = 1634995,
		Name = "The Cold Shirt of Lonleyness",
		Texture = "http://www.roblox.com/asset/?id=1634994",
		Color = Color3.fromRGB(154, 217, 234)
	},
	
	{
		Id = 1635000,
		Name = "The Warm Shirt of Happyness",
		Texture = "http://www.roblox.com/asset/?id=1634999",
		Color = Color3.fromRGB(245, 228, 156)
	},
	
	{
		Id = 1562148,
		Name = "Surfs Up",
		Texture = "http://www.roblox.com/asset/?id=1562147",
		Color = Color3.fromRGB(128, 128, 128)
	},
	
	
	
}

return FreeTShirtData


Streaming Enabled Compatibility for TheNexusAvenger's Projectile Buffer

When I first tried out TheNexusAvenger’s classic weapons, I had assumed they were broken. I narrowed down the problem and found out it was only that the client projectile buffer wasn’t streaming enabled compatible.

The fix is a one liner (almost). The only change needed is to swap the Folder used the in CreateBuffer module with a Model then set the Model.ModelStreamingMode to Enum.ModelStreamingMode.Persistent (perhaps PersistentPerPlayer functionality could be a future improvement).

Here is the SE compatible CreateBuffer module:

--TheNexusAvenger
--SE compatibility added by @BendsSpace
--Provides a client buffer for launching projectiles.
--This uses an exploit of network ownership where clients can change the physics
--of parts locally without needing to handle anything on the server.

local BufferCreator = {}

local Tool = script.Parent.Parent



--Creates a buffer class.
local function CreateBuffer(Folder)
	local Buffer = {}
	
	--Removes an item from the buffer.
	function Buffer:PopItem()
		local NextItem = Folder:GetChildren()[1]
		
		if NextItem then
			--Remove the position lock.
			local BufferPositionLock = NextItem:FindFirstChild("BufferPositionLock",true)
			if BufferPositionLock then
				BufferPositionLock:Destroy()
			end
			
			--Reparent it to Workspace.
			NextItem.Parent = game.Workspace
			
			--Return the item.
			return NextItem
		end
	end
	
	--Return the buffer class.
	return Buffer
end



--Creates a server-side buffer. Inherits the base buffer class.
function BufferCreator:CreateServerBuffer(BufferName)
	-- Folder switched to persistent Model for SE compatibility
	local BufferFolder = Instance.new("Model")
	BufferFolder.ModelStreamingMode = Enum.ModelStreamingMode.Persistent
	BufferFolder.Name = BufferName
	BufferFolder.Parent = Tool
	
	local Buffer = CreateBuffer(BufferFolder)
	local Player
	
	--Adds an item to the buffer.
	function Buffer:AddItem(NewItem)
		NewItem.Parent = BufferFolder
		
		local Part = (NewItem:IsA("BasePart") and NewItem) or NewItem:FindFirstChildWhichIsA("BasePart",true)
		if Part then
			--Add a position lock.
			local HoldPos = Vector3.new(math.random(-1000,1000),100000,math.random(-1000,1000))
			Part.CFrame = CFrame.new(HoldPos)
			local PositionLock = Instance.new("BodyPosition")
			PositionLock.Position = HoldPos
			PositionLock.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
			PositionLock.Name = "BufferPositionLock"
			PositionLock.Parent = Part
			
			--Set the network ownership to the client so it can control physics.
			if Part:IsDescendantOf(game.Workspace) and not Part.Anchored and Player then
				Part:SetNetworkOwner(Player)
			end
		end
	end
	
	--Sets the network ownership of the buffer.
	function Buffer:SetCurrentPlayer(NewPlayer)
		Player = NewPlayer
		
		for _,Item in pairs(BufferFolder:GetChildren()) do
			local Part = (Item:IsA("BasePart") and Item) or Item:FindFirstChildWhichIsA("BasePart",true)
			
			if Part and Part:IsDescendantOf(game.Workspace) and not Part.Anchored and Player then
				Part:SetNetworkOwner(NewPlayer)
			end
		end
	end
	
	--Return the buffer class.
	return Buffer
end

--Creates a client-side buffer.
function BufferCreator:CreateClientBuffer(BufferName)
	return CreateBuffer(Tool:WaitForChild(BufferName))
end

return BufferCreator


Closing

Credits

Thanks to TheNexusAvenger for his amazing remade classic weapons. (The client projectile buffer is a genius workaround.)

Thanks to Maximum_ADHD for Realism, which is perfect for classic tools! (Realism can be seen in the demo videos and the test game.)


Everything here is under a CC BY license, which basically means you’re allowed to do whatever you want as long as you leave the attribution comments in the code.

I hope some people find this interesting! I’d love to hear any thoughts or bugs you catch.

33 Likes

This’ll be fun to mess around with my friends with, thank you

3 Likes

Ahaha, this is actually hilarious, will use!

3 Likes