#include "StdAfx.h" #include "UNpcDlg.h" #include "../Utils/QuestDB.h" #include "../Utils/NpcTextDB.h" #include "../Network/PacketBuilder.h" #include "Network/NetworkManager.h" #include "UIGamePlay.h" #include "UISystem.h" #include "UNpcQuestDlg.h" #include "Player.h" #include "ObjectManager.h" #include "UMessageBox.h" UIMP_CLASS(UNpcDlg, UDialog); UBEGIN_MESSAGE_MAP(UNpcDlg, UDialog) UON_RED_URL_CLICKED(3, &UNpcDlg::OnURLClicked) UON_BN_CLICKED(0, &UNpcDlg::OnClickOK) UON_BN_CLICKED(1, &UNpcDlg::OnClickCancel) UEND_MESSAGE_MAP() UNpcDlg* g_NpcDlg = NULL; void UNpcDlg::StaticInit() { } UNpcDlg::UNpcDlg() { g_NpcDlg = this; m_pkTextCtrl = NULL; } UNpcDlg::~UNpcDlg() { } BOOL UNpcDlg::OnCreate() { if(!UDialog::OnCreate()) return FALSE; m_bCanDrag = FALSE; UScrollBar* pkScrollBar = (UScrollBar*)GetChildByID(2); if(pkScrollBar == NULL) return FALSE; pkScrollBar->SetBarShowMode(USBSM_FORCEON, USBSM_FORCEOFF); m_pkTextCtrl = (URichTextCtrl*)pkScrollBar->GetChildByID(3); if(m_pkTextCtrl == NULL) return FALSE; return TRUE; } void UNpcDlg::OnDestroy() { UDialog::OnDestroy(); } void UNpcDlg::OnClose() { CPlayerLocal::SetCUState(cus_Normal); ULOG( _TRAN("NPC对话(cus_Normal)") ); } void UNpcDlg::SetCUSNormal() { SetVisible(FALSE); //m_stMessage.CreatureGuid = 0; } void UNpcDlg::Close() { OnClose(); } BOOL UNpcDlg::OnEscape() { if (!UDialog::OnEscape()) { OnClose(); return TRUE; } return FALSE; } void UNpcDlg::OnTimer(float fDeltaTime) { if(!m_Visible) return; UDialog::OnTimer(fDeltaTime); //如果距离超过10M,自动关闭! if (m_stMessage.CreatureGuid != 0 && m_Visible) { CCreature* pCreature = (CCreature*)ObjectMgr->GetObject(m_stMessage.CreatureGuid); CPlayerLocal* pLocalPlayer = ObjectMgr->GetLocalPlayer(); if (pLocalPlayer == NULL || pCreature == NULL) { return ; }else { NiPoint3 pCreaturePos = pCreature->GetPosition(); NiPoint3 pLocalPlayerPos = pLocalPlayer->GetLocalPlayerPos(); if ((pLocalPlayerPos - pCreaturePos).Length() > MaxLenToNPC) { OnClose(); } } } } void UNpcDlg::OnClickOK() { CPlayerLocal::SetCUState(cus_Normal); ULOG( _TRAN("NPC对话(cus_Normal)") ); } void UNpcDlg::OnClickCancel() { OnClose(); } uint64 g_SetHomeCreatureID = 0; int g_SetIndex = 0; void SetHome() { PacketBuilder->SendNpcGossipSelectOptionMsg(g_SetHomeCreatureID, g_SetIndex); g_NpcDlg->Close(); } void CancelSet() { } void UNpcDlg::OnURLClicked(UNM* pNM) { URichEditURLClickNM* pREDURLNM = (URichEditURLClickNM*)pNM; const string strURL = pREDURLNM->pszURL; int iIndex = FindIndex(strURL); int id = FindTagNpcOrQuest(strURL); if(id == Tag_Close) { m_pkTextCtrl->SetText("", 0); OnClose(); } else if(id == Tag_Back) { }else if (id == Tag_MailList) { PacketBuilder->SendRequestMailList(); }else if (id == Tag_MailSend) { UInGame* pInGame = (UInGame*)SYState()->UI->GetDialogEX(DID_INGAME_MAIN); if (pInGame) { UInGame::GetFrame(FRAME_IG_MAILSENDDLG)->SetVisible(TRUE); } }else if(id == Tag_Npc && id != -1) { PacketBuilder->SendNpcGossipSelectOptionMsg(m_stMessage.CreatureGuid, iIndex); OnClose(); }else if(id == Tag_SetHome && id != -1) { g_SetHomeCreatureID = m_stMessage.CreatureGuid; g_SetIndex = iIndex; UMessageBox::MsgBox( _TRAN("是否将这里设置为您的新家?"), (BoxFunction*)SetHome, (BoxFunction*)CancelSet); }else if(id == Tag_Quest && id != -1) { if(m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_FINISHED || m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_REPEATABLE_FINISHED) { //UInGame* pkInGame = (UInGame*)SYState()->UI->GetDialogEX(DID_INGAME_MAIN); //UNpcQuestDlg * pNpcQuestDlg = NULL; //if (pkInGame) //{ // pNpcQuestDlg = INGAMEGETFRAME(UNpcQuestDlg,FRAME_IG_NPCQUESTDLG); // if (pNpcQuestDlg) // { // pNpcQuestDlg->SetQuestContent(m_stMessage.CreatureGuid, m_stMessage.vQuests[iIndex].quest_id); // pNpcQuestDlg->SetVisible(TRUE); // //PacketBuilder->SendQuestGiverCompleteQuestMsg(m_stMessage.CreatureGuid,m_stMessage.vQuests[iIndex].quest_id); // } //} PacketBuilder->SendQuestGiverCompleteQuestMsg(m_stMessage.CreatureGuid,m_stMessage.vQuests[iIndex].quest_id); //OnClose(); //UInGame* pkInGame = (UInGame*)SYState()->UI->GetDialogEX(DID_INGAME_MAIN); //UNpcQuestDlg * pNpcQuestDlg = NULL; //if (pkInGame) //{ // pNpcQuestDlg = INGAMEGETFRAME(UNpcQuestDlg,FRAME_IG_NPCQUESTDLG); // if (pNpcQuestDlg) // { // // } //} }else if (m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_NOT_AVAILABLE) { //显示任务详细信息 }else if (m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_AVAILABLE || m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_REPEATABLE || m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_NOT_FINISHED) { UInGame* pkInGame = (UInGame*)SYState()->UI->GetDialogEX(DID_INGAME_MAIN); UNpcQuestDlg * pNpcQuestDlg = NULL; if (pkInGame) { pNpcQuestDlg = INGAMEGETFRAME(UNpcQuestDlg,FRAME_IG_NPCQUESTDLG); if (pNpcQuestDlg) { //pNpcQuestDlg->SetNpcHead(m_stMessage.CreatureGuid); if(m_stMessage.vQuests[iIndex].stat == QMGR_QUEST_NOT_FINISHED) { pNpcQuestDlg->SetNpcHead(m_stMessage.CreatureGuid); pNpcQuestDlg->SetDlgByRequestItems(m_stMessage.vQuests[iIndex].quest_id); //pNpcQuestDlg->SetVisible(TRUE); } else { pNpcQuestDlg->OnQuest(m_stMessage, iIndex); //pNpcQuestDlg->SetVisible(TRUE); } } } } } } void UNpcDlg::OnNetmessage(MSG_S2C::stNPC_Gossip_Message& stMessage) { m_stMessage = stMessage; SetContentNpcDlg(); AddContentByQuest(); // string str = "
"; // str.append(_TRAN("再见")); // str += "
"; // m_pkTextCtrl->AppendText(str.c_str(), str.length(), TRUE); //SetNpcHead(); CPlayerLocal::SetCUState(cus_NPC); } //void UNpcDlg::SetNpcHead() //{ // CCreature* pkNPC = (CCreature*)ObjectMgr->GetObject(m_stMessage.CreatureGuid); // UBitmap* pkHead = (UBitmap*)GetChildByID(4); // // if (pkNPC) // { // ui32 guid = pkNPC->GetUInt32Value(OBJECT_FIELD_ENTRY); // char strFile[255]; // // if (guid) // { // NiSprintf(strFile,255,"Data\\UI\\Icon\\Monster\\Icon_%d.png" ,guid); // } // if (strFile) // { // if (pkHead) // { // pkHead->SetBitMapByStr(strFile); // return; // } // } // // } //} //const string UNpcDlg::QuestStateToString(ui32 uiQuestState) //{ // std::string str = ""; // switch(uiQuestState) // { // case QMGR_QUEST_NOT_AVAILABLE: // str = "任务未激活"; // break; // case QMGR_QUEST_AVAILABLE: // str = "任务可接受"; // break; // case QMGR_QUEST_FINISHED: // str = "任务可完成"; // break; // case QMGR_QUEST_REPEATABLE_FINISHED: // str = "任务已完成"; // break; // } // // return str; //} void UNpcDlg::SetContentNpcDlg() { NIASSERT(m_pkTextCtrl); m_pkTextCtrl->SetText("", 1); // 填写标题 std::string strText = ""; if(!g_pkNpcTex->GetNpcText(m_stMessage.TextId, strText)) { if (!g_pkNpcTex->GetNpcText(2, strText)) { return; } } strText = "
" + strText; m_pkTextCtrl->SetText(strText.c_str(), strText.length()); m_pkTextCtrl->FormatContent(); for(unsigned int ui = 0; ui < m_stMessage.vMenuItems.size(); ++ui) { char szTxt[1024]; if( m_stMessage.vMenuItems[ui].Text.compare(_TRAN("将这里设为你的家")) == 0) { NiSprintf(szTxt, 1024, "
%s ",ui, (m_stMessage.vMenuItems[ui].Text.c_str())); m_pkTextCtrl->AppendText(szTxt, strlen(szTxt), TRUE); continue; } NiSprintf(szTxt, 1024, "
%s ",ui, _TRAN(m_stMessage.vMenuItems[ui].Text.c_str(), true)); m_pkTextCtrl->AppendText(szTxt, strlen(szTxt), TRUE); } } void UNpcDlg::AddContentByQuest() { for(unsigned int ui = 0; ui < m_stMessage.vQuests.size(); ui++) { char sTemp[1024]; //ui NiSprintf(sTemp, 1024, "
%s (%s)", QuestStateToImage(m_stMessage.vQuests[ui].stat).c_str(),ui, /*UTF8ToAnis*/_TRAN((m_stMessage.vQuests[ui].title).c_str()), QuestStateToString(m_stMessage.vQuests[ui].stat).c_str()); m_pkTextCtrl->AppendText(sTemp, strlen(sTemp), TRUE); } } const string UNpcDlg::QuestStateToImage(ui32 uiQuestState) { std::string str = "TalkMask.png"; switch(uiQuestState) { case QMGR_QUEST_NOT_AVAILABLE: str = "UnAativeQ.png"; break; case QMGR_QUEST_AVAILABLE: case QMGR_QUEST_REPEATABLE: str = "CanQ.png"; break; case QMGR_QUEST_FINISHED: case QMGR_QUEST_REPEATABLE_FINISHED: str = "FinishQ.png"; break; case QMGR_QUEST_NOT_FINISHED: str = "DoQ.png"; break; } return str; } const string UNpcDlg::QuestStateToString(ui32 uiQuestState) { std::string str = ""; switch(uiQuestState) { case QMGR_QUEST_NOT_AVAILABLE: str = _TRAN("未激活"); break; case QMGR_QUEST_AVAILABLE: case QMGR_QUEST_REPEATABLE: str = _TRAN("可接受"); break; case QMGR_QUEST_FINISHED: str = _TRAN("可交付"); break; case QMGR_QUEST_REPEATABLE_FINISHED: str = _TRAN("可交付"); break; case QMGR_QUEST_NOT_FINISHED: str = _TRAN("进行中"); break; default: str = _TRAN("已完成"); break; } return str; } int UNpcDlg::FindTagNpcOrQuest(const string& str) { if (str == "#quest_npc_colse") { return Tag_Close; } if (str == "#quest_npc_back") { return Tag_Back; } if (str == "#listMail") { return Tag_MailList; } if (str == "#sendMail") { return Tag_MailSend; } if (str.find("#Q_") >= 0 && str.find("#Q_") < str.length()) { return Tag_Quest; } if (str.find("#N_") >=0 && str.find("#N_") < str.length()) { return Tag_Npc; } if (str.find("#R_") >=0 && str.find("#R_") < str.length()) { return Tag_Reward; } if (str.find("#H_") >=0 && str.find("#H_") < str.length()) { return Tag_SetHome; } return Tag_Invlaid; } int UNpcDlg::FindIndex(const string& str) { int index = -1; string strIndex; if (FindTagNpcOrQuest(str) == Tag_Npc || FindTagNpcOrQuest(str) == Tag_Quest || FindTagNpcOrQuest(str) == Tag_Reward || FindTagNpcOrQuest(str) == Tag_SetHome ) { strIndex = str.substr(3,str.length()); // 标识符为 Q_,N_.从第2为开始就是index; index = atoi(strIndex.c_str()); } return index; }