#include "stdafx.h" #include "KUIControlEdit.h" #include "KUIControlButton.h" #include "KUIControlStatic.h" #include "KUIControlCombo.h" #include "KUIControlClockBox.h" #include "SGameManager.h" #include "SUICreateCharWnd.h" #include "GameDefine.h" #include "SStringDB.h" #include "SItemDB.h" #include "SDefaultTextureResourceDB.h" #include "SDefaultTextureIconResourceDB.h" // 2010.04.22 - prodongi #include "SGameRenewalLobby.h" // Fraun new character UI 8/20/2025 int SUICreateCharSecondDlg::nReferences = 0; std::map* SUICreateCharSecondDlg::m_CharacterSelectionPoints = 0; std::map* SUICreateCharSecondDlg::m_CharacterHairDyesMap = 0; std::map* SUICreateCharSecondDlg::m_CharacterSkinColorMap = 0; SUICreateCharSecondDlg::~SUICreateCharSecondDlg() { clear(); nReferences--; if (nReferences == 0) { // Removing temporary maps delete m_CharacterSelectionPoints; m_CharacterSelectionPoints = nullptr; delete m_CharacterHairDyesMap; m_CharacterHairDyesMap = nullptr; delete m_CharacterSkinColorMap; m_CharacterSkinColorMap = nullptr; } } void SUICreateCharSecondDlg::clear() { m_vHairList.clear(); m_vFaceList.clear(); m_vBodyList.clear(); m_vDecoList.clear(); } // Character creation menu // Character customization // Buttons click messages function void SUICreateCharSecondDlg::PumpUpMessage( LPCSTR lpszControlID, DWORD nMessage, DWORD lparam, DWORD wparam ) { if (KUI_MESSAGE::KICON_CLICK == nMessage && !m_bAniCam) { int nControlID = m_CharacterSelectionPoints->find(lpszControlID)->second; switch (nControlID) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: // Faces { m_nCurFace = nControlID; m_nSelectFace = m_nCurFace; CharCreationProcMsgAtStatic(lpszControlID, "select_box_00", NULL, m_nCurFace); // Moving face selection box to the selected face break; } case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 108: case 109: // Tatoos case 110: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: // Tatoos { m_nCurDeco = nControlID; m_nSelectDeco = m_nCurDeco; CharCreationProcMsgAtStatic(lpszControlID, "select_box_01", &m_vDecoList[m_nSelectDeco], m_nCurDeco); break; } case 200: case 201: case 202: case 203: case 204: case 205: case 206: case 207: // Hairstyles (hairs) { m_nCurHair = nControlID; m_nSelectHair = m_nCurHair; CharCreationProcMsgAtStatic(lpszControlID, "select_box_02", &m_vHairList[m_nCurHair], m_nCurHair); break; } case 300: case 301: case 302: case 303: case 304: case 305: case 306: case 307: case 308: case 309: case 310: case 311: // Hairdyes (haircolor) (rgb) case 312: case 313: case 314: case 315: case 316: case 317: case 318: case 319: case 320: case 321: case 322: case 323: // Hairdyes (haircolor) (rgb) case 324: case 325: case 326: case 327: case 328: case 329: // Hairdyes (haircolor) (rgb) { m_nCurHairColor = m_CharacterHairDyesMap->at(nControlID); m_nSelectedHairColor = m_nCurHairColor; m_vHairList[m_nCurHair].m_textureId = m_nCurHairColor; CharCreationProcMsgAtStatic(lpszControlID, "select_box_03", &m_vHairList[m_nCurHair], m_nCurHairColor); break; } case 330: case 331: case 332: case 333: // Hairdyes (haircolor) (index) { m_nCurHairColor = nControlID - 327; m_nSelectedHairColor = m_nCurHairColor; m_vHairList[m_nCurHair].m_textureId = m_nCurHairColor; CharCreationProcMsgAtStatic(lpszControlID, "select_box_03", &m_vHairList[m_nCurHair], m_nCurHairColor); break; } case 400: case 401: case 402: case 403: // Clothes (Outfits) { m_nCurBody = nControlID; m_nSelectBody = m_nCurBody; CharCreationProcMsgAtStatic(lpszControlID, "select_box_04", NULL, m_nCurBody); break; } case 500: case 501: case 502: case 503: case 504: case 505: case 506: case 507: case 508: case 509: case 510: case 511: // Skin color { m_nCurSkinColor = m_CharacterSkinColorMap->at(nControlID); m_nSelectSkinColor = m_nCurSkinColor; CharCreationProcMsgAtStatic(lpszControlID, "select_box_05", NULL, m_nCurSkinColor); break; } default: { break; } } } // Face customization-related modification — kappamind, 2009.12.16 if( KUI_MESSAGE::KBUTTON_CLICK == nMessage && !m_bAniCam ) { if( 0 == ::_stricmp( "ok_bt", lpszControlID ) ) // Confirmation button (Create) { m_pGameManager->StartSound( "ui_bgm_antechamber01.wav" ); if( !m_bCreateChar ) { KUIControlEdit* pEdit = dynamicCast(GetChild("nameEdit")); if( pEdit ) { SIMSG_CREATE_NEWCHAR CreateNewCharMsg( pEdit->GetText() ); if (CreateNewCharMsg.m_strName.empty()) { m_pGameManager->InterfaceMsg( &SIMSG_REQ_OPEN_MSGBOX( SIMSG_REQ_OPEN_MSGBOX::MSGBOX_GENERAL, S(806), true ) ); } else { m_pGameManager->ProcMsgAtStatic( &CreateNewCharMsg ); pEdit->SetText(""); m_bCreateChar = true; } } } } else if( 0 == ::_stricmp( "cc_bt", lpszControlID ) ) // Return button (Cancel) { m_pGameManager->StartSound( "ui_bgm_antechamber01.wav" ); SIMSG_UIWND_NOTIFY_TO_LOBBY msg( lpszControlID ); m_pGameManager->ProcMsgAtStatic( &msg ); } else if( 0 == ::_stricmp( "malebtn", lpszControlID ) || 0 == ::_stricmp("fmalebtn", lpszControlID)) // Gender (Sex) change { SetCurrentDecoIcon( m_nCurRace, m_nCurSex, m_nCurFace ); SIMSG_UIWND_NOTIFY_TO_LOBBY msg( lpszControlID ); m_pGameManager->ProcMsgAtStatic( &msg ); } } SUIWnd::PumpUpMessage( lpszControlID, nMessage, lparam, wparam ); } void SUICreateCharSecondDlg::ProcMsgAtStatic( SGameMessage* pMsg ) { switch( pMsg->nType ) { case IMSG_CREATE_NEWCHAR: { SIMSG_CREATE_NEWCHAR * pNameMsg = (SIMSG_CREATE_NEWCHAR *)pMsg; if( !pNameMsg->m_strName.empty() ) { KUIControlIconStatic * pIcon = dynamicCast(GetChild( "static01" )); if( pIcon ) { switch (pNameMsg->m_nRace) { case GCLAN_GAIA: { if (pNameMsg->m_nSex == SEX_FEMALE) {// TODO: Old shit! Needs to be REMOVED! That's the 70x116 picture from 2004 year! pIcon->SetIcon("ui_frame.spr", "static_lobby_gaiafemale"); } else if (pNameMsg->m_nSex == SEX_MALE) { pIcon->SetIcon("ui_frame.spr", "static_lobby_gaiamale"); } break; } case GCLAN_DEVA: { switch (pNameMsg->m_nSex) { case SEX_FEMALE: { pIcon->SetIcon("ui_frame.spr", "static_lobby_devafemale"); break; } case SEX_MALE: { pIcon->SetIcon("ui_frame.spr", "static_lobby_devamale"); break; } } break; } case GCLAN_ASURA: { switch (pNameMsg->m_nSex) { case SEX_FEMALE: { pIcon->SetIcon("ui_frame.spr", "static_lobby_asurafemale"); break; } case SEX_MALE: { pIcon->SetIcon("ui_frame.spr", "static_lobby_asuramale"); break; } } break; } default: break; } } } } break; case IMSG_UI_CUSTOMIZIG_UPDATE: // Initializing the customize character window { SIMSG_UI_CUSTOMIZIG_UPDATE* pUpdateMsg = (SIMSG_UI_CUSTOMIZIG_UPDATE*)pMsg; InitData(); // Initializing basic stuff m_nCurHair = pUpdateMsg->m_nHair; m_nCurFace = pUpdateMsg->m_nFace; m_nCurBody = pUpdateMsg->m_nBody; m_nCurSex = pUpdateMsg->m_nSex; m_nCurRace = pUpdateMsg->m_nRace; m_nCurDeco = 0; // Set Icons (Filling arrays) SetCurrentFaceIcon( m_nCurRace, m_nCurSex, m_nCurFace ); SetCurrentHairIcon( m_nCurRace, m_nCurSex, m_nCurHair ); SetCurrentBodyIcon( m_nCurRace, m_nCurSex, m_nCurBody ); SetCurrentDecoIcon( m_nCurRace, m_nCurSex, m_nCurFace ); if (!m_vFaceList.empty()) // Obviously faces, but comment here in case if you, the one reading this code, have low IQ { // This vector (m_vFaceList) should not be empty actually if DefaultModelResource rdb is correct checkValidIndex(m_vFaceList, m_nCurFace); m_nFacePosition = m_nCurFace; m_nSelectFace = m_nCurFace; for (int i = 0; i < 11; i++) { KUIControlIconStatic* pFaceIcon = dynamicCast(GetChild(CStringUtil::StringFormat("select00%02d", i).c_str())); if (pFaceIcon) { std::string strRaceModificator = "static_face_"; if (m_nCurRace == 5) { strRaceModificator += "as"; } else if (m_nCurRace == 4) { strRaceModificator += "de"; } else if (m_nCurRace == 3) { strRaceModificator += "ga"; } m_nCurSex == 1 ? strRaceModificator += "f" : strRaceModificator += "m"; pFaceIcon->SetShow(false); pFaceIcon->SetIcon("05_ui.spr", CStringUtil::StringFormat("%s_0%02d", strRaceModificator.c_str(), i + 1).c_str()); pFaceIcon->SetShow(true); } } KUIControlIconStatic* pFaceSelect = dynamicCast(GetChild(CStringUtil::StringFormat("select00%02d", m_nCurFace).c_str())); const KRect& rIconRect = pFaceSelect->GetRect(); //SetMovePos("select_box_00", rIconRect.left, rIconRect.top); //SetChildShow("select_box_00", true); } if (!m_vDecoList.empty()) // Face tatoos { m_nCurDeco = 0; m_nDecoPosition = 0; for (int i = 0; i < 19; ++i) { KUIControlIconStatic* pDeco = dynamicCast(GetChild(CStringUtil::StringFormat("select01%02d", i + 1).c_str())); if (pDeco) { if (i + 1 < (int)m_vDecoList.size()) { pDeco->SetShow(true); pDeco->SetIcon("05_ui.spr", m_vDecoList.at(i).m_iconName.c_str()); //pDeco->SetAniName(m_vDecoList[m_nCurDeco + i].m_iconName.c_str()); pDeco->Enable(); } else { pDeco->SetShow(false); pDeco->Disable(); } } } m_nSelectDeco = m_nCurDeco; } if( !m_vHairList.empty() ) // Hairs { checkValidIndex(m_vHairList, m_nCurHair); m_nHairPosition = m_nCurHair; for( int i = 0; i < 8; i++ ) { if (i < m_vHairList.size()) { if (KUIControlIconStatic* pHair = dynamicCast(GetChild(CStringUtil::StringFormat("select02%02d", i).c_str()))) { pHair->SetIcon("05_ui.spr", m_vHairList.at(i).m_iconName.c_str()); pHair->SetShow(true); pHair->Enable(); } } } m_nSelectHair = m_nCurHair; } if( !m_vBodyList.empty() ) // Outfit (Costume) { checkValidIndex(m_vBodyList, m_nCurBody); m_nBodyPosition = m_nCurBody; for( int i = 0; i < 4; i++ ) { KUIControlIconStatic* pBody = dynamicCast(GetChild( CStringUtil::StringFormat( "select04%02d", i ).c_str() )); if( pBody ) { if( m_nBodyPosition < (int)m_vBodyList.size() ) { pBody->SetIcon("05_ui.spr", m_vBodyList.at(i).m_iconName.c_str()); pBody->SetShow( true ); pBody->Enable(); } else { pBody->SetShow( false ); pBody->Disable(); } } } m_nSelectBody = m_nCurBody; } m_nCurSkinColor = 0; VerifyAvatarHair(); } break; case IMSG_UI_SEND_DATA: { SIMSG_UI_SEND_DATA* pSendMsg = (SIMSG_UI_SEND_DATA*)pMsg; if( pSendMsg->m_strString == "ani_cam" ) { m_bAniCam = (pSendMsg->m_nNumber.getAmount() > 0 ); } else if( pSendMsg->m_strString == "create_fail" ) { m_bCreateChar = false; } } break; } } void SUICreateCharSecondDlg::OnNotifyUIWindowOpen( bool bOpen, bool bLimitWnd ) { // This is piece of shit rendering thing, totally useless seems like /* if( bOpen ) { if( !m_vHairList.empty() ) { for( int i = 0; i <= 7; i++ ) { KUIControlIconStatic* pHair = dynamicCast(GetChild( CStringUtil::StringFormat( "select02%02d", i ).c_str() )); if( pHair && i < m_vHairList.size() ) { pHair->SetShow( true ); pHair->SetIcon("05_ui.spr", m_vHairList[i].m_iconName.c_str()); pHair->Enable(); } } } if( !m_vFaceList.empty() ) { for( int i = 0; i < 3; ++i ) { KUIControlStatic * pFace = dynamicCast(GetChild( CStringUtil::StringFormat( "face_box_%02d", i + 1 ).c_str() )); KUIControlSimpleButton* pButtonFace = dynamicCast(GetChild( CStringUtil::StringFormat( "face_button_%02d", i+1 ).c_str() )); if( pFace && pButtonFace ) { if( m_nFacePosition + i < (int)m_vFaceList.size() ) { pFace->SetShow( true ); pFace->SetAniName( m_vFaceList[m_nFacePosition + i].m_iconName.c_str() ); pButtonFace->Enable(); } else { pFace->SetShow( false ); pButtonFace->Disable(); } } } } if( !m_vBodyList.empty() ) { for( int i = 0; i < 3; ++i ) { KUIControlStatic * pBody = dynamicCast(GetChild( CStringUtil::StringFormat( "clothe_box_%02d", i+1 ).c_str() )); KUIControlSimpleButton* pButtonBody = dynamicCast(GetChild( CStringUtil::StringFormat( "clothe_button_%02d", i+1 ).c_str() )); if( pBody && pButtonBody ) { if( m_nBodyPosition+i < (int)m_vBodyList.size() ) { pBody->SetShow( true ); // 2010.04.21 - prodongi pBody->SetAniName( m_vBodyList[m_nBodyPosition+i].m_iconName.c_str() ); pButtonBody->Enable(); } else { pBody->SetShow( false ); pButtonBody->Disable(); } } } } if( !m_vDecoList.empty() ) { for( int i = 0; i < 3; ++i ) { KUIControlStatic * pDeco = dynamicCast(GetChild( CStringUtil::StringFormat( "deco_box_%02d", i+1 ).c_str() )); KUIControlSimpleButton* pButtonDece = dynamicCast(GetChild( CStringUtil::StringFormat( "deco_button_%02d", i+1 ).c_str() )); if( pDeco && pButtonDece ) { if( m_nDecoPosition+i < (int)m_vDecoList.size() ) { pDeco->SetShow( true ); // 2010.04.21 - prodongi pDeco->SetAniName( m_vDecoList[m_nDecoPosition+i].m_iconName.c_str() ); pButtonDece->Enable(); } else { pDeco->SetShow( false ); pButtonDece->Disable(); } } } } } */ m_bCreateChar = false; } bool SUICreateCharSecondDlg::InitData( bool bReload ) { clear(); m_nSelectFace = 0; m_nSelectDeco = 0; m_nSelectHair = 0; m_nSelectedHairColor = 0; m_nSelectBody = 0; m_nSelectSkinColor = 0; return SUIWnd::InitData(bReload); } void SUICreateCharSecondDlg::SetCurrentFaceIcon( int nRace, int nSex, int nIndex ) { SDefaultItemDB& DefaultItemDB = GetDefaultItemDB(); // DefaultModelResource SDefaultTextureResourceDB& TextureResourceDB = GetDefaultTextureResourceDB(); // DefaultTextureResource SDefaultTextureIconResourceDB& IconResourceDB = GetDefaultTextureIconResourceDB(); // DefaultTextureIconResource unsigned int nFacesCount = DefaultItemDB.GetFaceCount(); for( int i(0); nFacesCount > i; i++ ) { int nTextureGroupID = DefaultItemDB.m_FaceItemList[i]->texture_group_id; int nTextureResourceCount = TextureResourceDB.GetTextureResourceCount(); for( int n(0); nTextureResourceCount > n; n++ ) { if( TextureResourceDB.m_vDefaultTextureList[n]->texture_group_id == nTextureGroupID && TextureResourceDB.m_vDefaultTextureList[n]->texture_id == 0 ) { int textureID = TextureResourceDB.m_vDefaultTextureList[n]->texture_id; // 0 int nIconID = TextureResourceDB.GetIconID(nTextureGroupID, textureID, nRace, nSex ); if( nIconID != -1 ) { std::string strIconName = IconResourceDB.GetIconFileName( nIconID ); pushList(m_vFaceList, sPartsListInfo(strIconName, textureID)); } } } } } void SUICreateCharSecondDlg::SetCurrentHairIcon( int nRace, int nSex, int nIndex ) { struct HairIconsStruct { HairIconsStruct(int nRace, int nSex) { switch( nRace ) { case GCLAN_GAIA: { if (nSex == SEX_FEMALE) { tempMap.insert( std::make_pair(0, sPartsListInfo("static_hair_gaf_001", 132001)) ); tempMap.insert( std::make_pair(1, sPartsListInfo("static_hair_gaf_002", 132002)) ); tempMap.insert( std::make_pair(2, sPartsListInfo("static_hair_gaf_003", 232001)) ); tempMap.insert( std::make_pair(3, sPartsListInfo("static_hair_gaf_004", 232002)) ); tempMap.insert( std::make_pair(4, sPartsListInfo("static_hair_gaf_005", 332001)) ); tempMap.insert( std::make_pair(5, sPartsListInfo("static_hair_gaf_006", 332002)) ); tempMap.insert( std::make_pair(6, sPartsListInfo("static_hair_gaf_007", 432001)) ); tempMap.insert( std::make_pair(7, sPartsListInfo("static_hair_gaf_008", 432002)) ); } else if (nSex == SEX_MALE) { tempMap.insert( std::make_pair(0, sPartsListInfo("static_hair_gam_001", 131001)) ); tempMap.insert( std::make_pair(1, sPartsListInfo("static_hair_gam_002", 131002)) ); tempMap.insert( std::make_pair(2, sPartsListInfo("static_hair_gam_003", 231001)) ); tempMap.insert( std::make_pair(3, sPartsListInfo("static_hair_gam_004", 231002)) ); tempMap.insert( std::make_pair(4, sPartsListInfo("static_hair_gam_005", 331001)) ); tempMap.insert( std::make_pair(5, sPartsListInfo("static_hair_gam_006", 331002)) ); tempMap.insert( std::make_pair(6, sPartsListInfo("static_hair_gam_007", 431001)) ); tempMap.insert( std::make_pair(7, sPartsListInfo("static_hair_gam_008", 431002)) ); } } case GCLAN_DEVA: { if (nSex == SEX_FEMALE) { tempMap.insert( std::make_pair(0, sPartsListInfo("static_hair_def_001", 112001)) ); tempMap.insert( std::make_pair(1, sPartsListInfo("static_hair_def_002", 112002)) ); tempMap.insert( std::make_pair(2, sPartsListInfo("static_hair_def_003", 212001)) ); tempMap.insert( std::make_pair(3, sPartsListInfo("static_hair_def_004", 212002)) ); tempMap.insert( std::make_pair(4, sPartsListInfo("static_hair_def_005", 312001)) ); tempMap.insert( std::make_pair(5, sPartsListInfo("static_hair_def_006", 312002)) ); tempMap.insert( std::make_pair(6, sPartsListInfo("static_hair_def_007", 412001)) ); tempMap.insert( std::make_pair(7, sPartsListInfo("static_hair_def_008", 412002)) ); } else if (nSex == SEX_MALE) { tempMap.insert( std::make_pair(0, sPartsListInfo("static_hair_dem_001", 111001)) ); tempMap.insert( std::make_pair(1, sPartsListInfo("static_hair_dem_002", 111002)) ); tempMap.insert( std::make_pair(2, sPartsListInfo("static_hair_dem_003", 211001)) ); tempMap.insert( std::make_pair(3, sPartsListInfo("static_hair_dem_004", 211002)) ); tempMap.insert( std::make_pair(4, sPartsListInfo("static_hair_dem_005", 311001)) ); tempMap.insert( std::make_pair(5, sPartsListInfo("static_hair_dem_006", 311002)) ); tempMap.insert( std::make_pair(6, sPartsListInfo("static_hair_dem_007", 411001)) ); tempMap.insert( std::make_pair(7, sPartsListInfo("static_hair_dem_008", 411002)) ); } } case GCLAN_ASURA: { if (nSex == SEX_FEMALE) { tempMap.insert( std::make_pair(0, sPartsListInfo("static_hair_asf_001", 122001)) ); tempMap.insert( std::make_pair(1, sPartsListInfo("static_hair_asf_002", 122002)) ); tempMap.insert( std::make_pair(2, sPartsListInfo("static_hair_asf_003", 222001)) ); tempMap.insert( std::make_pair(3, sPartsListInfo("static_hair_asf_004", 222002)) ); tempMap.insert( std::make_pair(4, sPartsListInfo("static_hair_asf_005", 322001)) ); tempMap.insert( std::make_pair(5, sPartsListInfo("static_hair_asf_006", 322002)) ); tempMap.insert( std::make_pair(6, sPartsListInfo("static_hair_asf_007", 422001)) ); tempMap.insert( std::make_pair(7, sPartsListInfo("static_hair_asf_008", 422002)) ); } else if (nSex == SEX_MALE) { tempMap.insert( std::make_pair(0, sPartsListInfo("static_hair_asm_001", 121001)) ); tempMap.insert( std::make_pair(1, sPartsListInfo("static_hair_asm_002", 121002)) ); tempMap.insert( std::make_pair(2, sPartsListInfo("static_hair_asm_003", 221001)) ); tempMap.insert( std::make_pair(3, sPartsListInfo("static_hair_asm_004", 221002)) ); tempMap.insert( std::make_pair(4, sPartsListInfo("static_hair_asm_005", 321001)) ); tempMap.insert( std::make_pair(5, sPartsListInfo("static_hair_asm_006", 321002)) ); tempMap.insert( std::make_pair(6, sPartsListInfo("static_hair_asm_007", 421001)) ); tempMap.insert( std::make_pair(7, sPartsListInfo("static_hair_asm_008", 421002)) ); } } } }; ~HairIconsStruct() { tempMap.clear(); }; std::map tempMap; }; std::map hairmap; HairIconsStruct hairstruct = HairIconsStruct(nRace, nSex); for (int i = 0; i < 8; i++) { pushList(m_vHairList, hairstruct.tempMap.at(i)); } } void SUICreateCharSecondDlg::SetCurrentBodyIcon( int nRace, int nSex, int nIndex ) { for (int i = 0; i < 4; i++) { std::string strIconFileName = "static_clothe_"; switch (nRace) { case GCLAN_ASURA: strIconFileName += "as"; break; case GCLAN_GAIA: strIconFileName += "ga"; break; case GCLAN_DEVA: strIconFileName += "de"; break; } nSex == SEX_FEMALE ? strIconFileName += "f_common_00" : strIconFileName += "m_common_00"; strIconFileName += std::to_string(static_cast(i+1)); m_vBodyList.push_back(sPartsListInfo(strIconFileName, 1)); } } void SUICreateCharSecondDlg::SetCurrentDecoIcon( int nRace, int nSex, int nIndex ) { int nIConGroupID = GetDefaultItemDB().GetFaceGroupID( nIndex ); for( int i(0); GetDefaultTextureResourceDB().GetTextureResourceCount() > i; i++ ) { if( GetDefaultTextureResourceDB().m_vDefaultTextureList[i]->texture_group_id == nIConGroupID ) { int textureID = GetDefaultTextureResourceDB().m_vDefaultTextureList[i]->texture_id; int nIconID = GetDefaultTextureResourceDB().GetIconID( nIConGroupID, textureID, nRace, nSex ); if( nIconID != -1 && textureID != 0 ) { std::string strIconName = GetDefaultTextureIconResourceDB().GetIconFileName( nIconID ); pushList(m_vDecoList, sPartsListInfo(strIconName, textureID)); } } } sort( m_vDecoList.begin(), m_vDecoList.end() ); } void SUICreateCharSecondDlg::pushList(v_partslist& list, sPartsListInfo const& info) { it_partslist it = std::find(list.begin(), list.end(), info); if (it != list.end()) return ; list.push_back(info); } void SUICreateCharSecondDlg::checkValidIndex(v_partslist const& list, int& index) const { if (0 > index) index = 0; else if (list.size() <= index) index = 0; } // Fraun 9.5.2 character creation 8/21/2025 void SUICreateCharSecondDlg::CharCreationProcMsgAtStatic(char const* iconName, char const* selectControl, sPartsListInfo const* info, int selectIndex) { // Display a border around the selected icon KUIControlIconStatic* iconStatic = dynamicCast< KUIControlIconStatic* >(GetChild( iconName)); const KRect& rIconRect = iconStatic->GetRect(); if (selectControl == "select_box_01") { SetMovePos( selectControl, rIconRect.left + 6, rIconRect.top + 4); } else if (selectControl == "select_box_04") { SetMovePos( selectControl, rIconRect.left + 5, rIconRect.top); } else { SetMovePos( selectControl, rIconRect.left , rIconRect.top ); } SetChildShow( selectControl, true ); SIMSG_UIWND_NOTIFY_TO_LOBBY msg( iconName ); msg.m_nSelectIndex = selectIndex; if (info) { msg.m_textureId = info->m_textureId; } m_pGameManager->ProcMsgAtStatic( &msg ); } void SUICreateCharSecondDlg::VerifyAvatarHair() { SGameRenewalLobby* renewalLobby = (SGameRenewalLobby*)m_pGameManager->GetActiveGame(); if (!renewalLobby) return ; SIMSG_UIWND_NOTIFY_TO_LOBBY msg(""); msg.m_nSelectIndex = m_nCurHair; msg.m_textureId = m_vHairList[m_nCurHair].m_textureId; renewalLobby->VerifyCustomizeAvatarHair(&msg); }