[DEPRECATED] Character+ - Free, advanced, open-sourced character functions

UPDATE: 19 OCTOBER 2021, DON’T USE THIS MODULE

See this post, this module won’t be maintained or updated anymore as Roblox has existing functions that do this:

Questions you may have:

Why Character+?

Character+ is a completely free, open-sourced module which contains functions which aren’t easily accessible for new developers/developers who want an easy solution.

Can I use this at server runtime?

Yes! This module was made specifically for runtime use.

Why is Character+ a better alternative than :ApplyDescription() or :GetHumanoidDescriptionFromUserId()?

Character+ uses InsertService which means models are up-to-date all the time. Another benefit is that accessories are always properly positioned, which is a huge issue for some developers. Also, as I said before, it’s a great alternative for builders.

What environments can run Character+?

Unfortunately this module heavily relies on InsertService which is only accessible from the server.

I’ve found a bug, or I have a suggestion! Who do I contact?

You can contact me on Twitter, or send me a message on Roblox. You can also just reply to this thread and I’ll do my best to reply!

Documentation

Functions

Enum.HumanoidRigType characterPLUS:GetRigType(rig: Model | Humanoid)

Requires a rig or a humanoid, returns the RigType Enum

Model characterPLUS:CreateBlankRig(rigType: Enum.HumanoidRigType | string)

Requires a string, either ‘R6’ or ‘R15’ or a HumanoidRigType Enum.

Model characterPLUS:BuildRigFromUserID(userId: number, rigType: Enum.HumanoidRigType? | string?)

Requires a player’s UserId and the RigType, defaults to R6 if not provided.

void characterPLUS:BuildRigFromHumanoidDescription(humanoidDescription: HumanoidDescription, rigType: Enum.HumanoidRigType? | string?)

Requires a HumanoidDescription and a string, either being ‘R6’ or ‘R15’, or a HumanoidRigType enum

void characterPLUS:UpdateRigAppearanceFromUserId(userId: number, rig: Model)

Updates the specified rig with your options.

void CharacterPLUS:UpdateRigAppearanceFromHumanoidDescription(self, humanoidDescription: HumanoidDescription, rig: Model)

Updates your specified rig with your options.

void characterPLUS:ClearAppearance(rig: Model)

Clears the rig’s appearance.

void characterPLUS:ClearHeadType(rig)

Changes the rig’s head type to the default head and changes the rig’s face to the default face.

Internal functions (not accessible outside of the module without modification)

Instance __insert(id: number)

Returns the cached asset or attempts to insert a new asset if no cached asset is found in the cache.

void __addAsset(humanoid: Humanoid, asset: Model)

Attempts to add the asset to the rig.

Model __loadR15()

Gets the R15 rig which is used to put the character’s BodyParts back to the default BodyParts.

Properties

table characterPLUS.CachedAssets

The cached assets where the index is the asset’s ID and the value is the asset.

table characterPLUS.RigIds

The rig IDs which should be inserted for the BuildRig functions.

table characterPLUS.HumanoidDescriptionPropertiesToInsert

List of HumanoidDescription properties to be inserted and added to the cache.

table characterPLUS.BodyColours.

List of HumanoidDescription properties to be assigned to BodyColors for colouring the rig’s body parts.

table characterPLUS.ToDestroy

List of classes that should be destroyed when the character’s appearance is cleared

Get Started

Character+ is very easy to get started with.
Simply require the module, and use the functions as I’ve stated above!

You can require the Character+ module in 2 ways:

local CharacterPLUS = require(5798963943)

OR

Get the module here, and then:

local CharacterPLUS = require(path.to.module)

Now, all you have to do is call the functions as you need them.

26 Likes

I will look this ASAP, but it sounds really cool. Thanks!

1 Like

Hi! Just want to say, this module is awesome! It does have an issue however.

This does not work. It always returns with a status code of error 403 forbidden, even though I have turned on API requests in studio. I’m not really sure why.

Thanks for that, error 403 means you’re trying to access something that you don’t have access to.

Could you provide a code sample?

UPDATE 7/10/2021

After nearly a year (like 3 days less lol), I decided to completely overhaul this script, using better practices and avoiding redundant/unnecessary/repeated code. This also fixed some bugs.

Complete changelog:

  • Added cache system for assets that have already been loaded to avoid unnecessarily long wait times for assets that have been previously added to the game
  • Added pcalls
  • Added .HumanoidDescriptionPropertiesToInsert
  • Added .BodyColours
  • Added .ToDestroy
  • Added :ClearHeadType
  • Added :ClearAppearance
  • Added internal functions __loadR15, __addAsset, and __insert
  • Made most main functions (BuildRig/UpdateRigAppearance) rely on each other instead of making them standalone functions. Basically it just greatly reduces the script’s size
  • Switched from PascalCase to camelCase
  • Removed most instances of bad variable naming (eg. IS → insertService; PS → players)
  • Added typechecking
  • Removed animate argument from all functions

could be wrong about this, but isn’t this actually camelCase?

1 Like

Shoot you’re right, I meant to put switched from PascalCase, whoops. Should be updated.

1 Like

Apparently I’m an idiot, don’t use this module lol. I don’t know how I didn’t think to use :ApplyDescription but use that instead, broken joints/positioning should fix themselves since physics are simulated at runtime. Also :ApplyDescription works with rthro scaling and whatnot so it’s better.

https://developer.roblox.com/en-us/api-reference/function/Humanoid/ApplyDescription

If you want to create a new character from a humanoid description, use this:

https://developer.roblox.com/en-us/api-reference/function/Players/CreateHumanoidModelFromDescription

You can use my R6 and R15 rig models if you want though, the proper attachments should ensure properly positioned accessories every time: