Earlier this year we announced a suite of changes affecting JointInstance based joints; particularly to how legacy surface-based joints behave. This fixed a lot of joint-related bugs and made joint behavior more consistent. These changes were not enabled by default.
Coming soon we’ll be forcing these changes for all games.
You should opt-in today to test and update your place to support these changes to avoid any future interruptions in the next phase of our rollout!
You can enable these changes in Studio today under Workspace properties.
Changes in Explicit mode include:
Faster server startup times!
Hidden surface joints will now show up in Workspace as children of their parts.
Surface joints will be saved in the place file for consistent results.
Changes to BasePart property setter behavior. They will not break joints or create new ones.
Duplicate welds are now allowed.
Studio “Join” settings functioning as intended. “Never” works correctly in Explicit mode!
Starting January 7th all places that have made no changes or otherwise still have Workspace.AutoJointsMode set to Default will behave as if they were set to Explicit. The current default is LegacyImplicit.
We recommend testing your places with Explicit mode now and publishing with it enabled so this change happens on your timeline. Avoid any surprise game breakage when we enable this change!
During this time you can still opt-out by selecting LegacyImplicit, but this is only a temporary measure to buy you extra time to fix your game to support these changes or report new bugs to us before we force Explicit mode globally. We may postpone this if something on our end is not working as intended.
Starting February 13th at 1:22 PM PST all places will be forced to Explicit mode, even if they opted out. There will be no option to opt-out after this date.
We have just enabled this as of 10:25 AM January 7th PST.
Let us know here if you encounter any issues. You can still opt out now, but that option will go away on February 4th unless we hit some critical problems.
The Studio tools have a check if the two parts are already joined by any kind of joint. If there’s an existing one it shouldn’t make any more. Additionally when you use the move tools it should break any existing joints.
If you’re seeing something different happening it’s probably a bug. See if you can narrow it down and give us some repro steps and we’ll look into it.
I reproduced what happened on my game, and figured out that Studio doesn’t delete Welds referring to BaseParts just deleted. In addition, it doesn’t delete welds when moving the part around when one of said weld’s parts are set to a deleted part or nil.
To reproduce:
Open a new Baseplate place in studio.
Ensure that Workspace’s AutoJointsMode is set to Explicit.
Insert 3 parts using the Insert Part ribbon button on the Home tab. (Might help to give the new parts unique names.)
Use the Surface tool on the Model tab to add a weld surface to one of the sides of the 3rd part.
Arrange all 3 parts so that the 3rd’s weld surface touches both the 1st and 2nd parts, resizing them as needed and moving the third part to touch the rest last.
Open the Explorer window and open the foldouts on all the parts in Workspace so you can see what’s going on with welds. The 3rd part should have 2 Welds inside it at this point.
Delete either the 1st or 2nd part using the Delete key (or whatever works for you).
Move the 2 remaining parts around like crazy using Move, Scale, Rotate, or simply dragging it around. Though one weld will disappear or so, the weld with the missing part isn’t going anywhere.
The pesky 2nd part that isn’t there anymore remains referenced by the pesky weld…
What happened to me on my game was I copied that ladder from a much longer ladder and deleted a lot of the rungs, then I scaled down the posts to a shorter length. Studio didn’t automatically remove the welds on the posts referring to said rungs as I deleted them.
Good find. We’ll have to think about what makes the most sense here, but it seems like a good idea to replicate the old behavior and remove any implicit joints when deleting a selection of parts. Might make sense to additionally remove WeldConstraints in that situation too…
For now though, I’m guessing a developer using explicit mode would have to recompile their welds by deleting everything named Weld and is a Weld, and then run workspace:MakeJoints() to recreate them to avoid having a bunch of useless joints cluttering up RAM.
You could also use a script to prune all welds under Workspace if they don’t have two parts that are parented to the DataModel. That’s probably easier. Something like this:
for i,v in pairs(Workspace:GetDescendants()) do
if v:IsA("JointInstance") and not (v.Part0 and v.Part1 and v.Part0:FindFirstAncestorOfClass("DataModel") and v.Part1:FindFirstAncestorOfClass("DataModel")) then
v.Parent = nil
end
end