//------------------------------------------------------------------------------ // uiTradeMan_main.cpp // (C) 2005 ckbang //------------------------------------------------------------------------------ #include "SunClientPrecompiledHeader.h" #include "uiTradeMan.h" #include "uitargetman/uitargetman.h" #include "TargetDialog.h" #include "ObjectManager.h" #include "AskReplyTradeDialog.h" #include "InputNumTradeDialog.h" #include "MouseHandler.h" #include "InventoryDialog.h" #ifdef _NA_008678_20160203_ADD_HEIM_TRADINGVOLUME_NOTIFICATION_OPTION #else #include "uiTrade/uiTrade.h" #endif // _NA_008678_20160203_ADD_HEIM_TRADINGVOLUME_NOTIFICATION_OPTION #include "SCItemSlot.h" #include "hero.h" #include "globalfunc.h" #include "InterfaceManager.h" #include "uiInPutNumTradeUIDialog/uiInPutNumTradeUIDialog.h" #pragma warning ( push ) #pragma warning(disable : 4800) //------------------------------------------------------------------------------ /** */ uiTradeMan::uiTradeMan(InterfaceManager *pUIMan) : uiBaseMan(pUIMan) { m_bPutOneStaring = false; m_pUITrade = NULL; } void uiTradeMan::OnInitialize() { _LoadUI(); } //------------------------------------------------------------------------------ /** */ void uiTradeMan::Clear() { this->m_bModifyPending = false; this->m_uiFunctionIndex = 0; this->m_tradeInfo1.Clear(); this->m_tradeInfo2.Clear(); } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::SetName(DWORD dwKey) { Object *pObject = g_ObjectManager.GetObject(dwKey); assert (pObject); if (!pObject) return false; if (pObject->IsKindOfObject(PLAYER_OBJECT)) { Player * pPlayer = static_cast(pObject); assert (pPlayer); BASE_PLAYERINFO *bp = pPlayer->GetCharInfo(); assert (bp); this->m_tradeInfo1.m_strName = bp->m_tszCharName; this->m_tradeInfo1.m_dwKey = dwKey; this->m_tradeInfo1.m_isSet = true; this->m_tradeInfo1.m_DealMoney = 0; this->m_tradeInfo1.m_pObject = pObject; this->m_tradeInfo1.m_status = -1; return true; } else { assert (!"Object is not kind of player"); this->m_tradeInfo1.Clear(); return false; } return true; } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::SetNameTo(DWORD dwKey) { Object *pObject = g_ObjectManager.GetObject(dwKey); assert (pObject); if (!pObject) return false; if (pObject->IsKindOfObject(PLAYER_OBJECT)) { Player * pPlayer = static_cast(pObject); assert (pPlayer); BASE_PLAYERINFO *bp = pPlayer->GetCharInfo(); assert (bp); this->m_tradeInfo2.m_strName = bp->m_tszCharName; this->m_tradeInfo2.m_dwKey = dwKey; this->m_tradeInfo2.m_isSet = true; this->m_tradeInfo2.m_DealMoney = 0; this->m_tradeInfo2.m_pObject = pObject; this->m_tradeInfo2.m_status = -1; return true; } else { assert (!"Object is not kind of player"); this->m_tradeInfo2.Clear(); return false; } return true; } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::Ask(const TCHAR* pname) { if(!g_pHero) return false; TCHAR szText[INTERFACE_STRING_LENGTH], szMessage[INTERFACE_STRING_LENGTH]; if (g_pHero->GetBeHaveState() == PLAYER_BEHAVE_TRADE_STATE) { // °Å·¡ Áß Àϰæ¿ì ÀçÂ÷ °Å·¡½Åû ÇÒ ¼ö ¾ø½¿. // ÇöÀç ´Ù¸¥ ¿ë¹« ÁßÀ̽ʴϴÙ. g_InterfaceManager.GetInterfaceString( eST_YOU_ARE_BUSY, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice (eOUTPUT_MSG_CHAT, szMessage); return false; } if (pname == NULL && !(GET_DIALOG(IM_TARGET_MANAGER::TARGET_DIALOG)->IsVisible())) { // ¼±ÅÃµÈ Ç÷¹À̾ ¾ø½À´Ï´Ù. this->GetUIMan()->GetInterfaceString( eST_NOT_SELECTED_PLAYER, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return false; } DWORD dwTargetKey = 0; Object * pTargetObj = NULL; if (pname == NULL) { // Ÿ°Ùâ¿¡ ÀÖ´Â »ó´ë¿ÍÀÇ °Å·¡ TargetDialog * pTargetDlg = GET_CAST_DIALOG(TargetDialog, IM_TARGET_MANAGER::TARGET_DIALOG); assert (pTargetDlg); dwTargetKey = pTargetDlg->GetTargetKey(); if(g_pHero->GetObjectKey() == dwTargetKey) { // Àڽſ¡°Ô´Â °Å·¡¸¦ ½ÅûÇÒ ¼ö ¾ø½À´Ï´Ù. : 5370 g_InterfaceManager.GetInterfaceString(eST_CANNOT_TRADE_MYSELF , szMessage , INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice (eOUTPUT_MSG_CHAT, szMessage); this->Clear(); return false; } // °Å·¡ÇÏ´Â »ó´ë¹æ ¼³Á¤ if (!this->SetNameTo(dwTargetKey)) { this->Clear(); return false; } pTargetObj = g_ObjectManager.GetObject(dwTargetKey); assert (pTargetObj); } else { if ( !Strcmp( g_pHero->GetName(), pname ) ) { // Àڽſ¡°Ô´Â °Å·¡¸¦ ½ÅûÇÒ ¼ö ¾ø½À´Ï´Ù. : 5370 g_InterfaceManager.GetInterfaceString(eST_CANNOT_TRADE_MYSELF , szMessage , INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice (eOUTPUT_MSG_CHAT, szMessage); return false; } #ifdef _K2P_OBJECT_MANAGER_MODIFIDY // ÀÔ·ÂÇÑ ¾ÆÀ̵ð¿ÍÀÇ °Å·¡ Object * pObj = g_ObjectManager.GetObject( pname ); if( pObj != NULL ) { if( this->SetNameTo( pObj->GetObjectKey() ) ) { this->Clear(); return false; } } else { g_InterfaceManager.GetInterfaceString( eST_NAMECODE_NOT_FOUND, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice (eOUTPUT_MSG_CHAT, szMessage, pname); return false; } #else bool bFounded = false; Object_Map_Itr itr = g_ObjectManager.GetBegin(); while( g_ObjectManager.GetEnd() != itr ) { Object *pObj = (Object *)itr->second; if (!Strcmp(pObj->GetName(), pname) && !((pObj->GetObjectKey() > ONLYCLIENT_OBJECT_KEY) && // Ŭ¶ó¿¡¼­ °¡»ó »ý¼ºµÈ ¿ÀºêÁ§Æ®Å° Á¦¿Ü (pObj->GetObjectKey() < MAX_OBJECT_KEY))) { dwTargetKey = pObj->GetObjectKey(); pTargetObj = pObj; if (!this->SetNameTo(dwTargetKey)) { this->Clear(); return false; } bFounded = true; break; } ++itr; } if (!bFounded) { // ±×·± À¯Àú°¡ ¾ø½¿ // '%s' ´ÔÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù. g_InterfaceManager.GetInterfaceString( eST_NAMECODE_NOT_FOUND, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice (eOUTPUT_MSG_CHAT, szMessage, pname); return false; } #endif } // °Å·¡ÇÏ´Â º»ÀÎ ¼³Á¤ this->SetName(g_pHero->GetObjectKey()); assert (pTargetObj); if (!pTargetObj) return false; Player* pPlayerObj = (Player *)pTargetObj; assert (pPlayerObj); if (!this->CheckCanTrading(pPlayerObj)) { this->Clear(); return false; } // [%s] ´Ô¿¡°Ô °Å·¡¸¦ ¿äû g_InterfaceManager.GetInterfaceString( eST_TRADE_REQUEST_TO_NAMECODE, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, this->m_tradeInfo2.m_isSet ? this->m_tradeInfo2.m_strName.c_str() : _T("??") ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); this->m_tradeInfo1.m_status = TRADE_STATUS_IDLE; g_pHero->SetBeHaveState(PLAYER_BEHAVE_TRADE_STATE); MSG_CG_TRADE_OPEN_SYN msgSend; msgSend.m_dwPlayerKey = m_tradeInfo2.m_dwKey; return GlobalFunc::SendPacket( CI_GAMESERVERIDX, &msgSend, sizeof (msgSend) ); } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::CheckCanTrading(Player* pPlayer) { assert (pPlayer); if (!this->CheckCanTradingIsBusy(pPlayer)) return false; if (!this->CheckCanTradingIsInRanged(pPlayer)) return false; return true; } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::CheckCanTradingIsBusy(Player* pPlayer) { TCHAR szText[INTERFACE_STRING_LENGTH], szMessage[INTERFACE_STRING_LENGTH]; assert (pPlayer); if (pPlayer->GetBeHaveState() != PLAYER_BEHAVE_IDLE_STATE) { // [%s] ´ÔÀº ÇöÀç ´Ù¸¥ ¿ë¹« ÁßÀ̽ʴϴÙ. const int c_iBusy = 70414; g_InterfaceManager.GetInterfaceString( c_iBusy, szText, INTERFACE_STRING_LENGTH ); Sprintf (szMessage, szText, pPlayer->GetName()); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return false; } return true; } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::CheckCanTradingIsInRanged(Player* pPlayer) { TCHAR szMessage[INTERFACE_STRING_LENGTH]; assert (pPlayer); if(!g_pHero) return false; float distance = VectorLength( &(pPlayer->GetPosition() - g_pHero->GetVisiblePos()) ); if ( distance > DISTANCE_TRADING ) { // °Å·¡ÇÏ·Á´Â »ó´ë¹æ°úÀÇ °Å¸®°¡ ³Ê¹« ¸Ö¸® ¶³¾îÁ® ÀÖ½À´Ï´Ù. const int c_iTooFarDistanceTrading = 70391; g_InterfaceManager.GetInterfaceString( c_iTooFarDistanceTrading, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage); return false; } return true; } //------------------------------------------------------------------------------ /** °Å·¡ ¿äû¿¡ ´ëÇÑ ÀÀ´ä ÀÇ»çâ ¶ç¿ì±â */ bool uiTradeMan::PopupTradeReply(DWORD dwPlayerKey) { if(!g_pHero) return false; if (g_pHero->GetBeHaveState() == PLAYER_BEHAVE_TRADE_STATE) { // ÇÑ »ç¶÷ ÀÌ»óÇÑÅ× °Å·¡ ¿äû ¹Þ´Â Áß // ÀÌ¹Ì °Å·¡ÁßÀ̰ųª ´Ù¸¥ ÀÌ·Î ÇÏ¿©±Ý °Å·¡ ¿äû ¹Þ°í ÀÖ´Â Áß // ÀÌ·² °æ¿ì ÀÚµ¿ °Å·¡¿äû °ÅÀýÀ» º¸³½´Ù. this->SendTradeReply(false); return false; } this->Clear(); if (!this->SetName(g_pHero->GetObjectKey())) { this->Clear(); return false; } if (!this->SetNameTo(dwPlayerKey)) { this->Clear(); return false; } TCHAR szText[INTERFACE_STRING_LENGTH], szMessage[INTERFACE_STRING_LENGTH]; // [%s] ´ÔÀÌ °Å·¡¸¦ ¿äû g_InterfaceManager.GetInterfaceString( eST_TRADE_REQUEST_FROM_NAMECODE, szText, INTERFACE_STRING_LENGTH ); Sprintf( szMessage, szText, this->m_tradeInfo2.m_isSet ? this->m_tradeInfo2.m_strName.c_str() : _T("??") ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); //-ck- 2006. 1. 17. //¹«Á¶°Ç ÀÀÇÑ´Ù´Â ÆÐŶÀü¼Û this->SendTradeReply(true); g_pHero->SetBeHaveState(PLAYER_BEHAVE_TRADE_STATE); return true; } //------------------------------------------------------------------------------ /** °Å·¡¿¡ ´ëÇÑ ÀÀ´ä ÆÐŶ Àü¼Û */ void uiTradeMan::SendTradeReply(bool bDo) { } //------------------------------------------------------------------------------ /** */ void uiTradeMan::TradeStart() { this->m_tradeInfo1.m_status = TRADE_STATUS_IDLE; this->m_tradeInfo2.m_status = TRADE_STATUS_IDLE; this->m_pUITrade->ShowInterface(TRUE); if (this->m_bPutOneStaring) { this->m_pUITrade->PutOneStart(); this->m_bPutOneStaring = false; } } void uiTradeMan::ShowNumTradeUIDialog( BOOL show ) { #ifdef _K2P_SOFTWARE_NUMBER_KEYBOARD_000913 m_pUINumTradeUIDialog->ShowInterface( show ); #endif } //------------------------------------------------------------------------------ /** °Å·¡ ³¡ 1. °Å·¡Ã¢¿¡ ¿Ã·Á³õÀº ¾ÆÀÌÅÛÀ» ¼øÈ¯ÇÏ¸ç °Ë»ö 2. °Ë»öÁß ¾ÆÀÌÅÛÀÌ ¿Ã·ÁÁ® ÀÖ´Â ½½·ÔÀ» ¹ß°ßÇϸé Àκ¥Ã¢¿¡¼­ °°Àº ¾ÆÀÌÅÛÀ» ã¾Æ¼­ »èÁ¦ */ void uiTradeMan::TradeEnd(MONEY money, TRADE_TOTAL_INFO tradeInfo) { if(!g_pHero) return; g_pHero->SetMoney(money); this->m_pUITrade->TradeEnd(tradeInfo); this->TradeClose(); g_pHero->SetBeHaveState(PLAYER_BEHAVE_IDLE_STATE); } //------------------------------------------------------------------------------ /** °Å·¡ Ãë¼Ò ÆÐŶ Àü¼Û */ void uiTradeMan::SendTradeCancel() { MSG_CG_TRADE_CANCEL_SYN sendMsg; GlobalFunc::SendPacket( CI_GAMESERVERIDX, &sendMsg, sizeof (MSG_CG_TRADE_CANCEL_SYN) ); } //------------------------------------------------------------------------------ /** °Å·¡ Ãë¼Ò */ void uiTradeMan::TradeClose() { m_pUITrade->ShowInterface( FALSE ); GET_DIALOG( IM_INVENTORY_MANAGER::INVEN_DLG )->ShowWindow(FALSE); this->GetUIMan()->ShowWindow(InterfaceManager::DIALOG_EQUIP, FALSE); #ifdef _K2P_SOFTWARE_NUMBER_KEYBOARD_000913 m_pUINumTradeUIDialog->ShowInterface( FALSE ); #endif } //------------------------------------------------------------------------------ /** */ void uiTradeMan::PopupTradeMoney() { TCHAR szMessage[INTERFACE_STRING_LENGTH]; if (g_pHero && (g_pHero->GetMoney() <= 0)) { // ÇöÀç ¼ÒÁöÇϽŠÇÏÀÓÀÌ ¾ø½À´Ï´Ù. const int c_iHaveNotHyme = 70392; g_InterfaceManager.GetInterfaceString( c_iHaveNotHyme, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_CHAT, szMessage ); return; } InputNumTradeDialog *pInputNumTradeDlg; pInputNumTradeDlg = (InputNumTradeDialog *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_INPUT_NUM); if (pInputNumTradeDlg) g_InterfaceManager.DeleteInterface(pInputNumTradeDlg->rcinfo_GetID()); pInputNumTradeDlg = new InputNumTradeDialog; assert(pInputNumTradeDlg); if ( !g_InterfaceManager.LoadInterface( pInputNumTradeDlg, (char *)pInputNumTradeDlg->rcinfo_GetPath(), pInputNumTradeDlg->rcinfo_GetID(), FALSE) ) { return; } //pInputNumTradeDlg->SetDialogKey( pInputNumTradeDlg->rcinfo_GetID() ); //pInputNumTradeDlg->SetDialogResourceName( (char*)pInputNumTradeDlg->rcinfo_GetPath() ); g_InterfaceManager.ShowWindow(InterfaceManager::DIALOG_INPUT_NUM, TRUE); } //------------------------------------------------------------------------------ /** */ bool uiTradeMan::CheckEndTradingCauseRanged() { if (!m_tradeInfo1.m_isSet || !m_tradeInfo2.m_isSet) return false; Object* pObj; pObj = g_ObjectManager.GetObject(this->m_tradeInfo1.m_dwKey); if (!pObj) { this->SendTradeCancel(); return false; } pObj = g_ObjectManager.GetObject(this->m_tradeInfo2.m_dwKey); if (!pObj) { this->SendTradeCancel(); return false; } int distance = static_cast(VectorLength( &(this->m_tradeInfo2.m_pObject->GetPosition()- this->m_tradeInfo1.m_pObject->GetVisiblePos()) )); if ( distance > DISTANCE_TRADING ) { // °Å·¡ÁßÀÎ »ó´ë¹æ°úÀÇ °Å¸®°¡ ¸Ö¸é ÀÚµ¿À¸·Î °Å·¡´Â Ãë¼ÒµË´Ï´Ù. TCHAR szMessage[INTERFACE_STRING_LENGTH]; const int c_iDistanceTradingCheck = 70390; g_InterfaceManager.GetInterfaceString( c_iDistanceTradingCheck, szMessage, INTERFACE_STRING_LENGTH ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, szMessage); this->SendTradeCancel(); } return true; } void uiTradeMan::ErrorCode(DWORD dwErrorCode) { int iMessage = 0; TCHAR szMessage[INTERFACE_STRING_LENGTH] = {0,}; switch ( dwErrorCode ) { case RC_TRADE_CANCEL: { //5824 °Å·¡¸¦ Ãë¼ÒÇß½À´Ï´Ù. iMessage = 5824; } break; case RC_TRADE_PLAYER1_HAVENOTSPACE: { //5825 Àκ¥Å丮¿¡ ¿©À¯ °ø°£ÀÌ ºÎÁ·ÇÕ´Ï´Ù. iMessage = 5825; } break; case RC_TRADE_PLAYER2_HAVENOTSPACE: { //5826 »ó´ë¹æÀÇ Àκ¥Å丮¿¡ ¿©À¯ °ø°£ÀÌ ºÎÁ·ÇÕ´Ï´Ù. iMessage = 5826; } break; case RC_TRADE_PLAYER1_HAVENOTMONEY: { //551 ÇÏÀÓÀÌ ºÎÁ·ÇÕ´Ï´Ù. iMessage = 551; } break; case RC_TRADE_PLAYER2_HAVENOTMONEY: { //5827 »ó´ë¹æÀÇ ÇÏÀÓÀÌ ºÎÁ·ÇÕ´Ï´Ù. iMessage = 5827; } break; case RC_TRADE_COUNTERPARTNER_NOTACCEPT: { //5828 »ó´ë¹æÀÌ ¿äûÀ» »ç¾çÇÏ¿´½À´Ï´Ù. iMessage = 5828; } break; /* case RC_TRADE_INVALID_STATE: { //5830 À߸øµÈ »óÅÂÀÔ´Ï´Ù. iMessage = 5830; } break; */ case RC_TRADE_COUNTERPARTNER_CANNOT_STATE: { //5829 »ó´ë¹æÀÌ °Å·¡°¡ °¡´ÉÇÏÁö ¾ÊÀº »óÅÂÀÔ´Ï´Ù. iMessage = 5829; } break; case RC_TRADE_CANNOT_TRADE_ITEM: { //5350 °Å·¡°¡ °¡´ÉÇÏÁö ¾ÊÀº ¾ÆÀÌÅÛÀÔ´Ï´Ù. iMessage = 5350; } break; case RC_TRADE_NOT_AVAILABLE_SERVICE: { //5831 ÇöÀç´Â ÀÌ¿ëÇÏ½Ç ¼ö ¾ø´Â ¼­ºñ½ºÀÔ´Ï´Ù. iMessage = 5831; } break; case RC_TRADE_BLOCKED_ITEM: { //5811 ºí·°µÈ ¾ÆÀÌÅÛÀÔ´Ï´Ù. iMessage = 5811; } break; case RC_TRADE_INTERCEPTION: { // 6011 °Å·¡ »ó´ë°¡ °Å·¡¸¦ Â÷´ÜÇϰí ÀÖ¾î °Å·¡ÇÒ ¼ö ¾ø½À´Ï´Ù. iMessage = 6011; } break; case RC_TRADE_DIFFERENT_ITEM_INFO: { //5832 óÀ½ µî·ÏÇÑ ¾ÆÀÌÅÛ°ú ÇöÀç ¾ÆÀÌÅÛÀÇ Á¤º¸°¡ ´Ù¸¨´Ï´Ù. iMessage = 5832; } break; case RC_TRADE_UNABLE_FUNCTION_FOR_CHAOSTATE: { //5275 Ä«¿À »óÅ¿¡¼­´Â ÀÌ¿ëÀÌ °¡´ÉÇÏÁö ¾Ê½À´Ï´Ù. iMessage = 5275; } break; case RC_TRADE_LENGTH_CANNOT_TRADE: { //5833 °Å·¡ÇÒ ¼ö ¾ø´Â °Å¸®ÀÔ´Ï´Ù. iMessage = 5833; } break; case RC_TRADE_DIFFERENT_ZONE: { //5834 »ó´ë¹æÀÌ ´Ù¸¥ Áö¿ª¿¡ ÀÖ½À´Ï´Ù. iMessage = 5834; } break; case RC_TRADE_MODIFY_CANCEL: { //6341 »ó´ë¹æÀÌ ¹°Ç°º¯°æÀ» °ÅÀýÇß½À´Ï´Ù. iMessage = 6341; } break; case RC_TRADE_MODIFY_FAIL: { //6342 »ó´ë¹æÀÇ ¹°Ç° º¯°æ ¿äûÀ» °ÅÀýÇÏ¿´½À´Ï´Ù iMessage = 6342; } break; default: { //5823 °Å·¡¿¡ ½ÇÆÐÇß½À´Ï´Ù. iMessage = 5823; } break; } g_InterfaceManager.GetInterfaceString(iMessage , szMessage , INTERFACE_STRING_LENGTH); GlobalFunc::OutputMsg_Notice( eOUTPUT_MSG_CHAT, szMessage ); GlobalFunc::OutputMsg_Notice(eOUTPUT_MSG_TOP_SHOW, szMessage); } #pragma warning ( pop ) //------------------------------------------------------------------------------ // EOF //------------------------------------------------------------------------------