Release Notes for 564

Notes for Release 564

32 Likes

Can you guys not deprecate BreakJoints, there’s no suitable alternative to it (breaking all constraints or legacy joins)

23 Likes

Fixed an issue that prevented dragging dynamic thumbstick over GuiButtons
download.jpeg-1

Legends!

Also, what is this
Added the property RTLTextsupport in StarterGui to enable or disable the support for right-to-left or bidirectional text. By default, the property is disabled.

6 Likes

Did someone mess with the function thingy called “IsA”? It was broken in all my games for models. If you type IsA(“Model”) over some things it returns true even though it isn’t a model.

2 Likes

Yes, tools were changed recently to inherit models. You should just check the class name instead.

1 Like

Expected behavior change for Tools:

If you’re seeing incorrect behavior for other Instance types please let us know.

Arabic and some other written languages are actually written from right-to-left rather than left-to-right like English text is. Properly localizing your game to these languages with no help from the engine is quite an undertaking. Most UI systems, soon to include Roblox, offer some affordances to make localizing to these languages less of a pain.

5 Likes

ListObjectsAsync has a new optional parameter called “excludeDeleted” which if enabled, will hide any deleted objects from being returned.

It appears a slight error was made here, went searching for a bit and found that this was referring to the ListKeysAsync function of ‘DataStore’, ListObjectsAsync is not a valid API member

4 Likes

UnionAsync, NegateAsync, but what is this?
Screenshot_20230224_075249

1 Like

probably something like this
image
(kept geometry is blue)

6 Likes

@JoolCaat is right. You can see it in action in an example by @Maximum_ADHD https://twitter.com/MaximumADHD/status/1626002378162860032

8 Likes

@JoolCaat

That is really interesting! Honestly just mentioning “inversed negation” would’ve made me understand but seeing it implemented is awesome. What’s the keybind for it?

2 Likes

…?

for i, v in pairs(Character:GetDescendants()) do 
      if v:IsA("Weld") then -- and other classes
            v:Destroy()
      end
end
2 Likes

Um, actually :nerd_face:

for _, Object in Character:GetDescendants() do
    if Object:IsA("Weld") then
        Object:Destroy()
    end
end

Generalized iteration exists :nerd_face:

2 Likes

Actually…

for _, Object in Character:GetDescendants() do
    if Object:IsA("JointInstance") then
        Object:Destroy()
    end
end

So you dont have to add each individual class

9 Likes

(cc @Judgy_Oreo @Vundeq)

Do I have to explain why BreakJoints is obviously faster than iterating over possibly hundreds of instances.

5 Likes

Behind the curtain the code is going to be the same, its only slightly more convenient than writing a module for your projects that can contain custom functions for your own desired use cases (which you should be doing), some API is bloat, and some is helpful, whether or not breakjoints is bloat is the discussion we should be having here, not whether or not it is more performant.

2 Likes

Fun fact, the code linked here is actually substantially different than what BreakJoints does. Did you know that if you put your parts under a Folder (or any other non-Model non-Part Instance) within the model you’re calling it on, they won’t have their joints broken by BreakJoints!

BreakJoints as a very old function which was implemented in the initial engine API so it has some pretty old janky behavior.

14 Likes

What if the joint is parented to another part? e.g if Part1 has a weld that connects to Part2, and breakJoints is called on Part2, looping through the descendants of Part2 wouldn’t work to destroy them.

2 Likes

This is the code that’s required to replicate exactly what BreakJoints does (which probably isn’t what you want because it doesn’t handle parts under other parts, or folders, etc. But if you do want an exact replacement that’s what it would be):

local function breakJoints(root)
    if root:IsA("Model") then
        for _, child in root:GetChildren() do
            breakJoints(child)
        end
    elseif root:IsA("BasePart") then
        for _, joint in root:GetJoints() do
            if joint:IsA("JointInstance") or joint:IsA("WeldConstraint") then
                joint:Destroy()
            end
        end
    end
end
14 Likes

I still think it would be useful to have one of two things to replace this

A filtered GetChildren/GetDescendants
OR A more modern replacement to BreakJoints

2 Likes