Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Client/App/App.vcproj
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,10 @@
RelativePath=".\include\v8datamodel\Camera.h"
>
</File>
<File
RelativePath=".\include\v8datamodel\CharacterAppearance.h"
>
</File>
<File
RelativePath=".\include\v8datamodel\DebugSettings.h"
>
Expand Down Expand Up @@ -1354,6 +1358,10 @@
RelativePath=".\v8datamodel\Camera.cpp"
>
</File>
<File
RelativePath=".\v8datamodel\CharacterAppearance.cpp"
>
</File>
<File
RelativePath=".\v8datamodel\Decal.cpp"
>
Expand Down
129 changes: 129 additions & 0 deletions Client/App/include/v8datamodel/CharacterAppearance.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#include "humanoid/Humanoid.h"
#include "util/TextureId.h"
#include "v8datamodel/BrickColor.h"
#include "Network/Players.h"

namespace RBX
{
class CharacterAppearance : public Instance
{
private:
virtual void apply(Humanoid* humanoid) = 0;
public:
void apply();
protected:
virtual void onAncestorChanged(const AncestorChanged& event);
virtual bool askSetParent(const Instance* instance) const;
};

extern const char* sBodyColors;
class BodyColors : public DescribedCreatable<BodyColors, CharacterAppearance, &sBodyColors>
{
private:
BrickColor headColor;
BrickColor leftArmColor;
BrickColor rightArmColor;
BrickColor torsoColor;
BrickColor leftLegColor;
BrickColor rightLegColor;

public:
static Reflection::BoundProp<BrickColor, 1> prop_HeadColor;
static Reflection::BoundProp<BrickColor, 1> prop_LeftArmColor;
static Reflection::BoundProp<BrickColor, 1> prop_RightArmColor;
static Reflection::BoundProp<BrickColor, 1> prop_TorsoColor;
static Reflection::BoundProp<BrickColor, 1> prop_LeftLegColor;
static Reflection::BoundProp<BrickColor, 1> prop_RightLegColor;

public:
BodyColors();
private:
virtual void apply(Humanoid* humanoid);

void dataChanged(const Reflection::PropertyDescriptor& __formal)
{
if (Network::Players::backendProcessing(this, false))
{
Humanoid* humanoid = Humanoid::modelIsCharacter(getParent());
if (humanoid)
apply(humanoid);
}
}
};

extern const char* sShirtGraphic;
class ShirtGraphic : public DescribedCreatable<ShirtGraphic, CharacterAppearance, &sShirtGraphic>
{
private:
TextureId graphic;
public:
static Reflection::BoundProp<TextureId, 1> prop_Graphic;

public:
ShirtGraphic();
protected:
virtual void apply(Humanoid* humanoid);
private:
void dataChanged(const Reflection::PropertyDescriptor& __formal)
{
if (Network::Players::backendProcessing(this, false))
{
Humanoid* humanoid = Humanoid::modelIsCharacter(getParent());
if (humanoid)
apply(humanoid);
}
}
};

extern const char* sShirt;
class Shirt : public DescribedCreatable<Shirt, ShirtGraphic, &sShirt>
{
private:
BrickColor leftSleeveColor;
BrickColor rightSleeveColor;
BrickColor torsoColor;
public:
static Reflection::BoundProp<BrickColor, 1> prop_leftSleeveColor;
static Reflection::BoundProp<BrickColor, 1> prop_rightSleeveColor;
static Reflection::BoundProp<BrickColor, 1> prop_torsoColor;

public:
Shirt();
private:
virtual void apply(Humanoid* humanoid);

void dataChanged(const Reflection::PropertyDescriptor& __formal)
{
if (Network::Players::backendProcessing(this, false))
{
Humanoid* humanoid = Humanoid::modelIsCharacter(getParent());
if (humanoid)
apply(humanoid);
}
}
};

extern const char* sSkin;
class Skin : public DescribedCreatable<Skin, CharacterAppearance, &sSkin>
{
private:
BrickColor skinColor;
public:
static Reflection::BoundProp<BrickColor, 1> prop_skinColor;

public:
Skin();
private:
virtual void apply(Humanoid* humanoid);

void dataChanged(const Reflection::PropertyDescriptor& __formal)
{
if (Network::Players::backendProcessing(this, false))
{
Humanoid* humanoid = Humanoid::modelIsCharacter(getParent());
if (humanoid)
apply(humanoid);
}
}
};
}
148 changes: 148 additions & 0 deletions Client/App/v8datamodel/CharacterAppearance.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
#include "v8datamodel/CharacterAppearance.h"
#include "v8datamodel/PartInstance.h"
#include "v8datamodel/Decal.h"

namespace RBX
{
void CharacterAppearance::onAncestorChanged(const AncestorChanged& event)
{
if (event.child == this && Network::Players::backendProcessing(this, false))
{
Humanoid* humanoid = Humanoid::modelIsCharacter(getParent());
if (humanoid)
apply(humanoid);
}
}

bool CharacterAppearance::askSetParent(const Instance* instance) const
{
return fastDynamicCast<const ModelInstance>(instance) != NULL;
}

ShirtGraphic::ShirtGraphic()
{
setName("Shirt Graphic");
}

void ShirtGraphic::apply(Humanoid* humanoid)
{
PartInstance* torso = humanoid->getTorso();
if (torso)
{
Decal* decal = torso->findFirstChildOfType<Decal>();
if (decal)
decal->setTexture(graphic);
}
}

Shirt::Shirt()
: leftSleeveColor(BrickColor::lego_23),
rightSleeveColor(BrickColor::lego_23),
torsoColor(BrickColor::lego_1)
{
setName("Shirt");
}

void Shirt::apply(Humanoid* humanoid)
{
ShirtGraphic::apply(humanoid);

PartInstance* torso = humanoid->getTorso();
if (torso)
torso->setColor(torsoColor);

PartInstance* leftArm = humanoid->getLeftArm();
if (leftArm)
leftArm->setColor(leftSleeveColor);

PartInstance* rightArm = humanoid->getRightArm();
if (rightArm)
rightArm->setColor(rightSleeveColor);
}

Skin::Skin()
: skinColor(BrickColor::lego_226)
{
setName("Skin");
}

void Skin::apply(Humanoid* humanoid)
{
bool hasShirt = getParent()->findFirstChildOfType<Shirt>() != NULL;

PartInstance* head = humanoid->getHead();
if (head)
head->setColor(skinColor);

PartInstance* leftLeg = humanoid->getLeftLeg();
if (leftLeg)
leftLeg->setColor(skinColor);

PartInstance* rightLeg = humanoid->getRightLeg();
if (rightLeg)
rightLeg->setColor(skinColor);

if (!hasShirt)
{
PartInstance* torso = humanoid->getTorso();
if (torso)
torso->setColor(skinColor);

PartInstance* leftArm = humanoid->getLeftArm();
if (leftArm)
leftArm->setColor(skinColor);

PartInstance* rightArm = humanoid->getRightArm();
if (rightArm)
rightArm->setColor(skinColor);
}
}

BodyColors::BodyColors()
: headColor(BrickColor::lego_226),
leftArmColor(BrickColor::lego_226),
rightArmColor(BrickColor::lego_226),
torsoColor(BrickColor::lego_28),
leftLegColor(BrickColor::lego_23),
rightLegColor(BrickColor::lego_23)
{
setName("Body Colors");
}

void BodyColors::apply(Humanoid* humanoid)
{
Skin* skin = getParent()->findFirstChildOfType<Skin>();

if (!skin)
{
bool hasShirt = getParent()->findFirstChildOfType<Shirt>() != NULL;

PartInstance* head = humanoid->getHead();
if (head)
head->setColor(headColor);

PartInstance* leftLeg = humanoid->getLeftLeg();
if (leftLeg)
leftLeg->setColor(leftLegColor);

PartInstance* rightLeg = humanoid->getRightLeg();
if (rightLeg)
rightLeg->setColor(rightLegColor);

if (!hasShirt)
{
PartInstance* torso = humanoid->getTorso();
if (torso)
torso->setColor(torsoColor);

PartInstance* leftArm = humanoid->getLeftArm();
if (leftArm)
leftArm->setColor(leftArmColor);

PartInstance* rightArm = humanoid->getRightArm();
if (rightArm)
rightArm->setColor(rightArmColor);
}
}
}
}