Files
Leviathan/Client/Game/game/GameSystem/SAutoToolTip.cpp
T
2026-06-01 12:46:52 +02:00

545 lines
24 KiB
C++

#include "stdafx.h"
#include "SAutoToolTip.h"
#include "ItemEffect.h"
#include "SUIDisplayInfo.h"
#include <toolkit/XStringUtil.h>
namespace rp
{
bool s_bApplyAutoToolTip = false;
// 현재 타이밍에서 S()함수로 DB를 읽어오면 안된다. 아직 파일시스템 추가가 안되었기 때문이다. 2009.12.29 sfreer
namespace
{
const std::string c_strLineFeed = "<BR>";
const std::string c_strLineGap = std::string("<size:4>") + c_strLineFeed + std::string("<size:10>");
const std::string c_strAutoToolTip = "@#auto_tooltip#@";
const std::string c_strItemNameDeco = "<b><size:13>#@itemname@#</b>";
const std::string c_strLimitLevelDeco = "#@limit_level@#";
const std::string c_strRecommendLevelDeco = "#@recommend_level@#";
const std::string c_strBitsetTextDeco = std::string("#@bitset_text@#") + c_strLineFeed;
const std::string c_strWeightDeco = "#@weight@#";
const std::string c_strJobDepth = "#@job_depth@#"; /// 2011.03.30 - prodongi
}
#define CLASS_STRING( c, s ) m_mapClassString.insert( mapClassString::value_type( (c), (s) ) );
#define OPTION_STRING( o, s ) m_mapOptionString.insert( mapOptionString::value_type( (o), (s) ) );
#define AWAKENINGOPTION_STRING( o, s ) m_mapAwakeningOptionString.insert( mapOptionString::value_type( (o), (s) ) )
CAutoToolTip::CAutoToolTip()
{
CLASS_STRING( 0, S(7500) ) // 기타
CLASS_STRING( ItemBase::CLASS_ETCWEAPON, S(7501) )
CLASS_STRING( ItemBase::CLASS_ONEHAND_SWORD, S(7502) )
CLASS_STRING( ItemBase::CLASS_TWOHAND_SWORD, S(7503) )
CLASS_STRING( ItemBase::CLASS_DAGGER, S(7504) )
CLASS_STRING( ItemBase::CLASS_TWOHAND_SPEAR, S(7505) )
CLASS_STRING( ItemBase::CLASS_TWOHAND_AXE, S(7506) )
CLASS_STRING( ItemBase::CLASS_ONEHAND_MACE, S(7507) )
CLASS_STRING( ItemBase::CLASS_TWOHAND_MACE, S(7508) )
CLASS_STRING( ItemBase::CLASS_HEAVY_BOW, S(7509) )
CLASS_STRING( ItemBase::CLASS_LIGHT_BOW, S(7510) )
CLASS_STRING( ItemBase::CLASS_CROSSBOW, S(7511) )
CLASS_STRING( ItemBase::CLASS_ONEHAND_STAFF, S(7512) )
CLASS_STRING( ItemBase::CLASS_TWOHAND_STAFF, S(7513) )
CLASS_STRING( ItemBase::CLASS_ONEHAND_AXE, S(7514) )
CLASS_STRING( ItemBase::CLASS_ARMOR, S(7515) )
CLASS_STRING( ItemBase::CLASS_FIGHTER_ARMOR, S(7516) )
CLASS_STRING( ItemBase::CLASS_HUNTER_ARMOR, S(7517) )
CLASS_STRING( ItemBase::CLASS_MAGICIAN_ARMOR, S(7518) )
CLASS_STRING( ItemBase::CLASS_SUMMONER_ARMOR, S(7519) )
CLASS_STRING( ItemBase::CLASS_SHIELD, S(7520) )
CLASS_STRING( ItemBase::CLASS_HELM, S(7521) )
CLASS_STRING( ItemBase::CLASS_HELM + 1, S(7522) ) // 전사투구
CLASS_STRING( ItemBase::CLASS_HELM + 2, S(7523) ) // 헌터투구
CLASS_STRING( ItemBase::CLASS_HELM + 3, S(7524) ) // 법사투구
CLASS_STRING( ItemBase::CLASS_HELM + 4, S(7525) ) // 소환사투구
CLASS_STRING( ItemBase::CLASS_BOOTS, S(7526) )
/// 2011.01.19 - prodongi
CLASS_STRING( ItemBase::CLASS_FIGHTER_BOOTS, S(7569) )
CLASS_STRING( ItemBase::CLASS_HUNTER_BOOTS, S(7570) )
CLASS_STRING( ItemBase::CLASS_MAGICIAN_BOOTS, S(7571) )
CLASS_STRING( ItemBase::CLASS_SUMMONER_BOOTS, S(7572) )
CLASS_STRING( ItemBase::CLASS_GLOVE, S(7527) )
/// 2011.01.19 - prodongi
CLASS_STRING( ItemBase::CLASS_FIGHTER_GLOVE, S(7573) )
CLASS_STRING( ItemBase::CLASS_HUNTER_GLOVE, S(7574) )
CLASS_STRING( ItemBase::CLASS_MAGICIAN_GLOVE, S(7575) )
CLASS_STRING( ItemBase::CLASS_SUMMONER_GLOVE, S(7576) )
CLASS_STRING( ItemBase::CLASS_BELT, S(7528) )
/// 2011.01.19 - prodongi
CLASS_STRING( ItemBase::CLASS_FIGHTER_BELT, S(7577) )
CLASS_STRING( ItemBase::CLASS_HUNTER_BELT, S(7578) )
CLASS_STRING( ItemBase::CLASS_MAGICIAN_BELT, S(7579) )
CLASS_STRING( ItemBase::CLASS_SUMMONER_BELT, S(7580) )
CLASS_STRING( ItemBase::CLASS_MANTLE, S(7529) )
/// 2011.01.19 - prodongi
CLASS_STRING( ItemBase::CLASS_FIGHTER_MANTLE, S(7581) )
CLASS_STRING( ItemBase::CLASS_HUNTER_MANTLE, S(7582) )
CLASS_STRING( ItemBase::CLASS_MAGICIAN_MANTLE, S(7583) )
CLASS_STRING( ItemBase::CLASS_SUMMONER_MANTLE, S(7584) )
CLASS_STRING( ItemBase::CLASS_ETC_ACCESSORY, S(7530) )
CLASS_STRING( ItemBase::CLASS_RING, S(7531) )
CLASS_STRING( ItemBase::CLASS_EARRING, S(7532) )
CLASS_STRING( ItemBase::CLASS_ARMULET, S(7533) )
CLASS_STRING( ItemBase::CLASS_EYEGLASS, S(7534) )
CLASS_STRING( ItemBase::CLASS_MASK, S(7535) )
CLASS_STRING( 350, S(7536) ) // 가방이 아이템클래스의 enum에서는 빠져 있다.
CLASS_STRING( ItemBase::CLASS_BOOST_CHIP, S(7537) )
CLASS_STRING( ItemBase::CLASS_SOULSTONE, S(7538) )
CLASS_STRING( 500, S(7539) ) // 소모형캐쉬템이 아이템클래스의 enum에서 빠져 있다.
CLASS_STRING( 501, S(7540) ) // 소지형캐쉬템이 아이템클래스의 enum에서 빠져 있다.
CLASS_STRING( ItemBase::CLASS_USE_CASH_ITEM, S(7541) )
CLASS_STRING( ItemBase::CLASS_DECO_WEAPON, S(7542) )
CLASS_STRING( ItemBase::CLASS_DECO_SHIELD, S(7543) )
CLASS_STRING( ItemBase::CLASS_DECO_ARMOR, S(7544) )
CLASS_STRING( ItemBase::CLASS_DECO_HELM, S(7545) )
CLASS_STRING( ItemBase::CLASS_DECO_GLOVE, S(7546) )
CLASS_STRING( ItemBase::CLASS_DECO_BOOTS, S(7547) )
CLASS_STRING( ItemBase::CLASS_DECO_MALTLE, S(7548) )
CLASS_STRING( ItemBase::CLASS_DECO_SHOULDER, S(7549) )
CLASS_STRING( ItemBase::CLASS_DECO_HAIR, S(7550) )
CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_SWORD, S(7551) )
CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_SWORD, S(7552) )
CLASS_STRING( ItemBase::CLASS_DECO_DAGGER, S(7553) )
CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_SPEAR, S(7554) )
CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_AXE, S(7555) )
CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_MACE, S(7556) )
CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_MACE, S(7557) )
CLASS_STRING( ItemBase::CLASS_DECO_HEAVY_BOW, S(7558) )
CLASS_STRING( ItemBase::CLASS_DECO_LIGHT_BOW, S(7559) )
CLASS_STRING( ItemBase::CLASS_DECO_CROSSBOW, S(7560) )
CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_STAFF, S(7561) )
CLASS_STRING( ItemBase::CLASS_DECO_TWOHAND_STAFF, S(7562) )
CLASS_STRING( ItemBase::CLASS_DECO_ONEHAND_AXE, S(7563) )
CLASS_STRING( 700, S(7564) ) // 속성이펙트
CLASS_STRING( 701, S(7565) ) // 속성이펙트 공격력 강화
CLASS_STRING( 702, S(7566) ) // 속성이펙트 마력 강화
CLASS_STRING( 703, S(7567) ) // 양손용 속성이펙트 공격력 강화
CLASS_STRING( 704, S(7568) ) // 양손용 속성이펙트 마력 강화
OPTION_STRING( ITEM_EFFECT_PASSIVE::ATTACK_POINT, S(8002) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_POINT, S(8003) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::ACCURACY, S(8004) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::ATTACK_SPEED, S(8005) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::DEFENCE, S(8006) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_DEFENCE, S(8007) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::AVOID, S(8008) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MOVE_SPEED, S(8009) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::BLOCK_CHANGE, S(8010) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::CARRY_WEIGHT, S(8011) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::BLOCK_DEFENCE, S(8012) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::CASTING_SPEED, S(8013) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_ACCURACY, S(8014) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MAGIC_AVOID, S(8015) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::COOLTIME_SPEED, S(8016) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::BELT_SLOT, S(8017) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MAX_HP, S(8018) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MAX_MP, S(8019) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MP_REGEN_POINT, S(8020) )
OPTION_STRING( ITEM_EFFECT_CHARM::INC_MAX_STAMINA, S(8021) )
/// 2011.03.30 - prodongi
OPTION_STRING( ITEM_EFFECT_PASSIVE::PBLOCK_CHANCE, S(7238) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::ADEF_IGNORE, S(7239) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MDEF_IGNORE, S(7240) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::ADEM_PENETRATION, S(7241) )
OPTION_STRING( ITEM_EFFECT_PASSIVE::MDEM_PENETRATION, S(7242) )
OPTION_STRING(ITEM_EFFECT_PASSIVE::ADD_STATE_BY_EQUIP_ITEM, "ADD_STATE_BY_EQUIP_ITEM" )
// 17가지 옵션
AWAKENINGOPTION_STRING ( StateInfo::STR , S(70) ); // 힘
AWAKENINGOPTION_STRING ( StateInfo::VIT , S(71) ); // 체력
AWAKENINGOPTION_STRING ( StateInfo::DEX , S(73) ); // 민첩
AWAKENINGOPTION_STRING ( StateInfo::AGI , S(72) ); // 집중
AWAKENINGOPTION_STRING ( StateInfo::INT , S(74) ); // 지능
AWAKENINGOPTION_STRING ( StateInfo::MEN , S(75) ); // 정신
AWAKENINGOPTION_STRING ( StateInfo::PHYSICS , S(53) ); // 물리공격력 1 << 7
AWAKENINGOPTION_STRING ( StateInfo::MAGIC , S(54) ); // 마력
AWAKENINGOPTION_STRING ( StateInfo::PHY_DEF , S(55) ); // 물리방어력
AWAKENINGOPTION_STRING ( StateInfo::MGC_DEF , S(56) ); // 마법방어력
AWAKENINGOPTION_STRING ( StateInfo::A_SPEED , S(57) ); // 공격속도
AWAKENINGOPTION_STRING ( StateInfo::C_SPEED , S(58) ); // 시전속도
AWAKENINGOPTION_STRING ( StateInfo::M_SPEED , S(59) ); // 이동속도 1 << 13
AWAKENINGOPTION_STRING ( StateInfo::ACCURACY , S(60) ); // 명중
AWAKENINGOPTION_STRING ( StateInfo::MGS_ACRC , S(62) ); // 마법명중 1 << 15
AWAKENINGOPTION_STRING ( StateInfo::AVOIDANCE , S(61) ); // 회피 1<<19
AWAKENINGOPTION_STRING ( StateInfo::MGS_RESIST , S(1253) ); // 마법 저항 1<<10
AWAKENINGOPTION_STRING(StateInfo::MAXHP, S(1748)); // 마법 저항 1<<10
AWAKENINGOPTION_STRING ( StateInfo::CRI_DAG , S(7152) ); // 치명타 위력 1<<28
AWAKENINGOPTION_STRING ( StateInfo::CRI , S(9775) ); // 치명타율 1<<16
AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_ALL_SKILL , S(7250) ); // 모든 스킬 레벨 증가Lv1
AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_COOLTIME_SPEED , S(7251) ); // 모든 스킬 쿨타임 감소
AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_CASTING_SPEED , S(7252) ); // 모든 스킬 시전시간 감소
AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_DOUBLE_ATTACK , S(7253) ); // 일반공격 더블어택 확률 추가
AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::RESIST_NEGATIVE , S(7254) ); // 모든 해로운 이펙트 지속시간감소
AWAKENINGOPTION_STRING (ITEM_EFFECT_PASSIVE::INC_CREATURE_FCM, S(7255) ); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_BELT_ENHANCE, S(7258)); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_FIRE_DAMAGE, S(7139)); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_WATER_DAMAGE, S(7140)); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_WIND_DAMAGE, S(7141)); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_EARTH_DAMAGE, S(7142)); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_LIGHT_DAMAGE, S(7143)); // 모든 크리처 능력치 강화
AWAKENINGOPTION_STRING(ITEM_EFFECT_PASSIVE::INC_DARK_DAMAGE, S(7144)); // 모든 크리처 능력치 강화
}
std::string CAutoToolTip::GetItemClassString( int nClass ) const
{
std::string strClassName;
cimapClassString itor = m_mapClassString.find( static_cast < ItemBase::ItemClass > ( nClass ) );
if ( itor != m_mapClassString.end() )
strClassName = itor->second;
return strClassName;
}
std::string CAutoToolTip::GetItemOptionString( const ItemBaseEx_info * pItemBase ) const
{
std::string strOptions;
cimapOptionString itor;
for( int i(0); ItemBase::MAX_OPTION_NUMBER>i; i++ )
{
itor = m_mapOptionString.find( pItemBase->nBaseType[i] );
if ( itor != m_mapOptionString.end() )
strOptions += std::string( itor->second );
}
for( int i(0); ItemBase::MAX_OPTION_NUMBER>i; i++ )
{
itor = m_mapOptionString.find( pItemBase->nOptType[i] );
if ( itor != m_mapOptionString.end() )
strOptions += std::string( itor->second );
}
return strOptions;
}
std::string CAutoToolTip::GetItemAwakeningOptionString( DWORD dwType ) const
{
mapAwakeningOptionString::const_iterator it = m_mapAwakeningOptionString.find( dwType );
if ( it != m_mapAwakeningOptionString.end() )
return std::string( it->second );
return std::string("");
}
std::string CAutoToolTip::GetItemStateString( const ItemBaseEx_info * pItemBase ) const
{
std::string strState;
if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_TRADE ) ) // 거래불가
strState += c_strLineFeed + S( 7800 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_WEARABLE ) ) // 기부 불가 표시... 기부가 왜 WEARABLE일까?????
strState += c_strLineFeed + S( 7801 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_STORAGE ) && !pItemBase->CheckFlag( ItemBase::FLAG_CANT_TRADE ) ) // 창고 보관 불가
strState += c_strLineFeed + S( 7802 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_CASHITEM ) )// 캐쉬 아이템
strState += c_strLineFeed + S( 7803 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_ENHANCE ) ) //강화 조합 불가
strState += c_strLineFeed + S( 690000032 );
if ( pItemBase->nType == ItemBase::TYPE_ARMOR ) // 장비
// AziaMafia Tooltip Fix / Opti
//strState += c_strLineFeed + S( 7804 );
if ( ( pItemBase->nType == ItemBase::TYPE_ETC ) && !pItemBase->CheckFlag( ItemBase::FLAG_QUEST ) ) // 기타
strState += c_strLineFeed + S( 7805 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_USE ) ) // 소모품
strState += c_strLineFeed + S( 7806 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_QUEST ) ) // 퀘스트 아이템
strState += c_strLineFeed + S( 7807 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_HUNTAHOLIC_USEABLE_ONLY ) ) // 베어로드에서만 사용 가능
strState += c_strLineFeed + S( 7808 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_DEATHMATCH_USEABLE_ONLY ) ) // 베어로드에서만 사용 가능
strState += c_strLineFeed + S( 7808 );
strState += c_strLineFeed;
if ( pItemBase->CheckFlag( ItemBase::FLAG_RAID ) ||
pItemBase->CheckFlag( ItemBase::FLAG_SECROUTE ) ||
pItemBase->CheckFlag( ItemBase::FLAG_EVENTMAP ) ||
pItemBase->CheckFlag( ItemBase::FLAG_HUNTAHOLIC ) ) // 해당 지역에서 사용 불가
{
strState += S( 7813 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_RAID ) ) // 레이드, 시즈,
strState += S( 7809 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_SECROUTE ) ) // 시크루트
strState += S( 7810 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_EVENTMAP ) ) // 이벤트
strState += S( 7811 );
if ( pItemBase->CheckFlag( ItemBase::FLAG_HUNTAHOLIC ) ) // 베어로드
strState += S( 7812 );
strState += c_strLineFeed;
}
// floyd 2010. 4. 19
/// 2010.11.10 FLAG_CANT_SELL가 아니고 FLAG_CANT_TRADE가 맞습니다. - prodongi
//if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_STORAGE ) && pItemBase->CheckFlag( ItemBase::FLAG_CANT_SELL ) ) // 아바타 귀속 아이템
if ( pItemBase->CheckFlag( ItemBase::FLAG_CANT_STORAGE ) && pItemBase->CheckFlag( ItemBase::FLAG_CANT_TRADE ) ) // 아바타 귀속 아이템
strState += c_strLineFeed + S( 7814 );
return strState;
}
string CAutoToolTip::CreateItemTooltipString( const ItemBaseEx_info* pItemBase,
int nRace,
int nJobID,
string appearanceName, /* = "" */
bool bAwakening, /* = false */
bool bIsRandomOptionItem, /* = false */
bool bIsIdentifiedRandomOption, /* = false */
int nAdditionalItemEffect /* = 0 */ ) const // Fraun Sky Accessories 7/12/2025
{
std::string strTooltip( "" );
if (s_bApplyAutoToolTip)
{
strTooltip = c_strAutoToolTip;
}
else
{
strTooltip = GetStringDB().GetString( pItemBase->nToolTipID );
}
// Fraun 7/17/2025 automatic autotooltip for specific classes if it does not exist
if (strTooltip.compare(0, c_strAutoToolTip.length(), c_strAutoToolTip) != 0)
{
if ( pItemBase->nClass == pItemBase->CLASS_ONEHAND_SWORD
|| pItemBase->nClass == pItemBase->CLASS_TWOHAND_SWORD
|| pItemBase->nClass == pItemBase->CLASS_DAGGER
|| pItemBase->nClass == pItemBase->CLASS_TWOHAND_SPEAR
|| pItemBase->nClass == pItemBase->CLASS_TWOHAND_AXE
|| pItemBase->nClass == pItemBase->CLASS_ONEHAND_MACE
|| pItemBase->nClass == pItemBase->CLASS_TWOHAND_MACE
|| pItemBase->nClass == pItemBase->CLASS_HEAVY_BOW
|| pItemBase->nClass == pItemBase->CLASS_LIGHT_BOW
|| pItemBase->nClass == pItemBase->CLASS_CROSSBOW
|| pItemBase->nClass == pItemBase->CLASS_ONEHAND_STAFF
|| pItemBase->nClass == pItemBase->CLASS_TWOHAND_STAFF
|| pItemBase->nClass == pItemBase->CLASS_ONEHAND_AXE
|| pItemBase->nClass == pItemBase->CLASS_ARMOR
|| pItemBase->nClass == pItemBase->CLASS_FIGHTER_ARMOR
|| pItemBase->nClass == pItemBase->CLASS_HUNTER_ARMOR
|| pItemBase->nClass == pItemBase->CLASS_MAGICIAN_ARMOR
|| pItemBase->nClass == pItemBase->CLASS_SUMMONER_ARMOR
|| pItemBase->nClass == pItemBase->CLASS_SHIELD
|| pItemBase->nClass == pItemBase->CLASS_HELM
|| pItemBase->nClass == pItemBase->CLASS_BOOTS
|| pItemBase->nClass == pItemBase->CLASS_FIGHTER_BOOTS
|| pItemBase->nClass == pItemBase->CLASS_HUNTER_BOOTS
|| pItemBase->nClass == pItemBase->CLASS_MAGICIAN_BOOTS
|| pItemBase->nClass == pItemBase->CLASS_SUMMONER_BOOTS
|| pItemBase->nClass == pItemBase->CLASS_GLOVE
|| pItemBase->nClass == pItemBase->CLASS_FIGHTER_GLOVE
|| pItemBase->nClass == pItemBase->CLASS_HUNTER_GLOVE
|| pItemBase->nClass == pItemBase->CLASS_MAGICIAN_GLOVE
|| pItemBase->nClass == pItemBase->CLASS_SUMMONER_GLOVE
|| pItemBase->nClass == pItemBase->CLASS_BELT
|| pItemBase->nClass == pItemBase->CLASS_FIGHTER_BELT
|| pItemBase->nClass == pItemBase->CLASS_HUNTER_BELT
|| pItemBase->nClass == pItemBase->CLASS_MAGICIAN_BELT
|| pItemBase->nClass == pItemBase->CLASS_SUMMONER_BELT
|| pItemBase->nClass == pItemBase->CLASS_MANTLE
|| pItemBase->nClass == pItemBase->CLASS_FIGHTER_MANTLE
|| pItemBase->nClass == pItemBase->CLASS_HUNTER_MANTLE
|| pItemBase->nClass == pItemBase->CLASS_MAGICIAN_MANTLE
|| pItemBase->nClass == pItemBase->CLASS_SUMMONER_MANTLE
|| pItemBase->nClass == pItemBase->CLASS_QUIVER
|| pItemBase->nClass == pItemBase->CLASS_BOOSTER
|| pItemBase->nClass == pItemBase->CLASS_ETC_ACCESSORY
|| pItemBase->nClass == pItemBase->CLASS_RING
|| pItemBase->nClass == pItemBase->CLASS_EARRING
|| pItemBase->nClass == pItemBase->CLASS_ARMULET
|| pItemBase->nClass == pItemBase->CLASS_EYEGLASS
|| pItemBase->nClass == pItemBase->CLASS_MASK
|| pItemBase->nClass == pItemBase->CLASS_DECO_WEAPON
|| pItemBase->nClass == pItemBase->CLASS_DECO_SHIELD
|| pItemBase->nClass == pItemBase->CLASS_DECO_ARMOR
|| pItemBase->nClass == pItemBase->CLASS_DECO_HELM
|| pItemBase->nClass == pItemBase->CLASS_DECO_GLOVE
|| pItemBase->nClass == pItemBase->CLASS_DECO_BOOTS
|| pItemBase->nClass == pItemBase->CLASS_DECO_MALTLE
|| pItemBase->nClass == pItemBase->CLASS_DECO_SHOULDER
|| pItemBase->nClass == pItemBase->CLASS_DECO_HAIR
|| pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_SWORD
|| pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_SWORD
|| pItemBase->nClass == pItemBase->CLASS_DECO_DAGGER
|| pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_SPEAR
|| pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_AXE
|| pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_MACE
|| pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_MACE
|| pItemBase->nClass == pItemBase->CLASS_DECO_HEAVY_BOW
|| pItemBase->nClass == pItemBase->CLASS_DECO_LIGHT_BOW
|| pItemBase->nClass == pItemBase->CLASS_DECO_CROSSBOW
|| pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_STAFF
|| pItemBase->nClass == pItemBase->CLASS_DECO_TWOHAND_STAFF
|| pItemBase->nClass == pItemBase->CLASS_DECO_ONEHAND_AXE)
{
strTooltip = c_strAutoToolTip;
}
}
if ( strTooltip.compare( 0, c_strAutoToolTip.length(), c_strAutoToolTip ) == 0 )
{
string strItemDescription( std::string( strTooltip.begin() + c_strAutoToolTip.length(), strTooltip.end() ) );
string strItemToolTip( "" );
strItemToolTip = c_strItemNameDeco + appearanceName + "<#ffffff>"+ c_strLineFeed + c_strLineGap;
// 아이템 기본 설명
if ( strItemDescription.size() > 0 )
strItemToolTip += strItemDescription + c_strLineFeed + c_strLineGap;
DWORD dwAllRace = ItemBase::LIMIT_DEVA | ItemBase::LIMIT_ASURA | ItemBase::LIMIT_GAIA;
if ( ( pItemBase->nLimit & dwAllRace ) != dwAllRace )
{
bool bWearable = GetItemDB().IsWearablebyRace( pItemBase, nRace );
if( bWearable == false )
{
strItemToolTip += "<#ff0000>";
}
// 종족 제한
if ( ( pItemBase->nLimit & ItemBase::LIMIT_DEVA ) == ItemBase::LIMIT_DEVA )
strItemToolTip += string( S(2) ) + " ";
if ( ( pItemBase->nLimit & ItemBase::LIMIT_ASURA ) == ItemBase::LIMIT_ASURA )
strItemToolTip += string( S(3) ) + " ";
if ( ( pItemBase->nLimit & ItemBase::LIMIT_GAIA ) == ItemBase::LIMIT_GAIA )
strItemToolTip += string( S(1) ) + " ";
if( bWearable == false )
{
strItemToolTip += "<#ffffff>";
}
}
// 아이템 계열
bool bWearable = GetItemDB().IsWearablebyJob( pItemBase, nJobID, nRace );
if( bWearable == true && pItemBase->nGroup == ItemBase::GROUP_DECO )
{
bWearable = isWearableDecoItem( pItemBase );
}
if( bWearable == false )
{
strItemToolTip += "<#ff0000>";
}
strItemToolTip += GetItemClassString( pItemBase->nClass );
if( bWearable == false )
{
strItemToolTip += "<#ffffff>";
}
strItemToolTip += c_strLineFeed + c_strLineGap;
/// 2011.03.30 job_depth - prodongi
strItemToolTip += c_strJobDepth + c_strLineFeed;
// 아이템 레벨
strItemToolTip += string( S( 7700 ) ) + c_strLimitLevelDeco + c_strLineFeed; // 제한 레벨 need to implement!!
if (pItemBase->nMaxLevel > 0 && pItemBase->nMaxLevel < 300 )
strItemToolTip += string( S( 7701 ) ) + c_strRecommendLevelDeco + c_strLineFeed; // 권장 레벨 need to implement!!
strItemToolTip += c_strLineGap;
// 아이템 성능옵션
strItemToolTip += GetItemOptionString( pItemBase );
strItemToolTip += c_strBitsetTextDeco + c_strLineGap;
string strWeight( "" );
XStringUtil::Format( strWeight, "%4.0f", pItemBase->fWeight );
if (pItemBase->fWeight > 0)
strItemToolTip += S( 7702 ) + strWeight + c_strLineFeed; // 무게
if( true == bIsRandomOptionItem && // 랜덤 옵션 아이템이고
false == bIsIdentifiedRandomOption ) // 미확인 된 아이템이라면,
{
return strItemToolTip; // 여기까지의 정보만 출력한다.
}
if ( pItemBase->set_id != 0 )
{
std::string szsz = c_strLineGap + S(7703) + c_strLineFeed + string( "#@setitem_fx@#" ) + c_strLineGap + string( "[#@setitem_name@#]" ) + string( "#@setitem_part@#" );
strItemToolTip += c_strLineGap + szsz + c_strLineGap;
}
if (nAdditionalItemEffect > 0)
{
strItemToolTip += "#@additional_item_effect@#"; // Fraun Sky Accessories 7/12/2025
}
if (pItemBase->nEffectId != 0)
{
strItemToolTip += string( "#@itemeffecttooltip@#" ) + c_strLineFeed;
}
if (bAwakening)
{
strItemToolTip += string( "#@itemawakeningtooltip@#" ) + c_strLineFeed;
}
if( true == bIsRandomOptionItem && // 랜덤 옵션 아이템이고
true == bIsIdentifiedRandomOption ) // 확인 된 아이템이라면,
{
strItemToolTip.append( "#@itemRandomOptionToolTip@#" );
strItemToolTip.append( c_strLineFeed );
}
// 아이템 상태 표시 툴팁
strItemToolTip += GetItemStateString( pItemBase );
if(pItemBase->nEthereal_durability > 0)
{
strItemToolTip += c_strLineFeed + S(7815) + "#@Ethereal_Durability@# / #@Ethereal_Durability_Max@#";
#ifdef _DEV
strItemToolTip += c_strLineFeed + S(7816) + "#@Ethereal_Durability_test@# / #@Ethereal_Durability_test_Max@#";
#endif
}
#ifdef _DEV
strItemToolTip += c_strLineFeed + S(7817) + "#@Soulstone_Durability_test@# / #@Soulstone_Durability_test_Max@#";
#endif
// 2010.06.21 - prodongi
if (ITEM_EFFECT_INSTANT::AUTO_HP_RECOVERY == pItemBase->nOptType[0] ||
ITEM_EFFECT_INSTANT::AUTO_MP_RECOVERY == pItemBase->nOptType[0])
{
strItemToolTip += c_strLineFeed + S(7818) + "#@Recovery_Endurance@# / #@Recovery_Endurance_Max@#";
}
return strItemToolTip;
}
else
return strTooltip;
}
} // namespace rp