Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
921 lines
31 KiB
C++
921 lines
31 KiB
C++
|
||
#include "stdafx.h"
|
||
|
||
#include <Utility/Math/Math.h>
|
||
|
||
#include <Map/FieldMap/Cell.h>
|
||
#include <Skill/SkillMgr.h>
|
||
|
||
#include <Creature/AggresiveCreature.h>
|
||
#include <Creature/Character/Character.h>
|
||
|
||
#include <Network/Packet/PacketCommand.h>
|
||
#include <Network/Packet/PacketStruct/CharAttackPacket.h>
|
||
#include <Network/ClientSocket/ClientConstants.h>
|
||
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
|
||
#include <Network/Dispatch/GameClient/SendCharAttack.h>
|
||
|
||
#include "SpellTable.h"
|
||
#include "SpellMgr.h"
|
||
#include "GlobalSpellMgr.h"
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Chant Spell
|
||
|
||
void CChantSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
if (lpAffected == m_pCaster)
|
||
{
|
||
m_cOperateTurn++;
|
||
if (m_cOperateTurn == UCHAR_MAX)
|
||
{
|
||
m_cOperateTurn = 0;
|
||
}
|
||
|
||
if (0 == (m_cOperateTurn % CSpell::REDUCE_MANA_TURN))
|
||
{
|
||
CreatureStatus& affectedStatus = lpAffected->GetStatus();
|
||
CCastingSpell& affectedCastingInfo = lpAffected->GetSpellMgr().GetCastingInfo();
|
||
|
||
if (m_nConsumeMPAmount > affectedStatus.m_nNowMP)
|
||
{
|
||
affectedStatus.m_nNowMP = 0;
|
||
affectedCastingInfo.DisableChant();
|
||
}
|
||
else
|
||
{
|
||
affectedStatus.m_nNowMP -= m_nConsumeMPAmount;
|
||
affectedCastingInfo.EnableChant();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// BattleSong Spell
|
||
|
||
bool CBattleSongSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CBattleSongSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CStealHandSpell Spell
|
||
|
||
bool CStealHandSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CStealHandSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// MaintenanceChant Spell
|
||
|
||
void CMaintenanceChantSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
if (0 == m_cOperateTurn % 2)
|
||
{
|
||
lpAffected->RegenHPAndMP(m_wSpellLevel, 0, false);
|
||
}
|
||
|
||
CChantSpell::Operate(lpAffected);
|
||
}
|
||
|
||
bool CMaintenanceChantSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CMaintenanceChantSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// AccelerationChant Spell
|
||
|
||
void CAccelerationChantSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
if (0 == m_cOperateTurn % 2)
|
||
{
|
||
lpAffected->RegenHPAndMP(0, m_wSpellLevel, false);
|
||
}
|
||
|
||
CChantSpell::Operate(lpAffected);
|
||
}
|
||
|
||
bool CAccelerationChantSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CAccelerationChantSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// LifeAura Spell
|
||
|
||
void CLifeAuraSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
if (0 == m_cOperateTurn % 2)
|
||
{
|
||
lpAffected->RegenHPAndMP(m_wSpellLevel * 2, m_wSpellLevel * 2, false);
|
||
}
|
||
|
||
CChantSpell::Operate(lpAffected);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// SpeedBuff Spell
|
||
|
||
bool CSpeedBuffChantSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CSpeedBuffChantSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Regeneration Spell
|
||
|
||
void CRegenerationSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
if (0 == m_dwDurationSec % 2)
|
||
{
|
||
lpAffected->RegenHPAndMP(m_wSpellLevel * 2, 0, false);
|
||
}
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CBuffPotionSpell Spell
|
||
|
||
bool CBuffPotionSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CBuffPotionSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Blaze Spell
|
||
|
||
bool CBlazeSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CBlazeSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Charging Spell
|
||
|
||
bool CChargingSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CChargingSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Encourage Spell
|
||
|
||
bool CEncourageSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CEncourageSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// EnchantWeapon Spell
|
||
|
||
bool CEnchantWeaponSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CEnchantWeaponSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// BrightArmor Spell
|
||
|
||
bool CBrightArmorSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CBrightArmorSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// HardenSkin Spell
|
||
|
||
bool CHardenSkinSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CHardenSkinSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Guard Spell
|
||
|
||
bool CGuardSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CGuardSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CMichaelBlessSpell Spell
|
||
|
||
bool CMichaelBlessSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CMichaelBlessSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CExpOrbSpell Spell
|
||
|
||
bool CExpOrbSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CExpOrbSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CLuckyOrbSpell Spell
|
||
|
||
bool CLuckyOrbSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CLuckyOrbSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Chocolate Spell
|
||
|
||
bool CChocolateSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CChocolateSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CTasteWineSpell Spell
|
||
|
||
bool CTasteWineSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CTasteWineSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// ArmorBroken Spell
|
||
|
||
bool CArmorBrokenSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CArmorBrokenSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Stun Spell
|
||
|
||
bool CStunSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->GetSpellMgr().GetCastingInfo().ClearChant();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Poisoned Spell
|
||
|
||
void CPoisonedSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
const short wDamage = static_cast<short>( (float)(m_wSpellLevel) * 1.0f );
|
||
|
||
const short wThreatAmount = (lpAffected->GetStatus().m_nNowHP < wDamage) ?
|
||
lpAffected->GetStatus().m_nNowHP : wDamage;
|
||
lpAffected->GetThreat().AddToThreatList(m_pCaster, wThreatAmount);
|
||
|
||
lpAffected->GetStatus().m_nNowHP = (lpAffected->GetStatus().m_nNowHP > wDamage) ?
|
||
lpAffected->GetStatus().m_nNowHP - wDamage : 0;
|
||
|
||
if (0 == lpAffected->GetStatus().m_nNowHP)
|
||
{
|
||
lpAffected->Dead(m_pCaster);
|
||
lpAffected->GetThreat().ClearAll();
|
||
}
|
||
|
||
DefenserNode node;
|
||
|
||
node.m_wDamage = wDamage;
|
||
node.m_dwCharID = lpAffected->GetCID();
|
||
node.m_sCurrHP = lpAffected->GetStatus().m_nNowHP;
|
||
node.m_sCurrMP = lpAffected->GetStatus().m_nNowMP;
|
||
node.m_wMaxHP = lpAffected->GetStatus().m_StatusInfo.m_nMaxHP;
|
||
node.m_wMaxMP = lpAffected->GetStatus().m_StatusInfo.m_nMaxMP;
|
||
node.m_wMPHeal = 0;
|
||
node.m_cJudge = ClientConstants::Judge_Poisoned;
|
||
|
||
AtType attackType;
|
||
attackType.m_wType = AtType::RIGHT_MELEE;
|
||
|
||
CCell* lpCell = lpAffected->GetCellPos().m_lpCell;
|
||
if (NULL != lpCell)
|
||
{
|
||
lpCell->SendAttackInfo(m_pCaster->GetCID(), attackType, 1, &node);
|
||
}
|
||
|
||
if (Creature::CT_PC == Creature::GetCreatureType(lpAffected->GetCID()))
|
||
{
|
||
AtType attackType;
|
||
attackType.m_wType = AtType::RIGHT_MELEE;
|
||
|
||
CCharacter* pAffectedCharacter = (CCharacter *)lpAffected;
|
||
CGameClientDispatch* pCharacterDispatcher = pAffectedCharacter->GetDispatcher();
|
||
if (NULL != pCharacterDispatcher)
|
||
{
|
||
GameClientSendPacket::SendCharAttacked(pCharacterDispatcher->GetSendStream(), m_pCaster, pAffectedCharacter,
|
||
attackType, 0, wDamage, ClientConstants::Judge_Poisoned, 0, PktBase::NO_SERVER_ERR);
|
||
}
|
||
}
|
||
}
|
||
|
||
bool CPoisonedSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CPoisonedSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// LowerStrength Spell
|
||
|
||
bool CLowerStrengthSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CLowerStrengthSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// StoneForm Spell
|
||
|
||
bool CStoneFormSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->GetSpellMgr().GetCastingInfo().ClearChant();
|
||
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CStoneFormSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// BombSet Spell
|
||
|
||
void CBombSetSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
if (0 == m_dwDurationSec)
|
||
{
|
||
AtType attackType;
|
||
attackType.m_wType = 0x8708; // <20><><EFBFBD><EFBFBD> <20><>ų
|
||
attackType.m_cSkillLockCount = m_wSpellLevel / 6;
|
||
attackType.m_cSkillLevel = m_wSpellLevel % 6;
|
||
|
||
unsigned char cDefenceJudge[AtNode::MAX_DEFENDER_NUM] = { 0, };
|
||
|
||
m_pCaster->MultiAttack(attackType, 1, &lpAffected, cDefenceJudge,
|
||
lpAffected->GetCurrentPos(), 0, 12, Math::Const::PI * 2, Skill::Target::ENEMY);
|
||
}
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Fired Spell
|
||
|
||
void CFiredSpell::Operate(CAggresiveCreature* lpAffected)
|
||
{
|
||
const short wDamage = static_cast<short>( (float)(m_wSpellLevel) * 1.5f );
|
||
|
||
const short wThreatAmount = (lpAffected->GetStatus().m_nNowHP < wDamage) ?
|
||
lpAffected->GetStatus().m_nNowHP : wDamage;
|
||
lpAffected->GetThreat().AddToThreatList(m_pCaster, wThreatAmount);
|
||
|
||
lpAffected->GetStatus().m_nNowHP = (lpAffected->GetStatus().m_nNowHP > wDamage) ?
|
||
lpAffected->GetStatus().m_nNowHP - wDamage : 0;
|
||
|
||
if (0 == lpAffected->GetStatus().m_nNowHP)
|
||
{
|
||
lpAffected->Dead(m_pCaster);
|
||
lpAffected->GetThreat().ClearAll();
|
||
}
|
||
|
||
DefenserNode node;
|
||
|
||
node.m_wDamage = wDamage;
|
||
node.m_dwCharID = lpAffected->GetCID();
|
||
node.m_sCurrHP = lpAffected->GetStatus().m_nNowHP;
|
||
node.m_sCurrMP = lpAffected->GetStatus().m_nNowMP;
|
||
node.m_wMaxHP = lpAffected->GetStatus().m_StatusInfo.m_nMaxHP;
|
||
node.m_wMaxMP = lpAffected->GetStatus().m_StatusInfo.m_nMaxMP;
|
||
node.m_wMPHeal = 0;
|
||
node.m_cJudge = ClientConstants::Judge_Fired;
|
||
|
||
AtType attackType;
|
||
attackType.m_wType = AtType::RIGHT_MELEE;
|
||
|
||
CCell* lpCell = lpAffected->GetCellPos().m_lpCell;
|
||
if (NULL != lpCell)
|
||
{
|
||
lpCell->SendAttackInfo(m_pCaster->GetCID(), attackType, 1, &node);
|
||
}
|
||
|
||
if (Creature::CT_PC == Creature::GetCreatureType(lpAffected->GetCID()))
|
||
{
|
||
AtType attackType;
|
||
attackType.m_wType = AtType::RIGHT_MELEE;
|
||
|
||
CCharacter* pAffectedCharacter = (CCharacter *)lpAffected;
|
||
CGameClientDispatch* pCharacterDispatcher = pAffectedCharacter->GetDispatcher();
|
||
if (NULL != pCharacterDispatcher)
|
||
{
|
||
GameClientSendPacket::SendCharAttacked(pCharacterDispatcher->GetSendStream(), m_pCaster, pAffectedCharacter,
|
||
attackType, 0, wDamage, ClientConstants::Judge_Fired, 0, PktBase::NO_SERVER_ERR);
|
||
}
|
||
}
|
||
}
|
||
|
||
bool CFiredSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CFiredSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// CurseOfBlind Spell
|
||
|
||
bool CCurseOfBlindSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CCurseOfBlindSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// KarterantWorldBuff Spell
|
||
|
||
bool CKarterantWorldBuffSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CKarterantWorldBuffSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// MerkadiaWorldBuff Spell
|
||
|
||
bool CMerkadiaWorldBuffSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CMerkadiaWorldBuffSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// KarterantWorldDeBuff Spell
|
||
|
||
bool CKarterantWorldDeBuffSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CKarterantWorldDeBuffSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// MerkadiaWorldDeBuff Spell
|
||
|
||
bool CMerkadiaWorldDeBuffSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CMerkadiaWorldDeBuffSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// PowerStatue Spell
|
||
|
||
bool CPowerStatueSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CPowerStatueSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// IntStatue Spell
|
||
|
||
bool CIntStatueSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CIntStatueSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// ExpStatue Spell
|
||
|
||
bool CExpStatueSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CExpStatueSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// WealthStatue Spell
|
||
|
||
bool CWealthStatueSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CWealthStatueSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// RealmHP Spell
|
||
|
||
bool CRealmHPSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CRealmHPSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// RealmMP Spell
|
||
|
||
bool CRealmMPSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CRealmMPSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Hundred Spell
|
||
|
||
bool CHundredLevelSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CHundredLevelSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
//-------------------------------------------------------------------------------------------------
|
||
// Hundred Spell
|
||
|
||
bool CDeCoolDownSpell::Activate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), m_wSpellLevel);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Activate(lpAffected, dwOperateFlag);
|
||
}
|
||
|
||
bool CDeCoolDownSpell::Deactivate(CAggresiveCreature* lpAffected, unsigned long dwOperateFlag)
|
||
{
|
||
lpAffected->SetEnchantLevel(static_cast<Skill::SpellID::Type>(m_wSpellID), 0);
|
||
lpAffected->CalculateEnchantStatus();
|
||
|
||
return CSpell::Deactivate(lpAffected, dwOperateFlag);
|
||
} |