2024-12-21 10:04:04 +08:00
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "DNScriptAPICommon.h"
|
|
|
|
|
|
#include "DnLuaAPIDefine.h"
|
|
|
|
|
|
#include "DNGameDataManager.h"
|
|
|
|
|
|
#include "DNQuestManager.h"
|
|
|
|
|
|
#include "DNUserSession.h"
|
|
|
|
|
|
#include "DNNpc.h"
|
|
|
|
|
|
#include "DNReplaceString.h"
|
|
|
|
|
|
#include "EtUIXML.h"
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
#include "ReputationSystemRepository.h"
|
|
|
|
|
|
#include "NpcReputationProcessor.h"
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
|
|
|
|
|
|
#include "DNQuest.h"
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
#include "DnPlayerActor.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_VILLAGESERVER) && defined( PRE_DRAGONBUFF )
|
|
|
|
|
|
#include "DNUserSessionManager.h"
|
|
|
|
|
|
#include "DNMasterConnection.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
extern CLog g_ScriptLog;
|
|
|
|
|
|
|
|
|
|
|
|
namespace DNScriptAPI
|
|
|
|
|
|
{
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> Ư<><C6AF> <20>Կ<F3BDBDB7> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __SetBlankInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], const TItem& Item, int iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 != Item.nItemID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < Item.wCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(-1 < iIndex, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if (pTempInven[iIndex].nItemID != 0) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pTempInven[iIndex].Set( Item.nItemID, Item.wCount, Item.bSoulbound, Item.cSealCount );
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20>Ե鿡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __SetBlankInventorySlotCount(TInvenItemCnt pTempInven[INVENTORYMAX], const TItem& Item, int nOverlapCount, int nCount /* ä<><C3A4> <20><><EFBFBD><EFBFBD><D4B0><EFBFBD> */)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 != Item.nItemID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < Item.wCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < nOverlapCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < nCount, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
// !!! <20><><EFBFBD><EFBFBD> - <20><> <20>Լ<EFBFBD> ȣ<><C8A3> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9> Ȯ<><C8AE><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κи<CEBA> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
int nBundle = Item.wCount / nOverlapCount;
|
|
|
|
|
|
int nRemain = Item.wCount % nOverlapCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 0 ; INVENTORYMAX > iIndex ; ++iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (0 < nBundle) {
|
|
|
|
|
|
if (pTempInven[iIndex].nItemID == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
pTempInven[iIndex].Set( Item.nItemID, nOverlapCount, Item.bSoulbound, Item.cSealCount );
|
|
|
|
|
|
--nBundle;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (0 < nRemain)
|
|
|
|
|
|
{
|
|
|
|
|
|
if( CDNUserItem::bIsSameItem( &Item, &pTempInven[iIndex] ) && nOverlapCount >= pTempInven[iIndex].wCount + nRemain )
|
|
|
|
|
|
{
|
|
|
|
|
|
pTempInven[iIndex].wCount += nRemain;
|
|
|
|
|
|
nRemain = 0;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (0 < nBundle)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (0 < nRemain)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int iIndex = 0 ; INVENTORYMAX > iIndex ; ++iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pTempInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
pTempInven[iIndex].Set( Item.nItemID, nRemain, Item.bSoulbound, Item.cSealCount );
|
|
|
|
|
|
nRemain = 0;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (0 < nRemain)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> Ư<><C6AF> <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __SetOverlapInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], const TItem& Item, int nOverlapCount, int iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 != Item.nItemID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < Item.wCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < nOverlapCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(-1 < iIndex, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if ( CDNUserItem::bIsDifferentItem( &Item, &pTempInven[iIndex] ) || nOverlapCount < pTempInven[iIndex].wCount + Item.wCount )
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pTempInven[iIndex].wCount += Item.wCount;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><EFBFBD> ã<><C3A3> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int __FindBlankInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 0 ; nTempInvenCount > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
return iIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><EFBFBD><F3BDBDB7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int __FindBlankInventorySlotCount(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
for (int iIndex = 0 ; nTempInvenCount > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
++nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> wCount <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> Index ã<><C3A3> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int __FindOverlapInventorySlot(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount, const TItem& Item)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if ((Item.nItemID <= 0) || (Item.wCount <= 0)) DN_RETURN(-1);
|
|
|
|
|
|
|
|
|
|
|
|
TItemData *pItemData = NULL;
|
|
|
|
|
|
for (int iIndex = 0 ; nTempInvenCount > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
// <20><>ĭ<EFBFBD≯<EFBFBD> <20>н<EFBFBD>
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pItemData = g_pDataManager->GetItemData(pTempInven[iIndex].nItemID);
|
|
|
|
|
|
if (!pItemData) continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (pItemData->nOverlapCount == 1) continue; // <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD>
|
|
|
|
|
|
if( CDNUserItem::bIsDifferentItem( &Item, &pTempInven[iIndex] ) ) continue; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
if (pItemData->nOverlapCount >= pTempInven[iIndex].wCount + Item.wCount) {
|
|
|
|
|
|
return iIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD> (P.S.> api_user_CheckInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __IsValidSpaceInventorySlotAndSet(TInvenItemCnt pTempInven[INVENTORYMAX], int nTempInvenCount, const TItem& Item )
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(CHECK_RANGE(nTempInvenCount, 0, INVENTORYMAX), "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if ((Item.nItemID <= 0) || (Item.wCount <= 0))
|
|
|
|
|
|
DN_RETURN(false);
|
|
|
|
|
|
|
|
|
|
|
|
TItemData *pItem = g_pDataManager->GetItemData(Item.nItemID);
|
|
|
|
|
|
if (!pItem) return false;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
if (ITEMTYPE_QUEST == pItem->nType) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
if (pItem->nOverlapCount == 1){ // <20><>ġ<EFBFBD><C4A1> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
nCount = __FindBlankInventorySlotCount(pTempInven, nTempInvenCount);
|
|
|
|
|
|
if (Item.wCount > nCount) {
|
|
|
|
|
|
// <20><EFBFBD><F3BDBDB7>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(__SetBlankInventorySlotCount(pTempInven, Item, 1, nCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20><EFBFBD><EEB0B3> <20><><EFBFBD><EFBFBD><EFBFBD>־ <20>Ű<EFBFBD><C5B0>Ⱦ<EFBFBD><C8BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>츸 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
if (pItem->nOverlapCount < Item.wCount){ // <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>纸<EFBFBD><E7BAB8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int nBundle = Item.wCount / pItem->nOverlapCount;
|
|
|
|
|
|
if ((Item.wCount % pItem->nOverlapCount) > 0) nBundle++;
|
|
|
|
|
|
|
|
|
|
|
|
nCount = __FindBlankInventorySlotCount(pTempInven, nTempInvenCount);
|
|
|
|
|
|
if (nBundle > nCount) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><EFBFBD><F3BDBDB7>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(__SetBlankInventorySlotCount(pTempInven, Item, pItem->nOverlapCount, nCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
int nBlank = __FindOverlapInventorySlot(pTempInven, nTempInvenCount, Item ); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20>ѹ濡 <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD>
|
|
|
|
|
|
if (nBlank < 0){
|
|
|
|
|
|
nBlank = __FindBlankInventorySlot(pTempInven, nTempInvenCount);
|
|
|
|
|
|
if (nBlank < 0) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(__SetBlankInventorySlot(pTempInven, Item, nBlank));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(__SetOverlapInventorySlot(pTempInven, Item, pItem->nOverlapCount, nBlank));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> Ư<><C6AF> <20>Կ<F3BDBDB7> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __SetBlankQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount, int iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 != nItemID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < wCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(-1 < iIndex, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID != 0) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pTempQuestInven[iIndex].Set(nItemID, wCount);
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20>Ե鿡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __SetBlankQuestInventorySlotCount(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount, int nOverlapCount, int nCount /* ä<><C3A4> <20><><EFBFBD><EFBFBD><D4B0><EFBFBD> */)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 != nItemID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < wCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < nOverlapCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < nCount, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
// !!! <20><><EFBFBD><EFBFBD> - <20><> <20>Լ<EFBFBD> ȣ<><C8A3> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9> Ȯ<><C8AE><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κи<CEBA> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
int nBundle = wCount / nOverlapCount;
|
|
|
|
|
|
int nRemain = wCount % nOverlapCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (0 < nBundle) {
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
pTempQuestInven[iIndex].Set(nItemID, nOverlapCount);
|
|
|
|
|
|
--nBundle;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (0 < nRemain) {
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID == nItemID &&
|
|
|
|
|
|
nOverlapCount >= pTempQuestInven[iIndex].wCount + nRemain
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
pTempQuestInven[iIndex].wCount += nRemain;
|
|
|
|
|
|
nRemain = 0;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (0 < nBundle) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (0 < nRemain) {
|
|
|
|
|
|
for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
pTempQuestInven[iIndex].Set(nItemID, nRemain);
|
|
|
|
|
|
nRemain = 0;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (0 < nRemain) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> Ư<><C6AF> <20><><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __SetOverlapQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount, int nOverlapCount, int iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 != nItemID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < wCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < nOverlapCount, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(-1 < iIndex, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID != nItemID ||
|
|
|
|
|
|
nOverlapCount < pTempQuestInven[iIndex].wCount + wCount
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pTempQuestInven[iIndex].wCount += wCount;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><EFBFBD><F3BDBDB7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD> ã<><C3A3> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int __FindBlankQuestInventorySlotCount(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX])
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
++nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><EFBFBD> ã<><C3A3> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int __FindBlankQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX])
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID == 0) {
|
|
|
|
|
|
return iIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> wCount <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> Index ã<><C3A3> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
int __FindOverlapQuestInventorySlot(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if ((nItemID <= 0) || (wCount <= 0)) DN_RETURN(-1);
|
|
|
|
|
|
|
|
|
|
|
|
bool boFlag = false;
|
|
|
|
|
|
TItemData *pQuestItem = NULL;
|
|
|
|
|
|
for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) {
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID == 0) continue; // <20><>ĭ<EFBFBD≯<EFBFBD> <20>н<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
pQuestItem = g_pDataManager->GetItemData(pTempQuestInven[iIndex].nItemID);
|
|
|
|
|
|
if (!pQuestItem) continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (pQuestItem->nOverlapCount == 1) continue; // <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD>
|
|
|
|
|
|
if (pTempQuestInven[iIndex].nItemID != nItemID) continue; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>
|
|
|
|
|
|
|
|
|
|
|
|
if (pQuestItem->nOverlapCount >= pTempQuestInven[iIndex].wCount + wCount){
|
|
|
|
|
|
return iIndex;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// desc : <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD> (P.S.> api_quest_CheckQuestInvenForAddItemList <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
|
bool __IsValidSpaceQuestInventorySlotAndSet(TQuestItemCnt pTempQuestInven[QUESTINVENTORYMAX], int nItemID, short wCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(NULL != pTempQuestInven, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if ((nItemID <= 0) || (wCount <= 0)) DN_RETURN(false);
|
|
|
|
|
|
|
|
|
|
|
|
TItemData *pItem = g_pDataManager->GetItemData(nItemID);
|
|
|
|
|
|
if (!pItem) return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (ITEMTYPE_QUEST != pItem->nType) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = 0;
|
|
|
|
|
|
if (pItem->nOverlapCount == 1){ // <20><>ġ<EFBFBD><C4A1> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
nCount = __FindBlankQuestInventorySlotCount(pTempQuestInven);
|
|
|
|
|
|
if (wCount > nCount) {
|
|
|
|
|
|
// <20><EFBFBD><F3BDBDB7>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(__SetBlankQuestInventorySlotCount(pTempQuestInven, nItemID, wCount, 1, nCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
else { // <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int nRemain = 0, nBlank = 0, nBundle = 0;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = __FindBlankQuestInventorySlotCount(pTempQuestInven); // <20><> <20><><EFBFBD><EFBFBD><D4B0><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
if (pItem->nOverlapCount >= wCount){
|
|
|
|
|
|
nRemain = wCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
nBundle = wCount / pItem->nOverlapCount;
|
|
|
|
|
|
nRemain = wCount % pItem->nOverlapCount;
|
|
|
|
|
|
|
|
|
|
|
|
if (nBundle > nCount) return false; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (nRemain > 0){
|
|
|
|
|
|
nBlank = __FindOverlapQuestInventorySlot(pTempQuestInven, nItemID, nRemain); // ¥<><C2A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD>
|
|
|
|
|
|
if (nBlank < 0){ // ¥<><C2A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if ((nBundle + 1) > nCount) return false; // <20><>ĭ<EFBFBD><C4AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD>...
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(__SetBlankQuestInventorySlotCount(pTempQuestInven, nItemID, wCount, pItem->nOverlapCount, nCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CheckInvenForQuestReward(CDNUserBase* pUser, const TQuestReward& QuestReward, const bool bSelectedArray[])
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
const CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem)
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
TInvenItemCnt TempInven[INVENTORYMAX];
|
|
|
|
|
|
::memset(TempInven, 0, sizeof(TempInven));
|
|
|
|
|
|
#if defined(PRE_PERIOD_INVENTORY)
|
|
|
|
|
|
for (int i = 0; i < INVENTORYTOTALMAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (i == pUserItem->GetInventoryCount()){
|
|
|
|
|
|
if (pUserItem->IsEnablePeriodInventory())
|
|
|
|
|
|
i = INVENTORYMAX;
|
|
|
|
|
|
else
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
#else // #if defined(PRE_PERIOD_INVENTORY)
|
|
|
|
|
|
for (int i = 0 ; i < INVENTORYMAX; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
#endif // #if defined(PRE_PERIOD_INVENTORY)
|
|
|
|
|
|
const TItem* pItem = pUserItem->GetInventory(i);
|
|
|
|
|
|
if (pItem)
|
|
|
|
|
|
TempInven[i].Set(pItem->nItemID, pItem->wCount, pItem->bSoulbound, pItem->cSealCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
UINT nUserObjectID = static_cast<CDNUserSession*>(pUser)->GetObjectID();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
UINT nUserObjectID = static_cast<CDNUserSession*>(pUser)->GetSessionID();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
bool bSelectedItems[QUESTREWARD_INVENTORYITEMMAX];
|
|
|
|
|
|
CopyMemory(bSelectedItems, bSelectedArray, sizeof(bSelectedItems));
|
|
|
|
|
|
if (QuestReward.cType == 1) // <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (<28><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < QUESTREWARD_INVENTORYITEMMAX; ++i)
|
|
|
|
|
|
bSelectedItems[i] = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < QUESTREWARD_INVENTORYITEMMAX; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!bSelectedItems[i])
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (QuestReward.ItemArray[i].nItemID <= 0 || QuestReward.ItemArray[i].nItemCount <= 0)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
TItem Item;
|
|
|
|
|
|
if (!CDNUserItem::MakeItemStruct(QuestReward.ItemArray[i].nItemID, Item))
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
|
|
|
|
|
|
Item.wCount = QuestReward.ItemArray[i].nItemCount;
|
|
|
|
|
|
if (!__IsValidSpaceInventorySlotAndSet(TempInven, pUserItem->GetInventoryCount(), Item))
|
|
|
|
|
|
return -4;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < MAX_QUEST_LEVEL_CAP_REWARD; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (QuestReward.LevelCapItemArray[i].nItemID <= 0 || QuestReward.LevelCapItemArray[i].nItemCount <= 0)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
TItem Item;
|
|
|
|
|
|
if (!CDNUserItem::MakeItemStruct(QuestReward.LevelCapItemArray[i].nItemID, Item))
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
|
|
|
|
|
|
Item.wCount = QuestReward.LevelCapItemArray[i].nItemCount;
|
|
|
|
|
|
if (!__IsValidSpaceInventorySlotAndSet(TempInven, pUserItem->GetInventoryCount(), Item))
|
|
|
|
|
|
return -4;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void api_npc_NextTalk(CDNUserBase* pUser, UINT nNpcObjectID, const char* szTalkIndex, const char* szTargetFile)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszTalkIndex[512] = {0,};
|
|
|
|
|
|
WCHAR wszTargetFile[512] = {0,};
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszTalkIndex, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szTalkIndex, -1, wszTalkIndex, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszTargetFile, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szTargetFile, -1, wszTargetFile, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>繮<EFBFBD><E7B9AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3>´<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ȱ<DBB5><C8B0><EFBFBD>..
|
|
|
|
|
|
TALK_PARAGRAPH& para = pUser->GetLastTalkParagraph();
|
|
|
|
|
|
bool bResult = g_pDataManager->GetTalkParagraph(std::wstring(wszTalkIndex), std::wstring(wszTargetFile), para);
|
|
|
|
|
|
if ( bResult == false )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
if (!g_pDataManager->CheckTalkAnswer(std::wstring(wszTalkIndex), std::wstring(wszTargetFile))) { // <20>ƽ<EFBFBD> <20><><EFBFBD><EFBFBD> talk_paragraph <20><><EFBFBD><EFBFBD> talk_answer <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>찡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD> <20><>ȿ<EFBFBD><C8BF>
|
|
|
|
|
|
pUser->SendNextTalkError();
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, true);
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<TalkParam>& talkParamList = pUser->GetTalkParamList();
|
|
|
|
|
|
pUser->NextTalk(nNpcObjectID, wszTalkIndex, wszTargetFile, talkParamList );
|
|
|
|
|
|
talkParamList.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void api_npc_NextScript(CDNUserBase* pUser, CDnNpc* pNpc, UINT nNpcObjectID, const char* szTalkIndex, const char* szTargetFile)
|
|
|
|
|
|
{
|
|
|
|
|
|
WCHAR wszTalkIndex[512];
|
|
|
|
|
|
WCHAR wszTargetFile[512];
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszTalkIndex, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szTalkIndex, -1, wszTalkIndex, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszTargetFile, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szTargetFile, -1, wszTargetFile, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>繮<EFBFBD><E7B9AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3>´<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۵Ȱ<DBB5><C8B0><EFBFBD>..
|
|
|
|
|
|
TALK_PARAGRAPH& para = pUser->GetLastTalkParagraph();
|
|
|
|
|
|
bool bResult = g_pDataManager->GetTalkParagraph(std::wstring(wszTalkIndex), std::wstring(wszTargetFile), para);
|
|
|
|
|
|
if ( bResult == false ) return;
|
|
|
|
|
|
|
|
|
|
|
|
bool& bSkipCheck = pUser->GetSkipParagraphCheck();
|
|
|
|
|
|
bSkipCheck = true;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, true);
|
|
|
|
|
|
|
|
|
|
|
|
pNpc->Talk(pUser, nNpcObjectID, std::wstring(wszTalkIndex), std::wstring(wszTargetFile) );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_SetParamString(CDNUserBase* pUser, const char* szParamKey, int nParamID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<TalkParam>& talkParamList = pUser->GetTalkParamList();
|
|
|
|
|
|
|
|
|
|
|
|
if ( talkParamList.size() > 10 ) return -2;
|
|
|
|
|
|
std::wstring wszParam;
|
|
|
|
|
|
ToWideString(std::string(szParamKey), wszParam);
|
|
|
|
|
|
|
|
|
|
|
|
TalkParam talkparam;
|
|
|
|
|
|
ZeroMemory(&talkparam, sizeof(TalkParam));
|
|
|
|
|
|
talkparam.cType = TalkParam::STRING;
|
|
|
|
|
|
_wcscpy(talkparam.wszKey, _countof(talkparam.wszKey), wszParam.c_str(), (int)wcslen(wszParam.c_str()));
|
|
|
|
|
|
talkparam.nValue = nParamID;
|
|
|
|
|
|
|
|
|
|
|
|
talkParamList.push_back(talkparam);
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_SetParamInt(CDNUserBase* pUser, const char* szParamKey, int nValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<TalkParam>& talkParamList = pUser->GetTalkParamList();
|
|
|
|
|
|
|
|
|
|
|
|
if ( talkParamList.size() > 10 ) return -2;
|
|
|
|
|
|
std::wstring wszParam;
|
|
|
|
|
|
ToWideString(std::string(szParamKey), wszParam);
|
|
|
|
|
|
|
|
|
|
|
|
TalkParam talkparam;
|
|
|
|
|
|
ZeroMemory(&talkparam, sizeof(TalkParam));
|
|
|
|
|
|
talkparam.cType = TalkParam::INT;
|
|
|
|
|
|
_wcscpy(talkparam.wszKey, _countof(talkparam.wszKey), wszParam.c_str(), (int)wcslen(wszParam.c_str()));
|
|
|
|
|
|
talkparam.nValue = nValue;
|
|
|
|
|
|
|
|
|
|
|
|
talkParamList.push_back(talkparam);
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void api_log_AddLog(const char* szLog)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if !defined(_FINAL_BUILD)
|
|
|
|
|
|
WCHAR wszMsg[512];
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszMsg, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szLog, -1, wszMsg, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
g_ScriptLog.Log(LogType::_FILELOG, wszMsg);
|
|
|
|
|
|
#endif //#if !defined(_FINAL_BUILD)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void api_log_UserLog(CDNUserBase* pUser, const char* szLog)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if !defined(_FINAL_BUILD)
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszMsg[512]={0,};
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszMsg, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szLog, -1, wszMsg, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wszString;
|
|
|
|
|
|
wszString = wszMsg;
|
|
|
|
|
|
static_cast<CDNUserSession*>(pUser)->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
|
|
|
|
|
#endif //#if !defined(_FINAL_BUILD)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
desc : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|
|
|
|
|
param :
|
|
|
|
|
|
return : void
|
|
|
|
|
|
*/
|
|
|
|
|
|
void api_quest_DumpQuest(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if !defined(_FINAL_BUILD)
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<TQuest> QuestList;
|
|
|
|
|
|
pUser->GetQuest()->DumpQuest(QuestList);
|
|
|
|
|
|
|
|
|
|
|
|
for ( size_t i = 0 ; i < QuestList.size() ; i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
TQuest& quest = QuestList[i];
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wszString;
|
|
|
|
|
|
wszString = FormatW( L"[Slot:%d] QID:%d Type:%d QStep:%d JStep:%d Marking:%d\n", i,
|
|
|
|
|
|
(int)quest.nQuestID, g_pQuestManager->GetQuestType(quest.nQuestID), (int)quest.nQuestStep, (int)quest.cQuestJournal,
|
|
|
|
|
|
(!quest.nQuestID)?(0):(pUser->GetQuest()->IsClearQuest(quest.nQuestID))
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
static_cast<CDNUserSession*>(pUser)->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#if !defined(_FINAL_BUILD)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_AddHuntingQuest(CDNUserBase* pUser, int nQuestID, int nQuestStep, int nJournalStep, int nCountingSlot, int nCountingType, int nCountingIndex, int nTargetCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->AddHuntingQuest(nQuestID, nQuestStep, nJournalStep, nCountingSlot, nCountingType, nCountingIndex, nTargetCnt);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// nQuestType : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
int api_quest_AddQuest(CDNUserBase* pUser, int nQuestID, int nQuestType)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->AddQuest(nQuestID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_CompleteQuest(CDNUserBase* pUser, int nQuestID, bool bDelPlayList)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD>
|
|
|
|
|
|
int nReturn = pUser->GetQuest()->RewardAfterCompletingQuest(nQuestID, bDelPlayList);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
|
|
|
|
|
|
pUser->GetQuest()->ResetRewardFlag();
|
|
|
|
|
|
|
|
|
|
|
|
return nReturn;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_IsMarkingCompleteQuest(CDNUserBase* pUser, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return (pUser->GetQuest()->IsClearQuest(nQuestID)) ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_UserHasQuest(CDNUserBase* pUser, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->HasQuest(nQuestID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_GetPlayingQuestCnt(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->GetPlayingQuestCount();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_GetNpcIndex(CDnNpc* pNpc)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pNpc)
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return pNpc->GetNpcData()->nNpcID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_SetQuestStepAndJournalStep(CDNUserBase* pUser, int nQuestID, short nQuestStep, int nJournalStep)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if ( nJournalStep < 0 || nJournalStep > 255 )
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->SetQuestStepAndJournalStep(nQuestID, nQuestStep, nJournalStep, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_SetQuestStep(CDNUserBase* pUser, int nQuestID, short nQuestStep)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->SetQuestStep(nQuestID, nQuestStep);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_GetQuestStep(CDNUserBase* pUser, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->GetQuestStep(nQuestID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_SetJournalStep(CDNUserBase* pUser, int nQuestID, int nJournalStep)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if ( nJournalStep < 0 || nJournalStep > 255 )
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->SetJournalStep(nQuestID, nJournalStep);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_GetJournalStep(CDNUserBase* pUser, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->GetJournalStep(nQuestID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_SetQuestMemo(CDNUserBase* pUser, int nQuestID, char nMemoIndex, int iVal)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (QUESTMEMOREWARDCHECK == nMemoIndex) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
DN_RETURN(-3);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!CHECK_RANGE(nMemoIndex, 1, QUESTMEMOMAX)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (1~10)
|
|
|
|
|
|
DN_RETURN(-3);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->SetQuestMemo(nQuestID, nMemoIndex-1, iVal);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_GetQuestMemo(CDNUserBase* pUser, int nQuestID, char nMemoIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
if (!CHECK_RANGE(nMemoIndex, 1, QUESTMEMOMAX)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (1~10)
|
|
|
|
|
|
DN_RETURN(-3);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->GetQuestMemo(nQuestID, nMemoIndex-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_SetCountingInfo(CDNUserBase* pUser, int nQuestID, int nSlot, int nCountingType, int nCountingIndex, int nTargetCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->SetCountingInfo(nQuestID, nSlot, nCountingType, nCountingIndex, nTargetCnt);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_ClearCountingInfo(CDNUserBase* pUser, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->ClearCountingInfo(nQuestID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_IsAllCompleteCounting(CDNUserBase* pUser, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->IsAllCompleteCounting(nQuestID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_CheckInvenForAddItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TItem ResultItem;
|
|
|
|
|
|
if( CDNUserItem::MakeItemStruct( nItemIndex, ResultItem ) == false )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
// <20>ϴ<EFBFBD><CFB4><EFBFBD> <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (!pUserItem->IsValidSpaceInventorySlot(nItemIndex, nItemCnt, ResultItem.bSoulbound, ResultItem.cSealCount, ResultItem.bEternity))
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_ITEM_INVENTORY_NOTENOUGH);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_CheckInvenForAddItemList(CDNUserBase* pUser, lua_tinker::table ItemTable)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TInvenItemCnt TempInven[INVENTORYMAX];
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
::memset(TempInven, 0, sizeof(TempInven));
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 0 ; INVENTORYMAX > iIndex ; ++iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
const TItem* pItem = pUserItem->GetInventory(iIndex);
|
|
|
|
|
|
if (pItem)
|
|
|
|
|
|
{
|
|
|
|
|
|
TempInven[iIndex].Set(pItem->nItemID, pItem->wCount, pItem->bSoulbound, pItem->cSealCount );
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
TempInven[iIndex].Reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (0 >= ItemTable.getSize())
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ?
|
|
|
|
|
|
DN_RETURN(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 1 ; ItemTable.getSize() >= iIndex ; ++iIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
lua_tinker::table pTable = ItemTable.get<lua_tinker::table>(iIndex);
|
|
|
|
|
|
if (0 >= pTable.getSize())
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TItem Item;
|
|
|
|
|
|
if( CDNUserItem::MakeItemStruct( pTable.get<int>(1), Item ) == false )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
Item.wCount = pTable.get<int>(2);
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = __IsValidSpaceInventorySlotAndSet(TempInven, pUserItem->GetInventoryCount(), Item ); // RandomSeed <20><> <20><EFBFBD><EEB6BB> ?
|
|
|
|
|
|
if (!bResult)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_ITEM_INVENTORY_NOTENOUGH);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_AddItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
int nResult = api_user_CheckInvenForAddItem(pUser, nItemIndex, nItemCnt);
|
|
|
|
|
|
|
|
|
|
|
|
if ( nResult < 0 )
|
|
|
|
|
|
return nResult;
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = pUserItem->AddInventoryByQuest(nItemIndex, nItemCnt, nQuestID, 0); // <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> randomseed <20><> <20><EFBFBD><EEB6BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽñ<D6BD>!
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
if ( bResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#ifndef _FINAL_BUILD
|
|
|
|
|
|
#endif //#if defined (_VILLAGESERVER)
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
TItem ResultItem;
|
|
|
|
|
|
if( CDNUserItem::MakeItemStruct(nItemIndex, ResultItem) == false )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
// <20>ϴ<EFBFBD><CFB4><EFBFBD> <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if ( !pUserItem->IsValidSpaceInventorySlot(nItemIndex, nItemCnt, ResultItem.bSoulbound, ResultItem.cSealCount, ResultItem.bEternity ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = pUserItem->AddInventoryByQuest(nItemIndex, nItemCnt, nQuestID, 0); // <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> randomseed <20><> <20><EFBFBD><EEB6BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽñ<D6BD>!
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( PRE_ENABLE_QUESTCHATLOG )
|
|
|
|
|
|
if ( bResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ӽ÷<D3BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined( PRE_ENABLE_QUESTCHATLOG )
|
|
|
|
|
|
#endif //#if defined (_GAMESERVER)
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_DelItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetInventoryItemCount(nItemIndex);
|
|
|
|
|
|
if ( nCount < nItemCnt )
|
|
|
|
|
|
{
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = pUserItem->DeleteInventoryByQuest(nItemIndex, nItemCnt, nQuestID);
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
if ( bResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
#if defined (PRE_ENABLE_QUESTCHATLOG)
|
|
|
|
|
|
if ( bResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_AllDelItem(CDNUserBase* pUser, int nItemIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetInventoryItemCount(nItemIndex);
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = pUserItem->DeleteInventoryByQuest(nItemIndex, nCount, 0);
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
if ( bResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nCount );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nCount );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
#if defined (PRE_ENABLE_QUESTCHATLOG)
|
|
|
|
|
|
if ( bResult )
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : id %d count : %d" , nItemIndex, nItemCnt );
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_HasItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetInventoryItemCount(nItemIndex);
|
|
|
|
|
|
if (nCount < nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetUserClassID(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return int(pUser->GetClassID());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetUserJobID(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetUserJob();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetUserLevel(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return int(pUser->GetLevel());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetUserInvenBlankCount(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return pUserItem->FindBlankInventorySlotCount();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_GetUserQuestInvenBlankCount(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return pUserItem->FindBlankQuestInventorySlotCount();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_PlayCutScene(CDNUserBase* pUser, UINT nNpcObjectID, int nCutSceneTableID, bool bIgnoreFadeIn)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
DNTableFileFormat* pSox = GetDNTable( CDnTableDB::TCUTSCENE );
|
|
|
|
|
|
if( pSox->IsExistItem( nCutSceneTableID ) == false ) {
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>. : %d", nCutSceneTableID);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
std::string szFileName = pSox->GetFieldFromLablePtr( nCutSceneTableID, "_FileName" )->GetString();
|
|
|
|
|
|
WCHAR wszMsg[512];
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(&wszMsg, sizeof(WCHAR)*512);
|
|
|
|
|
|
MultiByteToWideChar(CP_ACP, 0, szFileName.c_str(), -1, wszMsg, 512 );
|
|
|
|
|
|
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> %s : ", wszMsg);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendPlayCutScene( nCutSceneTableID,-1, -1, nNpcObjectID, !bIgnoreFadeIn, UINT_MAX );
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenWareHouse(CDNUserBase* pUser, int iItemID/*=0*/ )
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"â<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendShowWarehouse( iItemID );
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (PRE_MOD_GAMESERVERSHOP)
|
|
|
|
|
|
int api_ui_OpenShop(CDNUserBase* pUser, int nShopID, Shop::Type::eCode Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
TShopData *pShopData = g_pDataManager->GetShopData(nShopID);
|
|
|
|
|
|
if ( !pShopData )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( false == g_pDataManager->IsCombinedShop( nShopID ) )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_REMOTE_OPENSHOP)
|
|
|
|
|
|
pUser->m_bRemoteShopOpen = false;
|
|
|
|
|
|
#endif // #if defined(PRE_ADD_REMOTE_OPENSHOP)
|
|
|
|
|
|
pUser->m_nShopID = nShopID;
|
|
|
|
|
|
pUser->SendShopOpen(nShopID,Type);
|
|
|
|
|
|
pUser->SetShopType( Type );
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenSkillShop(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
//std::wstring wszLog;
|
|
|
|
|
|
//wszLog = FormatW( L"<22><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
//pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendSkillShopOpen();
|
|
|
|
|
|
|
|
|
|
|
|
//TSkillShopData *pShopData = g_pDataManager->GetSkillShopData(nSkillShopID);
|
|
|
|
|
|
//if ( !pShopData )
|
|
|
|
|
|
// return -2;
|
|
|
|
|
|
//
|
|
|
|
|
|
//pUser->m_nShopID = nSkillShopID;
|
|
|
|
|
|
//pUser->SendSkillShopList(pShopData);
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenCompoundEmblem(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD>庸<EFBFBD><EFBFBD> <20>ռ<EFBFBD> â<><C3A2><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenCompoundEmblem();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenUpgradeJewel(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenUpdagrageJewel();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenGlyphLift(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ( !pUser )
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>â <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenGlyphLift();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenMailBox(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenMailBox();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenDisjointItem(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.\r\n");
|
|
|
|
|
|
pUser->SendChat( CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str() );
|
|
|
|
|
|
#endif // _FINAL_BUILD
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>â <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
pUser->SendOpenDisjointItem();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenCompoundItem(CDNUserBase* pUser, int nCompoundShopID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD>â <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenCompoundItem(nCompoundShopID);
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenCashShop(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"ij<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenCashShop();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenGuildMgrBox(CDNUserBase* pUser, int nGuildMgrNo)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenGuildMgrBox(nGuildMgrNo);
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenGacha_JP(CDNUserBase* pUser, int nGachaShopID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef PRE_ADD_GACHA_JAPAN
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD>Ϻ<EFBFBD> <20><>í<EFBFBD><C3AD> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
TGachaponData_JP* pGachaData = g_pDataManager->GetGachaponData_JP( nGachaShopID );
|
|
|
|
|
|
if( !pGachaData )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->m_nGachaponShopID = nGachaShopID;
|
|
|
|
|
|
pUser->SendGachaShopOpen_JP( nGachaShopID );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
pUser->SetCalledNpcResponse( true, false );
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenGiveNpcPresent(CDNUserBase* pUser, int nNpcID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"NPC <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> UI <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> npc <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> UI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
pUser->SendOpenGiveNpcPresent( nNpcID );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> npc <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD>д<EFBFBD>. <20>̰<EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20><>ȭ <20><><EFBFBD>̾<EFBFBD><CCBE>αװ<CEB1> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
//pUser->SetCalledNpcResponse( true, false );
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenDonation(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (PRE_ADD_DONATION)
|
|
|
|
|
|
pUser->SendOpenDonation();
|
|
|
|
|
|
pUser->SetCalledNpcResponse( true, false );
|
|
|
|
|
|
#endif // #if defined (PRE_ADD_DONATION)
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenInventory(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenInventory();
|
|
|
|
|
|
pUser->SetCalledNpcResponse( true, false );
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_UserMessage(CDNUserBase* pUser, int nType, int nBaseStringIdx, lua_tinker::table ParamTable)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<DNReplaceString::DynamicReplaceStringInfo> ReplaceParamList;
|
|
|
|
|
|
// <20><><EFBFBD>̽<EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
|
|
std::wstring wszBaseString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nBaseStringIdx, pUser->m_eSelectedLanguage );
|
|
|
|
|
|
#else //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
|
|
std::wstring wszBaseString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nBaseStringIdx );
|
|
|
|
|
|
#endif //#if defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE> <20>ϰ<EFBFBD>
|
|
|
|
|
|
lua_tinker::table t = ParamTable.get<lua_tinker::table>(1);
|
|
|
|
|
|
const char* __szKey = t.get<const char*>(1);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if ( __szKey )
|
|
|
|
|
|
{
|
|
|
|
|
|
for ( int i = 1 ; i <= ParamTable.getSize() ; i++ )
|
|
|
|
|
|
{
|
|
|
|
|
|
lua_tinker::table pTable = ParamTable.get<lua_tinker::table>(i);
|
|
|
|
|
|
char* szKey = pTable.get<char*>(1);
|
|
|
|
|
|
int nValueType = pTable.get<int>(2);
|
|
|
|
|
|
int nValue = pTable.get<int>(3);
|
|
|
|
|
|
|
|
|
|
|
|
DNReplaceString::DynamicReplaceStringInfo param;
|
|
|
|
|
|
ToWideString(szKey, param.szKey);
|
|
|
|
|
|
param.cValueType = (char)nValueType;
|
|
|
|
|
|
param.nValue = nValue;
|
|
|
|
|
|
ReplaceParamList.push_back(param);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_SERVER) &&defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
|
|
g_ReplaceString.Relpace(wszBaseString, ReplaceParamList, pUser->m_eSelectedLanguage );
|
|
|
|
|
|
#else //#if defined(_SERVER) &&defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
|
|
g_ReplaceString.Relpace(wszBaseString, ReplaceParamList );
|
|
|
|
|
|
#endif //#if defined(_SERVER) &&defined(PRE_ADD_MULTILANGUAGE)
|
|
|
|
|
|
|
|
|
|
|
|
if ( wszBaseString.size() > 256)
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
|
|
|
|
|
|
switch(nType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case CHATTYPE_NORMAL:
|
|
|
|
|
|
case CHATTYPE_PARTY:
|
|
|
|
|
|
case CHATTYPE_PRIVATE:
|
|
|
|
|
|
case CHATTYPE_GUILD:
|
|
|
|
|
|
case CHATTYPE_CHANNEL:
|
|
|
|
|
|
case CHATTYPE_SYSTEM:
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendChat((eChatType)nType, (int)wszBaseString.size()*sizeof(WCHAR), L"", (WCHAR*)wszBaseString.c_str());
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_AddSymbolItem(CDNUserBase* pUser, int nItemID, short wCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
/*
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = false;
|
|
|
|
|
|
if (pUser->GetItem()->AddSymbolItem(nItemID, wCount, 0, ITEMLOG_ADDQUESTINVEN) == ERROR_NONE) bResult = true;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD> %s ID:%d %d<><64>" , bResult ? L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>":L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", nItemID, (int)wCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_DelSymbolItem(CDNUserBase* pUser, int nItemID, short wCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
/*
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = false;
|
|
|
|
|
|
if (pUser->GetItem()->DelSymbolItem(nItemID, wCount, 0, ITEMLOG_DELETEQUESTINVEN) == ERROR_NONE) bResult = true;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s ID:%d %d<><64>" , bResult ? L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>":L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", nItemID, (int)wCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_HasSymbolItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
/*
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->ExistSymbolItemCount(nItemIndex);
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȸ UserObjID: %d nItemID:%d %d<><64> %d<><64> <20><><EFBFBD><EFBFBD>" , nUserObjectID, nItemIndex, (int)nItemCnt, nCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (nCount < nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_CheckQuestInvenForAddItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
if (!pUserItem->IsValidSpaceQuestInventorySlot(nItemIndex, nItemCnt))
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
if (!pUserItem->IsValidSpaceQuestInventorySlot(nItemIndex, nItemCnt)) {
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_INVENTORY_NOTENOUGH);
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
int nResult = pUserItem->FindBlankQuestInventorySlotCount();
|
|
|
|
|
|
if (QUESTINVENBLANKCHECKMIN >= nResult) {
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_INVENTORY_ALMOSTFULL);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_CheckQuestInvenForAddItemList(CDNUserBase* pUser, lua_tinker::table ItemTable)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TQuestItemCnt TempQuestInven[QUESTINVENTORYMAX];
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮<EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
::memset(TempQuestInven, 0, sizeof(TempQuestInven));
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 0 ; QUESTINVENTORYMAX > iIndex ; ++iIndex) {
|
|
|
|
|
|
const TQuestItem* pQuestItem = pUserItem->GetQuestInventory(iIndex);
|
|
|
|
|
|
if (pQuestItem) {
|
|
|
|
|
|
TempQuestInven[iIndex].Set(pQuestItem->nItemID, pQuestItem->wCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
TempQuestInven[iIndex].Reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (0 >= ItemTable.getSize()) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ?
|
|
|
|
|
|
DN_RETURN(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (int iIndex = 1 ; ItemTable.getSize() >= iIndex ; ++iIndex) {
|
|
|
|
|
|
lua_tinker::table pTable = ItemTable.get<lua_tinker::table>(iIndex);
|
|
|
|
|
|
if (0 >= pTable.getSize()) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = __IsValidSpaceQuestInventorySlotAndSet(TempQuestInven, pTable.get<int>(1), pTable.get<int>(2));
|
|
|
|
|
|
if (!bResult) {
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_AddQuestItem(CDNUserBase* pUser, int nItemID, short wCount, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = false;
|
|
|
|
|
|
if (pUser->GetItem()->AddQuestInventory(nItemID, wCount, nQuestID, DBDNWorldDef::AddMaterializedItem::QuestReward) == ERROR_NONE) bResult = true;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD> %s ID:%d %d<><64>" , bResult ? L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>":L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", nItemID, (int)wCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return bResult ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_DelQuestItem(CDNUserBase* pUser, int nItemID, short wCount, int nQuestID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = false;
|
|
|
|
|
|
if (pUser->GetItem()->DeleteQuestInventory(nItemID, wCount, nQuestID, DBDNWorldDef::UseItem::Destroy) == ERROR_NONE) bResult = true;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s ID:%d %d<><64>" , bResult ? L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>":L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", nItemID, (int)wCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return bResult ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_AllDelQuestItem(CDNUserBase* pUser, int nItemID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
bool bResult = false;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetQuestInventoryItemCount(nItemID);
|
|
|
|
|
|
|
|
|
|
|
|
if (pUser->GetItem()->DeleteQuestInventory(nItemID, nCount, 0, DBDNWorldDef::UseItem::Destroy) == ERROR_NONE) bResult = true;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s ID:%d %d<><64>" , bResult ? L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>":L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", nItemID, (int)nCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return bResult ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_HasQuestItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetQuestInventoryItemCount(nItemIndex);
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
#if defined(_VILLAGESERVER)
|
|
|
|
|
|
UINT nUserID = static_cast<CDNUserSession*>(pUser)->GetObjectID();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_GAMESERVER)
|
|
|
|
|
|
UINT nUserID = static_cast<CDNUserSession*>(pUser)->GetSessionID();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȸ UserObjID: %d nItemID:%d %d<><64> %d<><64> <20><><EFBFBD><EFBFBD>" , nUserID, nItemIndex, (int)nItemCnt, nCount);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (nCount < nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenGuildCreate(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
// N/A
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenQuestReward(CDNUserBase* pUser, int nRewardTableIndex, bool bActivate)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenQuestReward(nRewardTableIndex, bActivate);
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_RewardQuestUser(CDNUserBase* pUser, int nRewardTableIndext, int nQuestID, int nRewardCheck)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD>
|
|
|
|
|
|
TQuestReward table;
|
|
|
|
|
|
bool bResult = g_pDataManager->GetQuestReward(nRewardTableIndext, table);
|
|
|
|
|
|
if (!bResult) {
|
|
|
|
|
|
return -4;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DN_ASSERT(0 < table.nQuestID, "Invalid!");
|
|
|
|
|
|
DN_ASSERT(0 < table.nQuestStep, "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if (table.nQuestStep != pUser->GetQuest()->GetQuestStep(table.nQuestID) || (table.nClass != 0 && table.nClass != pUser->GetClassID()))
|
|
|
|
|
|
{
|
|
|
|
|
|
return -5;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ZeroMemory(table.LevelCapItemArray, sizeof(table.LevelCapItemArray));
|
|
|
|
|
|
if (pUser->GetLevel() >= (int)CGlobalWeightTable::GetInstance().GetValue(CGlobalWeightTable::PlayerLevelLimit))
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNQuest* pQuest = g_pQuestManager->GetQuest(table.nQuestID);
|
|
|
|
|
|
if(!pQuest)
|
|
|
|
|
|
return -6;
|
|
|
|
|
|
|
|
|
|
|
|
if (pQuest->IsLevelCapReward())
|
|
|
|
|
|
{
|
|
|
|
|
|
const TQuestLevelCapReward* pLevelCapReward = g_pDataManager->GetQuestLevelCapReward(pQuest->GetQuestInfo().cQuestType, pUser->GetClassID());
|
|
|
|
|
|
if (!pLevelCapReward)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if !defined (_FINAL_BUILD)
|
|
|
|
|
|
wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>ĸ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><>ȸ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ƮID:%d Ÿ<><C5B8>:%d Ŭ<><C5AC><EFBFBD><EFBFBD>ID:%d ", table.nQuestID, pQuest->GetQuestInfo().cQuestType, pUser->GetClassID());
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif // #if !defined (_FINAL_BUILD)
|
|
|
|
|
|
return -7;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CopyMemory(table.LevelCapItemArray, pLevelCapReward->Items, sizeof(pLevelCapReward->Items));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pUser->GetQuest()) {
|
|
|
|
|
|
pUser->GetQuest()->SetReward(table, nQuestID, nRewardCheck);
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
#if defined (_VILLAGESERVER)
|
|
|
|
|
|
UINT nUserObjectID = static_cast<CDNUserSession*>(pUser)->GetObjectID();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
UINT nUserObjectID = static_cast<CDNUserSession*>(pUser)->GetSessionID();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
std::wstring wszMsg;
|
|
|
|
|
|
wszMsg = FormatW( L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>UserObjID: %d <20><><EFBFBD>̺<EFBFBD>ID:%d <20><><EFBFBD><EFBFBD>ƮIDL%d " ,
|
|
|
|
|
|
nUserObjectID, nRewardTableIndext, nQuestID);
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszMsg.size()*sizeof(WCHAR), L"", (WCHAR*)wszMsg.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetMapIndex(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetMapIndex();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetLastStageClearRank(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetLastStageClearRank();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_EnoughCoin(CDNUserBase* pUser, int nCoin)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if( pUser->GetCoin() < (INT64)nCoin )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_GetCoin(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return static_cast<int>(pUser->GetCoin());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_IsMissionGained(CDNUserBase* pUser, int nMissionIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ش<EFBFBD> <20>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
TMissionData *pData = g_pDataManager->GetMissionData(nMissionIndex);
|
|
|
|
|
|
if (!pData || !pData->bActivate) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
return(GetBitFlag(pUser->GetMissionData()->MissionGain, nMissionIndex));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_IsMissionAchieved(CDNUserBase* pUser, int nMissionIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
DN_ASSERT(CHECK_LIMIT(nMissionIndex, MISSIONMAX), "Invalid!");
|
|
|
|
|
|
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ش<EFBFBD> <20>̼<EFBFBD><CCBC><EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
TMissionData *pData = g_pDataManager->GetMissionData(nMissionIndex);
|
|
|
|
|
|
if (!pData || !pData->bActivate) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return(GetBitFlag(pUser->GetMissionData()->MissionAchieve, nMissionIndex));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_HasItemWarehouse(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
const CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetWarehouseItemCount(nItemIndex);
|
|
|
|
|
|
if (nCount < nItemCnt) {
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_HasItemEquip(CDNUserBase* pUser, int nItemIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
const CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = pUserItem->CheckEquipByItemID(nItemIndex);
|
|
|
|
|
|
if (!bResult) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_guild_GetGuildMemberRole(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (pUser->GetGuildSelfView().IsSet()) {
|
|
|
|
|
|
return(pUser->GetGuildSelfView().btGuildRole + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_IncQuestMemo(CDNUserBase* pUser, int nQuestID, char nMemoIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return LONG_MIN;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (!CHECK_RANGE(nMemoIndex, 1, QUESTMEMOMAX)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (1~10)
|
|
|
|
|
|
DN_RETURN(LONG_MIN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (QUESTMEMOREWARDCHECK == nMemoIndex) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
DN_RETURN(LONG_MIN);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->IncQuestMemo(nQuestID, nMemoIndex-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_DecQuestMemo(CDNUserBase* pUser, int nQuestID, char nMemoIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return LONG_MAX;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (!CHECK_RANGE(nMemoIndex, 1, QUESTMEMOMAX)) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (1~10)
|
|
|
|
|
|
DN_RETURN(LONG_MAX);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (QUESTMEMOREWARDCHECK == nMemoIndex) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
DN_RETURN(LONG_MAX);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return pUser->GetQuest()->DecQuestMemo(nQuestID, nMemoIndex-1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_SetUserJobID(CDNUserBase* pUser, int nJobID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (nJobID == pUser->GetUserJob()) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DNTableFileFormat* pJobTable = GetDNTable( CDnTableDB::TJOB );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谪<DCB0><E8B0AA> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
int iNowJob = pUser->GetUserJob();
|
|
|
|
|
|
int iNowJobDeep = 0;
|
|
|
|
|
|
int iNowRootJob = 0;
|
|
|
|
|
|
for( int i = 0; i < pJobTable->GetItemCount(); ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
int iItemID = pJobTable->GetItemID( i );
|
|
|
|
|
|
if( iItemID == iNowJob )
|
|
|
|
|
|
{
|
|
|
|
|
|
iNowJobDeep = pJobTable->GetFieldFromLablePtr( iItemID, "_JobNumber" )->GetInteger();
|
|
|
|
|
|
iNowRootJob = pJobTable->GetFieldFromLablePtr( iItemID, "_BaseClass" )->GetInteger();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ٲٱ<D9B2> <20><><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܰ谡 <20><><EFBFBD>ų<EFBFBD> ū<><C5AB> Ȯ<><C8AE>.
|
|
|
|
|
|
bool bSuccess = false;
|
|
|
|
|
|
map<int, int> mapRootJob;
|
|
|
|
|
|
for( int i = 0; i < pJobTable->GetItemCount(); ++i )
|
|
|
|
|
|
{
|
|
|
|
|
|
int iItemID = pJobTable->GetItemID( i );
|
|
|
|
|
|
if( iItemID == nJobID )
|
|
|
|
|
|
{
|
|
|
|
|
|
int iJobRootToChange = pJobTable->GetFieldFromLablePtr( iItemID, "_BaseClass" )->GetInteger();
|
|
|
|
|
|
if( iNowRootJob == iJobRootToChange )
|
|
|
|
|
|
{
|
|
|
|
|
|
int iJobDeepToChange = pJobTable->GetFieldFromLablePtr( iItemID, "_JobNumber" )->GetInteger();
|
|
|
|
|
|
if( iNowJobDeep < iJobDeepToChange )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>¾ƾ<C2BE> <20><>.
|
|
|
|
|
|
int iParentJobID = pJobTable->GetFieldFromLablePtr( iItemID, "_ParentJob" )->GetInteger();
|
|
|
|
|
|
if( iParentJobID == iNowJob )
|
|
|
|
|
|
{
|
|
|
|
|
|
pUser->SetUserJob( nJobID );
|
|
|
|
|
|
bSuccess = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ٲٰ<D9B2><D9B0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.!!\r\n");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
|
|
|
|
|
#endif // _FINAL_BUILD
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ʒ<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
wstring wszString = FormatW(L"<EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
|
|
|
|
|
#endif // _FINAL_BUILD
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ٲٰ<D9B2><D9B0><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD>ٲ<EFBFBD>.
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
wstring wszString = FormatW(L"<EFBFBD>ٸ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>!!\r\n");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
|
|
|
|
|
#endif // _FINAL_BUILD
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( false == bSuccess )
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
wstring wszString = FormatW(L"<EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> Job ID <20>Դϴ<D4B4>..\r\n");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszString.size()*sizeof(WCHAR), L"", (WCHAR*)wszString.c_str());
|
|
|
|
|
|
#endif // _FINAL_BUILD
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_IsJobInSameLine(CDNUserBase* pUser, int nBaseJobID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
DNTableFileFormat* pSox = GetDNTable(CDnTableDB::TJOB);
|
|
|
|
|
|
if (!pSox) {
|
|
|
|
|
|
g_Log.Log( LogType::_FILELOG, L"JobTable.ext failed\r\n");
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int nJobID = pUser->GetUserJob();
|
|
|
|
|
|
if (!pSox->IsExistItem(nJobID)) {
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
if (nBaseJobID == nJobID) {
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DNTableCell *pSoxField = pSox->GetFieldFromLablePtr(nJobID, "_ParentJob");
|
|
|
|
|
|
if (!pSoxField) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nJobID = pSoxField->GetInteger();
|
|
|
|
|
|
if (0 >= nJobID) {
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} while(1);
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_HasCashItem(CDNUserBase* pUser, int nItemIndex, int nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if ( !pUserItem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
int nCount = pUserItem->GetCashItemCountByItemID(nItemIndex);
|
|
|
|
|
|
if (nCount < nItemCnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -3;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_HasCashItemEquip(CDNUserBase* pUser, int nItemIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_CH)
|
|
|
|
|
|
if (pUser->GetFCMState() != FCMSTATE_NONE){
|
|
|
|
|
|
pUser->SendQuestResult(ERROR_QUEST_FCM);
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
const CDNUserItem* pUserItem = pUser->GetItem();
|
|
|
|
|
|
if (!pUserItem) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool bResult = pUserItem->IsEquipCashItemExist(nItemIndex);
|
|
|
|
|
|
if (!bResult) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_IncCounting(CDNUserBase* pUser, int nCountingType, int nCountingIndex)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->GetQuest()->OnCounting(nCountingType, nCountingIndex);
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_IsPlayingQuestMaximum(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
if (MAX_PLAY_QUEST <= pUser->GetQuest()->GetPlayingQuestCount()) {
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_ForceCompleteQuest(CDNUserBase* pUser, int nQuestID, int nQuestCode, int bDoMark, int bDoDelete, int bDoRepeat)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUserQuest* pQuest = pUser->GetQuest();
|
|
|
|
|
|
if (!pQuest) {
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int aRetVal = pQuest->ForceCompleteQuest(nQuestID, nQuestCode, bDoMark, bDoDelete, bDoRepeat);
|
|
|
|
|
|
if (1 != aRetVal) {
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return aRetVal;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_GetFavorPoint(CDNUserBase* pUser, int iNpcID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CReputationSystemRepository* pReputationSystem = pUser->GetReputationSystem();
|
|
|
|
|
|
if( !pReputationSystem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return static_cast<int>(pReputationSystem->GetNpcReputation( iNpcID, IReputationSystem::NpcFavor ));
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_GetMalicePoint(CDNUserBase* pUser, int iNpcID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CReputationSystemRepository* pReputationSystem = pUser->GetReputationSystem();
|
|
|
|
|
|
if( !pReputationSystem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return static_cast<int>(pReputationSystem->GetNpcReputation( iNpcID, IReputationSystem::NpcMalice ));
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_GetFavorPercent(CDNUserBase* pUser, int iNpcID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CReputationSystemRepository* pReputationSystem = pUser->GetReputationSystem();
|
|
|
|
|
|
if( !pReputationSystem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return pReputationSystem->GetNpcReputationPercent( iNpcID, IReputationSystem::NpcFavor );
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_GetMalicePercent(CDNUserBase* pUser, int iNpcID )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CReputationSystemRepository* pReputationSystem = pUser->GetReputationSystem();
|
|
|
|
|
|
if( !pReputationSystem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
return pReputationSystem->GetNpcReputationPercent( iNpcID, IReputationSystem::NpcMalice );
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_AddFavorPoint(CDNUserBase* pUser, int iNpcID, int val)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CReputationSystemRepository* pReputationSystem = pUser->GetReputationSystem();
|
|
|
|
|
|
if( !pReputationSystem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
CNpcReputationProcessor::Process( static_cast<CDNUserSession*>(pUser), iNpcID, IReputationSystem::NpcFavor, val );
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_AddMalicePoint(CDNUserBase* pUser, int iNpcID, int val)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
CReputationSystemRepository* pReputationSystem = pUser->GetReputationSystem();
|
|
|
|
|
|
if( !pReputationSystem )
|
|
|
|
|
|
return -2;
|
|
|
|
|
|
|
|
|
|
|
|
CNpcReputationProcessor::Process( static_cast<CDNUserSession*>(pUser), iNpcID, IReputationSystem::NpcMalice, val );
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_SendSelectedPresent(CDNUserBase* pUser, int iNpcID )
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
pUser->SendRequestSendSelectedPresent( iNpcID );
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_Rage(CDNUserBase* pUser, int iNpcID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendShowNpcEffect( iNpcID, 0 );
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_npc_Disappoint(CDNUserBase* pUser, int iNpcID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendShowNpcEffect( iNpcID, 1 );
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_NPC_REPUTATION_SYSTEM )
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_user_RepairItem(CDNUserBase* pUser, int iAllRepair)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_REPAIR_NPC)
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
int nRet = ERROR_NONE;
|
|
|
|
|
|
if( iAllRepair )
|
|
|
|
|
|
{
|
|
|
|
|
|
nRet = pUser->GetItem()->CheckRepairAll(false);
|
|
|
|
|
|
if( nRet == ERROR_NONE )
|
|
|
|
|
|
pUser->SendRepairAll(ERROR_NONE);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
nRet = pUser->GetItem()->CheckRepairEquip(0);
|
|
|
|
|
|
if( nRet == ERROR_NONE )
|
|
|
|
|
|
pUser->SendRepairEquip(ERROR_NONE);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( nRet == ERROR_NONE)
|
|
|
|
|
|
return 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD>
|
|
|
|
|
|
else if( nRet == ERROR_ITEM_REPAIR)
|
|
|
|
|
|
return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
else if( nRet == ERROR_ITEM_INSUFFICIENCY_MONEY)
|
|
|
|
|
|
return 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_ui_OpenExchangeEnchant(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef PRE_ADD_EXCHANGE_ENCHANT
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _FINAL_BUILD
|
|
|
|
|
|
std::wstring wszLog;
|
|
|
|
|
|
wszLog = FormatW( L"<EFBFBD><EFBFBD>ȭ<EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>");
|
|
|
|
|
|
pUser->SendChat(CHATTYPE_NORMAL, (int)wszLog.size()*sizeof(WCHAR), L"", (WCHAR*)wszLog.c_str());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SendOpenExchangeEnchant();
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, false); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_env_CheckCloseGateByTime(int iMapID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef PRE_ADD_CHALLENGE_DARKLAIR
|
|
|
|
|
|
return g_pDataManager->IsCloseGateByTime(iMapID);
|
|
|
|
|
|
#else
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(PRE_ADD_OPEN_QUEST_TEXTURE_DIALOG)
|
|
|
|
|
|
int api_Open_Texture_Dialog(CDNUserBase* pUser, SCOpenTextureDialog data)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, true); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
pUser->SendOpenTextureDialog(data);
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_Close_Texture_Dialog(CDNUserBase* pUser, int nDlgID)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, true); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
pUser->SendCloseTextureDialog(nDlgID);
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
int api_quest_WorldBuffCheck(int nItemID)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( PRE_DRAGONBUFF )
|
|
|
|
|
|
if( g_pDataManager )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( g_pDataManager->bIsWorldBuffData(nItemID) )
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_quest_ApplyWorldBuff(CDNUserBase* pUser, int nItemID, int nMapIdx)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#if defined(_VILLAGESERVER) && defined( PRE_DRAGONBUFF )
|
|
|
|
|
|
if( g_pUserSessionManager )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( g_pDataManager )
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pDataManager->AddWorldBuffData(nItemID);
|
|
|
|
|
|
}
|
|
|
|
|
|
g_pUserSessionManager->ApplyWorldBuff( pUser->GetCharacterName(), nItemID, nMapIdx);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if( g_pMasterConnection && g_pMasterConnection->GetActive() )
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pMasterConnection->SendApplyWorldBuff( pUser->GetCharacterName(), nItemID, nMapIdx );
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int api_Open_ChangeJobDialog(CDNUserBase* pUser)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!pUser)
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
pUser->SetCalledNpcResponse(true, true); // <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI <20><><EFBFBD><EFBFBD> <20><>û <20><><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴѵ<C6B4><D1B5><EFBFBD> <20><><EFBFBD>Ǿƴϰ<C6B4> NPC <20><><EFBFBD>俩<EFBFBD><E4BFA9> üũ<C3BC><C5A9> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>ǹǷ<C7B9> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
pUser->SendOpenChangeJobDialog();
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|