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

📄 quickmanager.cpp

📁 墨香最新私服
💻 CPP
字号:

// QuickManager.cpp: implementation of the CQuickManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QuickManager.h"
#include "MapDBMsgParser.h"
#include "Player.h"
#include "UserTable.h"
#include "BattleSystem_Server.h"
//#include "ItemSlot.h"
//#include "ItemContainer.h"

#include "AbilityManager.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CQuickManager::CQuickManager()
{

}

CQuickManager::~CQuickManager()
{

}

void CQuickManager::SendErrorMsg( CPlayer * pPlayer, MSG_QUICK_ERROR * msg, int msgSize, int ECode )
{
	msg->ECode = ECode;
	pPlayer->SendMsg(msg, msgSize);
}

void CQuickManager::SendAckMsg( CPlayer * pPlayer, MSGBASE * msg, int msgSize)
{
	pPlayer->SendMsg(msg, msgSize);
}

void CQuickManager::NetworkMsgParse( BYTE Protocol, void* pMsg )
{
	MSGBASE * pmsg = (MSGBASE *)pMsg;
	CPlayer * pPlayer = (CPlayer *)g_pUserTable->FindUser(pmsg->dwObjectID);			
	if(!pPlayer) return;
	if( BATTLESYSTEM->GetBattle(pPlayer)->GetBattleKind() == eBATTLE_KIND_SURYUN )
	{
		char buf[128];
		sprintf(buf, "荐访厘俊辑 狞器瘤记 皋矫瘤甫 焊陈嚼聪促. character_Idx: %d, Protocol : %d", pmsg->dwObjectID, pmsg->Protocol);
		ASSERTMSG(0, buf);
		return;
	}
	switch(Protocol)
	{
	case MP_QUICK_ADD_SYN:
		{
			MSG_QUICK_ADD_SYN * msg = (MSG_QUICK_ADD_SYN *)pMsg;
			CPlayer * pPlayer = (CPlayer *)g_pUserTable->FindUser(msg->dwObjectID);
			if(!pPlayer) return;

			if(QUICKMNGR->AddQuickItem(pPlayer, msg->QuickPos, msg->SrcPos, msg->SrcItemIdx, msg->OldSrcPos, msg->OldSrcItemIdx))
			{
				MSG_QUICK_ADD_ACK msg2;
				memcpy(&msg2, msg, sizeof(MSG_QUICK_ADD_SYN));
				msg2.Protocol = MP_QUICK_ADD_ACK;
				SendAckMsg(pPlayer, &msg2, sizeof(msg2));
			}
			else
			{
				MSG_QUICK_ERROR msg;
				msg.Category = MP_QUICK;
				msg.Protocol = MP_QUICK_ADD_NACK;
				msg.dwObjectID = pPlayer->GetID();
				SendErrorMsg(pPlayer, &msg, sizeof(msg), 1);
			}
		}
		break;
	case MP_QUICK_REM_SYN:
		{
			MSG_QUICK_REM_SYN * msg = (MSG_QUICK_REM_SYN *)pMsg;
			CPlayer * pPlayer = (CPlayer *)g_pUserTable->FindUser(msg->dwObjectID);
			if(!pPlayer) return;
			if(QUICKMNGR->RemQuickItem(pPlayer, msg->SrcPos, msg->SrcItemIdx))
			{
				MSG_QUICK_REM_ACK msg2;
				memcpy(&msg2, msg, sizeof(MSG_QUICK_REM_SYN));
				msg2.Protocol = MP_QUICK_REM_ACK;
				SendAckMsg(pPlayer, &msg2, sizeof(msg2));
			}
			else
			{
				MSG_QUICK_ERROR msg;
				msg.Category = MP_QUICK;
				msg.Protocol = MP_QUICK_REM_NACK;
				msg.dwObjectID = pPlayer->GetID();
				SendErrorMsg(pPlayer, &msg, sizeof(msg), 2);
			}
		}
		break;
	case MP_QUICK_MOVE_SYN:
		{
			MSG_QUICK_MOVE_SYN * msg = (MSG_QUICK_MOVE_SYN *)pMsg;
			CPlayer * pPlayer = (CPlayer *)g_pUserTable->FindUser(msg->dwObjectID);
			if(!pPlayer) return;
			if(QUICKMNGR->MoveQuickItem(pPlayer, msg->FromSrcPos, msg->wFromSrcItemIdx, msg->FromQuickPos, msg->ToSrcPos, msg->wToSrcItemIdx, msg->ToQuickPos))
			{
				MSG_QUICK_MOVE_ACK msg2;
				memcpy(&msg2, msg, sizeof(MSG_QUICK_MOVE_SYN));
				msg2.Protocol = MP_QUICK_MOVE_ACK;
				SendAckMsg(pPlayer, &msg2, sizeof(msg2));
			}
			else
			{
				MSG_QUICK_ERROR msg;
				msg.Category = MP_QUICK;
				msg.Protocol = MP_QUICK_MOVE_NACK;
				msg.dwObjectID = pPlayer->GetID();
				SendErrorMsg(pPlayer, &msg, sizeof(msg), 3);
			}
		}
		break;
	}
}

BOOL ChangeV(CPlayer * pPlayer, POSTYPE WhatSrcPos, WORD WhatSrcItemIdx, POSTYPE QuickPos)
{
	eQUICKICON_KIND quickGroup = GetIconKind(WhatSrcItemIdx);
	if(quickGroup == eITEM_ICON)
	{
		CItemSlot * pSrcSlot = pPlayer->GetSlot(WhatSrcPos);	
		const ITEMBASE * pItemBase = pSrcSlot->GetItemInfoAbs(WhatSrcPos);
		if(pItemBase == 0)
		{
			ASSERT(0);
			return FALSE;
		}
		if(pItemBase->wIconIdx != WhatSrcItemIdx)
			return FALSE;

		if(EI_TRUE != pSrcSlot->UpdateItemAbs(pPlayer, WhatSrcPos, 0,0,0,QuickPos,0,UB_QABSPOS))
			return FALSE;

		// db update
		ItemUpdateToDB(pPlayer->GetID(), pItemBase->dwDBIdx, pItemBase->wIconIdx, pItemBase->Durability, 
						pItemBase->Position, pItemBase->QuickPosition );
	}
	else if( quickGroup == eMUGONG_ICON )
	{
		//公傍	
		MUGONGBASE * pMugongBase = pPlayer->GetMugongBase(WhatSrcPos);
		if(pMugongBase == 0)
		{
			ASSERT(0);
			return FALSE;
		}
		if(pMugongBase->wIconIdx != WhatSrcItemIdx)
		{
			return FALSE;
		}	
		if(pMugongBase->Sung == 0)
		{
			return FALSE;
		}

		pMugongBase->QuickPosition = QuickPos;

		// db update
		MugongUpdateToDB(pMugongBase,"QUICK");
	}
	else if( quickGroup == eABILITY_ICON )
	{
		//To Do : quick position update
		ABILITYMGR->SetAbilityQuickPosition(WhatSrcItemIdx-MIN_ABILITY_INDEX, QuickPos, pPlayer->GetAbilityGroup() );
	}
	else
	{
		char buf[64] = {0,};
		sprintf(buf, "Error! quickGroup : %d", quickGroup);
		ASSERTMSG(0, buf);
		return FALSE;
	}

	return TRUE;
}

BOOL CQuickManager::AddQuickItem( CPlayer * pPlayer, POSTYPE QuickPos, POSTYPE srcPos, WORD wSrcItemIdx, POSTYPE OldSrcPos, WORD wOldSrcItemIdx)
{
	CInventorySlot* pSlot = (CInventorySlot*)pPlayer->GetSlot( eItemTable_Inventory );
	if( GetItemKind( wSrcItemIdx ) == eYOUNGYAK_ITEM )
	{
		if( pSlot->CheckItemLockForItemIdx( wSrcItemIdx ) == FALSE )
			return FALSE;
	}

	//扁粮俊 乐栏搁 瘤框
	if(wOldSrcItemIdx != 0)
	{
		ChangeV(pPlayer, OldSrcPos, wOldSrcItemIdx, 0);
	}
	
	return ChangeV(pPlayer, srcPos, wSrcItemIdx, QuickPos);
}

BOOL CQuickManager::RemQuickItem(CPlayer * pPlayer, POSTYPE SrcPos, WORD wSrcItemIdx)
{
	return ChangeV(pPlayer, SrcPos, wSrcItemIdx, 0);
}

BOOL CQuickManager::MoveQuickItem(CPlayer * pPlayer, POSTYPE FromSrcPos, WORD wFromSrcItemIdx, POSTYPE FromQuickPos, POSTYPE ToSrcPos, WORD wToSrcItemIdx, POSTYPE ToQuickPos )
{
	if(!ChangeV(pPlayer, FromSrcPos, wFromSrcItemIdx, ToQuickPos))
	{
		return FALSE;
	}

	if( wToSrcItemIdx == 0 ) return TRUE;

	if(!ChangeV(pPlayer, ToSrcPos, wToSrcItemIdx, FromQuickPos))
	{
		//rollback
		if(!ChangeV(pPlayer, FromSrcPos, wFromSrcItemIdx, FromQuickPos))
			ASSERT(0);
		return FALSE;
	}
	return TRUE;
}

/*
	QUICKITEM quickItem;
	MSG_QUICK_ADD_ACK msg;



	// 公傍,酒捞袍 沥焊俊档 持澜
	eQUICKICON_KIND quickGroup = GetIconKind(pmsg->wIconIdx);
	if(quickGroup == eITEM_ICON)
	{
		eITEM_KINDBIT bits = GetItemKind(pmsg->wIconIdx);
		if(bits & eEQUIP_ITEM || bits & eYOUNGYAK_ITEM)
		{
			CIconTable * pTable = NULL;
			switch(GetTableIdxPosition(pmsg->wSrcAbsPosition))
			{
			case eItemTable_Inventory:
				{
					pTable = pPlayer->GetIconTable(eItemTable_Inventory);
				}
				break;
			case eItemTable_Weared:
				{
					pTable = pPlayer->GetIconTable(eItemTable_Weared);
				}
				break;
			case eItemTable_MunpaWarehouse:
				{
					pTable = pPlayer->GetIconTable(eItemTable_Weared);
				}
				break;
			default:
				{
					ASSERT(0);
					return;
				}
			}
			ITEMBASE * item = pTable->GetItemInfoAbs(pmsg->wSrcAbsPosition);
			if(item->QuickPosition != 0)			// 吝汗 殿废 阂啊
			{
				RemQuickItem(pPlayer, GetTableIdxPosition(pmsg->wSrcAbsPosition), item->QuickPosition);
				//goto QI_ADD_FAILED;
			}
			item->QuickPosition = pmsg->wQuickAbsPosition;
		}
		else 
		{
			goto QI_ADD_FAILED;
		}
	}
	else
	{
		// 公傍
		MUGONGBASE * pMugong = pPlayer->GetMugongBase(pmsg->wSrcAbsPosition);
		if(pMugong->QuickPosition != 0)				
		{
			// 吝汗 殿废 =>. 捞傈芭 瘤框
			RemQuickItem(pPlayer, GetTableIdxPosition(pmsg->wSrcAbsPosition), pMugong->QuickPosition);
			//goto QI_ADD_FAILED;
		}	
		if(pMugong->Sung == 0)
		{
			// 0己楼府 公傍篮 殿废 阂啊
			goto QI_ADD_FAILED;
		}
		pMugong->QuickPosition = pmsg->wQuickAbsPosition;
	}


	quickItem.dwIconIdx = pmsg->wIconIdx;
	quickItem.eIGKinds = quickGroup;
	quickItem.wAbsPostion = pmsg->wSrcAbsPosition;
	pPlayer->SetQuickItem(pmsg->wQuickAbsPosition,&quickItem);

	msg.Category = MP_QUICK;
	msg.Protocol = MP_QUICK_ADD_ACK;
	msg.dwObjectID = pmsg->dwObjectID;
	msg.wIconIdx = pmsg->wIconIdx;
	msg.wSrcAbsPosition = pmsg->wSrcAbsPosition;
	msg.wQuickAbsPosition = pmsg->wQuickAbsPosition;


	pPlayer->SendMsg(&msg, sizeof(msg));
	
	return;

QI_ADD_FAILED:
	MSG_WORD msgWord;
	msgWord.Category = MP_QUICK;
	msgWord.Protocol = MP_QUICK_ADD_NACK;
	msgWord.dwObjectID = pmsg->dwObjectID;
	msgWord.wData = 1;
	pPlayer->SendMsg(&msgWord, sizeof(msgWord));
}

void CQuickManager::RemQuickItem(CPlayer * pPlayer, MSG_QUICK_REM_SYN * pmsg)
{
	RemQuickItem(pPlayer, pmsg->wTableIdx, pmsg->AbsPosition);
}
void CQuickManager::RemQuickItem(CPlayer * pPlayer, WORD tableIdx, WORD absPosition)
{
	// 公傍,酒捞袍 沥焊俊档 持澜
	WORD wSrcAbsPosition = 0;
	QUICKITEM itemOut;
	if(!pPlayer->GetQuickPostion(absPosition,&itemOut))
		return;
	wSrcAbsPosition = itemOut.wAbsPostion;

	switch(itemOut.eIGKinds)
	{
	case eITEM_ICON:
		{
			
			CIconTable * pTable = pPlayer->GetIconTable(tableIdx);
			if( !pTable ) return ;
			ITEMBASE * item = pTable->GetItemInfoAbs(itemOut.wAbsPostion);
			item->QuickPosition = 0;
			CharacterItemUpdate(pPlayer->GetID(), item->dwDBIdx, item->wIconIdx, item->Durability, item->Position, item->QuickPosition);
		}
		break;
	case eMUGONG_ICON:
		{
			MUGONGBASE * pMugong = pPlayer->GetMugongBase(itemOut.wAbsPostion);
			pMugong->QuickPosition = 0;
			CharacterMugongUpdate(pMugong);
		}
		break;
	default:
		{
			//not implement
			//漂荐
			//ASSERT(0);
			return;
		}
	}


	PureRemQuickItemAbs(pPlayer, absPosition);
	
	MSG_QUICK_REM_ACK msg;
	msg.Category = MP_QUICK;
	msg.Protocol = MP_QUICK_REM_ACK;
	msg.dwObjectID = pPlayer->GetID();
	msg.wQuickAbsPosition = absPosition;
	msg.wSrcAbsPosition = wSrcAbsPosition;

	pPlayer->SendMsg(&msg, sizeof(msg));
}

void CQuickManager::MoveQuickItem(CPlayer * pPlayer, MSG_QUICK_MOVE_SYN * pmsg)
{	

	QUICKITEM FromQuickItem, ToQuickItem;
	if(!pPlayer->GetQuickPostion(pmsg->wFromAbsPosition,&FromQuickItem))
	{
		ASSERT(0);
	}
	if(!pPlayer->GetQuickPostion(pmsg->wToAbsPosition,&ToQuickItem))
	{
		ASSERT(0);
	}


	PureUpdateQuickItem(pPlayer, pmsg->wToAbsPosition, FromQuickItem.dwIconIdx, FromQuickItem.eIGKinds, FromQuickItem.wAbsPostion);
	PureUpdateQuickItem(pPlayer, pmsg->wFromAbsPosition, ToQuickItem.dwIconIdx, ToQuickItem.eIGKinds, ToQuickItem.wAbsPostion);

	MSG_QUICK_MOVE_ACK msg;
	msg.Category = MP_QUICK;
	msg.Protocol = MP_QUICK_MOVE_ACK;
	msg.dwObjectID = pPlayer->GetID();
	msg.wFromAbsPosition= pmsg->wFromAbsPosition;
	msg.wToAbsPosition = pmsg->wToAbsPosition;

	pPlayer->SendMsg(&msg, sizeof(msg));



	// 酒捞袍趣篮 公傍狼 QPOSITION阑 官层拎具 窃
	// DB绰 救官层林唱?

	int tableIdx = 0;
	switch((tableIdx = GetTableIdxPosition(FromQuickItem.wAbsPostion)))
	{
	case eItemTable_Inventory:
	case eItemTable_Weared:
		{
			CIconTable * pFromTable = pPlayer->GetIconTable(tableIdx);
			ITEMBASE * FromItem = pFromTable->GetItemInfoAbs(FromQuickItem.wAbsPostion);
			if(FromItem&&FromItem->dwDBIdx!=0)
				FromItem->QuickPosition = pmsg->wToAbsPosition;
			else
			{
				ASSERT(0);
			}
		}
		break;
	case eItemTable_Mugong:
		{
			MUGONGBASE * FromMugong = pPlayer->GetMugongBase(FromQuickItem.wAbsPostion);
			if(FromMugong && FromMugong->dwDBIdx != 0)
				FromMugong->QuickPosition = pmsg->wToAbsPosition;
			else
			{
				ASSERT(0);
			}
		}
		break;
	default:
		{
			//ASSERT(0);
			return ;

		}
	}

	if(ToQuickItem.dwIconIdx != 0)
	switch((tableIdx = GetTableIdxPosition(ToQuickItem.wAbsPostion)))
	{
	case eItemTable_Inventory:
	case eItemTable_Weared:
		{
			CIconTable * pToTable = pPlayer->GetIconTable(tableIdx);
			ITEMBASE * ToItem = pToTable->GetItemInfoAbs(ToQuickItem.wAbsPostion);
			if(ToItem&&ToItem->dwDBIdx!=0)
				ToItem->QuickPosition = pmsg->wFromAbsPosition;
			else
			{
				ASSERT(0);
			}
		}
		break;
	case eItemTable_Mugong:
		{
			MUGONGBASE * ToMugong = pPlayer->GetMugongBase(ToQuickItem.wAbsPostion);
			if(ToMugong && ToMugong->dwDBIdx != 0)
				ToMugong->QuickPosition = pmsg->wFromAbsPosition;
			else
			{
				ASSERT(0);
			}
		}
		break;
	default:
		{
			ASSERT(0);
		}
	}

}
void CQuickManager::UpdateSrcPosition( CPlayer * pPlayer, POSTYPE QAbsPos, POSTYPE srcAbsPos )
{
	QUICKITEM * itemOut = pPlayer->GetQuickItemInfo((QAbsPos-QUICK_STARTPOSITION)/MAX_QUICKITEMPERSHEET_NUM, 
							(QAbsPos-QUICK_STARTPOSITION)%MAX_QUICKITEMPERSHEET_NUM);

	itemOut->wAbsPostion = srcAbsPos;

	MSG_QUICK_UPD_ACK msg;
	msg.Category			= MP_QUICK;
	msg.Protocol			= MP_QUICK_UPD_ACK;
	msg.dwObjectID			= pPlayer->GetID();
	msg.wAbsPosition		= QAbsPos;
	msg.wSrcPosition		= srcAbsPos;

	pPlayer->SendMsg( &msg, sizeof(msg) );
}

void CQuickManager::PureUpdateQuickItem(CPlayer * pPlayer, WORD whatQuickAbsPos, DWORD dwIconIdx, WORD eIGKinds, WORD srcAbsPos, WORD flag)
{
	QUICKITEM * itemOut = pPlayer->GetQuickItemInfo((whatQuickAbsPos-QUICK_STARTPOSITION)/MAX_QUICKITEMPERSHEET_NUM, 
							(whatQuickAbsPos-QUICK_STARTPOSITION)%MAX_QUICKITEMPERSHEET_NUM);

	if(flag & QUB_ICONIDX)
	itemOut->dwIconIdx = dwIconIdx;
	if(flag & QUB_KINDS)
	itemOut->eIGKinds = (eQUICKICON_KIND)eIGKinds;
	if(flag & QUB_SRCPOS)
	itemOut->wAbsPostion = srcAbsPos;
}


void CQuickManager::PureRemQuickItemAbs(CPlayer * pPlayer, WORD abs_pos)
{
	QUICKITEM quickItem;
	quickItem.dwIconIdx = 0;
	quickItem.eIGKinds = (eQUICKICON_KIND)0;
	quickItem.wAbsPostion = 0;
	pPlayer->SetQuickItem(abs_pos,&quickItem);
}


*/

⌨️ 快捷键说明

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