⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exchangemanager.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					pPlayer1->SendMsg( &CancelMsg, sizeof( MSGBASE ) );
					break;
				}
			}
			else
			{
				break;
			}

			MSGBASE CancelMsg = *msg;

			CancelMsg.Protocol = MP_EXCHANGE_WAITING_CANCEL_ACK;
			pPlayer1->SendMsg( &CancelMsg, sizeof( MSGBASE ) );

			if( pPlayer1->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);

			CPlayer* pPlayer2		= pPlayer1->GetExchangeContainer()->pOpPlayer;

			DestroyExchangeRoom( pRoom );

			if( pPlayer2 == NULL ) break;	//üũ
			CancelMsg.Protocol = MP_EXCHANGE_WAITING_CANCEL;
			pPlayer2->SendMsg( &CancelMsg, sizeof( MSGBASE ) );
			
			if( pPlayer2->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_Exchange);
		}
		break;

	case MP_EXCHANGE_ADDITEM_SYN:
		{
			MSG_LINKITEM* msg = (MSG_LINKITEM*)pMsg;

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;
		
			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;
			if( pRoom == NULL ) break;	//Ãß°¡ : ¿À·ù¸Þ¼¼Áö ó¸®, Ŭ¶óÀÌ¾ðÆ® ±³È¯ ÁßÁö

			MSG_LINKITEM ItemMsg = *msg;

			//¿©±â¼­ ¾ÆÀÌÅÛ Æ÷Áö¼ÇÀ¸·Î ½ÇÁ¦ ¼­¹ö°¡ °¡Áö°í ÀÖ´Â Á¤º¸¿Í ÀÏÄ¡ÇÏ´ÂÁö üũÇÏÀÚ.
			CInventorySlot* pInventory = (CInventorySlot*)pPlayer1->GetSlot( eItemTable_Inventory );
			if( pInventory == NULL ) return;
			const ITEMBASE* pItemBase = pInventory->GetItemInfoAbs( msg->ItemInfo.Position );
			if( pItemBase == NULL )
			{
				ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_NACK;
				pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
				return;
			}

			if( pItemBase->dwDBIdx != msg->ItemInfo.dwDBIdx ||
				pItemBase->wIconIdx != msg->ItemInfo.wIconIdx ||
				pItemBase->Durability != msg->ItemInfo.Durability ||
				pItemBase->Position != msg->ItemInfo.Position )
			{
				ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_NACK;
				pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
				return;
			}

			if( ITEMMGR->IsDupItem(pItemBase->wIconIdx) )
			if( pItemBase->Durability > 5 )
			{
				ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_NACK;
				pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
				return;
			}

			if( pRoom->IsLocked( pPlayer1->GetExchangeContainer()->nMyIndex ) )
			{
				ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_NACK;
				pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
				return;
			}

			if( !pRoom->AddItem( pPlayer1->GetExchangeContainer()->nMyIndex, &msg->ItemInfo ) )
			{
				ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_NACK;
				pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
				return;
			}
			if( !CHKRT->ItemOf( pPlayer1, msg->ItemInfo.Position, msg->ItemInfo.wIconIdx,
				msg->ItemInfo.Durability, msg->ItemInfo.QuickPosition ) )
			{
				ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_NACK;
				pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );

				return;
			}

			ItemMsg.Protocol = MP_EXCHANGE_ADDITEM_ACK;
			pPlayer1->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
			
			//ItemMsg.Protocol = MP_EXCHANGE_ADDITEM;
			//pPlayer2->SendMsg( &ItemMsg, sizeof( MSG_LINKITEM ) );
//´Ù¸¥»ç¶÷¿¡°Ô º¸³¾¶§´Â ¿É¼ÇÁ¤º¸µµ ÇÔ²² º¸³»¾ßÇÑ´Ù.
			MSG_LINKITEM_ADD ItemOptionMsg;
			ItemOptionMsg.Category		= MP_EXCHANGE;
			ItemOptionMsg.Protocol		= MP_EXCHANGE_ADDITEM;
			ItemOptionMsg.dwObjectID	= msg->dwObjectID;
			ItemOptionMsg.ItemInfo		= msg->ItemInfo;
			ItemOptionMsg.wAbsPosition	= msg->wAbsPosition;

			if( ITEMMGR->IsOptionItem( msg->ItemInfo.wIconIdx, msg->ItemInfo.Durability ) )
			{
				ItemOptionMsg.bOptionItem = 1;
				ItemOptionMsg.sOptionInfo = *pPlayer1->GetItemOption( msg->ItemInfo.Durability );
			}

			pPlayer2->SendMsg( &ItemOptionMsg, ItemOptionMsg.GetSize() );
		}
		break;

	case MP_EXCHANGE_DELITEM_SYN:
		{
			MSG_WORD* msg = (MSG_WORD*)pMsg;

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;

			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;
			
			if( pRoom == NULL ) break;	//Ãß°¡ : ¿À·ù¸Þ¼¼Áö ó¸®, Ŭ¶óÀÌ¾ðÆ® ±³È¯ ÁßÁö

			MSG_WORD DelMsg = *msg;

			if( pRoom->IsLocked( pPlayer1->GetExchangeContainer()->nMyIndex ) )
			{
				DelMsg.Protocol = MP_EXCHANGE_DELITEM_NACK;
				pPlayer1->SendMsg( &DelMsg, sizeof( MSG_WORD ) );
				return;
			}

			if( !pRoom->DelItem( pPlayer1->GetExchangeContainer()->nMyIndex, msg->wData-1 ) )
			{
				DelMsg.Protocol = MP_EXCHANGE_DELITEM_NACK;
				pPlayer1->SendMsg( &DelMsg, sizeof( MSG_WORD ) );
				return;
			}

			DelMsg.Protocol = MP_EXCHANGE_DELITEM_ACK;
			pPlayer1->SendMsg( &DelMsg, sizeof( MSG_WORD ) );

			DelMsg.Protocol = MP_EXCHANGE_DELITEM;
			pPlayer2->SendMsg( &DelMsg, sizeof( MSG_WORD ) );
		}
		break;
		
	case MP_EXCHANGE_LOCK_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;
			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;
			//CHECK Ç÷¹ÀÌ¾î »óÈ£ ¸ðµÎ Á¸ÀçÇϳª?

			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;
			if( !pRoom ) return;		//erroró¸®ÇؾßÇϴµ¥..

			pRoom->Lock( pPlayer1->GetExchangeContainer()->nMyIndex, TRUE );

			MSGBASE LockMsg = *msg;
			LockMsg.Protocol = MP_EXCHANGE_LOCK_ACK;
			pPlayer1->SendMsg( &LockMsg, sizeof( MSGBASE ) );

			LockMsg.Protocol	= MP_EXCHANGE_LOCK;
			pPlayer2->SendMsg( &LockMsg, sizeof( MSGBASE ) );

			//¸ðµÎ ¶ôÀΰ¡...¸¦ Ã¼Å©ÇØ¼­ ±³È¯¹öư ´©¸¦ ¼ö ÀÖµµ·Ï...?
		}
		break;

	case MP_EXCHANGE_INPUTMONEY_SYN:
		{
			MSG_DWORD* msg = (MSG_DWORD*)pMsg;
			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;

			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;
			if( pRoom == NULL ) break;	//erroró¸®ÇؾßÇϴµ¥..
			
			//KES °Ë»ç Ãß°¡
			if( pRoom->IsLocked( pPlayer1->GetExchangeContainer()->nMyIndex ) )
			{
				MSGBASE NackMsg;
				NackMsg.Category = MP_EXCHANGE;
				NackMsg.Protocol = MP_EXCHANGE_INPUTMONEY_NACK;
				NackMsg.dwObjectID = pPlayer1->GetID();
				
				pPlayer1->SendMsg( &NackMsg, sizeof(MSGBASE) );
				return;
			}
			
			DWORD dwMoney = pRoom->InputMoney( pPlayer1->GetExchangeContainer()->nMyIndex, msg->dwData );

			MSG_DWORD MoneyMsg = *msg;
			MoneyMsg.dwData = dwMoney;	//½ÇÁ¦ ¼¼ÆÃµÈ µ·À¸·Î

			MoneyMsg.Protocol = MP_EXCHANGE_INPUTMONEY_ACK;
			pPlayer1->SendMsg( &MoneyMsg, sizeof( MSG_DWORD ) );

			MoneyMsg.Protocol = MP_EXCHANGE_INPUTMONEY;
			pPlayer2->SendMsg( &MoneyMsg, sizeof( MSG_DWORD ) );
		}
		break;

	case MP_EXCHANGE_UNLOCK_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;
			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;

			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;
			if( pRoom == NULL ) break;		//erroró¸®ÇؾßÇϴµ¥..

			pRoom->Lock( pPlayer1->GetExchangeContainer()->nMyIndex, FALSE );			

			MSGBASE LockMsg = *msg;			
			LockMsg.Protocol = MP_EXCHANGE_UNLOCK_ACK;
			pPlayer1->SendMsg( &LockMsg, sizeof( MSGBASE ) );

			LockMsg.Protocol	= MP_EXCHANGE_UNLOCK;
			pPlayer2->SendMsg( &LockMsg, sizeof( MSGBASE ) );

			//±³È¯ ¹öư..?
		}
		break;

	case MP_EXCHANGE_CANCEL_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;
			
			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;
			if( pRoom == NULL ) break;	//±³È¯ÀÌ ÀÌ¹Ì µÇ¾ú´Ù.
			
			DestroyExchangeRoom( pRoom );

			MSGBASE CancelMsg = *msg;
			CancelMsg.Protocol = MP_EXCHANGE_CANCEL_ACK;
			pPlayer1->SendMsg( &CancelMsg, sizeof( MSGBASE ) );

			MSG_BYTE ErrorMsg;
			ErrorMsg.Category	= MP_EXCHANGE;
			ErrorMsg.Protocol	= MP_EXCHANGE_CANCEL;
			ErrorMsg.bData		= eEE_USERCANCEL;
			pPlayer2->SendMsg( &ErrorMsg, sizeof( MSG_BYTE ) );

			if( pPlayer1->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);
			if( pPlayer2->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_Exchange);
		}
		break;
	
	case MP_EXCHANGE_EXCHANGE_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			if( pPlayer2 == NULL ) break;

			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;

			if( pRoom == NULL ) break;	//¿¡·¯Ã³¸® confirm
			if( pRoom->IsLocked( pPlayer1->GetExchangeContainer()->nMyIndex ) == FALSE )
			{
				//±³È¯¹öư ´©¸£°í »ó´ë°¡ ¶ôÀ» Ç®¾î ³ªÀÇ ¶ôÀÌ Ç®·ÈÀ»¶§ ¿©±â·Î µé¾î¿Ã ¼ö ÀÖ´Ù.
				MSGBASE ExchangeNackMsg;
				ExchangeNackMsg.Category = MP_EXCHANGE;
				ExchangeNackMsg.Protocol = MP_EXCHANGE_EXCHANGE_NACK;
				pPlayer1->SendMsg( &ExchangeNackMsg, sizeof( MSGBASE ) );
//				pPlayer2->SendMsg( &ExchangeNackMsg, sizeof( MSGBASE ) );
//				DestroyExchangeRoom( pRoom );
//				if( pPlayer1->GetState() == eObjectState_Exchange )
//					OBJECTSTATEMGR_OBJ->StartObjectState(pPlayer1, eObjectState_None, 0);
//					pPlayer1->SetState( eObjectState_None );
//				if( pPlayer2->GetState() == eObjectState_Exchange )
//					OBJECTSTATEMGR_OBJ->StartObjectState(pPlayer2, eObjectState_None, 0);
//					pPlayer2->SetState( eObjectState_None );


				break;
			}

			pRoom->SetExchange( pPlayer1->GetExchangeContainer()->nMyIndex );

			if( pRoom->IsAllExchange() )				//±³È¯!
			{
				int rt;
				if( ( rt = pRoom->DoExchange() ) == eEE_OK )
				{
					MSGBASE ExchangeMsg;
					ExchangeMsg.Category	= MP_EXCHANGE;
					ExchangeMsg.Protocol	= MP_EXCHANGE_EXCHANGE;
					pPlayer1->SendMsg( &ExchangeMsg, sizeof( MSGBASE ) );
					pPlayer2->SendMsg( &ExchangeMsg, sizeof( MSGBASE ) );
				}
				else
				{
					//±³È¯½ÇÆÐ ¸Þ¼¼Áö.
					MSG_BYTE ErrorMsg;
					ErrorMsg.Category	= MP_EXCHANGE;
					ErrorMsg.Protocol	= MP_EXCHANGE_CANCEL;
					ErrorMsg.bData		= rt;
					pPlayer1->SendMsg( &ErrorMsg, sizeof( MSG_BYTE ) );
					pPlayer2->SendMsg( &ErrorMsg, sizeof( MSG_BYTE ) );
				}

				DestroyExchangeRoom( pRoom );

//				if( pPlayer1->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState( pPlayer1, eObjectState_Exchange );
//				if( pPlayer2->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState( pPlayer2, eObjectState_Exchange );
			}
		}
		break;
	}
}

CExchangeRoom* CExchangeManager::GetRoomInfo( DWORD dwPlayer1ID, CPlayer** ppPlayer1, CPlayer** ppPlayer2 )
{
	*ppPlayer1 = (CPlayer*)g_pUserTable->FindUser( dwPlayer1ID );
	if( *ppPlayer1 == NULL ) return NULL;

	*ppPlayer2 = (*ppPlayer1)->GetExchangeContainer()->pOpPlayer;

	return (*ppPlayer1)->GetExchangeContainer()->pRoom;
}

//µÎ Ç÷¹ÀÌ¾î ±¸Çϱâ ÇÔ¼ö

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -