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

400 lines
13 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "ChatDialog.h"
#include "InterfaceManager.h"
#include "ChatMenu.h"
#include "ChatPersonalOption.h"
#include "GlobalFunc.h"
#include "GameConst_Color.h"
#include "uiChatMan/uiChatMan_def.h"
#include "BattleLobby.h"
#include "QuickContainer.h"
#include "hero.h"
#include "uichatman/uiChatMan.h"
//----------------------------------------------------------------------------
/**
*/
ChatDialog::ChatDialog(InterfaceManager* pUIMan):
uiBase(pUIMan),
m_bAlwaysOnTop(0),
m_pCurEditCtrl(NULL),
m_pChatEditCtrl(NULL),
m_pChatListCtrl(NULL)
{
for(int i=0; i<eCHAT_BTN_MAX; ++i)
{
m_pButton[i] = NULL;
}
m_pMicButton = NULL;
m_UseTooltipCtrls.clear();
m_iTooltipStringCode = 0;
m_bShowShout = TRUE;
m_UseTooltipCtrls[CHAT_CHECK_PROPERTY] = eST_CHAT_PROPERTY_OFF;
m_pSystemChatDlg = NULL;
m_UseTooltipCtrls[CHAT_CHECK_LOCK_SCROLL] = 1716;
m_ChannelJoinMember_Num = 0;
m_ChannelName[0] = 0;
m_bExistChannel = FALSE;
m_ChannelInvitedRoomName[0] = 0;
m_PendingChannelInvitedName[0] = 0;
m_UseTooltipCtrls[CHAT_CHECK_CHANNEL] = 235;
m_szPendingWhisperSender[0] = 0;
m_szPendingWhisperSenderToMe[0] = 0;
#ifdef _000541_BLOCK_CHAT_REPEAT
m_dwPendingSendChattingTime = 0;
m_szPendingSendChatMsg[0] = 0;
#endif
m_bLockScroll = FALSE;
m_iWhisperDequeIndex = 0;
m_bClickUPandDOWN = FALSE;
m_bShowSystemChat = TRUE;
m_iGapOfDialogYPosition = c_iOneLineYPostionToQuickSlot;
m_UseTooltipCtrls[CHAT_SYSTEM_CHAT_BUTTON] = 3420;
is_first_enter_ = true;
}
//----------------------------------------------------------------------------
/**
*/
ChatDialog::~ChatDialog()
{
m_UseTooltipCtrls.clear();
}
//----------------------------------------------------------------------------
/**
*/
VOID
ChatDialog::InitChatList()
{
if (!m_pChatListCtrl)
{
assert(!"왜 리스트가 없어!!");
}
m_pChatListCtrl->DeleteItemAll();
m_pChatVScrollCtrl = (CCtrlVScrollWZ *)getControl( CHAT_VSCR );
m_pChatVScrollCtrl->SetScrollRangeWZ(0,m_ChatMsgList.size());
m_pChatVScrollCtrl->SetScrollPosWZ(0);
}
//----------------------------------------------------------------------------
/**
*/
VOID
ChatDialog::Init( CDrawBase * pDrawBase )
{
uiBase::Init(pDrawBase);
memset(&m_VScrollInfo, 0, sizeof(m_VScrollInfo));
setChatType( CHAT_TYPE_GENERAL );
m_eChatPosition = eNORMAL;
this->MoveDefaultPosition();
for( int i = 0; i< LIST_CONTROL_MAX ; i ++)
{
m_pListControlType[i] = (CCtrlListWZ * ) getControl(i);
m_pListControlType[i]->SetColorSelBar(RGBA(0,0,0,0));
m_pListControlType[i]->SetColorSelBarOnText(RGBA(0,0,0,0));
m_pListControlType[i]->SetSellHeight(16);
m_pListControlType[i]->SetStartLineGapTop(7);
m_pListControlType[i]->SetTextKind(ETK_SHADOW);
m_pListControlType[i]->SetStartLineGapTop(5);
m_pListControlType[i]->SetStartLineGapLeft(3);
m_pListControlType[i]->SetUseRButtonSelect(true);
if( i != LIST_CONTROL_1X)
{
m_pListControlType[i]->ShowWindowWZ(WZ_HIDE);
}
}
m_pChatListCtrl = m_pListControlType[LIST_CONTROL_1X];
// EditBox 설정
m_pChatEditCtrl = (CCtrlDxIMEEditBox *)getControl( CHAT_EDIT );
if (m_pChatEditCtrl)
{
m_pCurEditCtrl = m_pChatEditCtrl;
}
m_pCurEditCtrl->SetLimitText(c_iLIMITED_EDIT_TEXT);
for(int i = 0 ; i < eCHECK_MAX ; ++i )
{
m_pCheckFilter[i] = (CCtrlButtonCheckWZ * ) getControl(i + CHAT_CHECK_ALL);
}
m_pCheckFilter[eCHECK_ALL]->SetCheckState(TRUE);
m_pCheckFilter[eCHECK_PARTY]->SetCheckState(FALSE);
m_pCheckFilter[eCHECK_GUILD]->SetCheckState(FALSE);
m_pCheckFilter[eCHECK_PROPERTY]->SetCheckState(FALSE);
#ifdef _K2P_ADD_WISPER_WINDOW
m_pCheckFilter[eCHECK_WISPER]->SetCheckState(FALSE);
#endif
m_pCtrlCurChatType = (CCtrlImageStaticWZ *)getControl(CHAT_TEXT_IMAGE_SELECT_MENU);
m_pButton[eCHAT_BTN_MENU] = static_cast<CCtrlButtonWZ*>(getControl(CHAT_MENU_BUTTON));
m_pButton[eCHAT_BTN_UP] = static_cast<CCtrlButtonWZ*>(getControl(CHAT_LIST_SIZE_UP));
m_pButton[eCHAT_BTN_DOWN] = static_cast<CCtrlButtonWZ*>(getControl(CHAT_LIST_SIZE_DOWN));
m_pMicButton = static_cast<CCtrlButtonCheckWZ*>(getControl(CHAT_VOICE_CHAT_BUTTON));
//m_pButton[eCHAT_BTN_UP] = static_cast<CCtrlButtonWZ*>(getControl(CHAT_LIST_SIZE_UP));
m_pButton[eCHAT_BTN_DOWN]->ShowWindowWZ(WZ_HIDE);
//TODO: 음성채팅용 컨트롤이 UI에서 제거되면 이 코드도 제거해야 함
if(m_pMicButton)
m_pMicButton->ShowWindowWZ(WZ_HIDE); // 버튼 없애버리자
m_pChatEditCtrl->SetFontID(StrToWzID("mn12"));
m_pChatEditCtrl->SetColorText( c_Chat_DefaultColor );
m_pChatEditCtrl->SetColorCaret( RGBA( 255, 255, 255, 255) );
m_pChatEditCtrl->SetColorSelText( RGBA( 0, 0, 255, 255) );
InitChatList();
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_GENERAL ] = c_Chat_DefaultColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_WHISPER ] = c_Chat_WhisperColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_GUILD ] = c_Chat_GuildColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_TRADE ] = c_Chat_TradeColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_SYSTEM ] = c_Chat_SystemColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_GM ] = c_Chat_GMColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_GM_WHISPER ] = c_Chat_GMWhisperColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_GM_NOTICE ] = c_Chat_GMColor; // GM 공지 채팅메시지 컬러
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_HELP ] = c_Chat_HelpColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_SHOUT ] = c_Chat_ShoutColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_PARTY ] = c_Chat_PartyColor;
m_dwTextColor[CHAT_TEXT_COLOR][ CHAT_TYPE_CHANNEL ] = c_Chat_ChannelColor;
m_dwTextColor[CHAT_TEXT_COLOR][CHAT_TYPE_WORLD_SHOUT] = c_WorldShoutColor;
m_dwTextColor[CHAT_BG_COLOR][CHAT_TYPE_WORLD_SHOUT] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_TEXT_COLOR][CHAT_TYPE_SUPER_LOBBY_MASTER_SHOUT] = c_SuperLobbyMasterColor;
m_dwTextColor[CHAT_BG_COLOR][CHAT_TYPE_SUPER_LOBBY_MASTER_SHOUT] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_PARTY ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_GENERAL ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_WHISPER ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_GUILD ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_TRADE ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_SYSTEM ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_GM ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_GM_WHISPER ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_HELP ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_SHOUT ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_CHANNEL ] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_BG_COLOR][ CHAT_TYPE_GM_NOTICE ] = WzColor_RGBA(255,255,255,0); // GM 공지 채팅메시지 컬러
// _100416_LTJ_MODIFY_CHAT_FILTERING
m_dwTextColor[CHAT_TEXT_COLOR][CHAT_TYPE_SLANG_FILTERING] = WzColor_RGBA(197, 47, 47, 255);
m_dwTextColor[CHAT_BG_COLOR][CHAT_TYPE_SLANG_FILTERING] = WzColor_RGBA(255,255,255,0);
m_dwTextColor[CHAT_TEXT_COLOR][CHAT_TYPE_SLANG_FILTERING_NOTICE] = c_Chat_SystemColor;
m_dwTextColor[CHAT_BG_COLOR][CHAT_TYPE_SLANG_FILTERING_NOTICE] = WzColor_RGBA(255,255,255,0);
// size set
m_preShow=FALSE;
// chat menu dialog 를 받아놓는다.
m_pChatMenuDlg = GET_CAST_DIALOG(ChatMenuDialog, IM_CHAT_MANAGER::CHAT_MENU_DIALOG);
m_pChatMenuDlg->SetChatDialog(this);
m_iCurFilterMode = eLFM_NORMAL;
m_pSystemChatDlg = GET_CAST_DIALOG(SystemChatDialog, IM_CHAT_MANAGER::SYSTEM_CHAT_DIALOG);
m_pPropertyDlg = GET_CAST_DIALOG(ChatPropertyDialog, IM_CHAT_MANAGER::CHAT_PROPERTY_DIALOG);
m_pCtrlCurChatType->SetTextID(eST_NORMAL_CHAT);
m_eFilter[0] = GAMEOPTION->GetChatFilterNormal();
m_eFilter[1] = GAMEOPTION->GetChatFilterParty();
m_eFilter[2] = GAMEOPTION->GetChatFilterGuild();
m_eFilter[3] = GAMEOPTION->GetChatFilterChannel();
m_eFilter[4] = GAMEOPTION->GetChatFilterSystem();
#ifdef _K2P_ADD_WISPER_WINDOW
m_eFilter[5] = GAMEOPTION->GetChatFilterWshiper();
#endif
m_pPropertyDlg->SetPropertyDlgFilter(eLFM_NORMAL , m_eFilter[eLFM_NORMAL]);
m_eCurChatControlType = LIST_CONTROL_1X;
m_iMaxChatMsgLine = SHOW_DEFAULT_CHAT_MSG_LINE;
m_icurrntStrInHistory = -1;
g_slangFilter.SetReplaceString(PROGRAMPARAM->GetReplaceWordForSlangWord(),
static_cast<FILTER_REPLACE_TYPE>(PROGRAMPARAM->GetReplaceType()));
is_channel_join_waitting_ = false;
sprintf(channel_waitting_name_, "");
}
//----------------------------------------------------------------------------
/**
*/
VOID
ChatDialog::Release()
{
ExhaustChatMsgALL();
std::deque<SenderName *>::iterator itr = m_WhisperSenderList.begin();
while( itr != m_WhisperSenderList.end() )
{
SenderName * pSender = *itr;
SAFE_DELETE(pSender);
itr++;
}
m_WhisperSenderList.clear();
// 채팅 히스토리 해제
TCHAR* pTemp = NULL;
int iSize = m_vecChatHistory.size() - 1;
for(int i = iSize; i >=0; i--)
{
pTemp = m_vecChatHistory[i];
SAFE_DELETE_ARRAY(pTemp);
}
m_vecChatHistory.clear();
// 채팅 히스토리
GAMEOPTION->SetChatFilterNormal(m_eFilter[0]);
GAMEOPTION->SetChatFilterParty(m_eFilter[1]);
GAMEOPTION->SetChatFilterGuild(m_eFilter[2]);
GAMEOPTION->SetChatFilterChannel(m_eFilter[3]);
GAMEOPTION->SetChatFilterSystem( m_eFilter[4]);
#ifdef _K2P_ADD_WISPER_WINDOW
GAMEOPTION->SetChatFilterWshiper(m_eFilter[5]);
#endif
GAMEOPTION->Save();
}
//----------------------------------------------------------------------------
/**
*/
VOID
ChatDialog::OnUpdateSolarDialog()
{
AutoFill();
updateTooltip();
updateScrollPosition();
updateWhisperSelectInput();
ShowChatMsgInHistory();
updateWheelScroll();
// 채팅 중인 지 Check
m_bInputChatingMessage = BOOL( _tcslen( this->GetCurChatMessage() ) );
}
//----------------------------------------------------------------------------
/**
*/
VOID
ChatDialog::OnShowWindow( BOOL val )
{
if (val)
{
m_bLockScroll = FALSE;
m_pCheckFilter[eCHECK_LOCK_SCROLL]->SetCheckState(FALSE);
m_iWhisperDequeIndex = m_WhisperSenderList.size();
m_pChatEditCtrl = (CCtrlDxIMEEditBox *) getControl(CHAT_EDIT);
this->InitChatInfo();
this->SetFocusChatEdit();
m_bFirstEnter = TRUE;
clearEdit();
CCtrlVScrollWZ * pScroll = (CCtrlVScrollWZ *)getControl( CHAT_VSCR );
if( pScroll)
{
int iMax = ( m_pChatListCtrl->GetListRowCnt() - (m_iMaxChatMsgLine) ) < 0 ? 0 : m_pChatListCtrl->GetListRowCnt() - (m_iMaxChatMsgLine);
pScroll->SetScrollRangeWZ(0,iMax);
}
updateDialogSize();
m_icurrntStrInHistory = -1;
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType = eDoType_dialog_chat;
msg.wParam = InterfaceManager::DIALOG_CHAT;
msg.DoSomething = GlobalFunc::DoShowWindow;
g_KeyQueueManager.PushBack(msg);
BattleLobby * pBattleLobby = (BattleLobby *)g_InterfaceManager.GetDialog(InterfaceManager::DIALOG_BATTLE_LOBBY);
//gs_bug_fix:배틀존이 로비창이 열린상태에서는 키큐메니저에 삽입하지말자
// esc를 눌러두 채팅창이 닫히지않게 하기위해
if(pBattleLobby && pBattleLobby->IsVisibleWindow())
{
g_KeyQueueManager.DeleteMsg(eDoType_dialog_chat);
}
if (g_pHero != NULL)
{
uiChatMan* char_man = GET_DIALOG_MANAGER(uiChatMan, UIMAN_CHAT);
QuickContainer* quick_container = g_pHero->GetQuickContainer();
if (char_man != NULL && quick_container != NULL)
{
if (quick_container->double_size() == true)
{
char_man->MoveChatDialog(2);
}
else
{
char_man->MoveChatDialog(1);
}
}
}
}
else
{
#if defined(_NA_006774_20130617_ARRANGE_UNNECESSARY_RESOURCES)
MoveDefaultPosition();
#endif // _NA_006774_20130617_ARRANGE_UNNECESSARY_RESOURCES
CCtrlVScrollWZ * pScroll = (CCtrlVScrollWZ *)getControl( CHAT_VSCR );
this->m_pChatMenuDlg->ShowWindow(FALSE);
this->SetAlwaysOnTop(FALSE);
g_Input.ResetKeyBuffer();
g_Input.Reset();
CloseOptionDialogs();
m_bFirstEnter = FALSE;
g_KeyQueueManager.DeleteMsg(eDoType_dialog_chat);
}
}
//----------------------------------------------------------------------------
/**
*/
void ChatDialog::CloseOptionDialogs()
{
uiBase* pDlg = GET_DIALOG(IM_CHAT_MANAGER::CHAT_PERSONAL_OPTION);
if(pDlg && pDlg->IsVisibleWindow())
{
pDlg->ShowWindow(FALSE);
}
pDlg = GET_DIALOG(IM_CHAT_MANAGER::CHAT_PROPERTY_DIALOG);
if (pDlg && pDlg->IsVisibleWindow())
{
pDlg->ShowWindow(FALSE);
}
if (pDlg && pDlg->IsVisibleWindow())
{
pDlg = GET_DIALOG(IM_CHAT_MANAGER::CHAT_MENU_DIALOG);
}
}