Preset Manager Plugin - Bulk apply properties, attributes, tags, and collisions

I was reading @PeZsmistic’s feature request for a Preset Manager to be added to Studio, and I decided to make that into a plugin while we wait for that feature to (maybe?) get made.

This plugin ended up being a bit over 2,800 lines of code, and took me quite a while to make. It was a really fun challenge!

Special thanks to @Elttob for letting me use the wonderful Vanilla icons for this plugin!
Special thanks to @Maximum_ADHD for his wonderful API Dump!
Special thanks to @1waffle1 for their LZW text compression I used to store the serialized Presets more efficiently!

image

Get it here!


What is this plugin’s purpose?

Honestly, I don’t think I can explain it better than PeZsmistic did in the feature request, so I’ll quote that here.

Some example use cases, explained by PeZsmistic in their request:


What can it do?

Well, for this initial MVP release I did the majority of what PeZ requested:

  • The ability to create “Presets”. (A Preset is a collection of properties, attributes, tags, and a collision group)
  • The ability to apply Presets to instances in the selection.
    • Presets can be applied to any instance type. Property names that are not valid are simply ignored.
    • These presets could be applied additively or as a complete overwrite to an instance.
    • If I “add” a preset to an instance, only properties defined in the preset will be changed, missing tags and attributes will be added, and the collision group will be changed
    • If I “set” a preset on an instance, all properties will be reset to default, all tags and attributes will be deleted, and the Preset will then be added as above.
  • The ability to name Presets.
  • The ability to quickly find a preset by searching by name.
  • The ability to duplicate Presets for quicker variant creation.
  • Autofill suggestions for Properties and Collision Group.
  • Automatic datatypes for Properties from API Dump.
  • Settable datatypes for Attributes.
  • The presets are serialized and saved, so your Presets do persist between sessions.
  • Preset summary when the GUI is collapsed.
  • Export Preset as standalone module for runtime preset application.
  • Select all Instances that match the Preset.

(More features are planned, just not needed for this initial release.)

Here’s a quick demonstration of some of the features in use.


Roadmap

  • Folders and Sorting
  • Recently Used Tab
  • Create Preset from Selection
  • Supporting more property types (eg: CFrame, Axes, PhysicalProperties, Instance)

Get it here!

71 Likes

I mean…

This is epic. Its the enhanced, faster properties window of the future. This one I’m definitely installing. Thank you for creating this!

5 Likes

This is super cool and the properties suggestions are on point. Thanks for doing this!

5 Likes

@boatbomber this is genuinely awesome, great work!

I have a suggestion, could you possibly make an option to export a preset as a modulescript?

Use case:

  • Lightning presets
  • Particle Effects presets
    etc

using Presets at run time

2 Likes

What would you expect this export to be?
I’m thinking something like this, but I want to make sure it’s what you meant.

local Preset = require(Path.To.Exported.Module)

Preset:Add(Object) -- Adds that preset to the given object
2 Likes

I think that would work great or something like this could work too

— Exported Preset Module
return function(Instance)
— set preset
end
— Preset Manager (this is something devs would write on their own)
function ApplyPreset(presetName, Instance)

end
1 Like

That doesn’t work, because presets can have two functions- Add and Set, so returning a single function isn’t enough.

1 Like

Ohhhh, I see then what you suggested before would work great!

either that or we create our own preset setter / adder function but the exported module would contain Preset information so developers can fully customize the behavior they want.


@boatbomber forgot to mention.

Does this plugin have the ability to extract Properties / Tags / etc as Presets from exiting Instances?
(I read through the OP quickly but didn’t seem to find anything on that)

1 Like

Not yet, no. That’s definitely something I’d like to add in the future. I’ll add my roadmap to OP shortly.
Edit: Added roadmap

1 Like

Update: Preset Export

Suggested by @RuizuKun_Dev

There is now a new Preset action button: Export.
This button creates a ModuleScript that can be used to Add/Set the Preset at runtime, in-game!

You require the module, and then you can use :Add(Instance) or :Set(Instance) just like the plugin’s primary buttons.

local Preset = require(script.Preset) -- Require the exported module
Preset:Add(workspace.Part) -- Apply the preset to a part

Note that this module will not update if you alter your Preset- you’ll need to export the new version.

2 Likes

Update: Select Objects

Suggested by @PeZsmistic in the original request as a “nice to have”

Another new Preset action button! This selection button will automatically select all Instances in the workspace that match the Preset exactly- object must have all the properties, attributes, tags, and (if a basepart) collision group.

It’s pretty expensive to check against every object in the workspace, so use this sparingly.

3 Likes

Needed something just like this. Really amazing plugin. Cuts down time and annoyance with common attributes that are used. Highly recommended.

2 Likes

Would you consider allowing setting/adding for services? My use case is I want to modify Lighting settings so I can jot them down in a script and then reset them when I am done.

1 Like

Can presets be tweened? That would be extremely useful.

Been having an issue where every time I apply a preset, it sets the part’s position to the Origin, even though there is not Position property set for the part.

Use add, not set. That’s the documented behavior.
Set makes all non preset properties into the default, setting only the preset.

2 Likes

That’s completely my bad, for some reason I was mistaking the “Add” button as for creating a new preset;
much appreciated.

I was literally about to create my own tool for this; thanks God I saw this post, gonna try it out. Thanks for the contribution mate :smiley: