Files
Sun1602/Client/GameClient/Interface/uiTradeMan/uiTradeMan_main.cpp
T
2022-10-26 12:25:11 +08:00

727 lines
18 KiB
C++

//------------------------------------------------------------------------------
// 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<Player *>(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<Player *>(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<int>(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
//------------------------------------------------------------------------------