TangibleObject* ImageDesignManager::createHairObject(CreatureObject* imageDesigner, CreatureObject* targetObject, const String& hairTemplate, const String& hairCustomization) { Reference<TangibleObject*> oldHair = targetObject->getSlottedObject("hair").castTo<TangibleObject*>(); HairAssetData* hairAssetData = CustomizationIdManager::instance()->getHairAssetData(hairTemplate); if (hairTemplate.isEmpty()) { if (!CustomizationIdManager::instance()->canBeBald(getSpeciesGenderString(targetObject))) return oldHair; else return NULL; } if (hairAssetData == NULL) return oldHair; int skillMod = hairAssetData->getSkillModValue(); if (imageDesigner->getSkillMod("hair") < skillMod) return oldHair; if (hairAssetData->getServerPlayerTemplate() != targetObject->getObjectTemplate()->getFullTemplateString()) { error("hair " + hairTemplate + " is not compatible with this creature player " + targetObject->getObjectTemplate()->getFullTemplateString()); return oldHair; } ManagedReference<SceneObject*> hair = imageDesigner->getZoneServer()->createObject(hairTemplate.hashCode(), 1); //TODO: Validate hairCustomization if (hair == NULL || !hair->isTangibleObject()) { if (hair != NULL) { Locker locker(hair); hair->destroyObjectFromDatabase(true); } return oldHair; } TangibleObject* tanoHair = cast<TangibleObject*>( hair.get()); Locker locker(tanoHair); tanoHair->setContainerDenyPermission("owner", ContainerPermissions::MOVECONTAINER); tanoHair->setContainerDefaultDenyPermission(ContainerPermissions::MOVECONTAINER); String appearanceFilename = tanoHair->getObjectTemplate()->getAppearanceFilename(); CustomizationVariables data; data.parseFromClientString(hairCustomization); if (validateCustomizationString(&data, appearanceFilename, getSkillLevel(imageDesigner, "hair"))) tanoHair->setCustomizationString(hairCustomization); return tanoHair; }
void PlayerCreationManager::addCustomization(CreatureObject* creature, const String& customizationString, const String& appearanceFilename) { //TODO: Validate customizationString CustomizationVariables data; data.parseFromClientString(customizationString); if (ImageDesignManager::validateCustomizationString(&data, appearanceFilename, -1)) creature->setCustomizationString(customizationString); }
void PlayerCreationManager::addHair(CreatureObject* creature, const String& hairTemplate, const String& hairCustomization) { if (hairTemplate.isEmpty()) return; HairStyleInfo* hairInfo = hairStyleInfo.get(hairTemplate); if (hairInfo == NULL) hairInfo = hairStyleInfo.get(0); HairAssetData* hairAssetData = CustomizationIdManager::instance()->getHairAssetData(hairTemplate); if (hairAssetData == NULL) { error("no hair asset data detected for " + hairTemplate); return; } if (hairAssetData->getServerPlayerTemplate() != creature->getObjectTemplate()->getFullTemplateString()) { error( "hair " + hairTemplate + " is not compatible with this creature player " + creature->getObjectTemplate()->getFullTemplateString()); return; } if (!hairAssetData->isAvailableAtCreation()) { error("hair " + hairTemplate + " not available at creation"); return; } ManagedReference<SceneObject*> hair = zoneServer->createObject( hairTemplate.hashCode(), 1); //TODO: Validate hairCustomization if (hair == NULL) { return; } Locker locker(hair); if (!hair->isTangibleObject()) { hair->destroyObjectFromDatabase(true); return; } TangibleObject* tanoHair = cast<TangibleObject*>(hair.get()); tanoHair->setContainerDenyPermission("owner", ContainerPermissions::MOVECONTAINER); tanoHair->setContainerDefaultDenyPermission( ContainerPermissions::MOVECONTAINER); String appearanceFilename = tanoHair->getObjectTemplate()->getAppearanceFilename(); CustomizationVariables data; data.parseFromClientString(hairCustomization); if (ImageDesignManager::validateCustomizationString(&data, appearanceFilename, -1)) tanoHair->setCustomizationString(hairCustomization); creature->transferObject(tanoHair, 4); }