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>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,946 @@
#include "stdafx.h"
#include "SiegeObject.h"
#include <Utility/Math/Math.h>
#include <Utility/Setup/ServerSetup.h>
#include <Item/ItemFactory.h>
#include <Network/ClientSocket/ClientConstants.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Dispatch/GameClient/SendCharCastle.h>
#include <Network/Dispatch/GameClient/SendCharAttack.h>
#include <Network/Dispatch/DBAgent/DBAgentDispatch.h>
#include <Network/Dispatch/DBAgent/DBAgentRequest.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Community/Guild/Guild.h>
#include <Community/Guild/GuildMgr.h>
#include <Creature/Siege/SiegeObjectMgr.h>
#include <Creature/Monster/MonsterMgr.h>
#include <Creature/EnemyCheck.h>
#include <Castle/Castle.h>
#include <Castle/CastleMgr.h>
#include <Map/FieldMap/CellManager.h>
#include <Map/DuelMap/DuelCellManager.h>
#include <Skill/SkillTable.h>
#include <Skill/SkillMgr.h>
#include <GameTime/GameTimeConstants.h>
#include <GameTime/GameTimeMgr.h>
CSiegeObject::CSiegeObject(MonsterCreateInfo& MonsterCreate, const CastleObjectInfo& CastleObject)
: CSkillMonster(MonsterCreate), m_dwCampOrCastleID(CastleObject.m_dwCastleID), m_dwOwnerID(CastleObject.m_dwOwnerID),
m_cNation(CastleObject.m_cNation), m_dwGID(0), m_wObjectType(CastleObject.m_wObjectType), m_cState(CastleObject.m_cState),
m_cSubState(CastleObject.m_cSubState), m_cUpgradeStep(CastleObject.m_cUpgradeStep), m_cUpgradeType(CastleObject.m_cUpgradeType),
m_cMaterial(0), m_cSiegeCount(0), m_fDefaultDir(CastleObject.m_fDefaultDir), m_dwRiderCID(0), m_cHPUpdateCount(0),
m_dwBroadCastSize(0), m_dwDeltaSize(0)
{
InitMonster(MonsterCreate.m_Pos);
m_MotionInfo.m_fDirection = m_fDefaultDir;
m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(CastleObject.m_dwHP);
switch (m_wObjectType)
{
case Siege::GUARD: m_wDefaultSearchRange = 32; break;
case Siege::EMBLEM: m_wDefaultSearchRange = 32; break;
}
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD>
m_SerializeSiegeObjectData.PrepareData( *this );
m_SerializeSiegeObjectData.ClearDeltaData();
}
CSiegeObject::CSiegeObject(MonsterCreateInfo& MonsterCreate, unsigned long dwCampID, unsigned long dwGID,
unsigned long dwHP, unsigned short wObjectType, unsigned char cState,
unsigned char cSubState, unsigned char cUpgradeStep, unsigned char cMaterial,
unsigned char cSiegeCount, bool bFullHP)
: CSkillMonster(MonsterCreate), m_dwCampOrCastleID(dwCampID), m_dwOwnerID(0), m_wObjectType(wObjectType),
m_dwGID(dwGID), m_cNation(0), m_cState(cState), m_cSubState(cSubState), m_cUpgradeStep(cUpgradeStep),
m_cUpgradeType(0), m_cMaterial(cMaterial), m_cSiegeCount(cSiegeCount), m_fDefaultDir(0), m_dwRiderCID(0),
m_cHPUpdateCount(0), m_dwBroadCastSize(0),m_dwDeltaSize(0)
{
InitMonster(MonsterCreate.m_Pos);
if (bFullHP) m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
else m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(dwHP);
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD>
m_SerializeSiegeObjectData.PrepareData( *this );
m_SerializeSiegeObjectData.ClearDeltaData();
}
CSiegeObject::CSiegeObject(MonsterCreateInfo& MonsterCreate, unsigned long dwOwnerID, unsigned char cNation,
unsigned long dwHP, unsigned short wObjectType, unsigned char cState, unsigned char cUpgradeStep)
: CSkillMonster(MonsterCreate), m_dwCampOrCastleID(0), m_dwOwnerID(dwOwnerID), m_wObjectType(wObjectType), m_cNation(cNation),
m_dwGID(0), m_cState(cState), m_cSubState(0), m_cUpgradeStep(cUpgradeStep), m_cUpgradeType(0), m_cMaterial(0),
m_cSiegeCount(0), m_fDefaultDir(0), m_dwRiderCID(0), m_cHPUpdateCount(0), m_dwBroadCastSize(0),m_dwDeltaSize(0)
{
InitMonster(MonsterCreate.m_Pos);
if (0 == dwHP) m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
else m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(dwHP);
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>غ<EFBFBD>
m_SerializeSiegeObjectData.PrepareData( *this );
m_SerializeSiegeObjectData.ClearDeltaData();
}
CSiegeObject::~CSiegeObject()
{
}
EnemyCheck::EnemyType CSiegeObject::IsEnemy(CCreature* lpTarget, unsigned char* cResult)
{
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);
return static_cast<EnemyCheck::EnemyType>(dwResult);
}
unsigned char CSiegeObject::IsRider(unsigned long dwCID) const
{
if (m_dwRiderCID == dwCID)
{
return Siege::RIDER_FOR_OWNER;
}
return Siege::NOT_RIDER;
}
bool CSiegeObject::SkillAttack()
{
unsigned char cSkillLockCount = m_cUpgradeStep + 1;
unsigned char cSkillLevel = CSkillMonster::USE_SKILL_LEVEL;
if (cSkillLockCount >= CSkillMgr::MAX_SKILL_LOCKCOUNT - 1)
{
cSkillLockCount = CSkillMgr::MAX_SKILL_LOCKCOUNT - 2;
}
enum { FIRST_PATTERN=0, SECOND_PATTERN=1, MAX_PATTERN = 2 };
int nSelectPattern = FIRST_PATTERN;
CAggresiveCreature* ppAggresiveCreature[AtNode::MAX_DEFENDER_NUM] = {0, };
AtType attackType;
attackType.m_cSkillLockCount = cSkillLockCount;
attackType.m_cSkillLevel = cSkillLevel;
char nSkillPattern = 0;
while (nSelectPattern < MAX_PATTERN)
{
switch (nSelectPattern)
{
case FIRST_PATTERN:
{
// <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ൿ
// A B A : <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MP <20>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
// : <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// : A <20><>ų <20><><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (0 == m_MonsterInfo.m_wSkillID[A_SKILL])
{
++nSelectPattern;
continue;
}
nSkillPattern = A_SKILL;
attackType.m_wType = m_MonsterInfo.m_wSkillID[A_SKILL];
ppAggresiveCreature[0] = m_lpTarget;
}
break;
case SECOND_PATTERN:
{
// <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ൿ
// A B D : <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> MP <20>ܿ<EFBFBD><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
// : <20>ڽſ<DABD><C5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// : D <20><>ų <20><><EFBFBD><EFBFBD>
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD>ٸ<EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
if (0 == m_MonsterInfo.m_wSkillID[D_SKILL])
{
++nSelectPattern;
continue;
}
nSkillPattern = D_SKILL;
attackType.m_wType = m_MonsterInfo.m_wSkillID[D_SKILL];
ppAggresiveCreature[0] = m_lpTarget;
}
break;
default:
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<EFBFBD><D1BE>Խ<EFBFBD><D4BD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
}
// <20><>ų <20><><EFBFBD><EFBFBD><><C4B3><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>ϰ<EFBFBD> <20>ȴ<EFBFBD>.)
if (true == UseSkill(attackType, ppAggresiveCreature, nSkillPattern))
{
return true;
}
else
{
++nSelectPattern;
}
}
return false;
}
void CSiegeObject::UpdateObjectInfo(unsigned char cHPType, unsigned short wRepairHP)
{
unsigned short wPrevMaxHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
unsigned short wNowHP = m_CreatureStatus.m_nNowHP;
int nKID = Siege::GetKID(m_wObjectType, m_cState, m_cUpgradeType, m_cUpgradeStep);
const CMonsterMgr::MonsterProtoType* lpProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoType)
{
m_CreatureStatus = lpProtoType->m_CreatureStatus;
m_MonsterInfo = lpProtoType->m_MonsterInfo;
m_CreatureStatus.m_StatusInfo.CalculateSubStatus();
}
unsigned long dwTempHp;
switch (cHPType)
{
case Siege::NOW_HP:
m_CreatureStatus.m_nNowHP = wNowHP;
SendHPUpdateToDBAgent();
break;
case Siege::UPGRADE_HP:
dwTempHp = wNowHP + m_CreatureStatus.m_StatusInfo.m_nMaxHP - wPrevMaxHP;
m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(
std::min(dwTempHp, static_cast<unsigned long>(m_CreatureStatus.m_StatusInfo.m_nMaxHP)));
SendHPUpdateToDBAgent(true);
break;
case Siege::REPAIR_HP:
dwTempHp = wNowHP + wRepairHP;
m_CreatureStatus.m_nNowHP = static_cast<unsigned short>(
std::min(dwTempHp, static_cast<unsigned long>(m_CreatureStatus.m_StatusInfo.m_nMaxHP)));
SendHPUpdateToDBAgent(true);
break;
case Siege::FULL_HP:
m_CreatureStatus.m_nNowHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
SendHPUpdateToDBAgent(true);
break;
}
}
void CSiegeObject::UpgradeByEmblem(unsigned char cUpgradeType, unsigned char cUpgradeStep)
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
if (!IsCastleObject())
{
return;
}
int nKID = Siege::GetKID(Siege::EMBLEM, Siege::COMPLETE, cUpgradeType, cUpgradeStep);
const CMonsterMgr::MonsterProtoType* lpProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoType)
{
// <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_cUpgradeSpeed -= static_cast<unsigned char>(m_MonsterInfo.m_cUpgradeSpeed
* lpProtoType->m_MonsterInfo.m_fUpgradeSpeedUp);
// <20><><EFBFBD><EFBFBD> <20>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_cDevelopSpeed -= static_cast<unsigned char>(m_MonsterInfo.m_cDevelopSpeed
* lpProtoType->m_MonsterInfo.m_fDevelopSpeedUp);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_CreatureStatus.m_StatusInfo.m_wArmor += static_cast<short>(m_CreatureStatus.m_StatusInfo.m_wArmor
* lpProtoType->m_MonsterInfo.m_fDefenseUp);
m_CreatureStatus.m_StatusInfo.m_wMagicResist += static_cast<short>(m_CreatureStatus.m_StatusInfo.m_wMagicResist
* lpProtoType->m_MonsterInfo.m_fDefenseUp);
// HP <20><><EFBFBD><EFBFBD>
unsigned short wAddHP = static_cast<unsigned short>(m_CreatureStatus.m_StatusInfo.m_nMaxHP
* lpProtoType->m_MonsterInfo.m_fHPUp);
m_CreatureStatus.m_StatusInfo.m_nMaxHP += wAddHP;
m_CreatureStatus.m_nNowHP += wAddHP;
// <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD>
m_CreatureStatus.m_StatusInfo.m_lMinDamage += static_cast<long>(m_CreatureStatus.m_StatusInfo.m_lMinDamage
* lpProtoType->m_MonsterInfo.m_fOffenseUp);
m_CreatureStatus.m_StatusInfo.m_lMaxDamage += static_cast<long>(m_CreatureStatus.m_StatusInfo.m_lMaxDamage
* lpProtoType->m_MonsterInfo.m_fOffenseUp);
m_CreatureStatus.m_StatusInfo.m_wMagicPower += static_cast<short>(m_CreatureStatus.m_StatusInfo.m_wMagicPower
* lpProtoType->m_MonsterInfo.m_fOffenseUp);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_dwDevelopGold -= static_cast<unsigned long>(m_MonsterInfo.m_dwDevelopGold
* lpProtoType->m_MonsterInfo.m_fDevelopGoldDown);
// <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_MonsterInfo.m_dwUpgradeGold -= static_cast<unsigned long>(m_MonsterInfo.m_dwUpgradeGold
* lpProtoType->m_MonsterInfo.m_fUpgradeGoldDown);
}
}
void CSiegeObject::DegradeByEmblem(unsigned char cUpgradeType, unsigned char cUpgradeStep)
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
if (!IsCastleObject())
{
return;
}
int nKID = Siege::GetKID(Siege::EMBLEM, Siege::COMPLETE, cUpgradeType, cUpgradeStep);
const CMonsterMgr::MonsterProtoType* lpProtoTypeEmblem = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
nKID = GetKID();
const CMonsterMgr::MonsterProtoType* lpProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoType && lpProtoTypeEmblem)
{
unsigned short wNowHP = m_CreatureStatus.m_nNowHP -
static_cast<unsigned short>(m_CreatureStatus.m_nNowHP * lpProtoTypeEmblem->m_MonsterInfo.m_fHPUp);
m_CreatureStatus = lpProtoType->m_CreatureStatus;
m_MonsterInfo = lpProtoType->m_MonsterInfo;
m_CreatureStatus.m_nNowHP = wNowHP;
}
}
unsigned short CSiegeObject::GetDefaultNowHP()
{
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>¡<EFBFBD><C2A1><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
if (IsCastleObject())
{
Castle::CCastle* lpCastle = Castle::CCastleMgr::GetInstance().GetCastle( GetCastleID() );
CSiegeObject* lpEmblem = lpCastle->GetCastleEmblem();
if (lpCastle && lpEmblem)
{
int nKID = lpEmblem->GetKID();
const CMonsterMgr::MonsterProtoType* lpProtoTypeEmblem = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if (lpProtoTypeEmblem)
{
return m_CreatureStatus.m_nNowHP - static_cast<unsigned short>(m_CreatureStatus.m_nNowHP * lpProtoTypeEmblem->m_MonsterInfo.m_fHPUp);
}
}
}
return m_CreatureStatus.m_nNowHP;
}
void CSiegeObject::MoveTo(const Position& NewPosition)
{
CAggresiveCreature::MoveTo(NewPosition, false);
}
unsigned long CSiegeObject::GetRepairHP()
{
return m_CreatureStatus.m_StatusInfo.m_nMaxHP - m_CreatureStatus.m_nNowHP;
}
int CSiegeObject::GetKID() const
{
return Siege::GetKID(m_wObjectType, m_cState, m_cUpgradeType, m_cUpgradeStep);
}
void CSiegeObject::GetRiders( unsigned long* pRiders ) const
{
pRiders[0] = m_dwRiderCID;
}
unsigned char CSiegeObject::GetRiderNum() const
{
return (0 == m_dwRiderCID) ? 0 : 1;
}
unsigned long CSiegeObject::GetDevelopGold(unsigned short wDefaultObjectType) const
{
wDefaultObjectType = (wDefaultObjectType == Siege::DEFAULT_TYPE) ? m_wObjectType : wDefaultObjectType;
int nKID = Siege::GetKID(wDefaultObjectType, Siege::DEVELOPING, m_cUpgradeType, m_cUpgradeStep);
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_dwDevelopGold;
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return 0;
}
unsigned char CSiegeObject::GetDevelopSpeed(unsigned short wDefaultObjectType) const
{
wDefaultObjectType = (wDefaultObjectType == Siege::DEFAULT_TYPE) ? m_wObjectType : wDefaultObjectType;
int nKID = Siege::GetKID(wDefaultObjectType, Siege::DEVELOPING, m_cUpgradeType, m_cUpgradeStep);
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_cDevelopSpeed;
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return Siege::DEFAULT_TIME_VALUE;
}
unsigned long CSiegeObject::GetUpgradeGold() const
{
int nKID = Siege::GetKID(m_wObjectType, Siege::UPGRADING, m_cUpgradeType, m_cUpgradeStep);
if ( m_cUpgradeStep < Siege::MAX_UPGRADE_NUM )
{
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_dwUpgradeGold;
}
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return 0;
}
unsigned char CSiegeObject::GetUpgradeSpeed(unsigned char cDefaultUpgradeType) const
{
cDefaultUpgradeType = (cDefaultUpgradeType == Siege::NO_JEWEL) ? m_cUpgradeType : cDefaultUpgradeType;
int nKID = Siege::GetKID(m_wObjectType, Siege::UPGRADING, cDefaultUpgradeType, m_cUpgradeStep);
if ( m_cUpgradeStep < Siege::MAX_UPGRADE_NUM )
{
const CMonsterMgr::MonsterProtoType* pProtoType = CMonsterMgr::GetInstance().GetMonsterProtoType(nKID);
if ( pProtoType )
{
return pProtoType->m_MonsterInfo.m_cUpgradeSpeed;
}
}
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><EFBFBD>̵<EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ( KID : %d )", nKID);
return Siege::DEFAULT_TIME_VALUE;
}
float CSiegeObject::GetBonusRate() const
{
return m_MonsterInfo.m_fBonusRate;
}
unsigned long CSiegeObject::GetGID() const
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetGID() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->GetGID();
}
}
return m_dwGID;
}
unsigned char CSiegeObject::GetNation() const
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetNation() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->GetNation();
}
}
if ( IsCastleObject() || IsSiegeArms() )
{
return m_cNation;
}
else
{
// <20>ش<EFBFBD> Guild <20><> GetNation() ȣ<><C8A3>
CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(m_dwGID);
if (NULL != lpGuild)
{
return lpGuild->GetNation();
}
}
// <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
return Creature::STATELESS;
}
bool CSiegeObject::IsPeaceMode()
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetNation() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->IsPeaceMode();
}
}
if ( IsCastleObject() || IsSiegeArms() )
{
return false;
}
else
{
// <20>ش<EFBFBD> Guild <20><> GetNation() ȣ<><C8A3>
CGuild* lpGuild = CGuildMgr::GetInstance().GetGuild(m_dwGID);
if (NULL != lpGuild)
{
return lpGuild->IsPeaceMode();
}
}
// <20><><EFBFBD>ְ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return false;
}
CAggresiveCreature* CSiegeObject::GetDuelOpponent(void) const
{
// <20><><EFBFBD>⿡ Ÿ<><C5B8> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>⿡ ž<><C5BE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetNation() ȣ<><C8A3>
if ( IsRidable() && 0 != m_dwRiderCID )
{
CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID);
if (lpRider)
{
return lpRider->GetDuelOpponent();
}
}
return NULL;
}
bool CSiegeObject::IsWorldWeapon() const
{
if (Siege::KARTERANT_WEAPON == m_wObjectType || Siege::MERKADIA_WEAPON == m_wObjectType)
{
return true;
}
return false;
}
/*
bool CSiegeObject::SerializeOut(char* szBuffer_In, unsigned short& wDataLen)
{
PktSiegeBroadCast* lpBroadCast = reinterpret_cast<PktSiegeBroadCast*>(szBuffer_In);
lpBroadCast->m_dwCID = m_dwCID;
lpBroadCast->m_dwOwnerID = m_dwOwnerID; // <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> ID
lpBroadCast->m_dwGID = m_dwGID; // <20><><EFBFBD><EFBFBD> ID
if (IsEmblem() && m_dwEnemyGID)
{
lpBroadCast->m_dwGID = m_dwEnemyGID; // <20><><EFBFBD><EFBFBD> ID
}
lpBroadCast->m_wObjectType = m_wObjectType;
lpBroadCast->m_dwNowHP = m_CreatureStatus.m_nNowHP;
lpBroadCast->m_dwMaxHP = m_CreatureStatus.m_StatusInfo.m_nMaxHP;
lpBroadCast->m_cState = m_cState;
lpBroadCast->m_cSubState = m_cSubState;
lpBroadCast->m_cUpgradeStep = m_cUpgradeStep;
lpBroadCast->m_cUpgradeType = m_cUpgradeType;
lpBroadCast->m_fDefaultDir = m_fDefaultDir;
std::fill_n(&lpBroadCast->m_dwRiderID[0], int(Siege::AIRSHIP_RIDER_NUM), 0);
GetRiders( lpBroadCast->m_dwRiderID );
float fY = GetCurrentPos().m_fPointY;
const MotionInfo& motionInfo = GetMotionInfo();
if (IsSiegeArms())
{
if (Siege::AIRSHIP != m_wObjectType)
{
fY = 0.0f;
}
}
lpBroadCast->m_NetworkPos.Initialize(GetCurrentPos().m_fPointX, fY, GetCurrentPos().m_fPointZ, motionInfo.m_fDirection,
(0 == motionInfo.m_dwFrame) ? 0.0f : motionInfo.m_fVelocity / motionInfo.m_dwFrame);
wDataLen = sizeof(PktSiegeBroadCast);
return true;
}
*/
/*
void CSiegeObject::SendToRadiusCell(const char* szPacket, unsigned long dwPacketSize, unsigned char cCMD_In)
{
// <20>ݰ<EFBFBD> 5<><35><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
CCell* lpCenterCell = GetCellPos().m_lpCell;
if (lpCenterCell)
{
int nCellWidth = Siege::BROADCAST_CELL_SIZE * 2 - 1;
int nCellHeight = Siege::BROADCAST_CELL_SIZE * 2 - 1;
int i, j;
CCell* lpStartCell = NULL;
for (i=1; i<Siege::BROADCAST_CELL_SIZE; ++i)
{
lpStartCell = lpCenterCell->GetConnectCell(CCell::LEFT);
if (NULL == lpStartCell)
{
nCellWidth = nCellWidth - (Siege::BROADCAST_CELL_SIZE - i);
break;
}
lpCenterCell = lpStartCell;
}
for (i=1; i<Siege::BROADCAST_CELL_SIZE; ++i)
{
lpStartCell = lpCenterCell->GetConnectCell(CCell::UP);
if (NULL == lpStartCell)
{
nCellHeight = nCellHeight - (Siege::BROADCAST_CELL_SIZE - i);
break;
}
lpCenterCell = lpStartCell;
}
lpStartCell = lpCenterCell;
for (i=0; i<nCellHeight; ++i)
{
CCell* lpTempCell = lpStartCell;
for (j=0; j<nCellWidth; ++j)
{
if (lpTempCell)
{
lpTempCell->SendAllCharacter(szPacket, dwPacketSize, cCMD_In);
lpTempCell = lpTempCell->GetConnectCell(CCell::RIGHT);
}
else break;
}
lpStartCell = lpStartCell->GetConnectCell(CCell::DOWN);
if (NULL == lpStartCell) break;
}
}
}
*/
void CSiegeObject::RangeTest()
{
// <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ <20>ݰ<EFBFBD><DDB0><EFBFBD> <20><><EFBFBD> ij<><C4B3><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> <20>˷<EFBFBD><CBB7>ش<EFBFBD>.)
PktNewSiegeBroadCast pktNSBC;
ZeroMemory(&pktNSBC, sizeof(PktNewSiegeBroadCast));
pktNSBC.m_dwCID = GetCID();
pktNSBC.m_cType = BroadCastSiege::BROADCAST_DELETE_DATA;
bool bDeletePacketCrypt = true;
char* szPacket = reinterpret_cast<char *>(&pktNSBC);
if (!PacketWrap::WrapCrypt(szPacket, sizeof(PktNewSiegeBroadCast), CmdNewSiegeBroadCast, 0, 0))
{
ERRLOG0(g_Log, "Siege Broadcast delete data packet crypt fail..");
bDeletePacketCrypt = false;
}
BroadCastSet::iterator itr = m_BroadCastSet.begin();
while (itr != m_BroadCastSet.end())
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter( (*itr) );
if (lpCharacter)
{
if (lpCharacter->GetCurrentPos().GetSquaredDistance( GetCurrentPos() ) > Siege::BROADCAST_SQUARED_RADIUS)
{
itr = m_BroadCastSet.erase(itr);
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch && bDeletePacketCrypt)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, sizeof(PktNewSiegeBroadCast), CmdNewSiegeBroadCast);
}
}
else
{
++itr;
}
}
else
{
itr = m_BroadCastSet.erase(itr);
}
}
// BroadCast Data <20><> Delta Data <20><> <20><><EFBFBD><EFBFBD><EFBFBD>صд<D8B5>.
char szSrcBuffer[ BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE ] ;
char szDeltaSrcBuffer[ BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE ] ;
m_dwBroadCastSize = BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE;
m_dwDeltaSize = 0;
PktNewSiegeBroadCast* lpPktNewSiegeBC = reinterpret_cast<PktNewSiegeBroadCast*>( szSrcBuffer );
char* lpDataPos = reinterpret_cast<char*>( lpPktNewSiegeBC + 1 );
lpPktNewSiegeBC->m_dwCID = GetCID();
lpPktNewSiegeBC->m_cType = BroadCastSiege::BROADCAST_ALL_DATA;
memcpy( lpDataPos, m_SerializeSiegeObjectData.GetBroadCastData(), m_SerializeSiegeObjectData.GetBroadCastDataLen() );
PacketWrap::WrapCompress( m_szBroadCastBuffer, m_dwBroadCastSize, szSrcBuffer,
static_cast<unsigned short>( sizeof(PktNewSiegeBroadCast) + m_SerializeSiegeObjectData.GetBroadCastDataLen() ),
CmdNewSiegeBroadCast, 0, 0 );
if ( m_SerializeSiegeObjectData.GetDeltaDataLen() > 0 )
{
m_dwDeltaSize = BroadCastSiege::MAX_SIEGEBROADCAST_BUFFER_SIZE;
lpPktNewSiegeBC = reinterpret_cast<PktNewSiegeBroadCast*>( szDeltaSrcBuffer ) ;
lpDataPos = reinterpret_cast<char*>( lpPktNewSiegeBC + 1 );
lpPktNewSiegeBC->m_dwCID = GetCID();
lpPktNewSiegeBC->m_cType = BroadCastSiege::BROADCAST_DELTA_DATA;
memcpy( lpDataPos, m_SerializeSiegeObjectData.GetDeltaData(), m_SerializeSiegeObjectData.GetDeltaDataLen() );
PacketWrap::WrapCompress( m_szDeltaBuffer, m_dwDeltaSize, szDeltaSrcBuffer,
static_cast<unsigned short>( sizeof(PktNewSiegeBroadCast) + m_SerializeSiegeObjectData.GetDeltaDataLen() ),
CmdNewSiegeBroadCast, 0, 0 );
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>Ѵ<EFBFBD>.
CCharSphereTree::GetInstance().RangeTest( GetCurrentPos(), Siege::BROADCAST_RADIUS, this );
}
void CSiegeObject::RangeTestCallBack( const Position& centerPos, float fDistance, CCharSphereNode* pNode )
{
if ( pNode )
{
BroadCastSet::iterator itr = m_BroadCastSet.find(pNode->GetCID());
if (itr != m_BroadCastSet.end())
{
CCharacter* lpCharacter = pNode->GetCharacter();
if (NULL != lpCharacter)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. Delta <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
if (m_SerializeSiegeObjectData.GetDeltaDataLen() > 0)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(m_szDeltaBuffer, m_dwDeltaSize, CmdNewSiegeBroadCast);
}
}
}
}
else
{
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. BroadCast <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CCharacter* lpCharacter = pNode->GetCharacter();
if (NULL != lpCharacter)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(m_szBroadCastBuffer, m_dwBroadCastSize, CmdNewSiegeBroadCast);
}
m_BroadCastSet.insert( pNode->GetCID() );
}
}
}
}
void CSiegeObject::SendToRange( float fRadius, const char* szPacket, unsigned long dwPacketSize, unsigned char cCMD_In )
{
CCharSphereTree::GetInstance().SendToRange( GetCurrentPos(), fRadius, szPacket, dwPacketSize, cCMD_In );
}
void CSiegeObject::SendHPUpdateToDBAgent(bool bForce)
{
++m_cHPUpdateCount;
// <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if (lpDBAgentDispatch)
{
switch (m_wObjectType)
{
case Siege::CAMP: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::CAMP_SHOP: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::MINING_CAMP: // ä<><C3A4><EFBFBD><EFBFBD>
case Siege::KARTERANT_WEAPON: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::MERKADIA_WEAPON: // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (bForce || m_cHPUpdateCount >= MAX_HP_UPDATE_COUNT)
{
GameClientSendPacket::SendCharCampCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), 0, GetCampID(),
m_CreatureStatus.m_nNowHP, 0, PktCampCmd::CAMP_UPDATE_HP,
PktBase::NO_SERVER_ERR);
m_cHPUpdateCount = 0;
}
}
break;
case Siege::EMBLEM: // <20><> <20><>¡<EFBFBD><C2A1>
case Siege::GATE: // <20><><EFBFBD><EFBFBD>
case Siege::GUARD: // <20><><EFBFBD><EFBFBD>
case Siege::SHORT_RANGE_CASTLE_ARMS: // <20>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::LONG_RANGE_CASTLE_ARMS: // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
{
if (bForce || m_cHPUpdateCount >= MAX_HP_UPDATE_COUNT)
{
GameClientSendPacket::SendCharCastleCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), 0, GetCastleID(), m_dwCID,
GetDefaultNowHP(), 0, PktCastleCmd::CASTLE_UPDATE_HP,
PktBase::NO_SERVER_ERR);
m_cHPUpdateCount = 0;
}
}
break;
case Siege::SHORT_RANGE_SIEGE_ARMS: // <20>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::LONG_RANGE_SIEGE_ARMS: // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
case Siege::AIRSHIP: // <20><><EFBFBD>ۼ<EFBFBD>
{
if (bForce || m_cHPUpdateCount >= MAX_HP_UPDATE_COUNT)
{
GameClientSendPacket::SendCharSiegeArmsCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), m_dwOwnerID, m_dwCID,
m_CreatureStatus.m_nNowHP, PktSiegeArmsCmd::SIEGE_UPDATE_HP,
PktBase::NO_SERVER_ERR);
m_cHPUpdateCount = 0;
}
}
}
}
}
bool CSiegeObject::IsCamp() const
{
switch ( m_wObjectType )
{
case Siege::CAMP:
case Siege::CAMP_SHOP:
case Siege::MINING_CAMP:
case Siege::KARTERANT_WEAPON:
case Siege::MERKADIA_WEAPON:
return true;
}
return false;
}
bool CSiegeObject::IsCastleObject() const
{
switch ( m_wObjectType )
{
case Siege::EMBLEM :
case Siege::GATE :
case Siege::BACKDOOR :
case Siege::CASTLE_ARMS_NPC :
case Siege::GUARD :
case Siege::SHORT_RANGE_CASTLE_ARMS :
case Siege::LONG_RANGE_CASTLE_ARMS :
{
return true;
}
}
return false;
}
bool CSiegeObject::IsCastleArms() const
{
switch ( m_wObjectType )
{
case Siege::GUARD :
case Siege::SHORT_RANGE_CASTLE_ARMS :
case Siege::LONG_RANGE_CASTLE_ARMS :
case Siege::CASTLE_ARMS_NPC :
{
return true;
}
}
return false;
}
bool CSiegeObject::IsSiegeArms() const
{
switch ( m_wObjectType )
{
case Siege::SHORT_RANGE_SIEGE_ARMS :
case Siege::LONG_RANGE_SIEGE_ARMS :
case Siege::AIRSHIP :
{
return true;
}
}
return false;
}
bool CSiegeObject::IsRidable() const
{
switch ( m_wObjectType )
{
case Siege::SHORT_RANGE_CASTLE_ARMS :
case Siege::LONG_RANGE_CASTLE_ARMS :
case Siege::SHORT_RANGE_SIEGE_ARMS :
case Siege::LONG_RANGE_SIEGE_ARMS :
case Siege::AIRSHIP :
{
return true;
}
}
return false;
}
void CSiegeObject::SetMaterialNum(unsigned char cMaterial)
{
m_cMaterial = cMaterial;
}
void CSiegeObject::SetNation(unsigned char cNation)
{
m_cNation = cNation;
if (IsEmblem() && Creature::STATELESS == cNation)
{
m_cState = Siege::COMPLETE;
m_cSubState = Siege::NONE;
}
}