📄 battlemanager.cpp
字号:
// 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 + -