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

📄 battlemanager.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// BattleManager.cpp: implementation of the CBattleManager class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
#include "BattleManager.h"

#include "PhysicalAttack.h"
#include "AttackMagic.h"
#include "AssistanceMagic.h"
#include "ProtectionMagic.h"
#include "CursingMagic.h"
#include "RecoveryMagic.h"
#include "ExtraMagic.h"

#include "ThunderCombat.h" 
#include "EarthCombat.h"
#include "FlameCombat.h"
#include "DarkCombat.h"
#include "FreezeCombat.h"
#include "WindCombat.h"

#include "Op_Magic.h"
#include "Op_Battle.h"
#include "CItem.h"
#include "SealStoneGameServer.h"
#include "NationSys.h"
#include "scrp_exe.h"
#include "LogManager.h"
#include "UserManager.h"
#include "ArenaManager.h"
#include "SymbolItemMgr.h" // 031110 kyo

//<< 031111 kyo
#include "SymbolItemMgr.h"
extern CSymbolItemMgr g_CSymbolMgr;
//>> 031111 kyo


extern int g_isLocalWarServer;
extern int g_LocalWarBegin;
extern bool IsWar();
extern bool isAttacker(CHARLIST* pCaster);
extern bool isNationWarfieldServer();
extern int CanLocalWarAttack(CHARLIST* pAttacker,CHARLIST* pDefencer); // 020115 LTS
extern int CheckLocalWarAttacker(CHARLIST* pAttacker);						     // 020115 LTS
extern int CheckEventAttack();	 // 020115 LTS
extern int CheckEventWarDoing(); // 020115 LTS
extern void SaveObtainCombat(CHARLIST* ch, int nOld, int nNew);
extern void SaveChangeCombat(CHARLIST* ch, int nCombat, int nOld, int nNew);
extern bool isNewWarfieldServer();
extern bool isMyTeam(LPCHARLIST pCaster,LPCHARLIST pTarget);
extern CSymbolItemMgr g_CSymbolMgr; //031110 kyo

///////////////////////////////////////////////////////////////////////////////
// Global Member
///////////////////////////////////////////////////////////////////////////////

DWORD CBattleManager::s_dwDelay = 0;

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

CBattleManager::CBattleManager()
{
	m_vtBuffer.clear();
	m_vtBuffer.reserve(13);
	// magic_type俊 蝶扼辑 鉴辑利栏肺 积己
	m_vtBuffer.push_back(new CPhysicalAttack);  // [ 0] 拱府利 傍拜
	m_vtBuffer.push_back(new CRecoveryMagic);   // [ 1] 10 ~ 19 : 雀汗拌凯 付过
	m_vtBuffer.push_back(new CProtectionMagic); // [ 2] 20 ~ 29 : 焊龋拌凯 付过
	m_vtBuffer.push_back(new CAssistanceMagic); // [ 3] 30 ~ 39 : 焊炼拌凯 付过
	m_vtBuffer.push_back(new CCursingMagic);    // [ 4] 40 ~ 49 : 历林拌凯 付过
	m_vtBuffer.push_back(new CAttackMagic);     // [ 5] 50 ~ 59 : 傍拜拌凯 付过
	m_vtBuffer.push_back(new CExtraMagic);      // [ 6] 60 ~ 69 : 矫傍, 家券, 扁鸥拌凯 付过
	// order_type俊 蝶扼辑 鉴辑利栏肺 积己
	m_vtBuffer.push_back(new CThunderCombat);   // [ 7] 61 : 锅俺加己 傈捧胶懦
	m_vtBuffer.push_back(new CEarthCombat);     // [ 8] 62 : 措瘤加己 傈捧胶懦
	m_vtBuffer.push_back(new CFlameCombat);     // [ 9] 63 : 拳堪加己 傈捧胶懦
	m_vtBuffer.push_back(new CDarkCombat);      // [10] 64 : 绢狄加己 傈捧胶懦
	m_vtBuffer.push_back(new CFreezeCombat);    // [11] 65 : 倔澜加己 傈捧胶懦
	m_vtBuffer.push_back(new CWindCombat);      // [12] 66 : 官恩加己 傈捧胶懦
	// Method 官牢爹
	for_each(m_vtBuffer.begin(), m_vtBuffer.end(), mem_fun(&CBattle::Bind));
}

CBattleManager::~CBattleManager()
{
	for_each(m_vtBuffer.begin(), m_vtBuffer.end(), TDelete());
	m_vtBuffer.clear();
}

///////////////////////////////////////////////////////////////////////////////
// Public Method
///////////////////////////////////////////////////////////////////////////////

void CBattleManager::Elapse(DWORD dwSecond)
{	//< CSD-CHAOS : 矫埃包访 惑怕甫 炼沥
	if (g_curr_time < s_dwDelay)
	{
		return;
	}

	mem_fun1_t<bool, CBattle, CHARLIST*> mf(&CBattle::Elapse);
	CHARLIST* pTemp = NULL;
	
	for (int i = DRAGON_CONNECTIONS_START; i < DRAGON_MAX_CONNECTIONS; ++i)
	{	
		pTemp = ::CheckServerId(i);

		if (pTemp != NULL)
		{
			pTemp->IncPoisonedCount();

			::CheckCharacterCondition(pTemp);
			::CheckTransparency(pTemp);
			// 付过捞唱 傈捧胶懦 惑怕 八荤
			for_each(m_vtBuffer.begin(), m_vtBuffer.end(), bind2nd(mf, pTemp));
		}
	}	
	
	for (int j = NPC_LIST_START; j < MAX_NPC_LIST; ++j)
	{
		pTemp = ::CheckNpcId(j);

		if (pTemp != NULL && pTemp->bAlive != REMOVE_)
		{
			pTemp->IncPoisonedCount();
		
			::CheckCharacterCondition(pTemp);
			// 付过捞唱 傈捧胶懦 惑怕 八荤
			for_each(m_vtBuffer.begin(), m_vtBuffer.end(), bind2nd(mf, pTemp));
		}
	}
	// 瘤楷 矫埃 汲沥
	s_dwDelay = g_curr_time + dwSecond;
}	//> CSD-CHAOS

void CBattleManager::ClearCombat(BYTE nCombat, WORD idMaster)
{	//< CSD-TW-030623
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	
	if (nCombat != 0 && !IsEnableWeapon(nCombat, pMaster))
	{	// 公扁甫 官槽 版快俊 贸府
		t_client_combat_clear packet;
		packet.nType = 0;
		RecvCombatClear(idMaster, &packet);
		return;
	}
	
	switch (nCombat)
	{
    case LIGHTNING_BOOM:
    case THUNDER_BLOW:
    case LIGHTNING_SHOCK:
    case THUNDER_STRIKE:
    case BLOOD_WILL:
    case GROUND_ATTACK:
    case SWORD_N_ROSES:
    case FLEET_MISSILE:
    case CONVERTING_ARMOR:
    case CHERROY_SHADE:
    case DARK_BLADE:
    case SHARK_MISSILE:
    case HORN_OF_ICEBERG:
    case DOUBLE_ATTACK:
    case CHARGING:
    case MULTIPLE_FIRE:
    case ICING_BLAST:
    case LIGHTNING_EXTREME:
    case EARTH_EXTREME:
    case FIRE_EXTREME:
    case DARK_EXTREME:
    case ICE_EXTREME:
    case WIND_EXTREME:
		{
			if (pMaster->IsCount())
			{
				const int nCount = pMaster->DecCombatCount();
				pMaster->SendCharInfoBasic( BP, nCount);//020704 lsw
				break;
			}
			// 傈捧胶懦 檬扁拳
			pMaster->InitActiveCombat();
			pMaster->ClearActiveState();
			// 包访 Packet 傈价  
			memset(&m_packet, 0, sizeof(t_packet));
			m_packet.h.header.type = CMD_COMBAT_INIT;
			m_packet.h.header.size = sizeof(t_combat_init);
			m_packet.u.combat.server_combat_clear.idMaster = idMaster;
			m_packet.u.combat.server_combat_clear.nType = ACTIVE_COMBAT;
			::QueuePacket(connections, idMaster, &m_packet, 1);
			::CastMe2Other(idMaster, &m_packet);
			break;
		}
    case CRITICAL_HIDING:
		{
			if (pMaster->IsCount())
			{
				const int nCount = pMaster->DecCombatCount();
				pMaster->SendCharInfoBasic( BP, nCount);//020704 lsw
				
				if (nCount <= 0)
				{
					::CheckTransparency(pMaster, true);
				}
				
				break;
			}
			// 傈捧胶懦 檬扁拳
			pMaster->InitActiveCombat();
			pMaster->ClearActiveState();
			// 包访 Packet 傈价  
			memset(&m_packet, 0, sizeof(t_packet));
			m_packet.h.header.type = CMD_COMBAT_INIT;
			m_packet.h.header.size = sizeof(t_combat_init);
			m_packet.u.combat.server_combat_clear.idMaster = idMaster;
			m_packet.u.combat.server_combat_clear.nType = ACTIVE_COMBAT;
			::QueuePacket(connections, idMaster, &m_packet, 1);
			::CastMe2Other(idMaster, &m_packet);
			break;
		}
	}
}	//> CSD-TW-030623

void CBattleManager::ChangeCombat(BYTE nCombat, WORD idMaster)
{
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	
	switch (nCombat)
	{
    case BLOOD_EARTH:
    case TWISTER:
    case POISONING_NOVA:
    case WHILWIND:
		{
			const int nCount = pMaster->DecCombatCount();
			pMaster->SendCharInfoBasic(BP, nCount);//020704 lsw
			break;
		}
	}
}

void CBattleManager::ResetCombat(BYTE nCombat, WORD idMaster)
{	// 傈捧胶懦 荤侩啊瓷荐 犁汲沥
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	// CP樊 犁汲沥  
	pMaster->DecCombat(Magic_Ref[nCombat].exhaust_MP);
	// 咀萍宏 加己狼 傈捧胶懦牢 版快
	if (IsActiveCombat(nCombat))
	{
		int nMax = 0, nNow = 0;
		
		switch (nCombat)
		{
		case BLOOD_EARTH:
		case POISONING_NOVA:
		case WHILWIND:
		case TWISTER:
			{ // 荤侩第 皑家
				nMax = Magic_Ref[nCombat].nCombatCount;
				pMaster->SetActiveCombat(nCombat, nMax);
				pMaster->SendCharInfoBasic(MAX_BP, nMax);//020704 lsw
				nNow = pMaster->DecCombatCount();
				pMaster->SendCharInfoBasic(BP, nNow);//020704 lsw
				break;
			}
		case STONE_ARMOR:
			{
				nMax = pMaster->GetCombatValue(nCombat);
				pMaster->SetActiveCombat(nCombat, nMax);
				pMaster->SendCharInfoBasic(MAX_BP, nMax);//020704 lsw
				nNow = pMaster->GetCombatCount();
				pMaster->SendCharInfoBasic(BP, nNow);//020704 lsw
				break;
			}
		default:
			{ // 傍拜第 皑家
				nMax = Magic_Ref[nCombat].nCombatCount;
				pMaster->SetActiveCombat(nCombat, nMax);
				pMaster->SendCharInfoBasic(MAX_BP, nMax);//020704 lsw
				nNow = pMaster->GetCombatCount();
				pMaster->SendCharInfoBasic(BP, nNow);//020704 lsw
				break;
			}
		}
		
		return;
	}
	// 菩矫宏 加己狼 傈捧胶懦牢 版快
	if (IsPassiveCombat(nCombat))
	{
		DWORD dwPeriod = g_curr_time + Magic_Ref[nCombat].continue_Time;
		pMaster->SetPassiveCombat(nCombat, dwPeriod);
		return;
	}
	// 雀汗 加己狼 傈捧胶懦牢 版快
	if (IsRecoveryCombat(nCombat))
	{	// 030415 kyo
		DWORD dwPeriod = g_curr_time + Magic_Ref[nCombat].continue_Time;
		pMaster->SetRecoveryCombat(nCombat, dwPeriod);
		return;
	}
}

void CBattleManager::SendNpcAttack(WORD idNpc)
{
	// 傍拜磊
	WORD idCaster = idNpc + 10000;
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	if (pCaster == NULL)  return;
	// 规绢磊
	WORD idTarget = pCaster->targetid;
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pTarget == NULL)  return;
	// 傍拜 荐青
	t_npc_attack packet;
	packet.idCaster = idCaster;
	packet.idTarget = idTarget;
	packet.nX = pTarget->Tox;
	packet.nY = pTarget->Toy;
	RecvNpcAttack(&packet);
}

void CBattleManager::SendNpcThrow(WORD idNpc)
{
	// 傍拜磊
	WORD idCaster = idNpc + 10000;
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	if (pCaster == NULL)  return;
	// 规绢磊
	WORD idTarget = pCaster->targetid;
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pTarget == NULL)  return;
	// 傍拜 荐青
	t_npc_throw packet;
	packet.idCaster = idCaster;
	packet.idTarget = idTarget;
	packet.nX = pTarget->Tox;
	packet.nY = pTarget->Toy;
	RecvNpcThrow(&packet);
}

void CBattleManager::SendNpcMagic(WORD idNpc, BYTE nMagic)
{ // 措惑 瘤沥 付过
	// 矫傈磊
	WORD idCaster = idNpc + 10000;
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	if (pCaster == NULL)  return;
	// 措惑磊
	WORD idTarget = pCaster->targetid;
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pTarget == NULL)  return;
	// 付过 荐青
	t_client_npc_magic packet;
	packet.nMagic = nMagic;
	packet.idCaster = idCaster;
	packet.idTarget = idTarget;
	packet.nX = pTarget->X;
	packet.nY = pTarget->Y;
	packet.bTimeDisable = false; // LTS DRAGON MODIFY
	RecvNpcMagic(&packet);
}

void CBattleManager::SendNpcMagic(WORD idNpc, BYTE nMagic, int nX, int nY, bool bTimeDisable)
{ // 瘤开 付过
	WORD idCaster = idNpc + 10000;
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	if (pCaster == NULL)  return;
	// 付过 荐青
	t_client_npc_magic packet;
	packet.nMagic = nMagic;
	packet.idCaster = idCaster;
	packet.idTarget = idCaster;
	packet.nX = nX;
	packet.nY = nY;
	packet.bTimeDisable = bTimeDisable;	// LTS DRAGON MODIFY
	RecvNpcMagic(&packet);
}

void CBattleManager::SendNpcRecall(WORD idNpc, BYTE nMagic, BYTE nMonster, int nX, int nY)
{ // 家券 付过
	WORD idMaster = idNpc + 10000;
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	// 家券且 阁胶磐 汲沥
	pMaster->SetFollow(nMonster);
	// 付过 荐青
	t_client_npc_magic packet;
	packet.nMagic = nMagic;
	packet.idCaster = idMaster;
	packet.idTarget = idMaster;
	packet.nX = nX;
	packet.nY = nY;
	packet.bTimeDisable = true;			// LTS DRAGON MODIFY		
	RecvNpcRecall(&packet); // CSD-021119
}

void CBattleManager::SendNpcTeleport(WORD idNpc, int nX, int nY)
{	//< CSD-030314
	WORD idMaster = idNpc + 10000;
	CHARLIST* pMaster = ::GetCharListPtr(idMaster);
	if (pMaster == NULL)  return;
	// 付过 荐青
	t_client_npc_magic packet;
	packet.nMagic = TELEPORT;
	packet.idCaster = idMaster;
	packet.idTarget = idMaster;
	packet.nX = nX;
	packet.nY = nY;
	packet.bTimeDisable = false;
	RecvNpcTeleport(&packet);
}	//> CSD-030314

void CBattleManager::RecvNpcAttack(t_npc_attack* pPacket)
{	//< CSD-030723
	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 (FilterNpcAttack(pCaster, pTarget) == false)
	{
		return;
	}
	
	const int nBattle = 0; // 泅犁 NPC绰 窜芭府 傍拜父 啊瓷窍档废 汲沥
	GetBattle(nBattle)->SetIndex(WR_SHORT);
	GetBattle(nBattle)->SetBothID(idCaster, idTarget);
	GetBattle(nBattle)->SetBothPtr(pCaster, pTarget);
	GetBattle(nBattle)->Execute();
}	//> CSD-030723

void CBattleManager::RecvStrikeAttack(WORD idCaster, t_player_attack* pPacket)
{	//< CSD-030723
	const WORD idTarget = pPacket->idTarget;
	CHARLIST* pCaster = ::GetCharListPtr(idCaster);
	CHARLIST* pTarget = ::GetCharListPtr(idTarget);
	if (pCaster == NULL || pTarget == NULL)     return;
	// 傍拜 啊瓷咯何 八荤
	if (!IsBattle())                            return;
	if (!IsBattle(pCaster))                     return;
	if (!IsBattle(pCaster, pTarget))            return;
	if (!pCaster->CheckAttack(2, g_curr_time))  return;
	if (!FilterAttack(pCaster, pTarget))        return;
	// 泅惑裹牢瘤 咯何 汲沥
	pTarget->SetWanted(pPacket->bWanted);
	// 历林加己 汲沥
	AutoCurse(idCaster, idTarget);
	// 傈捧胶懦 荤侩 啊瓷荐 拌魂
	const int nBattle = 0;
	const int nCombat = pCaster->GetActiveCombat();
	ClearCombat(nCombat, idCaster);
	// CSD-030806
	g_pLogManager->SaveStrikeAttack(pCaster, pTarget);

	switch (pCaster->GetTacticsKind())
	{	

⌨️ 快捷键说明

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