diff --git a/Sources/Plasma/FeatureLib/pfPython/cyAvatar.cpp b/Sources/Plasma/FeatureLib/pfPython/cyAvatar.cpp index cd5d123e..a5f5f31c 100644 --- a/Sources/Plasma/FeatureLib/pfPython/cyAvatar.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/cyAvatar.cpp @@ -1600,6 +1600,60 @@ void cyAvatar::PlaySimpleAnimation(const char* animName) } } +///////////////////////////////////////////////////////////////////////////// +// +// Function : SaveClothingToFile +// PARAMETERS : filename - file to save to +// +// PURPOSE : Save the avatar's clothing to a file. If only a filename is +// given, it will write to UserData/Avatars. +// +bool cyAvatar::SaveClothingToFile(plFileName filename) +{ + if (fRecvr.Count() > 0) { + plArmatureMod* avatar = plAvatarMgr::FindAvatar(fRecvr[0]); + if (avatar) { + plClothingOutfit* cl = avatar->GetClothingOutfit(); + if (cl) { + // Save file in UserData/Avatars if only a filename is given + if (!filename.StripFileName().IsValid()) { + plFileName path = plFileName::Join(plFileSystem::GetUserDataPath(), "Avatars"); + plFileSystem::CreateDir(path, true); + filename = plFileName::Join(path, filename); + } + return cl->WriteToFile(filename); + } + } + } + return false; +} + +///////////////////////////////////////////////////////////////////////////// +// +// Function : LoadClothingFromFile +// PARAMETERS : filename - file to load from +// +// PURPOSE : Load the avatar's clothing from a file. If only a filename is +// given, it will read from UserData/Avatars. +// +bool cyAvatar::LoadClothingFromFile(plFileName filename) +{ + if (fRecvr.Count() > 0) { + plArmatureMod* avatar = plAvatarMgr::FindAvatar(fRecvr[0]); + if (avatar) { + plClothingOutfit* cl = avatar->GetClothingOutfit(); + if (cl) { + // Search for file in UserData/Avatars if only a filename is given + if (!filename.StripFileName().IsValid()) + filename = plFileName::Join(plFileSystem::GetUserDataPath(), "Avatars", filename); + cl->SetClothingFile(filename); + return cl->ReadClothing(); + } + } + } + return false; +} + ///////////////////////////////////////////////////////////////////////////// // // Function : ChangeAvatar diff --git a/Sources/Plasma/FeatureLib/pfPython/cyAvatar.h b/Sources/Plasma/FeatureLib/pfPython/cyAvatar.h index e21a8929..596f9594 100644 --- a/Sources/Plasma/FeatureLib/pfPython/cyAvatar.h +++ b/Sources/Plasma/FeatureLib/pfPython/cyAvatar.h @@ -414,6 +414,9 @@ public: virtual void PlaySimpleAnimation(const char* animName); + virtual bool SaveClothingToFile(plFileName filename); + virtual bool LoadClothingFromFile(plFileName filename); + ///////////////////////////////////////////////////////////////////////////// // // Function : ChangeAvatar diff --git a/Sources/Plasma/FeatureLib/pfPython/cyAvatarGlue.cpp b/Sources/Plasma/FeatureLib/pfPython/cyAvatarGlue.cpp index 8a538415..214cb03b 100644 --- a/Sources/Plasma/FeatureLib/pfPython/cyAvatarGlue.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/cyAvatarGlue.cpp @@ -597,6 +597,30 @@ PYTHON_METHOD_DEFINITION(ptAvatar, playSimpleAnimation, args) PYTHON_RETURN_NONE; } +PYTHON_METHOD_DEFINITION(ptAvatar, saveClothingToFile, args) +{ + PyObject* filename; + if (!PyArg_ParseTuple(args, "O", &filename) || !PyString_CheckEx(filename)) + { + PyErr_SetString(PyExc_TypeError, "saveClothingToFile expects a string object"); + PYTHON_RETURN_ERROR; + } + + PYTHON_RETURN_BOOL(self->fThis->SaveClothingToFile(PyString_AsStringEx(filename))); +} + +PYTHON_METHOD_DEFINITION(ptAvatar, loadClothingFromFile, args) +{ + PyObject* filename; + if (!PyArg_ParseTuple(args, "O", &filename) || !PyString_CheckEx(filename)) + { + PyErr_SetString(PyExc_TypeError, "loadClothingFromFile expects a string object"); + PYTHON_RETURN_ERROR; + } + + PYTHON_RETURN_BOOL(self->fThis->LoadClothingFromFile(PyString_AsStringEx(filename))); +} + PYTHON_START_METHODS_TABLE(ptAvatar) PYTHON_METHOD(ptAvatar, netForce, "Params: forceFlag\nSpecify whether this object needs to use messages that are forced to the network\n" "- This is to be used if your Python program is running on only one client\n" @@ -651,6 +675,9 @@ PYTHON_START_METHODS_TABLE(ptAvatar) PYTHON_METHOD(ptAvatar, unRegisterForBehaviorNotify, "Params: selfKey\nThis will unregister behavior notifications"), PYTHON_METHOD(ptAvatar, playSimpleAnimation, "Params: animName\nPlay simple animation on avatar"), + + PYTHON_METHOD(ptAvatar, saveClothingToFile, "Params: filename\nSave avatar clothing to a file"), + PYTHON_METHOD(ptAvatar, loadClothingFromFile, "Params: filename\nLoad avatar clothing from a file"), PYTHON_END_METHODS_TABLE; PYTHON_GLOBAL_METHOD_DEFINITION(PtSetBehaviorLoopCount, args, "Params: behaviorKey,stage,loopCount,netForce\nThis will set the loop count for a particular stage in a multistage behavior")