#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Character.h" using namespace Item; bool CCharacter::AddGold(unsigned long dwGold, bool bNotice) { if (m_DBData.m_Info.Gold <= ULONG_MAX - dwGold) { m_DBData.m_Info.Gold += dwGold; // ±æµå¿ø Á¤º¸ ¾÷µ¥ÀÌÆ® CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(GetGID()); if (NULL != lpGuild) { lpGuild->UpdateMemberInfo(m_dwCID, m_DBData.m_Info.Gold, Guild::TYPE_GOLD); } if (true == bNotice) { if (NULL != m_lpGameClientDispatch) { GameClientSendPacket::SendCharTakeGold(m_lpGameClientDispatch->GetSendStream(), m_dwCID, dwGold, TakeType::TS_NONE, TakeType::TS_INVEN, 0); } } return true; } ERRLOG2(g_Log, "CID:0x%08x Àκ¥Å丮 µ· ¿À¹öÇ÷ο찡 ¹ß»ýÇß½À´Ï´Ù. : %dGold", m_dwCID, dwGold); return false; } bool CCharacter::DeductGold(unsigned long dwGold, bool bNotice) { if (dwGold <= m_DBData.m_Info.Gold) { m_DBData.m_Info.Gold -= dwGold; // ±æµå¿ø Á¤º¸ ¾÷µ¥ÀÌÆ® CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(GetGID()); if (NULL != lpGuild) { lpGuild->UpdateMemberInfo(m_dwCID, m_DBData.m_Info.Gold, Guild::TYPE_GOLD); } if (true == bNotice) { if (NULL != m_lpGameClientDispatch) { GameClientSendPacket::SendCharTakeGold(m_lpGameClientDispatch->GetSendStream(), m_dwCID, dwGold, TakeType::TS_INVEN, TakeType::TS_NONE, 0); } } return true; } ERRLOG3(g_Log, "CID:0x%08x Àκ¥Å丮 µ· ¾ð´õÇ÷ο찡 ¹ß»ýÇß½À´Ï´Ù. : ¼ÒÁö %dGold ÇÊ¿ä %dGold", m_dwCID, m_DBData.m_Info.Gold, dwGold); return false; } bool CCharacter::DeductMileage(unsigned long dwMileage, bool bNotice) { if (dwMileage <= m_DBData.m_Info.Mileage) { m_DBData.m_Info.Mileage -= dwMileage; return true; } ERRLOG3(g_Log, "CID:0x%08x Àκ¥Å丮 ¸Þ´Þ ¾ð´õÇ÷ο찡 ¹ß»ýÇß½À´Ï´Ù. : ¼ÒÁö %dMileage ÇÊ¿ä %dMileage", m_dwCID, m_DBData.m_Info.Mileage, dwMileage); return false; } unsigned long CCharacter::GetGold(unsigned char cPos) { unsigned long dwGold = 0; switch (cPos) { case TakeType::TS_INVEN: dwGold = GetGold(); break; case TakeType::TS_EXCHANGE: dwGold = m_Exchange.GetGold(); break; case TakeType::TS_DEPOSIT: dwGold = m_Deposit.GetGold(); break; } return dwGold; } bool CCharacter::MoveGold(unsigned long dwGold, unsigned char cSrcPos, unsigned char cDstPos, unsigned short& usError) { usError = 0; bool bResult = false; switch (cSrcPos) { case TakeType::TS_INVEN: bResult = DeductGold(dwGold, false); break; case TakeType::TS_EXCHANGE: bResult = m_Exchange.DeductGold(dwGold); break; case TakeType::TS_DEPOSIT: bResult = m_Deposit.DeductGold(dwGold); break; default: bResult = false; break; } if (false == bResult) { usError = PktTG::FAIL_MOVE; return false; } switch (cDstPos) { case TakeType::TS_INVEN: bResult = AddGold(dwGold, false); break; case TakeType::TS_EXCHANGE: bResult = m_Exchange.AddGold(dwGold); break; case TakeType::TS_DEPOSIT: bResult = m_Deposit.AddGold(dwGold); break; default: bResult = false; break; } if (false == bResult || 0 != usError) { usError = PktTG::GOLD_OVERFLOW; switch (cSrcPos) { case TakeType::TS_INVEN: bResult = AddGold(dwGold, false); break; case TakeType::TS_EXCHANGE: bResult = m_Exchange.AddGold(dwGold); break; case TakeType::TS_DEPOSIT: bResult = m_Deposit.AddGold(dwGold); break; } return false; } return true; } bool CCharacter::MoveItem(const TakeType takeType, bool bChk) { PERFORMANCE_CHECK(FunctionTimingCheck); Item::CItemContainer* lpSrcContainer = GetItemContainer(takeType.m_srcPos.m_cPos); Item::CItemContainer* lpDstContainer = GetItemContainer(takeType.m_dstPos.m_cPos); ERRLOG( const int MAX_ERROR_BUFFER = 4096; char szErrorBuffer[MAX_ERROR_BUFFER] = ""; int nLength = 0; ); if (NULL == lpSrcContainer || NULL == lpDstContainer) { ERRLOG3(g_Log, "CID:0x%08x SrcPos¶Ç´Â DstPos°¡ À߸øµÇ¾ú½À´Ï´Ù. SrcPos:%d, DstPos:%d", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_dstPos.m_cPos); return false; } if (TakeType::TS_TEMPINVEN == takeType.m_srcPos.m_cPos) { if (TakeType::TS_QSLOT == takeType.m_dstPos.m_cPos || TakeType::TS_STALL == takeType.m_dstPos.m_cPos) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Àӽà Àκ¥Å丮¿¡¼­ À߸øµÈ °÷À¸·Î ¾ÆÀÌÅÛÀ» ¿Å±â·Á ÇÕ´Ï´Ù. " "(%d ¿¡¼­ %d ·Î À̵¿)", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_dstPos.m_cPos); return false; } } if (TakeType::TS_TEMPINVEN == takeType.m_dstPos.m_cPos) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Àӽà Àκ¥Å丮·Î ¾ÆÀÌÅÛÀ» ¿Å±â·Á ÇÕ´Ï´Ù. (%d ¿¡¼­ %d ·Î À̵¿)", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_dstPos.m_cPos); return false; } // Src¿¡¼­ ¾ÆÀÌÅÛÀ» ¾ò¾î¿Â´Ù. Item::CItem* lpSrcItem = GetItem(takeType.m_srcPos); if (NULL == lpSrcItem) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : (%d, 0x%04x) ¿¡¼­ ¾ÆÀÌÅÛÀ» ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù.", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); return false; } // ·é ¾ÆÀÌÅÛÀÌ ÀåÂø µÇ¾î ÀÖÀ¸¸é ½ºÅ³ Æ÷ÀÎÆ® üũ. if(bChk) { bool bResult = CheckItemRuneSkill(takeType.m_srcPos, Item::ItemPos(0, 0), false); if(!bResult) { return false; } } ////////////////////////////////////////////////////////////////////////////////////////////// // edith 2009.02.28 ¾ÆÀÌÅÛ ±³È¯½Ã Àκ¥¿¡¼­ ¾ÆÀÌÅÛÀ» ³ª´² ±³È¯Ã¢ÀÇ ¾ÆÀÌÅÛ°ú SwipÇÒ¶§ »ý±â´Â // ¹ö±×¸¦ ¼öÁ¤Çϱâ À§ÇØ ¾Æ·¡ ¾ÆÀÌÅÛ ½ºÇø´ÇÔ¼ö°¡ Ãß°¡µÊ. BOOL bOri = FALSE; // ¿ì¼± ½ºÅÃÇüÀ̰í, ŸÀÔÀÌ Æ²¸®°í, °³¼ö°¡ Ʋ¸±¶§¸¸ µû·Î ó¸®ÇÏ°Ô ÇÑ´Ù. if(lpSrcItem->IsSet(Item::DetailData::STACKABLE) && takeType.m_cNum != lpSrcItem->GetNumOrDurability()) { // Dst¿¡¼­ ¾ÆÀÌÅÛÀ» ¾ò¾î¿Â´Ù. Item::CItem* lpDstItem = GetItem(takeType.m_dstPos); // ¸¸¾à Dest °ªÀÌ ÀÖ°í ¼Ò½º¿Í °°Àº ¸ð¾çÀÇ ¾ÆÀÌÅÛÀ̶ó¸é ÇÕÄ¡´Â ·ÎÁ÷Àϼö°¡ ÀÖ´Ù. if(lpDstItem && lpSrcItem->GetPrototypeID() == lpDstItem->GetPrototypeID()) { bOri = TRUE; } else { // ¾ÆÀÌÅÛÀ» ³ª´«´Ù. if (lpSrcItem->GetNumOrDurability() <= takeType.m_cNum) { ERRLOG(nLength = _snprintf(szErrorBuffer, MAX_ERROR_BUFFER, "CID:%10u ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Source¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀÇ °³¼ö°¡ ³ª´©·Á°í ÇÏ´Â ¾ÆÀÌÅÛÀÇ °³¼öº¸´Ù À۰ųª °°½À´Ï´Ù." "SourceÀÇ ÇöÀç ¾ÆÀÌÅÛ °³¼ö %d, ³ª´©·Á°í ÇÏ´Â ¾ÆÀÌÅÛÀÇ °³¼ö %d", m_dwCID, lpSrcItem->GetNumOrDurability(), takeType.m_cNum)); return false; } else { // ¾ÆÀÌÅÛ »ý¼ºÇÔ. Item::CItem* lpSplitItem = Item::CItemFactory::GetInstance().CreateItem(lpSrcItem->GetItemInfo()); if (NULL == lpSplitItem) { ERRLOG(nLength = _snprintf(szErrorBuffer, MAX_ERROR_BUFFER, "CID:%10u ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : ¾ÆÀÌÅÛÀ» »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.", m_dwCID)); return false; } lpSplitItem->SetNumOrDurability(takeType.m_cNum); // ÀÚ¸®°¡ ºñ¾î ÀÖÀ¸¸é ¾ÆÀÌÅÛ À̵¿ if (NULL == lpDstItem) { if (false == SetItem(takeType.m_dstPos, lpSplitItem)) { ERRLOG5(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Ŭ¶óÀÌ¾ðÆ®°¡ ÁØ(%d, 0x%04x) À§Ä¡¿¡ SetÇÒ ¼ö ¾ø½À´Ï´Ù." " Á¾·ùID:%d, ¾ÆÀÌÅÛ ³»±¸µµ(°³¼ö):%d", m_dwCID, takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex, lpSrcItem->GetPrototypeID(), lpSrcItem->GetNumOrDurability()); DELETE_ITEM(lpSplitItem); goto MOVE_ROLLBACK; } // ÃÖÁ¾ ¼º°ø lpSrcItem->SetNumOrDurability(lpSrcItem->GetNumOrDurability() - takeType.m_cNum); } else { ERRLOG5(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Ŭ¶óÀÌ¾ðÆ®°¡ ÁØ(%d, 0x%04x) À§Ä¡¿¡ SetÇÒ ¼ö ¾ø½À´Ï´Ù." " Á¾·ùID:%d, ¾ÆÀÌÅÛ ³»±¸µµ(°³¼ö):%d", m_dwCID, takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex, lpSrcItem->GetPrototypeID(), lpSrcItem->GetNumOrDurability()); goto MOVE_ROLLBACK; } } } } else bOri = TRUE; if(bOri) { // ÀÚ½ÅÀÇ À§Ä¡¿¡ °ãÄ¡´Â °ÍÀÌ ½ÇÆÐÇÏ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ Á¦°ÅÇØµÐ´Ù. if (false == RemoveItem(takeType.m_srcPos)) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : (%d, 0x%04x) ¿¡¼­ ¾ÆÀÌÅÛÀ» ¸®¼ÂÇÒ ¼ö ¾ø½À´Ï´Ù.", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); return false; } // Dst¿¡¼­ ¾ÆÀÌÅÛÀ» ¾ò¾î¿Â´Ù. Item::CItem* lpDstItem = GetItem(takeType.m_dstPos); // ÀÚ¸®°¡ ºñ¾î ÀÖÀ¸¸é ¾ÆÀÌÅÛ À̵¿ if (NULL == lpDstItem) { if (false == SetItem(takeType.m_dstPos, lpSrcItem)) { ERRLOG5(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Ŭ¶óÀÌ¾ðÆ®°¡ ÁØ(%d, 0x%04x) À§Ä¡¿¡ SetÇÒ ¼ö ¾ø½À´Ï´Ù." " Á¾·ùID:%d, ¾ÆÀÌÅÛ ³»±¸µµ(°³¼ö):%d", m_dwCID, takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex, lpSrcItem->GetPrototypeID(), lpSrcItem->GetNumOrDurability()); goto MOVE_ROLLBACK; } } // ½ºÅÃÀÏ °¡´É¼ºÀÌ ÀÖ´Ù. else { if (TakeType::TS_STALL == takeType.m_dstPos.m_cPos) { ERRLOG5(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : ½ºÅÃÇÒ ¼ö ¾ø´Â À§Ä¡. SrcPos : (%d, 0x%04x), DstPos : (%d, 0x%04x)", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex, takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex); goto MOVE_ROLLBACK; } if (false == lpSrcItem->IsSet(DetailData::STACKABLE) || !lpDstItem->IsSet(DetailData::STACKABLE)) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : ½ºÅÃÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛ. SrcItemÀÇ Á¾·ùID %d, DstItemÀÇ Á¾·ùID %d", m_dwCID, lpSrcItem->GetPrototypeID(), lpDstItem->GetPrototypeID()); goto MOVE_ROLLBACK; } if (lpSrcItem->GetPrototypeID() != lpDstItem->GetPrototypeID()) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Á¾·ù°¡ ´Ù¸¥ ¾ÆÀÌÅÛ À§¿¡ ¿Ã·Á ³õ¾Ò½À´Ï´Ù." "SrcItemÀÇ Á¾·ùID %d, DstItemÀÇ Á¾·ùID %d", m_dwCID, lpSrcItem->GetPrototypeID(), lpDstItem->GetPrototypeID()); goto MOVE_ROLLBACK; } if (lpSrcItem->GetNumOrDurability() < takeType.m_cNum) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : Source¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀÇ °³¼ö°¡ ¿Å±â·Á°í ÇÏ´Â ¾ÆÀÌÅÛÀÇ °³¼öº¸´Ù ÀÛ½À´Ï´Ù." "SrcItem°³¼ö %d, ¿Å±â·Á°í ÇÑ °³¼ö %d", m_dwCID, lpSrcItem->GetNumOrDurability(), takeType.m_cNum); goto MOVE_ROLLBACK; } if (lpDstItem->GetNumOrDurability() + takeType.m_cNum > lpDstItem->GetMaxNumOrDurability()) { ERRLOG4(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : ÃÖ´ë °³¼ö ÀÌ»ó ¾ÆÀÌÅÛÀ» ¿Ã·Á ³õÀ» ¼ö ¾ø½À´Ï´Ù" " ³õ¿© ÀÖ´Â ¾ÆÀÌÅÛÀÇ °³¼ö %d, ³õÀ¸·Á°í ÇÑ ¾ÆÀÌÅÛÀÇ °³¼ö %d, ³õÀ»¼ö ÀÖ´Â ÃÖ´ë °³¼ö %d", m_dwCID, lpDstItem->GetNumOrDurability(), takeType.m_cNum, lpDstItem->GetMaxNumOrDurability()); goto MOVE_ROLLBACK; } // ¾ÆÀÌÅÛ °³¼ö Á¶Á¤ lpSrcItem->SetNumOrDurability(lpSrcItem->GetNumOrDurability() - takeType.m_cNum); lpDstItem->SetNumOrDurability(lpDstItem->GetNumOrDurability() + takeType.m_cNum); if (takeType.m_dstPos.m_cPos == TakeType::TS_EXCHANGE) { CCharacter* lpCharacter = m_Exchange.GetExchangeCharacter(); if (NULL != lpCharacter) { CGameClientDispatch* lpGameClientDispatch = lpCharacter->GetDispatcher(); if (NULL != lpGameClientDispatch) { GameClientSendPacket::SendCharExchangeItem(lpGameClientDispatch->GetSendStream(), m_dwCID, 0, lpDstItem, takeType.m_dstPos, true, false); } } } if (0 == lpSrcItem->GetNumOrDurability()) { // ÀÌ¹Ì RemoveÇÑ ¾ÆÀÌÅÛÀ̹ǷΠÁö¿öµµ »ó°ü ¾ø´Ù. DELETE_ITEM(lpSrcItem); } else { // ³²¾Æ ÀÖ´Â ¾ÆÀÌÅÛÀ» ´Ù½Ã SetÇÑ´Ù. if (!SetItem(takeType.m_srcPos, lpSrcItem)) { SERLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : (%d, 0x%04x) Á¦ÀÚ¸®¿¡ µ¹·Á ³õÀ» ¼ö ¾øÀ½. ¾ÆÀÌÅÛÀ» Á¦°ÅÇÔ.", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); SERLOG0(g_Log, "Src¾ÆÀÌÅÛ ´ýÇÁ ¼º°ø"); DELETE_ITEM(lpSrcItem); } } } } return true; MOVE_ROLLBACK: lpDstContainer->DumpItemInfo(); if (!SetItem(takeType.m_srcPos, lpSrcItem)) { SERLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À̵¿ ½ÇÆÐ : (%d, 0x%04x) Á¦ÀÚ¸®¿¡ µ¹·Á ³õÀ» ¼ö ¾øÀ½. ¾ÆÀÌÅÛÀ» Á¦°ÅÇÔ.", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); SERLOG0(g_Log, "Src¾ÆÀÌÅÛ ´ýÇÁ ¼º°ø"); DELETE_ITEM(lpSrcItem); } return false; } Item::CItem* CCharacter::SplitItem(const TakeType takeType) { Item::CItemContainer* lpSrcContainer = GetItemContainer(takeType.m_srcPos.m_cPos); Item::CItemContainer* lpDstContainer = GetItemContainer(takeType.m_dstPos.m_cPos); if (NULL == lpSrcContainer || NULL == lpDstContainer) { ERRLOG3(g_Log, "CID:0x%08x SrcPos¶Ç´Â DstPos°¡ À߸øµÇ¾ú½À´Ï´Ù. SrcPos:%d, DstPos:%d", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_dstPos.m_cPos); return false; } if (TakeType::TS_TEMPINVEN == takeType.m_srcPos.m_cPos) { ERRLOG1(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½ºÇø´ ½ÇÆÐ : Àӽà Àκ¥Å丮ÀÇ ¾ÆÀÌÅÛÀ» ½ºÇø´ÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID); return false; } // Src¿¡¼­ ¾ÆÀÌÅÛÀ» ¾ò¾î¿Â´Ù. Item::CItem* lpSrcItem = GetItem(takeType.m_srcPos); if (NULL == lpSrcItem) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½ºÇø´ ½ÇÆÐ : (%d, 0x%04x) À§Ä¡¿¡¼­ ¾ÆÀÌÅÛÀ» ¾ò¾î¿Ã ¼ö ¾ø½À´Ï´Ù.", m_dwCID, takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); return false; } if (false == lpSrcItem->IsSet(DetailData::STACKABLE)) { ERRLOG2(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½ºÇø´ ½ÇÆÐ : ³ª´­ ¼ö ¾ø´Â ¾ÆÀÌÅÛ(½ºÅà ºÒ°¡)ÀÔ´Ï´Ù. Á¾·ù ID : %d", m_dwCID, lpSrcItem->GetPrototypeID()); return false; } if (lpSrcItem->GetNumOrDurability() <= takeType.m_cNum) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½ºÇø´ ½ÇÆÐ : Source¿¡ ÀÖ´Â ¾ÆÀÌÅÛÀÇ °³¼ö°¡ ³ª´©·Á°í ÇÏ´Â ¾ÆÀÌÅÛÀÇ °³¼öº¸´Ù À۰ųª °°½À´Ï´Ù." "SourceÀÇ ÇöÀç ¾ÆÀÌÅÛ °³¼ö %d, ³ª´©·Á°í ÇÏ´Â ¾ÆÀÌÅÛÀÇ °³¼ö %d", m_dwCID, lpSrcItem->GetNumOrDurability(), takeType.m_cNum); return false; } // ¾ÆÀÌÅÛ »ý¼ºÇÑ´Ù. Item::CItem* lpSplitItem = CItemFactory::GetInstance().CreateItem(lpSrcItem->GetPrototypeID()); if (NULL == lpSplitItem) { ERRLOG1(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½ºÇø´ ½ÇÆÐ : ¾ÆÀÌÅÛÀ» »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.", m_dwCID); return false; } lpSrcItem->SetNumOrDurability(lpSrcItem->GetNumOrDurability() - takeType.m_cNum); lpSplitItem->SetNumOrDurability(takeType.m_cNum); if (!SetItem(takeType.m_dstPos, lpSplitItem)) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½ºÇø´ ½ÇÆÐ : (%d, 0x%04x)Âɰ³¼­ ³»·Á³õ°íÀÚ ÇÏ´Â ÀÚ¸®¿¡, ¾ÆÀÌÅÛÀ» ³»·Á ³õÀ» ¼ö ¾ø½À´Ï´Ù.", m_dwCID, takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex); DELETE_ITEM(lpSplitItem); lpDstContainer->DumpItemInfo(); return false; } // SetÀÌ ¼º°øÇÑ ´ÙÀ½ Àü¼ÛÇÑ´Ù. if (takeType.m_srcPos.m_cPos == TakeType::TS_EXCHANGE) { CCharacter* lpCharacter = m_Exchange.GetExchangeCharacter(); if (NULL != lpCharacter) { CGameClientDispatch* lpGameClientDispatch = lpCharacter->GetDispatcher(); if (NULL != lpGameClientDispatch) { GameClientSendPacket::SendCharExchangeItem(lpGameClientDispatch->GetSendStream(), m_dwCID, 0, lpSrcItem, takeType.m_dstPos, false, false); } } } return lpSplitItem; } bool CCharacter::SwapItem(const TakeType SrcTake, const TakeType DstTake) { /* ¾ÆÀÌÅÛ ½º¿ÒÀÇ ¿¹. Àåºñ[À妽º:5] ¾ÆÀÌÅÛA ¸¦ Àκ¥[À妽º:9]ÀÇ ¾ÆÀÌÅÛB ¿Í ½º¿Ò = Src[1, 5] Dst[2, 9] / Src[2, 9] Dst[6, X] * ¾ÆÀÌÅÛ A´Â ¾ÆÀÌÅÛ BÀÇ ÀÚ¸®·Î °¡°í, ¾ÆÀÌÅÛ B´Â ¸¶¿ì½º¿¡ µé·Á ÀÖ´Â »óÅÂ. Áï Àӽà °ø°£¿¡ ÀúÀåÀÌ µÊ ¸¶¿ì½º ¾ÆÀÌÅÛB ¸¦ Àκ¥[À妽º:4]ÀÇ ¾ÆÀÌÅÛC ¿Í ´Ù½Ã ½º¿Ò = Src[6, X] Det[2, 4] / Src[2, 4] Dst[6, X] ¸¶¿ì½º ¾ÆÀÌÅÛC ¸¦ ´Ù½Ã Àκ¥[À妽º:1]ÀÇ ÀÚ¸®¿¡ ³õ´Â´Ù. = Src[6, X] Det[2, 1] : ½º¿ÒÀÌ ¾Æ´Ñ ¾ÆÀÌÅÛ Áý±â(³õ±â) */ if (TakeType::TS_TEMP != DstTake.m_dstPos.m_cPos) { ERRLOG1(g_Log, "CID:0x%08x DstTakeÀÇ DstPos°¡ TS_TEMP°¡ ¾Æ´Õ´Ï´Ù.", m_dwCID); return false; } Item::ItemPos HoldPos(TakeType::TS_TEMP, Item::ExtraSpacePos::HOLDITEM_POS); Item::CItem* lpHoldItem = m_ExtraSpace.GetItem(HoldPos); // ·é ¾ÆÀÌÅÛÀÌ ÀåÂø µÇ¾î ÀÖÀ¸¸é ½ºÅ³ Æ÷ÀÎÆ® üũ. bool bChk = CheckItemRuneSkill(SrcTake.m_srcPos, DstTake.m_srcPos, true); if(!bChk) { return false; } if (NULL == lpHoldItem) { // Àӽà °ø°£¿¡ ¾ÆÀÌÅÛÀÌ ¾øÀ½. Àӽà °ø°£À¸·Î ¾ÆÀÌÅÛ µé¾î ³½´Ù. if (false == MoveItem(DstTake, false)) { ERRLOG1(g_Log, "CID:0x%08x Àӽà °ø°£À¸·Î ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù", m_dwCID); return false; } // ¾ÆÀÌÅÛÀ» ³»·Á ³õ´Â´Ù. if (false == MoveItem(SrcTake, false)) { ERRLOG1(g_Log, "CID:0x%08x SrcTake¸¦ ½ÇÆÐÇß½À´Ï´Ù", m_dwCID); // ¾ÆÀÌÅÛ SwapÀ» RollBackÇÕ´Ï´Ù if (false == MoveItem(TakeType(DstTake.m_dstPos, DstTake.m_srcPos, DstTake.m_cNum))) { ERRLOG1(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½º¿Ò RollBackÀÌ ½ÇÆÐÇß½À´Ï´Ù", m_dwCID); } return false; } } else { // ÀÌ¹Ì Àӽà °ø°£¿¡ ¾ÆÀÌÅÛÀÌ ÀÖÀ½. ÀÌ °æ¿ì´Â SrcTake.m_srcPos.m_cPos°¡ TS_TEMP¿©¾ß ÇÑ´Ù. if (TakeType::TS_TEMP != SrcTake.m_srcPos.m_cPos) { ERRLOG1(g_Log, "CID:0x%08x ÀÌ¹Ì Àӽà °ø°£¿¡ ¾ÆÀÌÅÛÀÌ Àִµ¥, SrcTakeÀÇ SrcPos°¡ TS_TEMP°¡ ¾Æ´Õ´Ï´Ù.", m_dwCID); return false; } // Àӽà °ø°£¿¡¼­ ¾ÆÀÌÅÛ Á¦°Å. if (false == m_ExtraSpace.RemoveItem(HoldPos)) { ERRLOG1(g_Log, "CID:0x%08x Àӽà °ø°£¿¡¼­ ¾ÆÀÌÅÛÀ» Á¦°ÅÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù.", m_dwCID); return false; } // Àӽà °ø°£À¸·Î ¾ÆÀÌÅÛ ¿Å±è if (false == MoveItem(DstTake)) { ERRLOG1(g_Log, "CID:0x%08x Àӽà °ø°£À¸·Î ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù", m_dwCID); if (false == m_ExtraSpace.SetItem(HoldPos, lpHoldItem)) { ERRLOG1(g_Log, "CID:0x%08x Àӽà °ø°£ ¾ÆÀÌÅÛ RollBack¿¡ ½ÇÆÐÇß½À´Ï´Ù.", m_dwCID); } return false; } // Àӽà °ø°£¿¡¾î ¾ò¾î³Â´ø ¾ÆÀÌÅÛÀ» ³»·Á³õ´Â´Ù. if (false == SetItem(SrcTake.m_dstPos, lpHoldItem)) { ERRLOG1(g_Log, "CID:0x%08x Àӽà °ø°£¿¡ ÀÖ´ø ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù", m_dwCID); if (false == MoveItem(TakeType(DstTake.m_dstPos, DstTake.m_srcPos, DstTake.m_cNum))) { ERRLOG1(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ ½º¿Ò RollBackÀÌ ½ÇÆÐÇß½À´Ï´Ù", m_dwCID); } if (false == m_ExtraSpace.SetItem(HoldPos, lpHoldItem)) { ERRLOG1(g_Log, "CID:0x%08x Àӽà °ø°£ ¾ÆÀÌÅÛ RollBack¿¡ ½ÇÆÐÇß½À´Ï´Ù.", m_dwCID); } return false; } } return true; } bool CCharacter::Pickup(Item::CItem* lpItem, ItemPos dstPos) { if (NULL == lpItem) { ERRLOG1(g_Log, "CID:0x%08x ¾ÆÀÌÅÛÀÌ NULLÀÔ´Ï´Ù.", m_dwCID); return false; } Item::CItem* lpPrevItem = m_Inventory.GetItem(dstPos); if (NULL == lpPrevItem) { // ¹ÞÀº ¾ÆÀÌÅÛÀ» ºóÀÚ¸®¿¡ ³õ´Â´Ù. if (false == SetItem(dstPos, lpItem)) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛÀ» Áý¾î¼­ ³õ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù. (%d, 0x%04x)", m_dwCID, dstPos.m_cPos, dstPos.m_cIndex); m_Inventory.DumpItemInfo(); return false; } } else { // ÀÌ¹Ì ÀÖ´Â ÀÚ¸®¿¡ ¾ÆÀÌÅÛÀ» ½ºÅÃÇÑ´Ù. if (false == lpPrevItem->IsSet(DetailData::STACKABLE)) { ERRLOG3(g_Log, "CID:0x%08x ½ºÅÃÇÒ ¼ö ¾ø´Â ¾ÆÀÌÅÛÀÔ´Ï´Ù. ItemID:%d, PrevItemID:%d", m_dwCID, lpItem->GetPrototypeID(), lpPrevItem->GetPrototypeID()); m_Inventory.DumpItemInfo(); return false; } if (lpPrevItem->GetPrototypeID() != lpItem->GetPrototypeID()) { ERRLOG3(g_Log, "CID:0x%08x Á¾·ù ID°¡ ´Ù¸¨´Ï´Ù. ItemID:%d, PrevItemID:%d", m_dwCID, lpItem->GetPrototypeID(), lpPrevItem->GetPrototypeID()); m_Inventory.DumpItemInfo(); return false; } if (lpPrevItem->GetNumOrDurability() + lpItem->GetNumOrDurability() > lpPrevItem->GetMaxNumOrDurability()) { ERRLOG1(g_Log, "CID:0x%08x ½ºÅÃÇÒ ¼ö ¾ø½À´Ï´Ù. : " "½ºÅÃÇÒ ¼ö ÀÖ´Â ÃÖ´ë ¾ÆÀÌÅÛ °³¼ö ÀÌ»óÀ» ½ºÅÃÇÏ·Á ÇÏ¿´½À´Ï´Ù.", m_dwCID); m_Inventory.DumpItemInfo(); return false; } // edith 2008.01.10 Àκ¥¿¡ ÀÖ´Â Áߺ¹¾ÆÀÌÅÛÀ» ¸Ô¾úÀ»¶§ Äù½ºÆ® Æ®¸®°Å ¹ßµ¿ // if (false == m_bAdminToolFlag) { CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_dwCID); if (NULL == lpCharacter) { return false; } // Äù½ºÆ® Æ®¸®°Å ¹ßµ¿ short wCount = (true == lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1; lpCharacter->CheckTrigger(Quest::TRIGGER_PICK, lpItem->GetPrototypeID(), Position(), wCount); } lpPrevItem->SetNumOrDurability(lpPrevItem->GetNumOrDurability() + lpItem->GetNumOrDurability()); lpItem->SetNumOrDurability(0); } return true; } Item::CItem* CCharacter::Drop(ItemPos SrcPos, unsigned char cNum) { Item::CItemContainer* lpSrcContainer = GetItemContainer(SrcPos.m_cPos); if (NULL == lpSrcContainer) { ERRLOG2(g_Log, "CID:0x%08x SrcPos°¡ À߸øµÇ¾ú½À´Ï´Ù. SrcPos:%d", m_dwCID, SrcPos.m_cPos); return NULL; } Item::CItem* lpItem = GetItem(SrcPos); if (NULL == lpItem) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛÀ» ¾ò¾î¿Í¼­ DropÇÒ ¼ö ¾ø½À´Ï´Ù (%d, 0x%04x)", m_dwCID, SrcPos.m_cPos, SrcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); return NULL; } // ·é ¾ÆÀÌÅÛÀÌ ÀåÂø µÇ¾î ÀÖÀ¸¸é ½ºÅ³ Æ÷ÀÎÆ® üũ. bool bChk = CheckItemRuneSkill(SrcPos, Item::ItemPos(0, 0), false); if(!bChk) { return NULL; } if (lpItem->IsSet(DetailData::STACKABLE) && cNum < lpItem->GetNumOrDurability()) { // ÀÌÀü ¾ÆÀÌÅÛ °³¼ö¸¦ ÁÙÀÓ lpItem->SetNumOrDurability(lpItem->GetNumOrDurability() - cNum); // »õ ¾ÆÀÌÅÛÀ» »ý¼ºÇÑ´Ù. unsigned short usProtoTypeID = lpItem->GetPrototypeID(); lpItem = CItemFactory::GetInstance().CreateItem(usProtoTypeID); if (NULL == lpItem) { ERRLOG2(g_Log, "CID:0x%08x ¾ÆÀÌÅÛÀ» ³ª´©¾î¼­ DropÇÒ ¼ö ¾ø½À´Ï´Ù. %dÁ¾·ùÀÇ ¾ÆÀÌÅÛÀ» »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.", m_dwCID, usProtoTypeID); return NULL; } // »õ ¾ÆÀÌÅÛ °³¼ö¸¦ SetÇÔ lpItem->SetNumOrDurability(cNum); } else { if (false == RemoveItem(SrcPos)) { ERRLOG3(g_Log, "CID:0x%08x ¾ÆÀÌÅÛ À§Ä¡¸¦ Áö¿ï ¼ö ¾ø½À´Ï´Ù (%d, 0x%04x)" , m_dwCID, SrcPos.m_cPos, SrcPos.m_cIndex); lpSrcContainer->DumpItemInfo(); return NULL; } } return lpItem; } bool CCharacter::CheckItemRuneSkill(Item::ItemPos SrcPos, Item::ItemPos DstPos, bool bChk) { // ·é ¾ÆÀÌÅÛÀÌ ÀåÂø µÇ¾î ÀÖÀ¸¸é ½ºÅ³ Æ÷ÀÎÆ® üũ. bool bEquip = GetEquipments().GetItem(SrcPos) == NULL ? false : true; if(bEquip) { Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(GetItem(SrcPos)); if(lpEquipment) { return lpEquipment->GetRuneCheckSkill(this, DstPos, bChk); } } return true; } using namespace Broadcast2nd; const CNetworkEquipGrade CCharacter::GetNetworkEquipGrade(void) { CNetworkEquipGrade equipGrade( CNetworkEquipGrade::TransferNetworkEquipGrade(m_Equipments.GetItem(ItemPos(TakeType::TS_EQUIP, Item::EquipmentPos::HELM))), CNetworkEquipGrade::TransferNetworkEquipGrade(m_Equipments.GetItem(ItemPos(TakeType::TS_EQUIP, Item::EquipmentPos::ARMOUR))), CNetworkEquipGrade::TransferNetworkEquipGrade(m_Equipments.GetRightHand()), CNetworkEquipGrade::TransferNetworkEquipGrade(m_Equipments.GetLeftHand())); return equipGrade; } bool CCharacter::GiveItem(Item::CItem* lpItem) { Item::CItem* lpPrevItem = NULL; unsigned char cNum = (lpItem->IsSet(DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1; Item::ItemPos itemPos = m_Inventory.GetBlankPos(lpItem->GetPrototypeID(), cNum, true, &lpPrevItem); if (TakeType::TS_INVEN == itemPos.m_cPos) { if (true == Pickup(lpItem, itemPos)) { bool bStack = (lpItem->IsSet(Item::DetailData::STACKABLE) && 0 == lpItem->GetNumOrDurability()) ? true : false; if (NULL != m_lpGameClientDispatch) { GameClientSendPacket::SendCharPickUp(m_lpGameClientDispatch->GetSendStream(), m_dwCID, 0, 0, (true == bStack) ? NULL : lpItem, itemPos, cNum, PktBase::NO_SERVER_ERR); } return true; } } else { // Àκ¥Å丮¿¡ ÀÚ¸®°¡ ¾øÀ¸¹Ç·Î Àӽà Àκ¥Å丮¿¡ ³Ö¾îÁØ´Ù. return SetItem(Item::ItemPos(TakeType::TS_TEMPINVEN, 0), lpItem); } return false; } bool CCharacter::TestItem(Item::CItem* lpItem) { Item::CItem* lpPrevItem = NULL; unsigned char cNum = (lpItem->IsSet(DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1; Item::ItemPos itemPos = m_Inventory.GetBlankPos(lpItem->GetPrototypeID(), cNum, true, &lpPrevItem); if (TakeType::TS_NONE != itemPos.m_cPos) { if(!m_Inventory.TestItem(itemPos, lpItem->GetPrototypeID(), cNum)) { goto lb_fail; } else { return true; } } else { lb_fail: return (m_TempInven.IsFull()) ? false : true; } return false; } bool CCharacter::UseLottery(unsigned short usItemID) { CLotteryEvent& LotteryEvent = CGameEventMgr::GetInstance().GetLotteryEvent(); Item::CItem* lpItem = LotteryEvent.PrizeLottery(usItemID); if (NULL == lpItem) { if (NULL != m_lpGameClientDispatch) { GameClientSendPacket::SendCharLotteryResult(m_lpGameClientDispatch->GetSendStream(), m_dwCID, ItemPos(0, 0), NULL, PktLotteryResult::FAIL_BLANK); } return true; } Item::CEquipment* lpEquip = Item::CEquipment::DowncastToEquipment(lpItem); if (NULL != lpEquip) { lpEquip->SetNewEquip(); } if (false == GiveItem(lpItem)) { ERRLOG3(g_Log, "CID:0x%08x º¹±Ç À§Ä¡¿¡ »óǰÀ» ³õ´Âµ¥ ½ÇÆÐÇÏ¿´½À´Ï´Ù. º¹±Ç:%d, »óǰ:%d" , m_dwCID, usItemID, lpItem->GetPrototypeID()); return false; } GAMELOG::LogUseLottery(*this, lpItem, 0); // GievItem À¸·Î ½ºÅÃµÈ °æ¿ì if (lpItem->IsSet(DetailData::STACKABLE) && 0 == lpItem->GetNumOrDurability()) { DELETE_ITEM(lpItem); } return true; } bool CCharacter::UseCashItem(unsigned long dwSender, unsigned long dwReceiver, Item::ItemPos itemPos, unsigned short wCashType, unsigned short& wError) { GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); wError = PktUI::SERVER_ERROR; return false; } return GameClientSendPacket::SendCharUseCashItem(lpDBAgentDispatch->GetSendStream(), dwSender, dwReceiver, itemPos, (unsigned char)wCashType, 0); } bool CCharacter::UseStartKit(unsigned short wObjectType, unsigned short& wError) { switch (wObjectType) { case Siege::CAMP: { if (GameTime::GT_GUILD_WAR != CGameTimeMgr::GetInstance().GetCurrentGuildTime()) { ERRLOG1(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ °Ç¼³ÇÒ ¼ö ¾ø´Â ½Ã°£¿¡ ¿ä»õ ±¸ÃàÀ» ½ÃµµÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::FAIL_NOT_GT_GUILD_WAR_TIME; return false; } if (!CCellManager::GetInstance().CheckPositionInZone( GetCurrentPos() )) { ERRLOG4(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ °Ç¼³ÇÏ·Á´Â À§Ä¡°¡ Á¸ ¿µ¿ª ¹ÛÀÔ´Ï´Ù. X:%f, Y:%f, Z:%f", m_dwCID, GetCurrentPos().m_fPointX, GetCurrentPos().m_fPointY, GetCurrentPos().m_fPointZ ); wError = PktUI::FAIL_POSITION; return false; } if (SERVER_ID::CAPITAL != CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_CAPITAL_ZONE; return false; } /* if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3) { wError = PktUI::FAIL_STONE_BATTLE; return false; } if (SERVER_ID::ZONE12 == CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_ALMIGHTY_GROUND; return false; } if (SERVER_ID::ZONE9 == CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_NEWZONE; return false; } */ if (false == CCellManager::GetInstance().IsCampCreateArea(GetCurrentPos())) { ERRLOG4(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ °Ç¼³ÇÏ·Á´Â À§Ä¡°¡ Á¸ ¿µ¿ª ¹ÛÀÔ´Ï´Ù. X:%f, Y:%f, Z:%f", m_dwCID, GetCurrentPos().m_fPointX, GetCurrentPos().m_fPointY, GetCurrentPos().m_fPointZ ); wError = PktUI::FAIL_POSITION; return false; } if (true == CCellManager::GetInstance().IsSafetyZone(GetCurrentPos())) { ERRLOG1(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ ¼¼¿ï ¼ö ¾ø´Â °÷¿¡ ±æµå ¿ä»õ¸¦ ÁöÀ»·Á°í ÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::IN_SAFETYZONE; return false; } if (0 == GetGID()) { ERRLOG1(g_Log, "CID:%10u ±æµå¿¡ °¡ÀÔÇÏÁö ¾Ê°í¼­ ±æµå ¿ä»õ »ý¼º ½ºÅ¸ÅÍŶÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::NOT_EXIST_GUILD; return false; } CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild( GetGID() ); if (NULL == lpGuild) { ERRLOG2(g_Log, "CID:%10u GID:0x%10u Á¸ÀçÇÏÁö ¾Ê´Â ±æµåÀÇ ¸¶½ºÅͰ¡ ±æµå ¿ä»õ »ý¼º ½ºÅ¸ÅÍŶÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID, GetGID()); wError = PktUI::NOT_EXIST_GUILD; return false; } if (m_dwCID != lpGuild->GetMaster().m_dwCID) { ERRLOG2(g_Log, "CID:%10u GID:0x%10u ±æµåÀÇ ¸¶½ºÅͰ¡ ¾Æ´ÑÀÚ°¡ ±æµå ¿ä»õ »ý¼º ½ºÅ¸ÅÍŶÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID, GetGID()); wError = PktUI::NOT_MASTER; return false; } if(GetAdminLevel() != 3) { unsigned long dwFameForCampBuilding = (SERVER_ID::GROUP_TEST == CServerSetup::GetInstance().GetServerGroup()) ? Siege::FAME_FOR_CAMP_BUILDING_TEST : Siege::FAME_FOR_CAMP_BUILDING; if (lpGuild->GetFame() < dwFameForCampBuilding) { ERRLOG2(g_Log, "CID:%10u Fame:%d ¸í¼ºÄ¡°¡ ºÎÁ·ÇÑ ±æµå ¸¶½ºÅͰ¡ ±æµå ¿ä»õ¸¦ »ý¼ºÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID, lpGuild->GetFame()); wError = PktUI::NOT_ENOUGH_FAME; return false; } } if (true == CSiegeObjectMgr::GetInstance().ExistBuildingOrDestroyingCamp(lpGuild->GetGID())) { ERRLOG1(g_Log, "CID:%10u ±¸ÃàÁß, Ãë¼ÒÁß, ÆÄ±«ÁßÀÎ ´Ù¸¥ ±æµå ¿ä»õ°¡ ÀÖ½À´Ï´Ù.", m_dwCID); wError = PktUI::ANOTHER_DEV_CAMP; return false; } if (true == Castle::CCastleMgr::GetInstance().ExistCastleInRadius( GetCurrentPos() ) || true == CSiegeObjectMgr::GetInstance().ExistCampInRadius( GetCurrentPos() )) { ERRLOG1(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ ÁöÀ»·Á´Â À§Ä¡°¡ ´Ù¸¥ ±æµå ¿ä»õ³ª ¼º »ó¡¹°ÀÇ ¹Ý°æ ¾ÈÂÊÀÔ´Ï´Ù.", m_dwCID); wError = PktUI::INNER_RADIUS; return false; } GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); wError = PktUI::SERVER_ERROR; } else { return GameClientSendPacket::SendCharCreateCamp(lpDBAgentDispatch->GetSendStream(), GetCID(), GetGID(), Siege::CAMP, GetCurrentPos()); } } break; case Siege::KARTERANT_WEAPON: case Siege::MERKADIA_WEAPON: { if (GameTime::GT_GUILD_WAR != CGameTimeMgr::GetInstance().GetCurrentGuildTime()) { ERRLOG1(g_Log, "CID:%10u ¿ùµå ¿þÆùÀ» °Ç¼³ÇÒ ¼ö ¾ø´Â ½Ã°£¿¡ ¿ùµå ¿þÆù ±¸ÃàÀ» ½ÃµµÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::FAIL_NOT_GT_GUILD_WAR_TIME; return false; } if (!CCellManager::GetInstance().CheckPositionInZone( GetCurrentPos() )) { ERRLOG4(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ °Ç¼³ÇÏ·Á´Â À§Ä¡°¡ Á¸ ¿µ¿ª ¹ÛÀÔ´Ï´Ù. X:%f, Y:%f, Z:%f", m_dwCID, GetCurrentPos().m_fPointX, GetCurrentPos().m_fPointY, GetCurrentPos().m_fPointZ ); wError = PktUI::FAIL_POSITION; return false; } if (SERVER_ID::CAPITAL != CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_CAPITAL_ZONE; return false; } /* if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3) { wError = PktUI::FAIL_STONE_BATTLE; return false; } if (SERVER_ID::ZONE12 == CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_ALMIGHTY_GROUND; return false; } if (SERVER_ID::ZONE9 == CServerSetup::GetInstance().GetServerZone()) { wError = PktUI::FAIL_NEWZONE; return false; } */ if (false == CSiegeObjectMgr::GetInstance().EnableCreateWorldWeapon(GetNation(), wError)) { ERRLOG1(g_Log, "CID:%10u ¿ùµå ¿þÆùÀ» ÁöÀ»¼ö ¾ø½À´Ï´Ù.", m_dwCID); return false; } if (false == CCellManager::GetInstance().IsCampCreateArea(GetCurrentPos())) { ERRLOG4(g_Log, "CID:%10u ±æµå ¿ä»õ¸¦ °Ç¼³ÇÏ·Á´Â À§Ä¡°¡ Á¸ ¿µ¿ª ¹ÛÀÔ´Ï´Ù. X:%f, Y:%f, Z:%f", m_dwCID, GetCurrentPos().m_fPointX, GetCurrentPos().m_fPointY, GetCurrentPos().m_fPointZ ); wError = PktUI::FAIL_POSITION; return false; } if (true == CCellManager::GetInstance().IsSafetyZone(GetCurrentPos())) { ERRLOG1(g_Log, "CID:%10u ¿ùµå ¿þÆùÀ» ¼¼¿ï ¼ö ¾ø´Â °÷¿¡ ¿ùµå ¿þÆùÀ» ÁöÀ»·Á°í ÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::IN_SAFETYZONE; return false; } if (0 == GetGID()) { ERRLOG1(g_Log, "CID:%10u ±æµå¿¡ °¡ÀÔÇÏÁö ¾Ê°í¼­ ¿ùµå ¿þÆù »ý¼º ½ºÅ¸ÅÍŶÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::NOT_EXIST_GUILD; return false; } CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild( GetGID() ); if (NULL == lpGuild) { ERRLOG2(g_Log, "CID:%10u GID:0x%10u Á¸ÀçÇÏÁö ¾Ê´Â ±æµåÀÇ ¸¶½ºÅͰ¡ ¿ùµå ¿þÆù »ý¼º ½ºÅ¸ÅÍŶÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID, GetGID()); wError = PktUI::NOT_EXIST_GUILD; return false; } if (m_dwCID != lpGuild->GetMaster().m_dwCID) { ERRLOG2(g_Log, "CID:%10u GID:0x%10u ±æµåÀÇ ¸¶½ºÅͰ¡ ¾Æ´ÑÀÚ°¡ ¿ùµå ¿þÆù »ý¼º ½ºÅ¸ÅÍŶÀ» »ç¿ëÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID, GetGID()); wError = PktUI::NOT_MASTER; return false; } const unsigned long dwFameForCampBuilding = (SERVER_ID::GROUP_TEST == CServerSetup::GetInstance().GetServerGroup()) ? Siege::FAME_FOR_WEAPON_BUILDING_TEST : Siege::FAME_FOR_WEAPON_BUILDING; if (lpGuild->GetFame() < dwFameForCampBuilding) { ERRLOG2(g_Log, "CID:%10u Fame:%d ¸í¼ºÄ¡°¡ ºÎÁ·ÇÑ ±æµå ¸¶½ºÅͰ¡ ¿ùµå ¿þÆùÀ» »ý¼ºÇÏ·Á ÇÕ´Ï´Ù.", m_dwCID, lpGuild->GetFame()); wError = PktUI::NOT_ENOUGH_FAME; return false; } if (true == CSiegeObjectMgr::GetInstance().ExistBuildingOrDestroyingCamp(lpGuild->GetGID())) { ERRLOG1(g_Log, "CID:%10u ±¸ÃàÁß, Ãë¼ÒÁß, ÆÄ±«ÁßÀÎ ´Ù¸¥ ±æµå ¿ä»õ°¡ ÀÖ½À´Ï´Ù.", m_dwCID); wError = PktUI::ANOTHER_DEV_CAMP; return false; } if (true == Castle::CCastleMgr::GetInstance().ExistCastleInRadius( GetCurrentPos() ) || true == CSiegeObjectMgr::GetInstance().ExistCampInRadius( GetCurrentPos() )) { ERRLOG1(g_Log, "CID:%10u ¿ùµå ¿þÆùÀ» ÁöÀ»·Á´Â À§Ä¡°¡ ´Ù¸¥ ±æµå ¿ä»õ³ª ¼º »ó¡¹°ÀÇ ¹Ý°æ ¾ÈÂÊÀÔ´Ï´Ù.", m_dwCID); wError = PktUI::INNER_RADIUS; return false; } GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); wError = PktUI::SERVER_ERROR; } else { // µ¿½Ã¿¡ µÎ°³ÀÇ »ý¼º 󸮸¦ ¸·±â À§Çؼ­... CSiegeObjectMgr::GetInstance().RequestWorldWeaponCreation(); return GameClientSendPacket::SendCharCreateCamp(lpDBAgentDispatch->GetSendStream(), GetCID(), GetGID(), wObjectType, m_CurrentPos); } } break; case Siege::SHORT_RANGE_SIEGE_ARMS: case Siege::LONG_RANGE_SIEGE_ARMS: case Siege::AIRSHIP: { // ÀÚÀç °¡Á®¿À±â CItem* lpMaterial = GetItem(ItemPos(TakeType::TS_EXTRA, ExtraSpacePos::KIT_MATERIAL_POS)); if (NULL == lpMaterial) { ERRLOG1(g_Log, "CID:0x%08x °ø¼º º´±â¸¦ ¸¸µé·Á´Â ÀÚÀç°¡ ¾ø½À´Ï´Ù.", m_dwCID); wError = PktUI::NOT_ENOUGH_MATERIAL; goto lb_fail; } // edith 2008.08.09 ÇöÀç °ø¼±ÀüÀ» ÁöÁ¤ÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¾Æ·¡¸¦ Àӽ÷ΠZONE3¹øÀ¸·Î // ÁöÁ¤Çß´Ù. ÈÄ¿¡ °ø¼±ÀüÀº ´Ù¸¥ Á¸À¸·Î ÁöÁ¤ÇÑ´Ù. if(CServerSetup::GetInstance().GetServerZone()!=SERVER_ID::CAPITAL) { ERRLOG1(g_Log, "CID:%10u Ä«³ª¹øÁ¸ÀÌ ¾Æ´Õ´Ï´Ù.", m_dwCID); goto lb_fail; } if (!CCellManager::GetInstance().CheckPositionInZone( GetCurrentPos() )) { ERRLOG4(g_Log, "CID:%10u °ø¼º º´±â¸¦ ¸¸µé·Á°í ÇÏ´Â À§Ä¡°¡ Á¸ ¿µ¿ª ¹ÛÀÔ´Ï´Ù. X:%f, Y:%f, Z:%f", m_dwCID, GetCurrentPos().m_fPointX, GetCurrentPos().m_fPointY, GetCurrentPos().m_fPointZ ); wError = PktUI::FAIL_POSITION; goto lb_fail; } if ( GameTime::ST_SIEGE_WAR != CGameTimeMgr::GetInstance().GetCurrentSiegeTime() ) { ERRLOG1(g_Log, "CID:0x%08x °ø¼º ½Ã°£ÀÌ ¾Æ´Ñ »óȲ¿¡¼­ °ø¼º º´±â¸¦ ¸¸µé·Á°í ÇÕ´Ï´Ù.", m_dwCID); wError = PktUI::NOT_SIEGE_TIME; goto lb_fail; } if (false == CCastleMgr::GetInstance().ExistSiegeInRadius( GetCurrentPos())) { ERRLOG1(g_Log, "CID:0x%08x ¿µ¿ª ¹Û¿¡¼­ °ø¼º º´±â¸¦ »ý¼ºÇÏ·Á°í Çß½À´Ï´Ù.", m_dwCID); wError = PktUI::OUTER_RADIUS_SIEGE; goto lb_fail; } if(CSiegeObjectMgr::GetInstance().HasSiegeArms(GetCID())) { wError = PktUI::FAIL_HAS_SIEGE_ARMS; goto lb_fail; } // ¼ö¼º º´±â üũ. if(CCastleMgr::GetInstance().HasCastleArms(GetCID())) { wError = PktUI::FAIL_HAS_SIEGE_ARMS; goto lb_fail; } // ±æµå ¸¶½ºÅÍ Ã¼Å©. if(!GetGID()) { wError = PktUI::NOT_GUILD_MASTER; goto lb_fail; } else { CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(GetGID()); if(lpGuild) { MemberInfo memberInfo = lpGuild->GetMaster(); if(memberInfo.m_dwCID!=GetCID()) { wError = PktUI::NOT_GUILD_MASTER; goto lb_fail; } } } // Level üũ. if(GetLevel()GetNumOrDurability()=MAX_SIEGE_OBJECT) { wError = PktUI::FAIL_MAX_SIEGE_OBJECT; goto lb_fail; } lb_fail: if(wError) { if(lpMaterial) { RemoveItem(lpMaterial->GetPos()); GiveItem(lpMaterial); } return false; } unsigned char cUpgradeStep = 0; int nRemain = lpMaterial->GetNumOrDurability() - Siege::SIEGE_ARMS_UPGRADE_MATERIAL_NUM; GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (0 == lpDBAgentDispatch) { ERRLOG0(g_Log, "¿¡ÀÌÀüÆ® ¾ò±â ½ÇÆÐ."); wError = PktUI::SERVER_ERROR; } else { if (GameClientSendPacket::SendCharCreateSiegeArms(lpDBAgentDispatch->GetSendStream(), GetCID(), GetNation(), wObjectType, cUpgradeStep, m_CurrentPos)) { lpMaterial->SetNumOrDurability(nRemain); if (0 == nRemain) { if (!RemoveItem(lpMaterial->GetPos())) { ERRLOG1(g_Log, "CID:0x%08x °ø¼º º´±â ½ºÅ¸Æ®Å¶ »ç¿ë½Ã ´Ù »ç¿ëÇÑ ÀÚÀç Á¦°Å¿¡ ½ÇÆÐÇß½À´Ï´Ù.", m_dwCID); wError = PktUI::SERVER_ERROR; } else { DELETE_ITEM(lpMaterial); } } else { // ³²Àº ¾ÆÀÌÅÛ Àκ¥Å丮·Î À̵¿. RemoveItem(lpMaterial->GetPos()); GiveItem(lpMaterial); } return true; } } } break; } return false; } bool CCharacter::GiveItemByDBAgentRequest(GiveItemInfo& giveItemInfo) { Item::CItemMgr& itemMgr = Item::CItemMgr::GetInstance(); Item::CItemFactory& itemFactory = Item::CItemFactory::GetInstance(); Item::ItemPos itemPos = Item::ItemPos(TakeType::TS_TEMPINVEN, 0); GivenItemList::iterator end = m_GivenItemList.end(); GivenItemList::iterator pos = std::lower_bound(m_GivenItemList.begin(), end, giveItemInfo.m_dwCreateID); // ÀÌ¹Ì Áö±ÞÇÑ ¾ÆÀÌÅÛÀÌ ¾Æ´Ò °æ¿ì Áö±Þ if (pos == end || *pos != giveItemInfo.m_dwCreateID) { Item::CItem* lpItem = CreateItemFromGiveInfo(itemMgr, itemFactory, giveItemInfo, itemPos); if (0 != lpItem) { if (GetTempInven().SetItem(itemPos, lpItem)) { giveItemInfo.m_dwItemUID = lpItem->GetUID(); m_GivenItemList.insert(pos, giveItemInfo.m_dwCreateID); return true; } else { DELETE_ITEM(lpItem); } } else { ERRLOG3(g_Log, "UID:%10u / CID:%10u / CreationID:%10u / ¾ÆÀÌÅÛ Áö±Þ : ¾ÆÀÌÅÛ »ý¼º ½ÇÆÐ", giveItemInfo.m_dwUID, giveItemInfo.m_dwCID, giveItemInfo.m_dwCreateID); } } else { ERRLOG3(g_Log, "UID:%10u / CID:%10u / CreationID:%10u / ¾ÆÀÌÅÛ Áö±Þ : ÀÌ¹Ì Áö±ÞÇÑ ¾ÆÀÌÅÛÀ̶ó ´õ Áö±ÞÇÒ ¼ö ¾ø½À´Ï´Ù", giveItemInfo.m_dwUID, giveItemInfo.m_dwCID, giveItemInfo.m_dwCreateID); } return false; }