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

📄 msgdataarray.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
字号:
////////////////////////////////////////////////////////////////
//
//		MsgDataArray.cpp
//

#include "AllMsg.h"
#include "mapgroup.h"
#include "transformation.h"
#include "Agent.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMsgDataArray::CMsgDataArray()
{
	Init();
	m_pInfo	=(MSG_Info *)m_bufMsg;
}

CMsgDataArray::~CMsgDataArray()
{

}


//////////////////////////////////////////////////////////////////////
BOOL CMsgDataArray::Create(int nAction, int nAmount, char setData[])
{
	CHECKF(nAmount);
	CHECKF(nAmount * sizeof(char) + sizeof(MSG_Info) + 20 < MAX_PACKETSIZE);

	// init
	this->Init();

	// fill info now
	m_unMsgSize		= sizeof(MSG_Info) - sizeof(unsigned long) + sizeof(char)*nAmount;

	m_unMsgType		= _MSG_DATAARRAY;

	m_pInfo->ucAction	= nAction;
	m_pInfo->ucAmount	= nAmount;

	memcpy(m_pInfo->ucChar, setData, nAmount * sizeof(char));

	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CMsgDataArray::Create(int nAction, int nAmount, short setData[])
{
	CHECKF(nAmount);
	CHECKF(nAmount * sizeof(short) + sizeof(MSG_Info) + 20 < MAX_PACKETSIZE);

	// init
	this->Init();

	// fill info now
	m_unMsgSize		= sizeof(MSG_Info) - sizeof(unsigned long) + sizeof(short)*nAmount;

	m_unMsgType		= _MSG_DATAARRAY;

	m_pInfo->ucAction	= nAction;
	m_pInfo->ucAmount	= nAmount;

	memcpy(m_pInfo->ucChar, setData, nAmount * sizeof(short));

	return true;
}

//////////////////////////////////////////////////////////////////////
BOOL CMsgDataArray::Create(int nAction, int nAmount, long setData[])
{
	CHECKF(nAmount);
	CHECKF(nAmount * sizeof(long) + sizeof(MSG_Info) + 20 < MAX_PACKETSIZE);

	// init
	this->Init();

	// fill info now
	m_unMsgSize		= sizeof(MSG_Info) - sizeof(unsigned long) + sizeof(long)*nAmount;

	m_unMsgType		= _MSG_DATAARRAY;

	m_pInfo->ucAction	= nAction;
	m_pInfo->ucAmount	= nAmount;

	memcpy(m_pInfo->ucChar, setData, nAmount * sizeof(long));

	return true;
}

/*/////////////////////////////////////////////////////////////////////
BOOL CMsgDataArray::Append(int nType, DWORD dwData)
{
	CHECKF(nType >= 0 && nType < _MAX_MSGATRRIB);
	CHECKF(m_unMsgSize + sizeof(DataArrayStruct) < MAX_PACKETSIZE);

	// fill info now
	m_unMsgSize		+= sizeof(DataArrayStruct);
	m_pInfo->setDataArray[m_pInfo->dwAttributeNum].ucAttributeType	= nType;
	m_pInfo->setDataArray[m_pInfo->dwAttributeNum].dwAttributeData	= dwData;
	m_pInfo->dwAttributeNum++;

	return true;
}*/

//////////////////////////////////////////////////////////////////////
BOOL CMsgDataArray::Create(char* pbufMsg, DWORD dwMsgSize)
{
	if (!CNetMsg::Create(pbufMsg, dwMsgSize))
		return false;

	if(_MSG_DATAARRAY != this->GetType())
		return false;

	return true;
}

//////////////////////////////////////////////////////////////////////
void CMsgDataArray::Process(CGameSocket* pSocket)
{
	CUserPtr pUser = UserManager()->GetUser(this) ;
	CHECK(pUser) ;
	IF_NOT( pUser->IsAlive() )
	{
		pUser->SendSysMsg(STR_DIE) ;
		return ;
	}

	switch( m_pInfo->ucAction )
	{
	case _DATAARRAY_ACTION_UPGRADE_QUALITY: //升级装备品质	
		{
			this->UpEquipQuality(pUser);
		}
		break;

	case _DATAARRAY_ACTION_UPGRADE_SUPERADDITION: //升级装备追加	
		{
			this->UpEquipSuperAddition(pUser);
		}
		break;
	case _DATAARRAY_ACTION_UPGRADE_EQUIPLEVEL: //升级装备等级
		{
			this->UpEquipLevel(pUser);
		}
		break;
	case _DATAARRAY_ACTION_EMBEDGEM://对装备嵌入宝石
		{
			this->EmbedGemToEquip(pUser);
		}
		break;
	case _DATAARRAY_ACTION_SETSYN_DRESS:	//设置帮派服装
		{
			this->SetSynDress(pUser);
		}
		break;
	default:
		break;

	}

}

int CMsgDataArray::RateSuccForGhostLevel(CItemPtr pEquipItem)
{
	return 50;
}

/*
通过灵魂晶石来锻造提高武器的品质,每个等级锻造的成功率不一样。
1--2,2--3,3--4,4--5的升级成功率都是100%。
普通升良(0--1):30%成功
良升上(1--2):12%成功
上升精(2--3):6%成功
精升极(3--4):4%成功

*/
int CMsgDataArray::RateSuccForQuality(CItemPtr pEquipItem)
{
	int iQuality = pEquipItem->GetQuality();
	
	if (iQuality==0)	return 30;
	else if(iQuality==1)	return 12;
	else if(iQuality==2)	return 6;
	else if(iQuality==3)	return 4;
	
	return 0;
}
//升级武器的等级
//该类物品TYPE的百位和十位实际上就是武器的等级,等级为0--22,一共可升级22次。
bool CMsgDataArray::UpEquipLevel(CUserPtr pUser)
{
	DEBUG_TRY

	OBJID idEquipment, idGem;

	IF_NOT(m_pInfo->ucAmount==2) 
		return false;
	
	idEquipment = m_pInfo->dwLong[0] ;
	idGem = m_pInfo->dwLong[1] ;

	CItemPtr pEquipItem = pUser->GetItem(idEquipment) ;
	CItemPtr pGem = pUser->GetItem(idGem) ;

	IF_NOT(pGem && pEquipItem && pGem->IsGemForUpLevel())
		return false;
	
	if( pEquipItem->IsEquipment() || pEquipItem->IsWeapon() )//是否为装备或武器
	{
		//检查级别
		int nLevel = pEquipItem->GetLevel();
		if (nLevel>=22) {
			return false;
		}
		
		int nRateSucc =  RateSuccForEquipLevel(pEquipItem);
		if( RandGet(100) < nRateSucc ) //succ
		{
			IF_NOT(pEquipItem->UpLevel())
			{
				pUser->SendSysMsg(STR_UPEQUIPLEVEL_FAIL_NOTYPE);			
				return false;
			}
			pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 
			//通知客户端
			CMsgItemInfo msg;			
			if (msg.Create(pEquipItem,ITEMINFO_UPDATE))
				pUser->SendMsg(&msg);				
			pUser->SendSysMsg(STR_UPEQUIPLEVEL_SUCC);				
			return true;
		}
		else
		{
			pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 				
			pUser->SendSysMsg(STR_UPEQUIPLEVEL_FAIL);
			return false;
		}
	}
	DEBUG_CATCH("bool CMsgDataArray::UpEquipLevel()")
	return false;
}
//武器升级时的成功率
/*
武器类(包括武器,项链,手镯,戒指,鞋子等):
该类物品TYPE的百位和十位实际上就是武器的等级,等级为0--22,一共可升级22次。但如果升级时在itemtype表中找不到对应的数据,则表示不能升级了(例如:450205,如果要升级则升级为450215,但因为数据库中没有450215的数据,所以表示该武器不能再升级了。)
升级成功率:
当等级<4时,升级成功率为100%
当等级<7时,升级成功率为:35%
当等级<10时,升级成功率为:20%
当等级<13时,升级成功率为:10%
当等级<16时,升级成功率为:7%
当等级<19时,升级成功率为:4%
当等级>=19时,升级成功率为:2%

装备类(包括衣服,帽子和盾牌):
该类物品TYPE的十位表示等级,等级为0--9,一共可升级9次。但如果升级时在itemtype表中找不到对应的数据,则表示不能升级了。
当等级<2时,升级成功率100%
当等级<4时,升级成功率为:35%
当等级<6时,升级成功率为:20%
当等级<7时,升级成功率为:10%
当等级<8时,升级成功率为:7%
当等级<9时,升级成功率为:4%
*/
int CMsgDataArray::RateSuccForEquipLevel(CItemPtr pEquipItem)
{
	IF_NOT(pEquipItem)
		return 0;

	int nLevel = pEquipItem->GetLevel();
	if (pEquipItem->IsShield() || pEquipItem->IsArmor() || pEquipItem->IsHelmet())
	{
		if (nLevel>=0 && nLevel < 2)		 	    return 100;
		else if(nLevel>=2 && nLevel < 4)			return 35;
		else if(nLevel>=4 && nLevel < 6)			return 20;
		else if(nLevel>=6 && nLevel < 7)			return 10;
		else if(nLevel>=7 && nLevel < 8)			return 7;
		else if(nLevel>=8 && nLevel < 9)			return 4;		
	}
	else
	{
		if (nLevel>=0 && nLevel < 4)		 	    return 100;
		else if(nLevel>=4 && nLevel < 7)			return 35;
		else if(nLevel>=7 && nLevel < 10)			return 20;
		else if(nLevel>=10 && nLevel < 13)			return 10;
		else if(nLevel>=13 && nLevel < 16)			return 7;
		else if(nLevel>=16 && nLevel < 19)			return 4;
		else if(nLevel>=19&&nLevel<22) 			return 2;
	}	
	return 0;
}

bool CMsgDataArray::UpEquipQuality(CUserPtr pUser)
{
	DEBUG_TRY

	OBJID idEquipment, idGem;

	IF_NOT(m_pInfo->ucAmount==2) 
		return false;
	
	idEquipment = m_pInfo->dwLong[0] ;
	idGem = m_pInfo->dwLong[1] ;

	CItemPtr pEquipItem = pUser->GetItem(idEquipment) ;
	CItemPtr pGem = pUser->GetItem(idGem) ;

	IF_NOT(pGem && pEquipItem && pGem->IsGemForUpQuality())
		return false;
	
	if( pEquipItem->IsEquipment() || pEquipItem->IsWeapon() )//是否为装备或武器
	{
		//检查品质
		int nQuality = pEquipItem->GetQuality();
		if (nQuality>=9) {
			return false;
		}
		
		//升级品质GEM
		int iRateSucc = RateSuccForQuality(pEquipItem);		
		
		if (iRateSucc==0) {//已经是最好的品质
			pUser->SendSysMsg(STR_QUALITY_UPGRADE_MAXLEVEL);
			return false;
		}
		if( RandGet(100) < iRateSucc ) //succ
		{
			IF_NOT(pEquipItem->UpQuality())
			{
				pUser->SendSysMsg(STR_ITEM_CHANGETYPE_FAILED);
				return false;
			}
			pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 
			//通知客户端
			CMsgItemInfo msg;			
			if (msg.Create(pEquipItem,ITEMINFO_UPDATE))
				pUser->SendMsg(&msg);
			pUser->SendSysMsg(STR_QUALITY_UPGRADE_SUCCESS);
			return true;	
		}
		else 
		{  
			//失败铸造
			pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 
			pUser->SendSysMsg(STR_QUALITY_UPGRADE_FAILED);
			return false;
		}		
	}	
	DEBUG_CATCH("bool CMsgDataArray::UpEquipQuality()")
	return false;
	
}
/*
2、魔魂等级:
通过魔魂晶石(魔魂晶石type:1037150)注入来提升魔魂等级,每次提升成功率为50%,如果成功,则魔魂等级+1,如果失败,则魔魂等级-1(如果目前魔魂等级为0,则不会降魔魂等级)。魔魂等级也是0--9级。

*/
bool CMsgDataArray::UpEquipSuperAddition(CUserPtr pUser)
{
	DEBUG_TRY

	OBJID idEquipment, idGem;

	IF_NOT(m_pInfo->ucAmount==2) 
		return false;
	
	idEquipment = m_pInfo->dwLong[0] ;
	idGem = m_pInfo->dwLong[1] ;

	CItemPtr pEquipItem = pUser->GetItem(idEquipment) ;
	CItemPtr pGem = pUser->GetItem(idGem) ;

	IF_NOT(pGem && pEquipItem && pGem->IsGemForUpSuperAddition())
		return false;
	
	if( pEquipItem->IsEquipment() || pEquipItem->IsWeapon() )//是否为装备或武器
	{
		//检查追加属性
		int nSuperAddition = pEquipItem->GetSuperAddition();
		if (nSuperAddition>=9) {
			return false;
		}
		//升级追加
		int iRateSucc = RateSuccForGhostLevel(pEquipItem);		
		if( RandGet(100) < iRateSucc ) //succ
		{
			IF_NOT(pEquipItem->UpSuperAddition())
			{
				pUser->SendSysMsg(STR_GHOSTLEVEL_FAILED_NOTYPE);
				return false;
			}
			pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 
			//通知客户端
			CMsgItemInfo msg;			
			if (msg.Create(pEquipItem,ITEMINFO_UPDATE))
				pUser->SendMsg(&msg);
			pUser->SendSysMsg(STR_GHOSTLEVEL_SUCCESS);			
			return true;
		}
		else 
		{  //失败,降低追加属性
			if(pEquipItem->DecSuperAddition())
			{
				//通知客户端
				CMsgItemInfo msg;			
				if (msg.Create(pEquipItem,ITEMINFO_UPDATE))
					pUser->SendMsg(&msg);
			}
			pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 
			pUser->SendSysMsg(STR_GHOSTLEVEL_FAILED);
			return false;
		}		
	}
	DEBUG_CATCH("bool CMsgDataArray::UpEquipSuperAddition()")
	return false;

}
//向装备中嵌入宝石
bool CMsgDataArray::EmbedGemToEquip(CUserPtr pUser)
{
	DEBUG_TRY

	OBJID idEquipment, idGem;

	IF_NOT(m_pInfo->ucAmount==2) 
		return false;
	
	idEquipment = m_pInfo->dwLong[0] ;
	idGem = m_pInfo->dwLong[1] ;

	CItemPtr pEquipItem = pUser->GetItem(idEquipment) ;
	CItemPtr pGem = pUser->GetItem(idGem) ;

	IF_NOT(pGem && pEquipItem && pGem->IsGemForEmbedEquip())
		return false;
	
	if( pEquipItem->IsEquipment() || pEquipItem->IsWeapon() )//是否为装备或武器
	{
		//得到魔魂等级和战魂等级
		int nSuperAdditionLevel = pEquipItem->GetSuperAddition();
		int nWarGhostLevel = pEquipItem->GetWarGhostLevel();

		if(nSuperAdditionLevel < MAX_LEVEL_SUPERADDITION || nWarGhostLevel < MAX_LEVEL_SUPERADDITION )
		{
			pUser->SendSysMsg(STR_EMBED_FAIL);
			return false;
		}

		DWORD dwGemType = pGem->GetInt(ITEMDATA_TYPE);		
		pUser->EraseItem(idGem,SYNCHRO_TRUE) ; //通知对方将宝石删除 
		pEquipItem->SetInt(ITEMDATA_GEMTYPE,dwGemType);
		CMsgItemInfo msg;			
		if (msg.Create(pEquipItem,ITEMINFO_UPDATE))
			pUser->SendMsg(&msg);		
		pUser->SendSysMsg(STR_EMBED_SUCC);

		return true;
	}
	DEBUG_CATCH("bool CMsgDataArray::EmbedGemToEquip(...)")
	return false;
}

bool CMsgDataArray::Create(int nAction, int nAmount, unsigned long setULong[])
{
	CHECKF(nAmount);
	CHECKF(nAmount * sizeof(long) + sizeof(MSG_Info) + 20 < MAX_PACKETSIZE);
	
	// init
	this->Init();
	
	// fill info now
	m_unMsgSize		= sizeof(MSG_Info) - sizeof(unsigned long) + sizeof(unsigned long)*nAmount;
	
	m_unMsgType		= _MSG_DATAARRAY;
	
	m_pInfo->ucAction	= nAction;
	m_pInfo->ucAmount	= nAmount;
	
	memcpy(m_pInfo->dwLong, setULong, nAmount * sizeof(unsigned long));
	
	return true;
}

void CMsgDataArray::SetSynDress(CUserPtr pUser)
{
	IF_NOT(m_pInfo->ucAmount==4) 
		return ;
	OBJID idNpc = m_pInfo->dwLong[0] ;
	CNpc* pNpc; 
	if(!pUser->GetMap()->QueryObj(pUser->GetPosX(), pUser->GetPosY(), OBJ_NPC, idNpc, IPP_OF(pNpc)))
		return ;
	if(!pNpc->IsTaskNpc())
		return;
	
	int nLevel1 = m_pInfo->dwLong[1]+1 ;
	int nLevel2 = m_pInfo->dwLong[2]+1 ;
	int nLevel3 = m_pInfo->dwLong[3]+1 ;
	int nLevel4 = m_pInfo->dwLong[4]+1 ;
//	char szData1[255];
//	sprintf(szData1,"%d%d%d%d",nLevel1,nLevel2,nLevel3,nLevel4);
//	int nLevel = atoi(szData1);
	
	int nLevel	= nLevel1*1000 + nLevel2*100 + nLevel3*10 + nLevel4;

	pNpc->SetData(SYNDRESS_SETTING,nLevel,true);//设置帮派服装
	
	pUser->SendSysMsg(STR_SYN_SETDRESS_SUCC);		
	
}

⌨️ 快捷键说明

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