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

📄 battlemanager.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	const WORD idTarget = pPacket->idTarget; // 付过 措惑磊 
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pCaster == NULL || pTarget == NULL)  return;  
	// 瓤苞寒俊 措茄 贸府
	const int nX = pPacket->nX;
	const int nY = pPacket->nY;
	
	if (!IsValid(nMagic, nX>>5, nY>>5))
	{
		pCaster->Message(MK_WARNING, 1, 4);
		return;
	}
	
	bool bFail = false;
	// 籍拳俊 吧妨乐栏搁 绢栋茄 付过档 利侩阑 罐瘤 给窃. 窜 历林秦力绰 力寇
	if (pTarget->IsStone() && pPacket->nMagic != REMOVE_CURSE)
	{		
		pCaster->Message(MK_NORMAL, 1, 18);
		pCaster->ClearMagic();
		bFail = true;
		goto MAGIC_FAIL;
	}
	// 辑肺 傍拜 啊瓷咯何 八荤
	if (!IsBattle(pCaster, pTarget))
	{
		pCaster->ClearMagic();
		bFail = true;
		goto MAGIC_FAIL;
	}
	
	// 付过 荤侩捞 啊瓷茄瘤 八荤
	if (!pCaster->CheckDoing(nMagic, g_curr_time))
	{
		pCaster->ClearMagic();
		bFail = true;
		goto MAGIC_FAIL;
	}
	
	if (!FilterMagic(pCaster, pTarget, nX, nY))
	{
		pCaster->ClearMagic();
		bFail = true;
		goto MAGIC_FAIL;
	}
	
	pCaster->ClearMagic(false); // 付过 荤侩捞 登菌澜阑 汲沥
	// CSD-030806
	g_pLogManager->SaveMagicExecute(nMagic, pCaster, pTarget, nX, nY);
	
MAGIC_FAIL:
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_MAGIC_EXECUTE;
	m_packet.h.header.size = sizeof(t_server_magic_execute);
	m_packet.u.magic.server_magic_execute.nMagic = nMagic;
	m_packet.u.magic.server_magic_execute.idCaster = idCaster;
	m_packet.u.magic.server_magic_execute.idTarget = idTarget;
	m_packet.u.magic.server_magic_execute.nX = nX;
	m_packet.u.magic.server_magic_execute.nY = nY;
	m_packet.u.magic.server_magic_execute.bFailed = bFail;
	::QueuePacket(connections, idCaster, &m_packet, 1);
	::CastMe2Other(idCaster, &m_packet);
}	//> CSD-TW-030606

void CBattleManager::RecvMagicResult(WORD idCaster, t_client_magic_result* pPacket)
{
	const WORD idTarget = pPacket->idTarget; // 付过阑 荤侩茄 措惑磊
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pCaster == NULL || pTarget == NULL)  return;  
	
	const int nMagic = pPacket->nMagic;
	if (nMagic == 0)  return;
	// 瓤苞寒俊 措茄 贸府
	const int nX = pPacket->nX;
	const int nY = pPacket->nY;
	
	if (!IsValid(nMagic, nX>>5, nY>>5))
	{
		pCaster->Message(MK_WARNING, 1, 4);
		return;
	}
	// 籍拳俊 吧妨乐栏搁 绢栋茄 付过档 利侩阑 罐瘤 给窃. 窜 历林秦力绰 力寇
	if (pTarget->IsStone() && nMagic != REMOVE_CURSE)
	{	
		pCaster->ClearMagic();
		return;
	}
	// 付过 利侩捞 啊瓷茄瘤 八荤
	if (!pCaster->CheckEnd(nMagic, g_curr_time))
	{ 
		pCaster->ClearMagic();
		return;
	}  
	// 辑肺 傍拜 啊瓷咯何 八荤
	if (!IsBattle(pCaster, pTarget))
	{
		pCaster->ClearMagic();
		return;
	}
	
	if (!FilterResult(pCaster, pTarget))
	{
		pCaster->ClearMagic();
		return;
	}
	
	pTarget->SetWanted(pPacket->bWanted);    // 泅惑裹牢瘤 咯何 汲沥
	
	const int nBattle = Magic_Ref[nMagic].magic_Type/10;
	
	GetBattle(nBattle)->SetIndex(nMagic);
	GetBattle(nBattle)->SetBothID(idCaster, idTarget);
	GetBattle(nBattle)->SetBothPtr(pCaster, pTarget);
	GetBattle(nBattle)->SetCurrentTime(g_curr_time);
	GetBattle(nBattle)->SetContinueTime(0);
	GetBattle(nBattle)->SetPosition(nX>>5, nY>>5);
	GetBattle(nBattle)->Execute();
}

void CBattleManager::RecvMagicResult(t_magic_result_d* pPacket)
{
	const WORD idCaster = pPacket->idCaster;
	const WORD idTarget = pPacket->idTarget; // 付过阑 荤侩茄 措惑磊
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pCaster == NULL || pTarget == NULL)  return;
	// 付过 搬苞 魂免 咯何 啊瓷 八荤
	if (!FilterResult(pPacket->nMagic, pCaster, pTarget))
	{ 
		return;
	}
	
	const BYTE nMagic = pPacket->nMagic; // 付过狼 锅龋
	const int nX = pPacket->nX;          // 付过捞 惯积等 困摹狼 X谅钎
	const int nY = pPacket->nY;          // 付过捞 惯积等 困摹狼 Y谅钎  
	const int nBattle = Magic_Ref[nMagic].magic_Type/10;
	
	if (nBattle >= 1 && nBattle <= 6)
	{
		GetBattle(nBattle)->SetIndex(nMagic);
		GetBattle(nBattle)->SetBothID(idCaster, idTarget);
		GetBattle(nBattle)->SetBothPtr(pCaster, pTarget);
		GetBattle(nBattle)->SetCurrentTime(g_curr_time);
		GetBattle(nBattle)->SetContinueTime(0);
		GetBattle(nBattle)->SetPosition(nX>>5, nY>>5);
		GetBattle(nBattle)->Execute();
	}
}

void CBattleManager::RecvCombatReset(WORD idMaster)
{ // 傈捧胶懦 器牢磐 犁盒硅
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	
	int nCount = pMaster->GetCombatPoint();
	
	for (int i = LIGHTNING_BOOM; i <= WIND_EXTREME; ++i)
	{
		nCount += pMaster->GetCombatLevel(i);
		pMaster->SetCombatLevel(i, 0);
	}
	
	pMaster->SetCombatPoint(nCount);
}

void CBattleManager::RecvCombatObtain(WORD idMaster, t_client_combat_obtain* pPacket)
{
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	
	const int nPoint = pPacket->nPoint;
	const int nOld = pMaster->GetCombatPoint();
	// 力茄摹 八荤
	if (pMaster->IsLimit(nPoint))  
	{
		pMaster->Message(MK_INFORMATION, 1, 58);
		return;
	}
	
	const int nNew = pMaster->GetCombatPoint();
	::SaveObtainCombat(pMaster, nOld, nNew);
	// Packet 傈价
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_COMBAT_OBTAIN;
	m_packet.h.header.size = sizeof(t_server_combat_obtain);
	m_packet.u.combat.server_combat_obtain.idMaster = idMaster;
	m_packet.u.combat.server_combat_obtain.nPara = pPacket->nPara;
	m_packet.u.combat.server_combat_obtain.nPosX = pPacket->nPosX;
	m_packet.u.combat.server_combat_obtain.nPosY = pPacket->nPosY;
	m_packet.u.combat.server_combat_obtain.nTotal = pMaster->GetCombatPoint();
	::QueuePacket(connections, idMaster, &m_packet, 1);
}

void CBattleManager::RecvCombatRequest(WORD idMaster, t_client_combat_request* pPacket)
{  
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	// 力茄摹甫 逞菌促搁 檬扁拳
	if (pMaster->IsLimit())  pMaster->InitCombat();
	// Packet 傈价
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_COMBAT_REQUEST;
	m_packet.h.header.size = sizeof(t_server_combat_request);
	m_packet.u.combat.server_combat_request.idMaster = idMaster;
	m_packet.u.combat.server_combat_request.nRemain = pMaster->GetCombatPoint();
	
	for (int i = 0; i < 36; ++i)
	{
		m_packet.u.combat.server_combat_request.aLevel[i] = pMaster->GetCombatLevel(i + LIGHTNING_BOOM);
	}
	
	::QueuePacket(connections, idMaster, &m_packet, 1);
}

void CBattleManager::RecvCombatLearn(WORD idMaster, t_client_combat_learn* pPacket)
{  
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	
	const int nCombat = pPacket->nSkill;
	
	if (!IsEnableClass(nCombat, pMaster))  return;
	// 力茄摹甫 逞菌促搁 檬扁拳
	if (pMaster->IsLimit())  
	{
		pMaster->InitCombat();
		return;
	}
	
	switch (nCombat)
	{
    case LIGHTNING_EXTREME:
    case EARTH_EXTREME:
    case FIRE_EXTREME:
    case DARK_EXTREME:
    case ICE_EXTREME:
    case WIND_EXTREME:
		{
			if (!pMaster->IsDual())
			{
				pMaster->Message(MK_SHORTAGE, 1, 54);
				return;
			}
			
			break;
		}
	}
	// 傈捧胶懦 嚼垫
	const int nLevel = pMaster->GetCombatLevel(nCombat) + 1;
	
	if (!IsValid(nCombat, nLevel, pMaster))
	{
		pMaster->Message(MK_SHORTAGE, 1, 54);
		return;
	}
	//< CSD-020909
	const int nPoint = pPacket->nPoint;
	const int nOld = pMaster->GetCombatLevel(nCombat);
	
	if (!pMaster->LevelUpCombat(nCombat, nPoint))
	{
		pMaster->Message(MK_SHORTAGE, 1, 54);
		return;
	}
	
	const int nNew = pMaster->GetCombatLevel(nCombat);
	::SaveChangeCombat(pMaster, nCombat, nOld, nNew);
	//> CSD-020909
	
	// Packet 傈价
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_COMBAT_LEARN;
	m_packet.h.header.size = sizeof(t_server_combat_learn);
	m_packet.u.combat.server_combat_learn.idMaster = idMaster;
	m_packet.u.combat.server_combat_learn.nSkill = nCombat;
	m_packet.u.combat.server_combat_learn.nLevel = pMaster->GetCombatLevel(nCombat);
	m_packet.u.combat.server_combat_learn.nRemain = pMaster->GetCombatPoint();
	::QueuePacket(connections, idMaster, &m_packet, 1);
}

void CBattleManager::RecvCombatClear(WORD idMaster, t_client_combat_clear* pPacket)
{	//< CSD-TW-030606
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	
	if (pMaster == NULL)
	{
		return;
	}

	pMaster->InitActiveCombat();
	pMaster->ClearActiveState();
	pMaster->ClearPassiveState();
	pMaster->ClearRecoveryState();
	
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_COMBAT_CLEAR;
	m_packet.h.header.size = sizeof(t_server_combat_clear);
	m_packet.u.combat.server_combat_clear.idMaster = idMaster;
	m_packet.u.combat.server_combat_clear.nType = 0;
	::QueuePacket(connections, idMaster, &m_packet, 1);
	::CastMe2Other(idMaster, &m_packet);
}	//> CSD-TW-030606

void CBattleManager::RecvCombatSelect(WORD idCaster, t_client_combat_select* pPacket)
{   //< CSD-TW-030623
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	if (pCaster == NULL)  return;
	// 辑肺 傍拜 啊瓷咯何 八荤
	if (!IsBattle())                 return;
	if (!IsBattle(pCaster))          return;
	// 荤侩啊瓷茄 傈捧胶懦牢瘤 八荤
	const int nCombat = pPacket->nCombat;
	if (!IsValid(nCombat, pCaster))  return;
	// cp雀汗拌凯 付过捞 惯悼吝老锭绰 酒公巴档 且 荐 绝澜 // 030430 kyo
	if (pCaster->IsRecoveryCombatState())
	{	
		pCaster->Message(MK_INFORMATION, 1, 43);
		return;
	}

	switch (Magic_Ref[nCombat].Spell_Type)
	{
	case ACTIVE_COMBAT:
		{	// Passive 傈捧胶懦 惑怕俊辑 促弗 拌凯狼 傈捧胶懦阑 急琶茄 版快
			const int nPassive = pCaster->GetPassiveCombat();
			
			if (nPassive > 0)
			{				
				if (Magic_Ref[nCombat].order_Type%10 != Magic_Ref[nPassive].order_Type%10)
				{ 
					pCaster->ClearPassiveState();
					pCaster->Message(MK_INFORMATION, 1, 90);
				}
			}
			
			break;
		}
	case PASSIVE_COMBAT:
		{	// Active 加己 傈捧胶懦 惑怕俊辑 促弗 拌凯狼 傈捧胶懦阑 急琶茄 版快
			const int nActive = pCaster->GetActiveCombat();
			
			if (nActive > 0)
			{
				if (Magic_Ref[nCombat].order_Type%10 != Magic_Ref[nActive].order_Type%10)
				{
					pCaster->Message(MK_INFORMATION, 1, 90);
					return;
				}
			}

			break;
		}
	case RECOVERY_COMBAT: // 030415 kyo
		{	// RECOVERY_COMBAT鸥涝 
			const int nRecovery = pCaster->GetRecoveryCombat();

			if (nRecovery > 0)
			{	// cp雀汗 鸥涝篮 active加己阑 檬扁拳 矫挪促.
				pCaster->InitActiveCombat();
				pCaster->ClearActiveState();

				if (Magic_Ref[nCombat].order_Type%10 != Magic_Ref[nRecovery].order_Type%10)
				{
					pCaster->Message(MK_INFORMATION, 1, 90);
					return;
				}
			}

			break;
		}
	}
	
	pCaster->ClearCombat(nCombat);
	// Packet 傈价
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_COMBAT_SELECT;
	m_packet.h.header.size = sizeof(t_server_combat_select);
	m_packet.u.combat.server_combat_select.nCombat = nCombat;
	m_packet.u.combat.server_combat_select.idMaster = idCaster;
	::QueuePacket(connections, idCaster, &m_packet, 1);
	::CastMe2Other(idCaster, &m_packet);
}   //> CSD-TW-030623

void CBattleManager::RecvCombatAttack(WORD idCaster, t_client_combat_attack* pPacket)
{	//< CSD-TW-030606
	const int nCombat = pPacket->nSkill;
	const int nX = pPacket->nX;
	const int nY = pPacket->nY;
	const WORD idTarget = pPacket->idTarget; // 付过 措惑磊
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pCaster == NULL || pTarget == NULL)  return;
	
	bool bFail = false;
	// 籍拳俊 吧妨乐栏搁 绢栋茄 傈捧胶懦档 利侩阑 罐瘤 给窃
	if (pTarget->IsStone())
	{		
		pCaster->Message(MK_NORMAL, 1, 18);
		bFail = true;
		goto COMBAT_FAIL;
	}
	// 辑肺 傍拜 啊瓷咯何 八荤
	if (!IsBattle())                        return;
	if (!IsBattle(pCaster))                 return;
	if (!IsBattle(pCaster, pTarget))        return;
	// 荤侩啊瓷茄 傈捧胶懦牢瘤 八荤
	if (!IsValid(nCombat, pCaster))         return;
	if (!IsEnableClass(nCombat, pCaster))   return;
	if (!IsEnableWeapon(nCombat, pCaster))  return;
	// 傈捧胶懦 荤侩 咯何 啊瓷 八荤
	if (!FilterCombat(nCombat, pCaster, pTarget, nX, nY))
	{ 
		bFail = true;
		goto COMBAT_FAIL;
	}

	if (!pCaster->IsEnableCombat(nCombat))
	{
		pCaster->Message(MK_SHORTAGE, 1, 57);
		return;
	}
	// 胶懦 荤侩啊瓷荐 犁汲沥
	switch (nCombat)
	{
    case BLOOD_EARTH:
    case TWISTER:
    case POISONING_NOVA:
    case WHILWIND:
		{
			if (pCaster->IsCount())
			{
				ChangeCombat(nCombat, idCaster);
			}
			else
			{
				ResetCombat(nCombat, idCaster);
			}
			
			break;
		}
    default:
		{
			ResetCombat(nCombat, idCaster);
			break;
		}
	}
	// CSD-030806
	g_pLogManager->SaveCombatExecute(nCombat, pCaster, pTarget, nX, nY);
	
COMBAT_FAIL:
	memset(&m_packet, 0, sizeof(t_packet));
	m_packet.h.header.type = CMD_COMBAT_ATTACK;
	m_packet.h.header.size = sizeof(t_server_combat_attack);
	m_packet.u.combat.server_combat_attack.nSkill = nCombat;
	m_packet.u.combat.server_combat_attack.nLevel = pCaster->GetCombatLevel(nCombat);
	m_packet.u.combat.server_combat_attack.idCaster = idCaster;
	m_packet.u.combat.server_combat_attack.idTarget = idTarget;
	m_packet.u.combat.server_combat_attack.wAmount = pCaster->Cp;
	m_packet.u.combat.server_combat_attack.nX = nX;
	m_packet.u.combat.server_combat_attack.nY = nY;
	m_packet.u.combat.server_combat_attack.bFailed = bFail;
	::QueuePacket(connections, idCaster, &m_packet, 1);

⌨️ 快捷键说明

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