DragonNest/Server/DNVillageServer/DNNpcObject.cpp

104 lines
2.8 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#include "StdAfx.h"
#include "DNNpcObject.h"
#include "DNQuest.h"
#include "DNQuestManager.h"
#include "DNUserSession.h"
#include "DNUserSessionManager.h"
#include "VarArg.h"
CDNNpcObject::CDNNpcObject(void)
{
m_NpcType = ActorNpc;
}
CDNNpcObject::~CDNNpcObject(void)
{
}
bool CDNNpcObject::EnterWorld()
{
return CDNBaseObject::EnterWorld();
}
bool CDNNpcObject::LeaveWorld()
{
return CDNBaseObject::LeaveWorld();
}
bool CDNNpcObject::InitObject(WCHAR *pName, UINT nUID, int nChannelID, int nMapIndex, TPosition *pCurPos)
{
return CDNBaseObject::InitObject(pName, nUID, nChannelID, nMapIndex, pCurPos);
}
bool CDNNpcObject::FinalObject()
{
return CDNBaseObject::FinalObject();
}
int CDNNpcObject::FieldProcess(CDNBaseObject *pSender, USHORT wMsg, TBaseData *pSenderData, TParamData *pParamData)
{
return CDNBaseObject::FieldProcess(pSender, wMsg, pSenderData, pParamData);
}
void CDNNpcObject::DoUpdate(DWORD CurTick)
{
}
bool CDNNpcObject::CreateNpc(TNpcData *pNpcData, char *pName, UINT nUID, int nChannelID, int nMapIndex, TPosition *pCurPos, float fRotate)
{
memset(&m_NpcData, 0, sizeof(TNpcData));
memcpy(&m_NpcData, pNpcData, sizeof(TNpcData));
InitObject(NULL, nUID, nChannelID, nMapIndex, pCurPos);
MultiByteToWideChar(CP_ACP, 0, pName, -1, m_BaseData.wszName, NAMELENMAX);
m_BaseData.fRotate = fRotate;
CDnNpc::Create(pNpcData);
EnterWorld();
return true;
}
bool CDNNpcObject::Talk(CDNUserBase* pUserBase, UINT nNpcUniqueID, IN std::wstring& wszIndex, IN std::wstring& wszTarget)
{
CDNUserSession* pUserSession = static_cast<CDNUserSession*>(pUserBase);
std::transform(wszTarget.begin(), wszTarget.end(), wszTarget.begin(), towlower);
TALK_MAP_IT iter = m_TalkMap.find(wszTarget);
// npc <20><>ũ<EFBFBD><C5A9> <20>ƴ϶<C6B4><CFB6><EFBFBD>
if ( iter == m_TalkMap.end() )
{
// <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
CDNQuest* pQuest = g_pQuestManager->GetQuest(wszTarget);
if ( !pQuest )
{
g_Log.Log(LogType::_ERROR, pUserSession, L"[CS_NPCTALK] (5-2) UID:%d, PAK:%d/%s/%s\n", pUserSession->GetObjectID(), nNpcUniqueID, wszIndex.c_str(), wszIndex.c_str());
return false;
}
pUserSession->SetCalledNpcResponse(false, false);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ontalk <20><><EFBFBD><EFBFBD>
return pQuest->OnTalk(pUserSession->GetObjectID(), m_BaseData.nObjectID, wszIndex, wszTarget);
}
pUserSession->SetCalledNpcResponse(false, false);
TALK_MAP_IT aIt = m_TalkMap.find(wszTarget);
if (m_TalkMap.end() == aIt) {
USES_CONVERSION;
DN_ASSERT(0, CVarArgA<128>("Invalid! -> m_TalkMap.end() == aIt : NpcUniqueID(%d), wszIndex(%s), wszTarget(%s)", nNpcUniqueID, CW2CT(wszIndex.c_str()), CW2CT(wszTarget.c_str())));
return false;
}
CDNTalk* pTalk = aIt->second;
DN_ASSERT(NULL != pTalk, CVarArgA<128>("Invalid! -> NULL == pTalk"));
return pTalk->OnTalk(pUserSession->GetObjectID(), m_BaseData.nObjectID, wszIndex, wszTarget);
}