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!
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:
When players get hit by T-shirts, they also get a prompt to get the free T-shirt:
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.