Skip to main content

Overview

The /skin command allows you to change your character’s skin code, which determines your visual appearance in the game. You can specify skin codes in decimal or hexadecimal format.

Syntax

/skin [hex] <code>
hex
keyword
Optional keyword indicating the code is in hexadecimal format. If omitted, the code is treated as decimal.
code
number
required
The skin code to apply. Can be decimal (e.g., 123456) or hexadecimal (e.g., 1E240) when preceded by hex.

Usage Examples

Decimal Skin Code

Set skin using a decimal code:
/skin 12345
Output:
Skin changed to 12345

Hexadecimal Skin Code

Set skin using a hexadecimal code (prefix with hex):
/skin hex 1A2B3C
Output:
Skin changed to 1A2B3C
The hexadecimal value 1A2B3C is converted to decimal 1715004 internally.

Common Skin Codes

Here are some example skin codes you can try:
/skin 0          # Default skin
/skin 1          # Variation 1
/skin hex FF     # Hex code 255
/skin 123456     # Custom skin code

Validation and Errors

Missing Skin Code

If you don’t provide a skin code:
/skin
Output:
Usage: /skin [hex] <code>

Invalid Skin Code

If the code contains invalid characters:
/skin abc
Output:
Oops: Invalid skin code: abc

Invalid Hexadecimal Code

If you use hex but provide an invalid hex value:
/skin hex XYZ
Output:
Oops: Invalid skin code: XYZ

How It Works

Decimal vs Hexadecimal

The command automatically detects the format:
  1. Check for hex keyword: If the first argument is “hex” (case-insensitive)
  2. Validate hex digits: If hex mode, ensures all characters are valid hexadecimal (0-9, A-F)
  3. Parse number: Converts the string to uint32_t using the appropriate base (10 or 16)
  4. Send packet: Broadcasts the skin change to all players

Skin Change Packet

The command sends an OnChangeSkin packet:
packet::game::OnChangeSkin pkt{};
pkt.net_id = world::World::instance().get_local_net_id();
pkt.skin_code = skin_code;
packet::PacketHelper::write(pkt, ctx.server);
This packet is broadcast to all players in the world, updating your visual appearance.

Implementation Details

Source Reference

Implementation: /home/daytona/workspace/source/src/command/commands/skin_command.hpp:14

Parsing Logic

The command uses sophisticated parsing:
// Convert argument to lowercase for comparison
std::string lowercase{ ctx.args[0] };
std::ranges::transform(lowercase, lowercase.begin(), ::tolower);

// Check if hex mode is enabled
bool is_hex_code = false;
if (lowercase == "hex" && ctx.args.size() > 1) {
    is_hex_code = std::ranges::all_of(ctx.args[1], ::isxdigit);
}

// Parse using std::from_chars with appropriate base
uint32_t skin_code{};
std::from_chars(
    is_hex_code ? ctx.args[1].data() : ctx.args[0].data(),
    is_hex_code ? ctx.args[1].data() + ctx.args[1].size() : ctx.args[0].data() + ctx.args[0].size(),
    skin_code,
    is_hex_code ? 16 : 10
);

Data Type

Skin codes are stored as uint32_t (unsigned 32-bit integer), supporting values from 0 to 4,294,967,295.

Finding Skin Codes

Common Methods

Observation

Note the skin codes of other players you encounter

Experimentation

Try different codes to discover appearances

Documentation

Check community resources for known skin codes

Hex Conversion

Convert between decimal and hex to explore ranges

Hex Conversion Example

Convert decimal to hex using any calculator or programming tool:
# Python example
decimal_code = 123456
hex_code = hex(decimal_code)  # '0x1e240'

# Use in GTProxy:
/skin hex 1e240

Persistence

Session-Based

Your skin change is not persistent across:
  • Disconnects and reconnects
  • World changes (unless you set it again)
  • Proxy restarts

Auto-Apply on Join

To automatically set your skin when joining a world:
local PREFERRED_SKIN = 123456

Events.subscribe("OnSpawn", function(packet)
    if packet.net_id == World.get_local_net_id() then
        Scheduler.schedule_delayed(function()
            Commands.execute("skin " .. PREFERRED_SKIN)
        end, 1000)
    end
end)
Save this as a .lua file in the scripts/ directory.

Use Cases

Customization

Personalize your character’s appearance

Disguise

Change your appearance for anonymity

Testing

Test different visual styles during development

Fun

Experiment with unique and rare appearances

Limitations

Important notes:
  • Invalid skin codes may cause visual glitches
  • Some skin codes may be restricted by the server
  • Not all skin codes have unique appearances
  • The server may reject certain skin changes
  • Anti-cheat systems may flag unusual skin codes

Range and Values

Valid Range

  • Minimum: 0 (default skin)
  • Maximum: 4,294,967,295 (0xFFFFFFFF in hex)

Practical Range

While technically you can use any value in the valid range, most meaningful skin codes are typically in a much smaller range. Experimentation is key to finding interesting appearances.

/nick

Change your display name

World API

Access player data from Lua