📄 physicalattack.cpp
字号:
bool CPhysicalAttack::IsMiss() const
{ // 拱府利 傍拜 己傍 咯何 魄窜
if( m_pTarget && m_pTarget->IsDead() ) return true;
const int nStatic = RareEM.GetStaticRareSmart(m_pTarget->StaticRare);
const int nDynamic = RareEM.GetDynamicRareValue(FITEM_AGILITY, m_pTarget->DynamicRare);
// 雀乔啦 拌魂
const int nRate = m_pCaster->CalcAttackSuccessRate(nStatic, nDynamic);
return (nRate < rand()%101) ? true:false;
}
///////////////////////////////////////////////////////////////////////////////
// Private Method
///////////////////////////////////////////////////////////////////////////////
void CPhysicalAttack::Correct(int& rDamage)
{ // 酒捞袍 加己俊 狼茄 焊沥
RareEM.CorrectByStaticRare(m_pCaster, m_pTarget, rDamage);
// 努贰胶俊 措茄 焊沥
if (m_pCaster->IsPlayer())
{
rDamage = rDamage*RATE_BY_CLASS[m_pCaster->Class][m_nIndex]/100;
}
// 芭府俊 措茄 焊沥
const int nDistance = ::getDistance(m_pCaster, m_pTarget);
m_pCaster->CorrectStrikeRange(nDistance, rDamage);
// 臭撤捞俊 蝶弗 焊沥
const int nX = m_pTarget->MoveSx;
const int nY = m_pTarget->MoveSy;
m_pCaster->CorrectRiseFall(0, nX, nY, rDamage);
// 空捞唱 墨款伎矾俊 措茄 焊沥
if (m_pCaster->name_status.nation == m_pTarget->name_status.nation)
{
if (m_pTarget->name_status.king || m_pTarget->IsCounselor())
{
rDamage /= 30;
}
}
else
{
if (m_pTarget->IsCounselor())
{
rDamage /= 30;
}
}
}
bool CPhysicalAttack::Result(int nDamage)
{ //< CSD-031007
BYTE nResult = HIT_FAILED;
if (nDamage <= 0 || IsMiss())
{
nDamage = 0;
nResult = HIT_FAILED;
goto SEND;
}
// 籍拳俊 吧妨乐栏搁 绢栋茄 拱府利 单捞瘤档 罐瘤 给窃
if (m_pTarget->IsStone())
{
nDamage = 0;
nResult = HIT_FAILED;
goto SEND;
}
// 父距 傍拜阑 罐栏搁 磊府俊 肛眠霸 窃
if (m_pTarget->IsNpc())
{
m_pTarget->MoveLength = m_pTarget->MovePathCount = 0;
}
// 父距 ROOKIE_LEVEL 捞窍捞搁 捣捞 唱坷霸 窃
if (m_pCaster->IsPlayer() && m_pTarget->IsNpc())
{
if (m_pCaster->GetLevel() <= ROOKIE_LEVEL && m_pTarget->Race == DUMMY)
{
if(!(rand()%10))
{
ItemAttr item = {0,};
if (LocalMgr.IsChangeMoney())
{
item = ::GenerateItem(IN_NEW_COINS, IATTR_MUCH, rand()%6 +10);
}
else
{
item = ::GenerateItem(IN_COINS, IATTR_MUCH , rand()%6 + 10);
}
::AddItemList(item.item_no, item.attr, 0,
m_pCaster->X + rand()%TILE_SIZE, m_pCaster->Y + rand()%TILE_SIZE, 0, 0);
}
}
}
// 规绢备狼 郴备档 皑家
::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo, false);
::HungryMuchAdd(m_pCaster, HT_ATTACK);
// NPC 辆幅俊 蝶弗 焊沥
if (m_pTarget->IsNpc())
{
switch (m_pTarget->Race)
{
case DUMMY:
{
if (m_pCaster->GetLevel() <= ENABLE_DUMMY_LEVEL)
{ // 版氰摹啊 10 捞窍搁辑 歹固甫 傍拜茄 版快父 版氰摹 惑铰
const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_NOTDEAD, nDamage);
const int nTemp = (rand()%10 < 3) ? 3:4; // 老馆 版氰摹俊辑 琶平 版氰摹肺 函券惑荐
m_pCaster->ChangeUpTacExp(0, nExp*nTemp);
}
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
case SEALSTONE:
{
m_pTarget->DecLife(nDamage);
g_pLogManager->SaveSealStoneInfo(m_pCaster, m_pTarget, nDamage); // CSD-040316
break;
}
case GUARDSTONE:
//case CASTLEGATEWAY: 固搬沥
//case WARARMS: 固搬沥
{
if (::IsWar() && ::CanDestroyTarget(m_pCaster, m_pTarget))
{ // 傈里牢 版快 焊炼 荐龋籍捞 促 颇鲍登菌促搁
m_pTarget->DecLife(nDamage);
}
else
{ // 傈里捞 酒囱 版快唱 傈里 吝 焊炼 荐龋籍捞 促 颇鲍登瘤 臼疽促搁
nDamage = 0;
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
break;
}
case ORC_DUMMY:
{
m_pCaster->ChangeUpTacExp(1, nDamage*3);
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
case LIFELESS:
{
nDamage = 0;
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
default:
{
m_pTarget->DecLife(nDamage);
break;
}
}
}
else
{
m_pTarget->DecLife(nDamage);
}
if (m_pTarget->IsDead())
{
const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_DEAD, nDamage);
m_pCaster->ChangeUpTacExp(0, nExp*3);
::KillWho(m_pTarget, m_pCaster);
// NK俊 拌魂
if (LocalMgr.IsAbleNation(TAIWAN))
{
if (m_pCaster->IsTamedNpc())
{
::CheckNK(m_pCaster->GetMaster(), m_idTarget, NK_TYPE_KILL_);
}
else
{
::CheckNK(m_idCaster, m_idTarget, NK_TYPE_KILL_);
}
}
else
{
::CheckNK(m_idCaster, m_idTarget, NK_TYPE_KILL_);
}
if (m_pTarget->IsNpc())
{
m_pTarget->m_xSummon.Remove(KillMonster);
}
::killCharacter(m_pCaster, m_pTarget);
nResult = HIT_AND_DEAD;
goto SEND;
}
else // 磷瘤 臼篮 版快
{
const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_NOTDEAD, nDamage);
m_pCaster->ChangeUpTacExp(0, nExp*3);
if (m_pTarget->Race == SEALSTONE)
{
if (++m_pTarget->sealstone%50 == 0)
{
::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
}
}
if (!m_pCaster->IsTamedNpc())
{
m_pTarget->ChangeUpTacExp(4, m_pCaster->GetLevel()*2);
::CheckNK(m_idCaster, m_idTarget, NK_TYPE_NO_KILL_);
}
nResult = HIT_AND_NOTDEAD;
goto SEND;
}
SEND:
if (m_pCaster->IsPlayer() == true)
{
::SaveBallancing(m_pCaster, m_pTarget, 0, nDamage, 0, 0, 0, 0);
}
const int nTactics = m_pCaster->cur_tac_skill;
const WORD wdEffect = (m_pCaster->GetActiveCombat() > 0) ? 0:m_pCaster->GetItemEffectNumber();
switch (m_nIndex)
{
case WR_SHORT:
case WR_MIDDLE:
{
if (m_pCaster->IsPlayer())
{
memset(&m_packet, 0, sizeof(t_packet));
m_packet.h.header.type = CMD_ATTACK_RESULT;
m_packet.h.header.size = sizeof(t_attack_result);
m_packet.u.strike.attack_result.idTarget = m_idTarget;
m_packet.u.strike.attack_result.nDamage = -nDamage;
m_packet.u.strike.attack_result.nX = m_pTarget->Tox;
m_packet.u.strike.attack_result.nY = m_pTarget->Toy;
m_packet.u.strike.attack_result.wdEffect = wdEffect; // CSD-031001
m_packet.u.strike.attack_result.nCombat = m_pCaster->GetActiveCombat();
m_packet.u.strike.attack_result.nResult = nResult;
::QueuePacket(connections, m_idCaster, &m_packet, 1);
memset(&m_packet, 0, sizeof(t_packet));
m_packet.h.header.type = CMD_ATTACK_RESULT_D;
m_packet.h.header.size = sizeof(t_attack_result_d);
m_packet.u.strike.attack_result_d.idCaster = m_idCaster;
m_packet.u.strike.attack_result_d.idTarget = m_idTarget;
m_packet.u.strike.attack_result_d.nDamage = -nDamage;
m_packet.u.strike.attack_result_d.nX = m_pTarget->Tox;
m_packet.u.strike.attack_result_d.nY = m_pTarget->Toy;
m_packet.u.strike.attack_result_d.wdEffect = wdEffect; // CSD-031001
m_packet.u.strike.attack_result_d.nCombat = m_pCaster->GetActiveCombat();
m_packet.u.strike.attack_result_d.nResult = nResult;
::CastMe2Other(m_idCaster, &m_packet);
}
else
{
memset(&m_packet, 0, sizeof(t_packet));
m_packet.h.header.type = CMD_ATTACK_RESULT_D;
m_packet.h.header.size = sizeof(t_attack_result_d);
m_packet.u.strike.attack_result_d.idCaster = m_idCaster;
m_packet.u.strike.attack_result_d.idTarget = m_idTarget;
m_packet.u.strike.attack_result_d.nDamage = -nDamage;
m_packet.u.strike.attack_result_d.nX = m_pTarget->Tox;
m_packet.u.strike.attack_result_d.nY = m_pTarget->Toy;
m_packet.u.strike.attack_result_d.wdEffect = wdEffect; // CSD-031001
m_packet.u.strike.attack_result_d.nCombat = m_pCaster->GetActiveCombat();
m_packet.u.strike.attack_result_d.nResult = nResult;
::CastNPC2Other(m_idCaster - 10000, &m_packet);
}
break;
}
case WR_LONG1:
case WR_LONG2:
{
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.wdEffect = wdEffect; // CSD-031001
m_packet.u.strike.server_throw_result.nCombat = m_pCaster->GetActiveCombat();
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.wdEffect = wdEffect; // CSD-031001
m_packet.u.strike.throw_result_d.nCombat = m_pCaster->GetActiveCombat();
m_packet.u.strike.throw_result_d.nResult = nResult;
::CastMe2Other(m_idCaster, &m_packet);
}
break;
}
case WR_EFFECT:
{
memset(&m_packet, 0, sizeof(t_packet));
m_packet.h.header.type = CMD_EFFECT_RESULT;
m_packet.h.header.size = sizeof(t_server_effect_result);
m_packet.u.strike.server_effect_result.idTarget = m_idTarget;
m_packet.u.strike.server_effect_result.nDamage = -nDamage;
m_packet.u.strike.server_effect_result.nResult = nResult;
CBattle::SendPacket(m_idCaster);
break;
}
}
if (!m_pCaster->IsNpc() && m_pTarget->IsStrikeReflect())
{
if (rand()%101 <= 20)
{
const int nReal = m_pCaster->DecLife(nDamage, 10);
if (nReal > 0)
{
SendBattleDamage(m_idCaster, 0, -nReal);
}
}
}
return true;
} //> CSD-031007
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -