c0balt60/promise_character

Promises a character tree

promise-character

Usage:

Pass a Player's Character Model into promiseR15 or promiseR6, which will promise via promiseTree from validate-tree that all the members defined in the R6/R15 trees exist (all members except those generated by Sound/Animate scripts).

promiseR15(character)
    :andThen(function(char)
        -- All members are properly typed and defined!
        char.Head.face.Texture = ""
    end)

-- alternatively, you can use await
task.spawn(function()
    local char = promiseR15(character):await()
    char.Head.face.Texture = ""
end)

Here is what I envision as a practical use for this library:

local Players = game:GetService("Players")
local promiseCharacter = require(...)
local promiseChild = require(...)

local function doStuffWithR15(rig: promiseCharacter.CharacterRigR15)
    rig.RightFoot:Destroy()
end

local function doStuffWithR6(rig: promiseCharacter.CharacterRigR6)
    rig["Left Arm"]:Destroy()
end

local function handleCharacterModel(model: Model)
    local rigType = promiseChild.promiseChildOfClass(model, "Humanoid"):await().RigType.Name

    if rigType == "R15" then
        local rig15 = promiseCharacter.promiseR15(model)
        rig15.Head.Neck:Destroy() -- R15 specific logic
        doStuffWithR15(rig15)
    elseif rigType == "R6" then
        local rig6 = promiseCharacter.promiseR6(model)
        rig6.Torso:Destroy() -- R6 specific logic
        doStuffWithR6(rig6)
    else
        error(`{model.Name} has an unknown rig type! {rigType}`)
    end
end

Players.PlayerAdded:Connect(function(player)
    print("Player joined: ", player.Name)
    if player.Character then
        handleCharacterModel(player.Character)
    end
    player.CharacterAdded:Connect(handleCharacterModel)
end)