📄 physicalattack.cpp
字号:
// PhysicalAttack.cpp: implementation of the CPhysicalAttack class.
//
//////////////////////////////////////////////////////////////////////
#include "..\stdafx.h"
#include "PhysicalAttack.h"
#include "Op_Battle.h"
#include "Op_Magic.h"
#include "CItem.h"
#include "NationSys.h"
#include "SealStoneGameServer.h"
#include "Npc_Pattern.h"
#include "AIManager.h"
#include "LogManager.h"
extern bool IsWar();
extern bool CanDestroyTarget(CHARLIST* pCaster,CHARLIST* pTarget);
extern void Send_CMD_SEALSTONE_STATUS(LPCHARLIST ch, int status);
///////////////////////////////////////////////////////////////////////////////
// Global Member
///////////////////////////////////////////////////////////////////////////////
static int RATE_BY_CLASS[5][4] =
{ // 努贰胶狼 公扁喊 焊沥蔼
{100, 100, 90, 90}, // 傈 荤 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
{ 90, 90, 100, 100}, // 档 利 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
{ 90, 90, 100, 100}, // 泵 荐 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
{ 90, 100, 90, 100}, // 付过荤 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
{ 90, 100, 90, 100} // 己流磊 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
};
///////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////////////////////////////////
CPhysicalAttack::CPhysicalAttack()
{
}
CPhysicalAttack::~CPhysicalAttack()
{
}
///////////////////////////////////////////////////////////////////////////////
// Public Method
///////////////////////////////////////////////////////////////////////////////
bool CPhysicalAttack::Bind()
{ //< CSD-030723
Resist(WR_SHORT, &CPhysicalAttack::AttackShort); // 窜芭府
Resist(WR_MIDDLE, &CPhysicalAttack::AttackMiddle); // 吝芭府
Resist(WR_LONG1, &CPhysicalAttack::AttackLong); // 厘芭府(劝)
Resist(WR_LONG2, &CPhysicalAttack::AttackLong); // 厘芭府(厚档)
Resist(WR_LONG3, &CPhysicalAttack::AttackEvent); // 厘芭府(捞亥飘)
Resist(WR_EFFECT, &CPhysicalAttack::AttackEffect); // 酒捞袍 瓤苞
return true;
} //> CSD-030723
bool CPhysicalAttack::AttackShort()
{
switch (m_pTarget->SprNo)
{
case 94 : case 95 : return false;
}
const int nAttack = CalcAttack(m_nIndex);
const int nDefense = CalcDefense(nAttack);
// 窜芭府 公扁俊 狼茄 单固瘤 拌魂
int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
Correct(nDamage);
// 芭府 八荤
switch (m_pCaster->GetActiveCombat())
{
case CHARGING:
{
break;
}
default:
{
if (!IsRange()) nDamage = 0;
break;
}
}
// 荤侩 公扁狼 郴备档 皑家
::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
return Result(nDamage);
}
bool CPhysicalAttack::AttackMiddle()
{
switch (m_pTarget->SprNo)
{
case 92: case 93: case 94: return false;
}
const int nAttack = CalcAttack(m_nIndex);
const int nDefense = CalcDefense(nAttack);
// 吝芭府 公扁俊 狼茄 单固瘤 拌魂
int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
Correct(nDamage);
// 芭府 八荤
if (!IsRange()) nDamage = 0;
// 荤侩 公扁狼 郴备档 皑家
::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
return Result(nDamage);
}
bool CPhysicalAttack::AttackLong()
{
switch (m_pTarget->SprNo)
{
case 92 : case 93 : case 95 : return false;
}
const int nAttack = CalcAttack(m_nIndex);
const int nDefense = CalcDefense(nAttack);
// 厘芭府 公扁俊 狼茄 单固瘤 拌魂
int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
Correct(nDamage);
// 荤侩 公扁狼 郴备档 皑家
switch (m_nIndex)
{ //< CSD-030723
case WR_LONG1: // 劝
{
::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
::DecreaseEquipDuration(m_pCaster, 1, WT_SHIELD, m_pTarget->SprNo);
break;
}
case WR_LONG2: // 厚档
{
::DecreaseEquipDuration(m_pCaster, 1, WT_WEAPON, m_pTarget->SprNo);
break;
}
} //> CSD-030723
if (m_pTarget->IsNpc()) // LTS AI
{
if (m_pTarget->ChairNum) // 辑滚 AI捞搁 // LTS AI2
{
if (m_pTarget->patterntype>=NPC_PATTERN_WANDER&&m_pTarget->patterntype<NPC_PATTERN_BOSS_WANDER) // LTS DRAGON MODIFY
{
if (rand()%10>5) // LTS AI2
{ //< CSD-030417
g_pAIManager->SetAI(m_pTarget,NPC_PATTERN_ATTACKED);
g_pAIManager->SetTarget(m_pTarget,m_pCaster->GetServerID());
} //> CSD-030417
}
}
}
return Result(nDamage);
}
bool CPhysicalAttack::AttackEvent()
{ //< CSD-030723
switch (m_pTarget->SprNo)
{
case 92 : case 93 : case 95 : return false;
}
switch (m_nIndex)
{
case WR_LONG3: // 传轿框
{
::DecreaseEquipDuration(m_pCaster, 1, WT_WEAPON, m_pTarget->SprNo);
break;
}
}
BYTE nResult = HIT_AND_NOTDEAD;
int nDamage = 1;
// 籍拳俊 吧妨乐栏搁 绢栋茄 拱府利 单捞瘤档 罐瘤 给窃
if (m_pTarget->IsStone())
{
nDamage = 0;
nResult = HIT_FAILED;
goto SEND;
}
// 父距 傍拜阑 罐栏搁 磊府俊 肛眠霸 窃
if (m_pTarget->IsNpc())
{
m_pTarget->MoveLength = m_pTarget->MovePathCount = 0;
}
// 规绢备狼 郴备档 皑家
::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo, false);
::HungryMuchAdd(m_pCaster, HT_ATTACK);
switch (m_pTarget->Race)
{
case SEALSTONE: // 搬拌籍牢 版快
{
m_pTarget->DecLife(nDamage);
g_pLogManager->SaveSealStoneInfo(m_pCaster, m_pTarget, nDamage); // CSD-040316
break;
}
case GUARDSTONE: // 荐龋籍牢 版快
{
if (::IsWar() && ::CanDestroyTarget(m_pCaster, m_pTarget))
{ // 傈里牢 版快 焊炼 荐龋籍捞 促 颇鲍登菌促搁
m_pTarget->DecLife(nDamage);
}
else
{ // 傈里捞 酒囱 版快唱 傈里 吝 焊炼 荐龋籍捞 促 颇鲍登瘤 臼疽促搁
nDamage = 0;
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
break;
}
//case CASTLEGATEWAY: 固搬沥
//case WARARMS: 固搬沥
}
switch (m_pTarget->SprNo)
{
case 92: // 扁嫡..
case 93: // 扁嫡..
case 94: // 苞翅..
case 95: // 倾荐酒厚.
case 96: // 怕平荐访侩.
{
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
case 97: // 绵备傍
{
nDamage = 0;
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
default :
{
m_pTarget->DecLife(nDamage);
break;
}
}
if (m_pTarget->IsDead() == true)
{
m_pTarget->Hp = 1;
}
if (m_pTarget->Race == SEALSTONE)
{
if (++m_pTarget->sealstone%50 == 0)
{
::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
}
}
if (m_pCaster->IsPlayer() == true)
{
::SaveBallancing(m_pCaster, m_pTarget, 0, nDamage, 0, 0, 0, 0);
}
SEND:
const int nTactics = m_pCaster->cur_tac_skill;
switch (m_nIndex)
{
case WR_LONG3:
{
if (m_pCaster->IsPlayer())
{
memset(&m_packet, 0, sizeof(t_packet));
m_packet.h.header.type = CMD_THROW_RESULT;
m_packet.h.header.size = sizeof(t_server_throw_result);
m_packet.u.strike.server_throw_result.idTarget = m_idTarget;
m_packet.u.strike.server_throw_result.nX = m_pTarget->Tox;
m_packet.u.strike.server_throw_result.nY = m_pTarget->Toy;
m_packet.u.strike.server_throw_result.nDamage = -nDamage;
m_packet.u.strike.server_throw_result.nResult = nResult;
::QueuePacket(connections, m_idCaster, &m_packet, 1);
memset(&m_packet, 0, sizeof(t_packet));
m_packet.h.header.type = CMD_THROW_RESULT_D;
m_packet.h.header.size = sizeof(t_throw_result_d);
m_packet.u.strike.throw_result_d.idCaster = m_idCaster;
m_packet.u.strike.throw_result_d.idTarget = m_idTarget;
m_packet.u.strike.throw_result_d.nDamage = -nDamage;
m_packet.u.strike.throw_result_d.nX = m_pTarget->Tox;
m_packet.u.strike.throw_result_d.nY = m_pTarget->Toy;
m_packet.u.strike.throw_result_d.nResult = nResult;
::CastMe2Other(m_idCaster, &m_packet);
return true;
}
break;
}
}
return false;
} //> CSD-030723
bool CPhysicalAttack::AttackEffect()
{ //< CSD-031007
const int nAttack = CalcAttack(m_nIndex);
const int nDefense = CalcDefense(nAttack);
// 酒捞袍 瓤苞俊 狼茄 单固瘤 拌魂
int nDamage = CalcDamage(m_nIndex, nAttack - nDefense)*m_pCaster->CorrectItemEffect()/100;
Correct(nDamage);
if (!IsRange())
{ // 芭府 八荤
nDamage = 0;
}
return Result(nDamage);
} //> CSD-031007
///////////////////////////////////////////////////////////////////////////////
// Protected Method
///////////////////////////////////////////////////////////////////////////////
bool CPhysicalAttack::IsRange() const
{ // 利例茄 裹困牢瘤 八荤
if (m_pCaster->IsPlayer() && m_pTarget->IsNpc())
{
const int nDistX = pow(m_pCaster->X - m_pTarget->X, 2.0);
const int nDistY = pow(m_pCaster->Y - m_pTarget->Y, 2.0);
if (nDistX + nDistY > 50000)
{
return false;
}
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -