Files
Client/Server/RylServerProject/RylGameLibrary/Creature/Character/CharacterFight.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

1897 lines
60 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include <Utility/Math/Math.h>
#include <Utility/Setup/ServerSetup.h>
#include <Log/LogStruct.h>
#include <Log/CharacterLog.h>
#include <Item/Item.h>
#include <Item/Container/ItemContainer.h>
#include <Item/Container/EquipmentsContainer.h>
#include <Network/ClientSocket/ClientConstants.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Network/Packet/PacketStruct/CharAttackPacketStruct.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Dispatch/Chat/ChatDispatch.h>
#include <Network/Dispatch/DBAgent/DBAgentRequest.h>
#include <Network/Dispatch/DBAgent/DBAgentDispatch.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharEtc.h>
#include <Network/Dispatch/GameClient/SendCharAttack.h>
#include <Network/Dispatch/GameClient/SendCharCastle.h>
#include <Skill/SkillTable.h>
#include <Skill/Spell/SpellTable.h>
#include <Skill/Spell/GlobalSpellMgr.h>
#include <Creature/CreatureManager.h>
#include <Creature/Monster/Monster.h>
#include <Creature/Monster/PatternMonster.h>
#include <Creature/Monster/VirtualMonsterMgr.h>
#include <Creature/Siege/SiegeObject.h>
#include <Creature/Siege/Camp.h>
#include <Creature/Siege/CastleGate.h>
#include <Creature/Siege/SiegeObjectMgr.h>
#include <Map/FieldMap/VirtualArea/VirtualArea.h>
#include <Map/FieldMap/VirtualArea/VirtualAreaMgr.h>
#include <Map/FieldMap/VirtualArea/BGServer/BGServerMap.h>
#include <Map/FieldMap/CellManager.h>
#include <Map/FieldMap/Cell.h>
#include <Community/Guild/GuildMgr.h>
#include <Community/Guild/Guild.h>
#include <Community/Party/Party.h>
#include <Castle/Castle.h>
#include <Castle/CastleMgr.h>
#include <GameTime/GameTimeConstants.h>
#include <GameTime/GameTimeMgr.h>
#include "ExpTable.h"
#include "Character.h"
#include "CharacterCreate.h"
#include "CharRespawnMgr.h"
#include <Creature/EnemyCheck.h>
const int CCharacter::CalculateFixLevelGap(CAggresiveCreature *pDefender)
{
Creature::CreatureType eCreatureType = Creature::GetCreatureType(pDefender->GetCID());
if (Creature::CT_MONSTER == eCreatureType ||
Creature::CT_SUMMON == eCreatureType ||
Creature::CT_STRUCT == eCreatureType)
{
CMonster* lpMonster = reinterpret_cast<CMonster *>(pDefender);
return (lpMonster->CalculateFixLevelGap(this) * -1);
}
return CAggresiveCreature::CalculateLevelGap(pDefender);
}
void CCharacter::Casting(AtType attackType, AtNode& attackNode)
{
// ij<><C4B3><EFBFBD>ý<EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE>
m_SpellMgr.GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::Invincible);
m_SpellMgr.GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::CounterAttack);
}
bool CCharacter::AttackCID(AtType attackType, AtNode& attackNode, unsigned short& wError)
{
PERFORMANCE_CHECK(FunctionTimingCheck);
if (true == m_bLogout || m_CreatureStatus.m_nNowHP == 0)
{
wError = PktAtAck::FAIL_ALREADY_DEAD;
return true;
}
unsigned char cDefenderNum = attackNode.m_wDefenserNum > AtNode::MAX_DEFENDER_NUM ?
AtNode::MAX_DEFENDER_NUM : attackNode.m_wDefenserNum; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
CAggresiveCreature* lpAggresiveCreature[AtNode::MAX_DEFENDER_NUM] = {0, };
unsigned short wDefenderMPHeal[AtNode::MAX_DEFENDER_NUM] = {0, };
char cTargetType = Skill::Target::ENEMY;
Skill::Target::Type eSkillTargetType = Skill::Target::ENEMY;
// ij<><C4B3><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> cDefenderNum <20><> 0 <20><><EFBFBD><EFBFBD> <20>Ѿ<EFBFBD><D1BE>´<EFBFBD>.
if (0 == cDefenderNum)
{
return Attack(attackType, cDefenderNum, lpAggresiveCreature, attackNode.m_cDefenserJudge, wDefenderMPHeal);
}
// <20>Ҽȿɼ<C8BF><C9BC≯<EFBFBD>
if (0x4000 < attackType.m_wType && attackType.m_wType < 0x5000)
{
const Skill::ProtoType* pThisSkill = CSkillMgr::GetInstance().GetSkillProtoType(attackType.m_wType);
if (0 == pThisSkill)
{
ERRLOG2(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>. Skill ID:0x%04x", m_dwCID, attackType.m_wType);
return false;
}
const unsigned short wLockCount = GetSkillLockCount(attackType.m_wType);
if (wLockCount < 0 || wLockCount >= CSkillMgr::MAX_SKILL_LOCKCOUNT)
{
ERRLOG3(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. SkillType : 0x%04x, LockCount : %d",
m_dwCID, attackType.m_wType, wLockCount);
return false;
}
eSkillTargetType = pThisSkill[attackType.m_cSkillLockCount].m_eTargetType;
cTargetType = Skill::Target::FRIEND;
}
else if (0 != (attackType.m_wType & AtType::SKILL_BIT))
{
const Skill::ProtoType* pThisSkill = CSkillMgr::GetInstance().GetSkillProtoType(attackType.m_wType);
if (0 == pThisSkill)
{
ERRLOG2(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>. Skill ID:0x%04x", m_dwCID, attackType.m_wType);
return false;
}
unsigned short wLockCount = GetSkillLockCount(attackType.m_wType);
// <20>Դ<EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ʾƵ<CABE> <20><><EFBFBD><EFBFBD><EBB0A1><EFBFBD>ϴ<EFBFBD>.
if(0x9E00 < attackType.m_wType && attackType.m_wType <= 0x9EFF)
{
wLockCount = attackType.m_cSkillLockCount;
}
if (wLockCount < 0 || wLockCount >= CSkillMgr::MAX_SKILL_LOCKCOUNT)
{
ERRLOG3(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. SkillType : 0x%04x, LockCount : %d",
m_dwCID, attackType.m_wType, wLockCount);
return false;
}
if (0 == pThisSkill[wLockCount].m_fMaxRange && 0 == pThisSkill[attackType.m_cSkillLockCount].m_fEffectExtent)
{
if (m_dwCID != attackNode.m_dwDefenser[0])
{
ERRLOG2(g_Log, "CID:0x%08x <20>ڱ<EFBFBD><DAB1>ڽſ<DABD><C5BF>Ը<EFBFBD> <20><> <20><> <20>ִ<EFBFBD> <20><>ų<EFBFBD>Դϴ<D4B4>. SkillID:0x%04x",
m_dwCID, attackType.m_wType);
return false;
}
}
// <20><>ų <20>Ÿ<EFBFBD> üũ
CAggresiveCreature* lpTargetCreature = 0;
// Target Creature <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (0 != GetMapIndex())
{
// Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
Creature::CreatureType eCreatureType = Creature::GetCreatureType(attackNode.m_dwDefenser[0]);
if (Creature::CT_MONSTER == eCreatureType ||
Creature::CT_SUMMON == eCreatureType ||
Creature::CT_STRUCT == eCreatureType)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(GetMapIndex());
if (0 != lpVirtualArea)
{
CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager();
if (0 != lpVirtualMonsterMgr)
{
lpTargetCreature = lpVirtualMonsterMgr->GetAggresiveCreature(attackNode.m_dwDefenser[0]);
}
}
}
else
{
lpTargetCreature = CCreatureManager::GetInstance().GetAggresiveCreature(attackNode.m_dwDefenser[0]);
if (0 != lpTargetCreature)
{
if (lpTargetCreature->GetMapIndex() != GetMapIndex())
{
lpTargetCreature = 0;
}
}
}
}
else
{
lpTargetCreature = CCreatureManager::GetInstance().GetAggresiveCreature(attackNode.m_dwDefenser[0]);
}
// Target Creature ó<><C3B3><EFBFBD>ϱ<EFBFBD>
if (0 != lpTargetCreature)
{
float fSquareTargetDistance = (m_CurrentPos.m_fPointX - lpTargetCreature->GetCurrentPos().m_fPointX) *
(m_CurrentPos.m_fPointX - lpTargetCreature->GetCurrentPos().m_fPointX) +
(m_CurrentPos.m_fPointZ - lpTargetCreature->GetCurrentPos().m_fPointZ) *
(m_CurrentPos.m_fPointZ - lpTargetCreature->GetCurrentPos().m_fPointZ);
float fSquareEffectDistance = (pThisSkill[wLockCount].m_fMaxRange + Skill::ERROR_OF_DISTANCE) *
(pThisSkill[wLockCount].m_fMaxRange + Skill::ERROR_OF_DISTANCE);
if (fSquareTargetDistance > fSquareEffectDistance)
{
wError = PktAtAck::FAIL_TOO_FAR;
return false;
}
}
if (pThisSkill[attackType.m_cSkillLockCount].m_eTargetType == Skill::Target::FRIEND ||
pThisSkill[attackType.m_cSkillLockCount].m_eTargetType == Skill::Target::DEAD_FRIEND ||
pThisSkill[attackType.m_cSkillLockCount].m_eTargetType == Skill::Target::FRIEND_EXCEPT_SELF ||
pThisSkill[attackType.m_cSkillLockCount].m_eTargetType == Skill::Target::FRIEND_OBJECT ||
pThisSkill[attackType.m_cSkillLockCount].m_eTargetType == Skill::Target::PARTY ||
pThisSkill[attackType.m_cSkillLockCount].m_eTargetType == Skill::Target::SUMMON)
{
eSkillTargetType = pThisSkill[attackType.m_cSkillLockCount].m_eTargetType;
cTargetType = Skill::Target::FRIEND;
}
}
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ѱ<EFBFBD><D1B0><EFBFBD> Ÿ<>ٵ<EFBFBD><D9B5><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ)
for (unsigned char cDefender = 0; cDefender < cDefenderNum; ++cDefender)
{
// Target Creature <20><><EFBFBD><EFBFBD>
CAggresiveCreature* lpCreature = 0;
if (0 != GetMapIndex())
{
Creature::CreatureType eCreatureType = Creature::GetCreatureType(attackNode.m_dwDefenser[cDefender]);
if (Creature::CT_MONSTER == eCreatureType ||
Creature::CT_SUMMON == eCreatureType ||
Creature::CT_STRUCT == eCreatureType)
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(GetMapIndex());
if (0 != lpVirtualArea)
{
CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager();
if (0 != lpVirtualMonsterMgr)
{
lpCreature = lpVirtualMonsterMgr->GetAggresiveCreature(attackNode.m_dwDefenser[cDefender]);
}
}
}
else
{
lpCreature = CCreatureManager::GetInstance().GetAggresiveCreature(attackNode.m_dwDefenser[cDefender]);
if (lpCreature && lpCreature->GetMapIndex() != GetMapIndex())
{
lpCreature = 0;
}
}
}
else
{
lpCreature = CCreatureManager::GetInstance().GetAggresiveCreature(attackNode.m_dwDefenser[cDefender]);
}
if (0 != lpCreature)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(-_-)
if (Skill::Target::FRIEND == cTargetType)
{
if (Creature::CT_PC == Creature::GetCreatureType(lpCreature->GetCID()))
{
CCharacter *lpCharacter = reinterpret_cast<CCharacter *>(lpCreature);
if (true == lpCharacter->GetEnchantInfo().GetFlag(Skill::SpellID::Hide))
{
continue;
}
if (false == lpCharacter->IsPeaceMode() && true == IsPeaceMode())
{
wError = PktAtAck::FAIL_PEACE_TO_WAR;
return false;
}
if (lpCharacter->GetCellPos().m_lpCell)
{
if (lpCharacter->GetCellPos().m_lpCell->IsDetectionCell() &&
Skill::IsStealthSkill(attackType.m_wType))
{
wError = PktAtAck::FAIL_NOT_STEALTH;
return false;
}
}
}
else if (Creature::CT_SIEGE_OBJECT == Creature::GetCreatureType(lpCreature->GetCID()))
{
wError = PktAtAck::FAIL_TO_SIEGE_OBJECT;
return false;
}
else
{
CMonster *lpMonster = reinterpret_cast<CMonster *>(lpCreature);
if (lpMonster->GetPattern() == MonsterInfo::PATTERN_STRUCTURE) { continue; }
}
EnemyCheck::EnemyType eEnemyType = IsEnemy(lpCreature);
switch (eSkillTargetType)
{
case Skill::Target::FRIEND:
case Skill::Target::FRIEND_EXCEPT_SELF:
case Skill::Target::DEAD_FRIEND:
{
if (EnemyCheck::EC_FRIEND == eEnemyType)
{
lpAggresiveCreature[cDefender] = lpCreature;
}
}
break;
case Skill::Target::PARTY:
{
if (EnemyCheck::EC_FRIEND == eEnemyType)
{
if (NULL != GetParty() &&
NULL != lpCreature->GetParty() &&
GetParty()->GetUID() == lpCreature->GetParty()->GetUID())
{
lpAggresiveCreature[cDefender] = lpCreature;
}
else if (GetGID() == lpCreature->GetGID())
{
if (NULL == GetParty() ||
(NULL != GetParty() && NULL == reinterpret_cast<CCharacterParty* >(GetParty())->GetHostileParty()))
{
// Vincent : <20><><EFBFBD><20><> <20><>Ʋ <20><><EFBFBD>϶<EFBFBD><CFB6><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
// if ( <20><><EFBFBD><20><> <20><>Ʋ <20><> )
lpAggresiveCreature[cDefender] = lpCreature;
}
}
}
}
break;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><>¥ <20><><EFBFBD><EFBFBD>)
else
{
// <20>ڱ⸦ <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
// (<28><> <20><><EFBFBD><EFBFBD> this<69><73> MultiAttack() <20>Լ<EFBFBD><D4BC><EFBFBD> Ÿ<>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD> <20>ݴϴ<DDB4>.)
if (EnemyCheck::EC_ENEMY == IsEnemy(lpCreature) || lpCreature == this)
{
lpAggresiveCreature[cDefender] = lpCreature;
}
}
}
}
if (0 != (attackType.m_wType & AtType::SKILL_BIT))
{
if (0 == cDefenderNum || 0 == lpAggresiveCreature[0])
{
return Attack(attackType, cDefenderNum, lpAggresiveCreature, attackNode.m_cDefenserJudge, wDefenderMPHeal);
}
const Skill::ProtoType* pSkillProtoType = CSkillMgr::GetInstance().GetSkillProtoType(attackType.m_wType);
if (0 == pSkillProtoType)
{
ERRLOG2(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>. Skill ID:0x%04x", m_dwCID, attackType.m_wType);
return false;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
if (0 != pSkillProtoType[attackType.m_cSkillLockCount].m_fEffectExtent)
{
if (Skill::Target::PARTY == pSkillProtoType[attackType.m_cSkillLockCount].m_eTargetType)
{
CParty* lpParty = lpAggresiveCreature[0]->GetParty();
if (0 != lpParty)
{
return lpParty->Attack(attackType, lpAggresiveCreature, attackNode.m_cDefenserJudge,
this, pSkillProtoType[attackType.m_cSkillLockCount].m_fEffectExtent, cTargetType);
}
}
else
{
return MultiAttack(attackType, cDefenderNum, lpAggresiveCreature, attackNode.m_cDefenserJudge,
lpAggresiveCreature[0]->GetCurrentPos(), 0, pSkillProtoType[attackType.m_cSkillLockCount].m_fEffectExtent,
Math::Const::PI * 2, cTargetType);
}
}
}
return Attack(attackType, cDefenderNum, lpAggresiveCreature, attackNode.m_cDefenserJudge, wDefenderMPHeal);
}
bool CCharacter::Attack(AtType attackType, unsigned char cDefenderNum,
CAggresiveCreature** ppDefenders, unsigned char* cDefenserJudges, unsigned short* wDefenderMPHeal)
{
if (0 == (attackType.m_wType & AtType::SKILL_BIT) && 0 == cDefenderNum)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD>ų<EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ݵ<EFBFBD><DDB5><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.");
return false;
}
bool bBrokenCounter = true;
bool bBrokenStealth = true;
bool bCheckDeadTarget = true;
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
if (0 != (attackType.m_wType & AtType::SKILL_BIT))
{
const Skill::ProtoType* pSkillProtoType = CSkillMgr::GetInstance().GetSkillProtoType(attackType.m_wType);
if (0 == pSkillProtoType)
{
ERRLOG2(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD><CCB5>Դϴ<D4B4>. Skill ID:0x%04x", m_dwCID, attackType.m_wType);
return false;
}
// æƮ <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD>ð<EFBFBD> <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (Skill::Type::CHANT == pSkillProtoType->m_eSkillType)
{
bBrokenCounter = false;
bBrokenStealth = false;
}
else
{
// ī<><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><><C4AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
if (0x8605 == attackType.m_wType)
{
bBrokenCounter = false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD>ڽ<EFBFBD>, ij<><C4B3><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>, <20>ϵ齺<CFB5><E9BDBA>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>, <20><> <20><>)
if (0x8704 == attackType.m_wType || 0x8805 == attackType.m_wType ||
0x9504 == attackType.m_wType || 0x9804 == attackType.m_wType ||
0x8205 == attackType.m_wType || 0x9805 == attackType.m_wType ||
0x8707 == attackType.m_wType)
{
bBrokenStealth = false;
}
// Ȯ<><C8AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD>(<28>麻, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ)
//if (0x8702 == attackType.m_wType)
//{
// CAggresiveCreature* lpMySelf = reinterpret_cast<CAggresiveCreature*>(CCreatureManager::GetInstance().GetCreature(m_dwCID));
// if (4 == lpMySelf->GetSkillLockCount(0x8704))
// {
// unsigned char cSuccessRate = static_cast<unsigned char>(20 + (attackType.m_cSkillLevel * 5));
// if (cSuccessRate > Math::Random::ComplexRandom(100))
// {
// bBrokenStealth = false;
// }
// }
//}
//if (0x9802 == attackType.m_wType)
//{
// CAggresiveCreature* lpMySelf = reinterpret_cast<CAggresiveCreature*>(CCreatureManager::GetInstance().GetCreature(m_dwCID));
// if (4 == lpMySelf->GetSkillLockCount(0x9804))
// {
// unsigned char cSuccessRate = static_cast<unsigned char>(20 + (attackType.m_cSkillLevel * 5));
// if (cSuccessRate > Math::Random::ComplexRandom(100))
// {
// bBrokenStealth = false;
// }
// }
//}
if (0x8702 == attackType.m_wType || 0x9802 == attackType.m_wType)
{
CSpell* pSpell = m_SpellMgr.GetAffectedInfo().GetSpell(Skill::SpellID::Stealth);
if (NULL != pSpell)
{
if (4 <= pSpell->GetSkillLockCount())
{
unsigned char cSuccessRate = 20 + (pSpell->GetSkillLevel() * 5);
if (cSuccessRate > Math::Random::ComplexRandom(100))
{
bBrokenStealth = false;
}
}
}
}
}
// <20><><EFBFBD><EFBFBD> Ÿ<>ٿ<EFBFBD><D9BF><EFBFBD> <20><> <20><> <20>ִ<EFBFBD> <20><>ų
if (Skill::Target::DEAD_FRIEND == pSkillProtoType->m_eTargetType ||
Skill::Target::DEAD_ENEMY == pSkillProtoType->m_eTargetType)
{
bCheckDeadTarget = false;
}
}
unsigned char cOffencerJudge = 0;
unsigned short wOffencerMPHeal = 0;
unsigned short wOffencerPrevHP = GetStatus().m_nNowHP;
unsigned short wOffencerPrevMP = GetStatus().m_nNowMP;
unsigned short wError = PktAtAck::NO_SERVER_ERR;
const int MAX_BUFFER = sizeof(PktAtAck) + AtNode::MAX_DEFENDER_NUM * sizeof(DefenserNode);
char szBuffer[MAX_BUFFER];
PktAtAck* lpPktAtAck = reinterpret_cast<PktAtAck*>(szBuffer);
DefenserNode* lpDefenserNode = reinterpret_cast<DefenserNode*>(lpPktAtAck + 1);
m_cConsumeMPCount = std::min(cDefenderNum, unsigned char(AtNode::MAX_MONSTER_DEFENDER_NUM));
unsigned char nMonsterDefenderNum = 0;
unsigned char cDefender = 0;
unsigned char cIndex = 0;
for (; cIndex < cDefenderNum; ++cIndex)
{
// MP <20>Ҹ<EFBFBD> Ÿ<>ֱ̹<CCB9><D6B1><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> MP <20>Ҹ<EFBFBD>)
--m_cConsumeMPCount;
if (0 == ppDefenders[cIndex])
{
continue;
}
if (true == bCheckDeadTarget && 0 == ppDefenders[cIndex]->GetStatus().m_nNowHP)
{
continue;
}
// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> ij<><C4B3><EFBFBD>Ϳʹ<CDBF> <20><><EFBFBD><EFBFBD> ó<><C3B3>)
Creature::CreatureType eCreatureType = Creature::GetCreatureType(ppDefenders[cIndex]->GetCID());
if (Creature::CT_MONSTER == eCreatureType ||
Creature::CT_SUMMON == eCreatureType ||
Creature::CT_STRUCT == eCreatureType)
{
nMonsterDefenderNum++;
if (nMonsterDefenderNum > AtNode::MAX_MONSTER_DEFENDER_NUM)
{
continue;
}
}
// ij<><C4B3><EFBFBD><EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD>ݽ<EFBFBD> <20>Ÿ<EFBFBD> üũ
if (0 == (attackType.m_wType & AtType::SKILL_BIT))
{
const Position& targetPos = ppDefenders[cIndex]->GetCurrentPos();
float fSquareTargetDistance =
(m_CurrentPos.m_fPointX - targetPos.m_fPointX) * (m_CurrentPos.m_fPointX - targetPos.m_fPointX) +
(m_CurrentPos.m_fPointZ - targetPos.m_fPointZ) * (m_CurrentPos.m_fPointZ - targetPos.m_fPointZ);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (AtType::RIGHT_MELEE == attackType.m_wType || AtType::LEFT_MELEE == attackType.m_wType)
{
if (fSquareTargetDistance > MELEE_ATTACK_RANGE * MELEE_ATTACK_RANGE)
{
// edith 2008.07.11 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD>.
// ERRLOG2(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20>ָ<EFBFBD> <20>ִ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20>մϴ<D5B4>. <20>Ÿ<EFBFBD>:%.2f(m)",
// m_dwCID, fSquareTargetDistance);
continue;
}
}
// <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>
else if (AtType::BOW == attackType.m_wType || AtType::CROSSBOW == attackType.m_wType)
{
if (fSquareTargetDistance > RANGE_ATTACK_RANGE * RANGE_ATTACK_RANGE)
{
ERRLOG2(g_Log, "CID:%10u <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʹ<EFBFBD> <20>ָ<EFBFBD> <20>ִ<EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20>մϴ<D5B4>. <20>Ÿ<EFBFBD>:%.2f(m)",
m_dwCID, fSquareTargetDistance);
continue;
}
}
}
// TODO : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽô<DDBD>.
cDefenserJudges[cDefender] = ClientConstants::Judge_Front;
wDefenderMPHeal[cDefender] = 0;
const unsigned short nPrevHP = ppDefenders[cIndex]->GetStatus().m_nNowHP;
const unsigned short nPrevMP = ppDefenders[cIndex]->GetStatus().m_nNowMP;
const unsigned short wPrevAttackerHP = m_CreatureStatus.m_nNowHP;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݿ<EFBFBD>
lpDefenserNode[cDefender].m_wDamage = ppDefenders[cIndex]->ApplyDamage(attackType, this,
cOffencerJudge, cDefenserJudges[cDefender], wOffencerMPHeal, wDefenderMPHeal[cDefender], wError);
const unsigned short nNowHP = ppDefenders[cIndex]->GetStatus().m_nNowHP;
const unsigned short nNowMP = ppDefenders[cIndex]->GetStatus().m_nNowMP;
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20>ڻ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (0 == m_CreatureStatus.m_nNowHP)
{
m_CreatureStatus.m_nNowHP = wPrevAttackerHP;
wError = PktAtAck::FAIL_SUICIDE;
break;
}
else
{
if (Creature::CT_PC == Creature::GetCreatureType(ppDefenders[cIndex]->GetCID()))
{
CCharacter* lpDefendCharacter = (CCharacter *)ppDefenders[cIndex];
CMonster* lpSummonee = lpDefendCharacter->GetSummonee();
if (0 != lpSummonee)
{
lpSummonee->GuardMe(this, lpDefenserNode[cDefender].m_wDamage);
}
if(ClientConstants::Judge_Chant == cDefenserJudges[cDefender] && lpDefenserNode[cDefender].m_wDamage == 0)
{
// edith 2009.06.20 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> æƮ<C3A6><C6AE><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// æƮ <20><>ų<EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<>϶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ް<EFBFBD><DEB0><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
}
else
{
lpDefendCharacter->CalculateEquipDurability((ClientConstants::Judge_Guard == cDefenserJudges[cDefender]) ?
AtType::GUARD : AtType::DEFENCE);
}
CGameClientDispatch* lpDispatch = lpDefendCharacter->GetDispatcher();
if (0 != lpDispatch)
{
GameClientSendPacket::SendCharAttacked(lpDispatch->GetSendStream(), this, lpDefendCharacter,
attackType, m_MotionInfo.m_fDirection, lpDefenserNode[cDefender].m_wDamage, cDefenserJudges[cDefender],
wDefenderMPHeal[cDefender], PktBase::NO_SERVER_ERR);
}
}
// <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpDefenserNode[cDefender].m_dwCharID = ppDefenders[cIndex]->GetCID();
lpDefenserNode[cDefender].m_sCurrHP = nNowHP;
lpDefenserNode[cDefender].m_sCurrMP = nNowMP;
lpDefenserNode[cDefender].m_wMaxHP = ppDefenders[cIndex]->GetStatus().m_StatusInfo.m_nMaxHP;
lpDefenserNode[cDefender].m_wMaxMP = ppDefenders[cIndex]->GetStatus().m_StatusInfo.m_nMaxMP;
lpDefenserNode[cDefender].m_wMPHeal = wDefenderMPHeal[cDefender];
lpDefenserNode[cDefender].m_cJudge = cDefenserJudges[cDefender];
}
++cDefender;
}
// --------------------------------------------------------------------------------------
// <20><><EFBFBD>ݽ<EFBFBD> Ǯ<><C7AE><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE>
m_SpellMgr.GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::Invincible);
if (true == bBrokenCounter)
{
m_SpellMgr.GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::CounterAttack);
}
if (true == bBrokenStealth)
{
CSpell* pSpell = m_SpellMgr.GetAffectedInfo().GetSpell(Skill::SpellID::Stealth);
if (NULL != pSpell)
{
if (4 <= pSpell->GetSkillLockCount())
{
m_SpellMgr.GetCastingInfo().ClearChant();;
}
}
m_SpellMgr.GetAffectedInfo().RemoveEnchantBySpellType(Skill::SpellID::Stealth);
}
// --------------------------------------------------------------------------------------
if (0 != (attackType.m_wType & AtType::SKILL_BIT))
{
if (0 == cDefender)
{
Skill::CFunctions::ConsumeMP(attackType, this, 0);
}
}
lpPktAtAck->m_dwCharID = m_dwCID;
lpPktAtAck->m_AtType = attackType;
lpPktAtAck->m_wHP = m_CreatureStatus.m_nNowHP;
lpPktAtAck->m_wMP = m_CreatureStatus.m_nNowMP;
lpPktAtAck->m_wMPHeal = wOffencerMPHeal;
lpPktAtAck->m_cJudge = cOffencerJudge;
lpPktAtAck->m_cDefenserNum = cDefender;
if (0 != m_lpGameClientDispatch)
{
CSendStream& SendStream = m_lpGameClientDispatch->GetSendStream();
if (true == SendStream.WrapCompress(
szBuffer, sizeof(PktAtAck) + cDefender * sizeof(DefenserNode), CmdCharAttack, 0, wError) &&
PktBase::NO_SERVER_ERR == wError)
{
CCell* lpCell = GetCellPos().m_lpCell;
if (0 != lpCell)
{
lpCell->SendAttackInfo(m_dwCID, attackType, cDefender, lpDefenserNode);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AttackInfo <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if (ClientConstants::Judge_Heal == cOffencerJudge || ClientConstants::Judge_ManaHeal == cOffencerJudge)
{
if (0 != lpCell)
{
DefenserNode node;
node.m_dwCharID = m_dwCID;
node.m_wMaxHP = GetStatus().m_StatusInfo.m_nMaxHP;
node.m_wMaxMP = GetStatus().m_StatusInfo.m_nMaxMP;
node.m_sCurrHP = GetStatus().m_nNowHP;
node.m_sCurrMP = GetStatus().m_nNowMP;
node.m_wMPHeal = wOffencerMPHeal;
node.m_wDamage = 0;
node.m_cJudge = cOffencerJudge;
if (ClientConstants::Judge_Heal == cOffencerJudge && node.m_sCurrHP > wOffencerPrevHP)
{
node.m_wDamage = node.m_sCurrHP - wOffencerPrevHP;
}
else if (ClientConstants::Judge_ManaHeal == cOffencerJudge)
{
node.m_wDamage = wOffencerMPHeal;
}
lpCell->SendAttackInfo(m_dwCID, attackType, 1, &node);
}
}
return true;
}
}
return false;
}
bool CCharacter::Dead(CAggresiveCreature* pOffencer)
{
if (0 != m_lpSummonee)
{
m_lpSummonee->Dead(0);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>̾<EFBFBD><CCBE>ٸ<EFBFBD>... <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
if (0 != m_dwProtectGateCID)
{
CCastleGate* lpGate = reinterpret_cast<CCastleGate*>( CSiegeObjectMgr::GetInstance().GetSiegeObject(m_dwProtectGateCID) );
if (lpGate)
{
lpGate->DeleteProtectGate(this);
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGameClientDispatch* lpDispatch = GetDispatcher();
if (0 != lpDispatch)
{
GameClientSendPacket::SendCharCastleCmd(lpDispatch->GetSendStream(), lpGate->GetCastleID(),
lpGate->GetCID(), 0, 0,
PktCastleCmd::CASTLE_GATE_PROTECT_CANCEL,
PktCastleCmd::NO_SERVER_ERR);
}
}
}
if (0 != pOffencer)
{
if (0 != pOffencer->GetMapIndex())
{
VirtualArea::CVirtualArea* lpVirtualArea = VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(pOffencer->GetMapIndex());
if (lpVirtualArea)
{
CVirtualMonsterMgr* lpVirtualMonsterMgr = lpVirtualArea->GetMonsterManager();
if (lpVirtualMonsterMgr && true == lpVirtualMonsterMgr->IsSummonee(pOffencer->GetCID()))
{
CSummonMonster* lpSummonee = reinterpret_cast<CSummonMonster *>(pOffencer);
pOffencer = lpSummonee->GetMaster();
}
}
}
else
{
if (true == CCreatureManager::GetInstance().IsSummonee(pOffencer->GetCID()))
{
CSummonMonster* lpSummonee = reinterpret_cast<CSummonMonster *>(pOffencer);
pOffencer = lpSummonee->GetMaster();
}
}
}
GAMELOG::ERRType eReturnCode = 0;
__int64 dwPrevExp = m_CreatureStatus.m_nExp;
m_FightInfo.m_nRestoreExp = 0;
if (0 != pOffencer)
{
switch (Creature::GetCreatureType(pOffencer->GetCID()))
{
case Creature::CT_MONSTER:
case Creature::CT_STRUCT:
m_eLastDeadType = DEAD_BY_MONSTER;
break;
case Creature::CT_PC:
case Creature::CT_SUMMON:
m_eLastDeadType = DEAD_BY_CHARACTER;
if (EnemyCheck::EC_ENEMY == IsEnemy(pOffencer))
{
CalculateFame(reinterpret_cast<CCharacter *>(pOffencer));
// <20><>Ʋ <20>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Flag <20><><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD><EFBFBD>)
if (0 != pOffencer && pOffencer->GetMapIndex() != 0)
{
CCharacter* lpOffencerChar = reinterpret_cast<CCharacter*>(pOffencer);
if (GetRace() != lpOffencerChar->GetRace())
{
VirtualArea::CVirtualArea* lpVirtualArea =
VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(pOffencer->GetMapIndex());
if (0 != lpVirtualArea && lpVirtualArea->GetVirtualType() == VirtualArea::BGSERVERMAP)
{
VirtualArea::CBGServerMap* lpBGServerMap = reinterpret_cast<VirtualArea::CBGServerMap*>(lpVirtualArea);
if (VirtualArea::FRAG == lpBGServerMap->GetMapType())
{
lpBGServerMap->KillChar(GetCID(), lpOffencerChar);
// <20>α<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DETLOG10(g_Log, "Battle Server Log :: (Channel : %d, %s) - "
"CID : 0x%08x ij<><C4B3><EFBFBD><EFBFBD>(%s, %s)<29><> CID : 0x%08x ij<><C4B3><EFBFBD><EFBFBD>(%s, %s)<29><> <20>׿<EFBFBD><D7BF><EFBFBD><EFBFBD>ϴ<EFBFBD>. (<28><><EFBFBD><EFBFBD> Score - HM: %d AK: %d)",
(lpBGServerMap->GetMapIndex() & ~VirtualArea::BGSERVERMAP), lpBGServerMap->GetMapTypeName(),
lpOffencerChar->GetCID(), lpOffencerChar->GetCharacterName(),
(lpOffencerChar->GetRace() == CClass::HUMAN) ? "HUMAN" : "AKHAN",
GetCID(), GetCharacterName(),
(GetRace() == CClass::HUMAN) ? "HUMAN" : "AKHAN",
lpBGServerMap->GetMapInfo().m_wScore[CClass::HUMAN],
lpBGServerMap->GetMapInfo().m_wScore[CClass::AKHAN]);
}
}
}
}
}
break;
}
}
else
{
m_eLastDeadType = DEAD_BY_SUICIDE;
}
DuelInit(PktDuC::DUC_DEAD);
GAMELOG::LogCharDead(*this, dwPrevExp, m_CreatureStatus.m_nExp,
pOffencer, m_CreatureStatus.m_nLevel, eReturnCode);
// ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
const SPELL spell = m_SpellMgr.GetAffectedInfo().GetSpellInfo(TRUE);
SetSpell(spell);
SetDead(TRUE);
m_SpellMgr.GetAffectedInfo().Disenchant(Skill::SpellType::NONE,
Skill::SpellTarget::ALL_ENCHANT, Skill::Disenchant::DEAD, 1, Skill::Disenchant::INFINITE_NUM);
m_SpellMgr.GetAffectedInfo().Disenchant(Skill::SpellType::ETERNAL_SPELL,
Skill::SpellTarget::ALL_ENCHANT, Skill::Disenchant::NONE, 1, Skill::Disenchant::INFINITE_NUM);
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æ<EFBFBD><C3A6> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
m_SpellMgr.GetCastingInfo().ClearEnchant();
m_SpellMgr.GetCastingInfo().ClearChant();
// <20>̺κ<CCBA><CEBA><EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20><>ų<EFBFBD><C5B3> <20><>æƮ <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD>.
// CAggresiveCreature::Dead(pOffencer);
if (0 != GetParty())
{
// <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
GameClientSendPacket::SendCharDeadToParty(
this, pOffencer, PktDeadInfo::DEAD);
}
return (0 == eReturnCode);
}
void CCharacter::SaveSpell(BOOL bDead)
{
// ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
const SPELL spell = m_SpellMgr.GetAffectedInfo().GetSpellInfo(bDead);
SetSpell(spell);
}
bool CCharacter::Respawn(unsigned char cType, const Position& Pos)
{
Position newPos;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20>ƴѵ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϸ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
if(!IsDead())
{
// ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
const SPELL spell = m_SpellMgr.GetAffectedInfo().GetSpellInfo();
SetSpell(spell);
}
SetDead(FALSE);
// edith 2009.08.26 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD><C8AD>.
// <20>̷<EFBFBD><CCB7><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20>ʱ<EFBFBD>ȭ <20>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
SetRespawnTownID(0);
if (0 == Pos.m_fPointX && 0 == Pos.m_fPointY && 0 == Pos.m_fPointZ)
{
newPos = CCharRespawnMgr::GetInstance().GetDefaultRespawnPos(GetNation());
m_DBData.m_Pos.LastPoint.fPointX = newPos.m_fPointX;
m_DBData.m_Pos.LastPoint.fPointY = newPos.m_fPointY;
m_DBData.m_Pos.LastPoint.fPointZ = newPos.m_fPointZ;
}
else
{
newPos = Pos;
}
if (0 == CCellManager::GetInstance().GetCell(m_CellPos.m_wMapIndex, Pos.PositionToPOS()))
{
ERRLOG1(g_Log, "CID : 0x%08x, <20><> <20><><EFBFBD><EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. ij<><C4B3><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>ϴ<EFBFBD>.", m_dwCID);
if (0 != GetMapIndex())
{
VirtualArea::CVirtualArea* lpVirtualArea =
VirtualArea::CVirtualAreaMgr::GetInstance().GetVirtualArea(GetMapIndex());
if (lpVirtualArea)
{
m_CurrentPos = lpVirtualArea->GetRespawnPosition(
GetRace(), Math::Random::ComplexRandom( lpVirtualArea->GetMaxRespawnPos() ) );
}
}
else
{
m_CurrentPos = CCharRespawnMgr::GetInstance().GetDefaultRespawnPos(GetNation());
}
m_DBData.m_Pos.LastPoint.fPointX = newPos.m_fPointX;
m_DBData.m_Pos.LastPoint.fPointY = newPos.m_fPointY;
m_DBData.m_Pos.LastPoint.fPointZ = newPos.m_fPointZ;
}
__int64 dwPrevExp = m_CreatureStatus.m_nExp;
// 1. <20><><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>־ Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <20>ٽðǴ<C3B0>.
m_SpellMgr.GetAffectedInfo().Disenchant(Skill::SpellType::NONE,
Skill::SpellTarget::ALL_ENCHANT, Skill::Disenchant::NONE, 1, Skill::Disenchant::INFINITE_NUM);
m_SpellMgr.GetAffectedInfo().Disenchant(Skill::SpellType::ETERNAL_SPELL,
Skill::SpellTarget::ALL_ENCHANT, Skill::Disenchant::NONE, 1, Skill::Disenchant::INFINITE_NUM);
m_SpellMgr.GetCastingInfo().ClearEnchant();
// Chant<6E><74>, <20><><EFBFBD><EFBFBD> <20><> <20><>ų<EFBFBD><C5B3> Disable<6C>Ѵ<EFBFBD>. ( <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20><><EFBFBD><EFBFBD> Disable<6C><65> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>. )
m_SpellMgr.GetCastingInfo().ClearChant();
// edith 2008.06.03 <20><><EFBFBD><EFBFBD> <20><>þƮȿ<C6AE><C8BF>
if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3)
{
bool bAddRealmStatueEnchant = false;
if (true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE))
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>æƮ ȿ<><C8BF><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
if (!CGameTimeMgr::GetInstance().IsRealmWarTime())
{
bAddRealmStatueEnchant = true;
}
}
/*
// edith 2008.07.17 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>.
if (true == CServerSetup::GetInstance().UseContents(GameRYL::SIEGE))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Խ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>æƮ ȿ<><C8BF><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
if (CGameTimeMgr::GetInstance().IsSiegeWarTime())
{
bAddRealmStatueEnchant = false;
}
}
*/
/*
// <20><><EFBFBD><EFBFBD> <20><>æƮ ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><>Ȳ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>....
if (bAddRealmStatueEnchant)
{
// edith 2008.06.03 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 11<31>ð<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
CCreatureManager::GetInstance().AddRealmStatueEnchant(this);
}
*/
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ȿ<><C8BF>.
if (CGameTimeMgr::GetInstance().IsRealmWarTime() &&
(SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3))
{
RealmSkill::RealmInchantAdd(this);
}
}
// edith 2009.06.13 16<31><36> <20><> / 17<31><37> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ð<EFBFBD> <20><><EFBFBD><EFBFBD>
int InvincibleTime = 30;
if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3)
InvincibleTime = 15;
switch (cType)
{
case CCharRespawnMgr::RST_RESURRECTION : // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ
if (0 == m_CreatureStatus.m_nNowHP)
{
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP * RESURRECTION_RECOVERY_PERCENTAGE / 100;
m_CreatureStatus.m_nNowMP = m_CreatureStatus.m_StatusInfo.m_nMaxMP * RESURRECTION_RECOVERY_PERCENTAGE / 100;
m_CreatureStatus.m_nExp += m_FightInfo.m_nRestoreExp;
m_FightInfo.m_nRestoreExp = 0;
}
break;
case CCharRespawnMgr::RST_BATTLE : // <20><>Ʋ <20><><EFBFBD>ѿ<EFBFBD><D1BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
if (0 == m_CreatureStatus.m_nNowHP)
{
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
m_CreatureStatus.m_nNowMP = m_CreatureStatus.m_StatusInfo.m_nMaxMP;
}
if (!CServerSetup::GetInstance().IsBattleGameServer())
{
// 30<33>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD>
Skill::CAddSpell<CInvincibleSpell>(
CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, this,
Skill::SpellType::MAGICAL_SPELL, Skill::SpellID::Invincible, 1, InvincibleTime))(this);
}
break;
case CCharRespawnMgr::RST_TOWN : // <20>װų<D7B0> <20><>Ż <20>̿<EFBFBD><CCBF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ (<28>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (0 == m_CreatureStatus.m_nNowHP)
{
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP * TOWN_RECOVERY_PERCENTAGE / 100;
m_CreatureStatus.m_nNowMP = m_CreatureStatus.m_StatusInfo.m_nMaxMP * TOWN_RECOVERY_PERCENTAGE / 100;
if (!CServerSetup::GetInstance().IsBattleGameServer())
{
// 30<33>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD>
Skill::CAddSpell<CInvincibleSpell>(
CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, this,
Skill::SpellType::MAGICAL_SPELL, Skill::SpellID::Invincible, 1, InvincibleTime))(this);
}
}
break;
case CCharRespawnMgr::RST_FORTRESS : // <20>װų<D7B0> <20><>Ż <20>̿<EFBFBD><CCBF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ
if (0 == m_CreatureStatus.m_nNowHP)
{
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP * FORTRESS_RECOVERY_PERCENTAGE / 100;
m_CreatureStatus.m_nNowMP = m_CreatureStatus.m_StatusInfo.m_nMaxMP * FORTRESS_RECOVERY_PERCENTAGE / 100;
if (!CServerSetup::GetInstance().IsBattleGameServer())
{
// 30<33>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD>
Skill::CAddSpell<CInvincibleSpell>(
CSpell::Spell_Info(Skill::CProcessTable::ProcessInfo::m_NullProtoType, this,
Skill::SpellType::MAGICAL_SPELL, Skill::SpellID::Invincible, 1, InvincibleTime))(this);
}
}
break;
}
// edith 2008.07.08 <20><>Ʋ<EFBFBD>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><E5BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD>..
if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3)
{
// <20><><EFBFBD>߿<EFBFBD> 30<33>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20><><EFBFBD><EFBFBD>.
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
m_CreatureStatus.m_nNowMP = m_CreatureStatus.m_StatusInfo.m_nMaxMP;
}
if (0 != m_lpGameClientDispatch)
{
CSendStream& SendStream = m_lpGameClientDispatch->GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktRsAck));
if (0 != lpBuffer)
{
PktRsAck* lpPktRsAck = reinterpret_cast<PktRsAck*>(lpBuffer);
lpPktRsAck->m_dwCharID = m_dwCID;
lpPktRsAck->m_Position = newPos.PositionToPOS();
lpPktRsAck->m_wHP = m_CreatureStatus.m_nNowHP;
lpPktRsAck->m_wMP = m_CreatureStatus.m_nNowMP;
lpPktRsAck->m_dlExp = m_CreatureStatus.m_nExp;
lpPktRsAck->m_dwGold = m_DBData.m_Info.Gold;
SendStream.WrapCrypt(sizeof(PktRsAck), CmdCharRespawn, 0, 0);
}
}
// 2. ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD> <20><>æƮ<C3A6><C6AE> <20>ٽðǴ<C3B0>.
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>־ Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>æƮ<C3A6><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <20>ٽðǴ<C3B0>.
const SPELL spell = GetSpell();
m_SpellMgr.SetSpell(spell);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20>ɾ<EFBFBD><C9BE>ش<EFBFBD>.
if(IsRealmWarBuffer())
CCreatureManager::GetInstance().AddRealmStatueEnchant(this);
SetRealmWarBuffer(FALSE);
if (cType != CCharRespawnMgr::RST_RESURRECTION)
{
switch(m_eLastDeadType)
{
case DEAD_BY_NONE: // <20><> <20><> <20><><EFBFBD><EFBFBD>
case DEAD_BY_CHARACTER: // ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
break;
case DEAD_BY_SUICIDE: // <20>ڻ<EFBFBD>
// <20>ڻ<EFBFBD><DABB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CalculateAllEquipDurability(DURABILITY_DECREASE_PERSENT_BY_SUICIDE);
break;
case DEAD_BY_MONSTER: // <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!CServerSetup::GetInstance().GetDeathPenaltyEvent())
{
unsigned char cDecreasePersent = 0;
if(m_AbilityValue[Skill::Type::AB_ENDUR_SHILD] != 0)
cDecreasePersent = DURABILITY_DECREASE_PERSENT_BY_MONSTER*m_AbilityValue[Skill::Type::AB_ENDUR_SHILD]/100;
// <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CalculateAllEquipDurability(DURABILITY_DECREASE_PERSENT_BY_MONSTER-cDecreasePersent);
}
break;
}
}
// <20>ٽ<EFBFBD> <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> NONE<4E><45><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>
m_eLastDeadType = DEAD_BY_NONE;
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD>
GAMELOG::LogCharRespawn(*this, dwPrevExp, m_CreatureStatus.m_nExp, 0);
return true;
}
// <20><>Ʋ <20>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20>Լ<EFBFBD>
bool CCharacter::AutoRespawn()
{
if (SERVER_ID::ZONE3 == CServerSetup::GetInstance().GetServerZone())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
const POS respawnPos[CClass::MAX_RACE] =
{
{ 1403.06f, 18.25f, 1958.41f },
{ 2014.29f, 63.50f, 1648.47f }
};
// <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD>Ų<EFBFBD><C5B2>.
unsigned char cZone = SERVER_ID::NONE;
switch (GetRace())
{
case CClass::HUMAN:
cZone = SERVER_ID::ZONE1;
break;
case CClass::AKHAN:
cZone = SERVER_ID::ZONE2;
break;
default:
ERRLOG2(g_Log, "CID:0x%08x ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. <20><><EFBFBD><EFBFBD>:%d", GetCID(), GetRace());
return false;
}
GetStatus().m_nNowHP = GetStatus().m_StatusInfo.m_nMaxHP;
GetStatus().m_nNowMP = GetStatus().m_StatusInfo.m_nMaxMP;
SetDead(FALSE);
// ä<><C3A4><EFBFBD><EFBFBD> 2<><32> <20>̻<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
// <20><> <20><><EFBFBD><EFBFBD> ä<><C3A4>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><31>η<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. (2004-09-17 by <20>ε<EFBFBD>)
if (false == MoveZone(respawnPos[ GetRace() ], cZone, 0))
{
ERRLOG1(g_Log, "CID:0x%08x <20><>Ʋ<EFBFBD>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> Ż<><20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", GetCID());
return false;
}
return true;
}
return false;
}
bool CCharacter::AttackUsingBow(unsigned short wType)
{
Item::CEquipment* lpEquipment = m_Equipments.GetLeftHand();
if (0 == lpEquipment)
{
return true;
}
switch (wType)
{
case AtType::BOW:
case AtType::CROSSBOW:
{
if (wType == AtType::BOW && lpEquipment->GetItemInfo().m_DetailData.m_cItemType != Item::ItemType::ARROW)
{
return false;
}
if (wType == AtType::CROSSBOW && lpEquipment->GetItemInfo().m_DetailData.m_cItemType != Item::ItemType::BOLT)
{
return false;
}
if (false == UseAmmo(reinterpret_cast<Item::CUseItem *>(lpEquipment)))
{
ERRLOG1(g_Log, "CID:0x%08x ȭ<><C8AD>(<28><>Ʈ) <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
if (0 != m_lpGameClientDispatch)
{
GameClientSendPacket::SendCharEquipDurability(m_lpGameClientDispatch->GetSendStream(), m_dwCID,
lpEquipment->GetPos().m_cIndex, lpEquipment->GetNumOrDurability(), 0, PktBase::NO_SERVER_ERR);
}
} break;
default:
{
if (lpEquipment->GetItemInfo().m_DetailData.m_cItemType == Item::ItemType::ARROW ||
lpEquipment->GetItemInfo().m_DetailData.m_cItemType == Item::ItemType::BOLT)
{
return false;
}
} break;
}
if (0 == lpEquipment->GetNumOrDurability() && true == lpEquipment->IsSet(Item::DetailData::STACKABLE))
{
CalculateStatusData(false);
if (false == m_Equipments.RemoveItem(lpEquipment->GetPos()))
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>񿡼<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
}
}
return true;
}
bool CCharacter::UseAmmo(Item::CUseItem* pUseItem)
{
using namespace Item::ItemType;
// <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> źȯ<C5BA><C8AF><EFBFBD><EFBFBD> üũ
switch (pUseItem->GetItemInfo().m_DetailData.m_cItemType)
{
case ARROW:
{ // ȭ<><C8AD>
Item::CEquipment* pUsingWeapon = m_Equipments.GetRightHand();
if (0 == pUsingWeapon)
{
return false;
}
if (pUsingWeapon->GetItemInfo().m_DetailData.m_cItemType != BOW)
{
return false;
}
pUseItem->SetNumOrDurability(pUseItem->GetNumOrDurability() - 1);
} break;
case BOLT:
{ // <20><>Ʈ
Item::CEquipment* pUsingWeapon = m_Equipments.GetRightHand();
if (0 == pUsingWeapon)
{
return false;
}
if (pUsingWeapon->GetItemInfo().m_DetailData.m_cItemType != CROSSBOW)
{
return false;
}
pUseItem->SetNumOrDurability(pUseItem->GetNumOrDurability() - 1);
} break;
case AMMO:
{ // źȯ
Item::CEquipment* lpSkillArm = m_Equipments.GetLeftHand();
if (0 == lpSkillArm)
{
return false;
}
if (lpSkillArm->GetItemInfo().m_DetailData.m_cItemType != SKILL_A_GUN)
{
return false;
}
} break;
}
return true;
}
bool CCharacter::IsPeaceMode(void)
{
// MichaelBless <20>Ͻ<EFBFBD> <20>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ <20><><EFBFBD><EFBFBD>
if (SERVER_ID::ZONE12 == CServerSetup::GetInstance().GetServerZone())
{
if(GetEnchantInfo().GetFlag(Skill::SpellID::MichaelBless))
return true;
}
/*
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ <20><><EFBFBD><EFBFBD>
if (SERVER_ID::ZONE12 == CServerSetup::GetInstance().GetServerZone())
{
return true;
}
*/
/*
if (true == CServerSetup::GetInstance().UseContents(GameRYL::STONE_BATTLE))
{
// ī<><C4AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> <20><>ȭ <20><><EFBFBD><EFBFBD>
if (SERVER_ID::CAPITAL == CServerSetup::GetInstance().GetServerZone() &&
!CGameTimeMgr::GetInstance().IsGuildWarTime())
{
return true;
}
}
*/
CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(GetGID());
if (NULL != lpGuild)
{
if (Guild::JOIN_WAIT != lpGuild->GetTitle(m_dwCID))
{
return lpGuild->IsPeaceMode();
}
}
return false;
}
char CCharacter::GetEliteBonus(void)
{
EliteBonus::EliteBonusData eliteBonus = CCreatureManager::GetInstance().GetEliteBonus();
char cBonus = eliteBonus.m_cLevel * ((GetRace() == eliteBonus.m_cNation) ? 1 : (-1));
// <20>߷<EFBFBD><DFB7><EFBFBD> <20><>ȣå
const char cServerZone = CServerSetup::GetInstance().GetServerZone();
if ((Creature::KARTERANT == GetNation() && SERVER_ID::ZONE5 == cServerZone) ||
(Creature::MERKADIA == GetNation() && SERVER_ID::ZONE4 == cServerZone))
{
cBonus -= 7;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
cBonus += GetCaste();
if (cBonus > EliteBonus::MAX_BONUS_LEVEL)
{
return EliteBonus::MAX_BONUS_LEVEL;
}
if (cBonus < EliteBonus::MAX_BONUS_LEVEL * (-1))
{
return EliteBonus::MAX_BONUS_LEVEL * (-1);
}
return cBonus;
}
char CCharacter::GetCaste(void)
{
if (m_DBData.m_Info.Fame <= 2000) { return 0; }
if (m_DBData.m_Info.Fame <= 10000) { return 1; }
if (m_DBData.m_Info.Fame <= 25000) { return 2; }
if (m_DBData.m_Info.Fame <= 50000) { return 3; }
if (m_DBData.m_Info.Fame <= 75000) { return 4; }
if (m_DBData.m_Info.Fame <= 100000) { return 5; }
if (m_DBData.m_Info.Fame <= 150000) { return 6; }
if (m_DBData.m_Info.Fame <= 250000) { return 7; }
if (m_DBData.m_Info.Fame <= 500000) { return 8; }
return 9;
}
void CCharacter::CalculateFame(CCharacter* lpWinnerCharacter)
{
CGameClientDispatch* lpDispatch = 0;
CCharacter* lpLoserCharacter = reinterpret_cast<CCharacter *>(this);
unsigned char cWinnerCmd = PktFIAck::FAME_WIN;
unsigned char cLoserCmd = PktFIAck::FAME_LOSE;
// <20>о<EFBFBD><D0BE>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28>̱<EFBFBD><CCB1><EFBFBD> <20><><EFBFBD>ʸ<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PvP<76><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>¡ <20><><EFBFBD><EFBFBD>å<EFBFBD><C3A5> <20><>ȭ<EFBFBD>ȴ<EFBFBD>.)
const unsigned long dwLimitFame = 1000;
if (0 == lpLoserCharacter->GetFame() && dwLimitFame <= lpWinnerCharacter->GetFame())
{
cWinnerCmd = PktFIAck::FAME_WIN_LARGE_GAP;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (true == lpLoserCharacter->GetThreat().SaveEnemy(lpWinnerCharacter->GetCID()))
{
cWinnerCmd = PktFIAck::FAME_WIN_CONTINUE;
cLoserCmd = PktFIAck::FAME_LOSE_CONTINUE;
}
else
{
GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if(lpDBAgentDispatch)
{
CSendStream& SendStream = lpDBAgentDispatch->GetSendStream();
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSaveEnemy));
if(lpBuffer)
{
PktSaveEnemy* lpPktSaveEnemy = reinterpret_cast<PktSaveEnemy*>(lpBuffer);
lpPktSaveEnemy->m_dwCID = m_dwCID;
lpPktSaveEnemy->m_dwAttackedCID = lpWinnerCharacter->GetCID();
lpPktSaveEnemy->m_dwTick = 0;
if(!SendStream.WrapCrypt(sizeof(PktSaveEnemy), CmdSaveEnemy, 0, 0))
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
}
}
}
}
// edith 2009.07.16 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ް<EFBFBD><DEB0>Ѵ<EFBFBD>.
if (SERVER_ID::CAPITAL == CServerSetup::GetInstance().GetServerZone())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0≯<EFBFBD>
if(CGameTimeMgr::GetInstance().IsGuildWarTime())
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
}
else
{
// edith 2008.08.18 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><> <20><>Ÿ <20><>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD>
if(lpWinnerCharacter->GetRace() == lpLoserCharacter->GetRace())
{
cWinnerCmd = PktFIAck::FAME_INFO;
cLoserCmd = PktFIAck::FAME_INFO;
}
}
}
else
{
// edith 2008.08.18 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><> <20><>Ÿ <20><>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD>
if(lpWinnerCharacter->GetRace() == lpLoserCharacter->GetRace())
{
cWinnerCmd = PktFIAck::FAME_INFO;
cLoserCmd = PktFIAck::FAME_INFO;
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (lpLoserCharacter->GetDuelOpponent() == lpWinnerCharacter)
{
cWinnerCmd = PktFIAck::FAME_WIN_DUEL;
cLoserCmd = PktFIAck::FAME_LOSE_DUEL;
}
// <20><><EFBFBD><EFBFBD>Ʋ <20><><EFBFBD><EFBFBD>
CCharacterParty* lpLoserParty = reinterpret_cast<CCharacterParty*>(lpLoserCharacter->GetParty());
CCharacterParty* lpWinnerParty = reinterpret_cast<CCharacterParty*>(lpWinnerCharacter->GetParty());
if (NULL != lpLoserParty && NULL != lpWinnerParty)
{
if (lpLoserParty->GetHostileParty() == lpWinnerParty)
{
cWinnerCmd = PktFIAck::FAME_WIN_DUEL;
cLoserCmd = PktFIAck::FAME_LOSE_DUEL;
}
}
// edith 2009.12.26 <20><><EFBFBD><EFBFBD> 20<32>̻<EFBFBD><CCBB≯<EFBFBD> <20>׾<EFBFBD><D7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>
if (NULL == lpWinnerParty)
{
int iLevelGap = lpWinnerCharacter->GetLevel() - lpLoserCharacter->GetLevel();
if(iLevelGap >= 20)
{
cWinnerCmd = PktFIAck::FAME_WIN_LEVELMIN;
cLoserCmd = PktFIAck::FAME_LOSE_LEVELMIN;
}
}
GAMELOG::ERRType eReturnCode = 0;
// -----------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ģ
if (PktFIAck::FAME_LOSE == cLoserCmd)
{
unsigned long dwPrevFame = lpLoserCharacter->GetFame();
unsigned long lReduceFame = std::min(static_cast<unsigned long>(10), lpLoserCharacter->GetFame());
unsigned long dwNextFame = dwPrevFame - lReduceFame;
lpLoserCharacter->SetFame(dwNextFame);
GAMELOG::LogFameLoseBattle(*lpLoserCharacter, lpWinnerCharacter,
lpLoserParty, dwPrevFame, dwNextFame, eReturnCode);
CCharacterParty* lpLoserParty = reinterpret_cast<CCharacterParty *>(lpLoserCharacter->GetParty());
if (NULL != lpLoserParty)
{
lpLoserParty->SendDivisionFame(lpWinnerCharacter, lpLoserCharacter, cLoserCmd, 0);
}
}
lpDispatch = lpLoserCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharFameInfo(lpDispatch->GetSendStream(), lpLoserCharacter,
lpWinnerCharacter->GetCharacterName(), lpLoserCharacter->GetCharacterName(),
lpWinnerCharacter->GetNation(), static_cast<unsigned char>(lpWinnerCharacter->GetClass()),
cLoserCmd, PktBase::NO_SERVER_ERR);
}
// -----------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ģ
unsigned long dwAcquireAmount = 10;
// <20><>Ƽ<EFBFBD><C6BC> <20>ƴҶ<C6B4>
if (NULL == lpWinnerParty)
{
unsigned long dwPrevFame = 0;
unsigned long dwNextFame = 0;
unsigned long dwPrevMileage = 0;
unsigned long dwNextMileage = 0;
if (PktFIAck::FAME_WIN == cWinnerCmd)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
dwPrevFame = lpWinnerCharacter->GetFame();
unsigned long dwGetFame = std::min(dwAcquireAmount * static_cast<unsigned long>(CServerSetup::GetInstance().GetFameDefault() / 100.0f),
UINT_MAX - lpWinnerCharacter->GetFame());
dwNextFame = dwPrevFame + dwGetFame;
lpWinnerCharacter->SetFame(dwNextFame);
}
if (PktFIAck::FAME_WIN == cWinnerCmd || PktFIAck::FAME_WIN_LEVELMIN == cWinnerCmd )
{
// <20>޴޿<DEB4> <20><><EFBFBD><EFBFBD> ó<><C3B3>
dwPrevMileage = lpWinnerCharacter->GetMileage();
dwNextMileage = dwPrevMileage;
// edith 2009.06.27 <20>޴<EFBFBD><DEB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
if (SERVER_ID::CAPITAL == CServerSetup::GetInstance().GetServerZone())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0≯<EFBFBD>
if (CGameTimeMgr::GetInstance().IsGuildWarTime())
{
unsigned long dwGetMileage = std::min(dwAcquireAmount * static_cast<unsigned long>(CServerSetup::GetInstance().GetMileageDefault() / 100.0f),
UINT_MAX - lpWinnerCharacter->GetMileage());
dwNextMileage = dwPrevMileage + dwGetMileage;
}
}
else if (SERVER_ID::STONE_WAR1 <= CServerSetup::GetInstance().GetServerZone() && CServerSetup::GetInstance().GetServerZone() <= SERVER_ID::STONE_WAR3)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0≯<EFBFBD>
if (CGameTimeMgr::GetInstance().IsRealmWarTime())
{
unsigned long dwGetMileage = std::min(dwAcquireAmount * static_cast<unsigned long>(CServerSetup::GetInstance().GetMileageDefault() / 100.0f),
UINT_MAX - lpWinnerCharacter->GetMileage());
dwNextMileage = dwPrevMileage + dwGetMileage;
}
}
lpWinnerCharacter->SetMileage(dwNextMileage);
GAMELOG::LogFameGetBattle(*lpWinnerCharacter, lpLoserCharacter, lpWinnerParty,
dwPrevFame, dwNextFame, dwPrevMileage, dwNextMileage, eReturnCode);
}
lpDispatch = lpWinnerCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharFameInfo(lpDispatch->GetSendStream(), lpWinnerCharacter,
lpWinnerCharacter->GetCharacterName(), lpLoserCharacter->GetCharacterName(),
lpLoserCharacter->GetNation(), (unsigned char)lpLoserCharacter->GetClass(),
cWinnerCmd, PktBase::NO_SERVER_ERR);
}
}
else
{
// <20><>Ƽ<EFBFBD>϶<EFBFBD>
lpWinnerParty->SendDivisionFame(lpWinnerCharacter, lpLoserCharacter,
cWinnerCmd, static_cast<unsigned char>(dwAcquireAmount));
}
}
void BattleInclination::SetCharData(CCreature& creature, BattleInclination::CharData& charData, bool bSetRideArmsInfo)
{
charData.m_dwCID = creature.GetCID(); // ij<><C4B3><EFBFBD><EFBFBD> CID
charData.m_dwGID = creature.GetGID(); // ij<><C4B3><EFBFBD><EFBFBD> GID
charData.m_dwCastleID = 0; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD>.
charData.m_cNation = creature.GetNation(); // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
charData.m_cSiegeState = 0; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>.
charData.m_cFlags = 0; // <20><>Ÿ <20><><EFBFBD><EFBFBD>
charData.m_cAdminLevel = 0;
charData.m_dwPID = 0;
charData.m_wObjectType = 0;
charData.m_wKind = 0;
charData.m_cCreatureType = Creature::GetCreatureType(creature.GetCID());
charData.m_cRealmWarFlag = 0;
charData.m_cGuildWarFlag = 0;
charData.m_cTacticsFlag = 0;
charData.m_cRide = creature.IsRideArms();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD> GID <20><> 0 <20><> <20><><EFBFBD><EFBFBD>.
Guild::CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild( charData.m_dwGID );
if ( lpGuild )
{
if(Creature::GetCreatureType(charData.m_dwCID)==Creature::CT_PC)
{
CCharacter& character = static_cast<CCharacter&>(creature);
unsigned char cTacticsFlag = character.GetTacticsFlag();
if (Guild::JOIN_WAIT == lpGuild->GetTitle( charData.m_dwCID ))
{
charData.m_dwGID = 0;
}
charData.m_cTacticsFlag = cTacticsFlag;
}
}
CParty* lpParty = creature.GetParty();
if (lpParty)
{
charData.m_dwPID = lpParty->GetUID();
}
charData.SetPeaceMode(creature.IsPeaceMode());
charData.SetSafetyZone(CCellManager::GetInstance().IsSafetyZone(creature.GetCurrentPos()));
charData.SetGODMode(creature.GetEnchantInfo().GetFlag(Skill::SpellID::Invincible));
bool bHasDevelopingCamp, bHasCompleteCamp;
CSiegeObjectMgr::GetInstance().HasCampByGID(charData.m_dwGID, bHasDevelopingCamp, bHasCompleteCamp);
charData.SetHasDevelopingCamp(bHasDevelopingCamp);
charData.SetHasCamp(bHasCompleteCamp);
switch (Creature::GetCreatureType(charData.m_dwCID))
{
case Creature::CT_SIEGE_OBJECT:
{
CSiegeObject& siegeObject = static_cast<CSiegeObject&>(creature);
charData.m_dwGID = siegeObject.GetGID();
charData.SetCastleObject(siegeObject.IsCastleObject());
charData.SetCastleNPC(siegeObject.IsCastleNPC());
charData.m_dwCastleID = siegeObject.GetCastleID();
charData.m_cSiegeState = siegeObject.GetState();
charData.m_wObjectType = siegeObject.GetObjectType();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
charData.m_cGuildWarFlag = Creature::WAR_ON ;
}
break;
case Creature::CT_PC:
{
CCharacter& character = static_cast<CCharacter&>(creature);
charData.m_cAdminLevel = character.GetAdminLevel();
charData.m_cRealmWarFlag = character.GetRealmWarFlag();
charData.m_cGuildWarFlag = character.GetGuildWarFlag();
// <20><><EFBFBD><EFBFBD>Ʋ <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><20><>Ʋ<EFBFBD><C6B2> <20>߰<EFBFBD><DFB0>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>)
if (NULL != character.GetParty())
{
if (NULL != reinterpret_cast<CCharacterParty*>(character.GetParty())->GetHostileParty())
{
charData.SetTeamBattle(true);
}
}
if(bSetRideArmsInfo && character.IsRideArms())
{
CSiegeObject* lpSiegeObject =
CSiegeObjectMgr::GetInstance().GetSiegeObject(character.GetRideArmsCID());
if(lpSiegeObject)
{
charData.m_dwGID = lpSiegeObject->GetGID();
charData.SetCastleObject(lpSiegeObject->IsCastleObject());
charData.SetCastleNPC(lpSiegeObject->IsCastleNPC());
charData.m_dwCastleID = lpSiegeObject->GetCastleID();
charData.m_cSiegeState = lpSiegeObject->GetState();
charData.m_wObjectType = lpSiegeObject->GetObjectType();
}
}
}
break;
case Creature::CT_MONSTER:
case Creature::CT_SUMMON:
case Creature::CT_STRUCT:
{
CMonster& monster = static_cast<CMonster&>(creature);
charData.m_wKind = monster.GetKID();
}
break;
}
}
void BattleInclination::SetRelationData(CCreature& ownerCreature, CCreature& targetCreature,
BattleInclination::RelationData& relationData)
{
relationData.m_cVSFlag = 0;
relationData.m_bHostileGuild = false;
if (Creature::CT_PC == Creature::GetCreatureType(ownerCreature.GetCID()) &&
Creature::CT_PC == Creature::GetCreatureType(targetCreature.GetCID()))
{
CCharacter& ownerCharacter = static_cast<CCharacter&>(ownerCreature);
CCharacter& targetCharacter = static_cast<CCharacter&>(targetCreature);
if (NULL != ownerCharacter.GetDuelOpponent())
{
if (ownerCharacter.GetDuelOpponent()->GetCID() == targetCharacter.GetCID())
{
relationData.m_cVSFlag |= BattleInclination::VS_CHARACTER;
}
}
if (NULL != ownerCharacter.GetParty() && NULL != targetCharacter.GetParty())
{
CCharacterParty* lpHostileParty =
reinterpret_cast<CCharacterParty* >(ownerCharacter.GetParty())->GetHostileParty();
if (NULL != lpHostileParty)
{
if (lpHostileParty->GetUID() == targetCharacter.GetParty()->GetUID())
{
relationData.m_cVSFlag |= BattleInclination::VS_PARTY;
}
}
}
}
// Rodin : <20><><EFBFBD><20><>Ʋ <20><><EFBFBD><EFBFBD>
Guild::CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(ownerCreature.GetGID());
if (NULL != lpGuild)
{
if (true == lpGuild->IsEnemyGuild(targetCreature.GetGID()))
{
relationData.m_bHostileGuild = true;
}
}
lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(targetCreature.GetGID());
if (NULL != lpGuild)
{
if (true == lpGuild->IsEnemyGuild(ownerCreature.GetGID()))
{
relationData.m_bHostileGuild = true;
}
}
}
EnemyCheck::EnemyType CCharacter::IsEnemy(CCreature* lpTarget, unsigned char* lpResult)
{
if (NULL == lpTarget)
{
ERRLOG1(g_Log, "CID:0x%08x <20>Ǿƽĺ<C6BD><C4BA><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_dwCID);
return EnemyCheck::EC_NEUTRAL;
}
BattleInclination::CharData ownerInfo;
BattleInclination::CharData targetInfo;
BattleInclination::SetCharData(*this, ownerInfo);
BattleInclination::SetCharData(*lpTarget, targetInfo);
BattleInclination::RelationData relationInfo;
BattleInclination::SetRelationData(*this, *lpTarget, relationInfo);
unsigned char cResultFromStruct = 0;
unsigned long dwResult = EnemyCheck::CCheckTable::GetInstance().IsEnemyFromStruct(
ownerInfo, targetInfo, relationInfo, cResultFromStruct);
if (NULL != lpResult)
{
*lpResult = cResultFromStruct;
}
return static_cast<EnemyCheck::EnemyType>(dwResult);
}
void CCharacter::SendAttackedToParty(unsigned long dwAttackerID, AtType atType, unsigned short wDamage, unsigned char cDefenserJudge, unsigned short wMPHeal)
{
if (0 != m_pParty)
{
bool bLastSendTimeCheck = true;
if(atType.m_wType & AtType::SKILL_BIT)
{
// (<28>Ϲݰ<CFB9><DDB0><EFBFBD><EFBFBD>̳<EFBFBD> Ÿ<><C5B8> Ÿ<><C5B8><EFBFBD><EFBFBD> Enemy, Melee<65><65> <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20>ð<EFBFBD> üũ)
// Friend, Frexme, Frdead, Party <20>ð<EFBFBD> üũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
const Skill::ProtoType* lpProtoType = CSkillMgr::GetInstance().GetSkillProtoType(atType.m_wType);
if(0 != lpProtoType)
{
switch(lpProtoType[atType.m_cSkillLockCount].m_eTargetType)
{
case Skill::Target::FRIEND:
case Skill::Target::FRIEND_EXCEPT_SELF:
case Skill::Target::DEAD_FRIEND:
case Skill::Target::PARTY:
bLastSendTimeCheck = false;
break;
}
}
}
unsigned long dwCurrentTime = 0;
if(!bLastSendTimeCheck || 500 <= (dwCurrentTime = timeGetTime()) - m_dwLastSendPartyAttackInfoTime)
{
m_dwLastSendPartyAttackInfoTime = dwCurrentTime;
CCharacterParty* lpParty = static_cast<CCharacterParty*>(m_pParty);
if(!lpParty)
{
return;
}
const int MAX_BUFFER = sizeof(PktAtAck) + sizeof(DefenserNode);
char szPacket[MAX_BUFFER];
unsigned short wPacketSize = sizeof(PktAtInfo) + sizeof(DefenserNode);
PktAtInfo* lpPktAtInfo = reinterpret_cast<PktAtInfo*>(szPacket);
DefenserNode* lpDefenserNode = reinterpret_cast<DefenserNode*>(lpPktAtInfo + 1);
lpPktAtInfo->m_dwCharID = dwAttackerID;
lpPktAtInfo->m_AtType = atType;
lpPktAtInfo->m_cDefenserNum = 1;
lpDefenserNode->m_dwCharID = m_dwCID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
lpDefenserNode->m_wMaxHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP; // <20>ִ<EFBFBD> HP
lpDefenserNode->m_sCurrHP = m_CreatureStatus.m_nNowHP; // <20><><EFBFBD><EFBFBD> HP
lpDefenserNode->m_wMaxMP = m_CreatureStatus.m_StatusInfo.m_nMaxMP; // <20>ִ<EFBFBD> MP
lpDefenserNode->m_sCurrMP = m_CreatureStatus.m_nNowMP; // <20><><EFBFBD><EFBFBD> MP
lpDefenserNode->m_wMPHeal = wMPHeal; // MP ȸ<><C8B8><EFBFBD><EFBFBD>
lpDefenserNode->m_wDamage = wDamage; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
lpDefenserNode->m_cJudge = cDefenserJudge; // <20><><EFBFBD><EFBFBD> <20><>
if (PacketWrap::WrapCrypt(szPacket, wPacketSize, CmdCharAttackInfo, 0, 0))
{
// <20>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ָ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
lpParty->SendNotNearCellMember(szPacket, wPacketSize, m_CellPos.m_lpCell, CmdCharAttackInfo);
}
}
}
}
void CCharacter::SkillClear()
{
CAffectedSpell& cAffectedInfo = m_SpellMgr.GetAffectedInfo();
cAffectedInfo.ClearAll();
CCastingSpell& cCastingInfo = m_SpellMgr.GetCastingInfo();
cCastingInfo.ClearAll();
}