Files
Client/Server/RylServerProject/RylGameLibrary/Creature/Siege/WorldWeapon.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

201 lines
7.3 KiB
C++

//--------------------------------------------------------------------------------------------------------------------------
// File Name: WorldWeapon.cpp
//
// Programmer: Zergra( Park Jongtae ) in GamaSoft corp.
//
// File Desciption: ¿ùµå ¿þÆù
//
// Date: 2004. 12. 14. (È­)
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// Headers
//--------------------------------------------------------------------------------------------------------------------------
#include "WorldWeapon.h"
#include <Creature/Siege/SiegeObjectMgr.h>
#include <Community/Guild/Guild.h>
#include <Community/Guild/GuildMgr.h>
#include <Network/Stream/SendStream.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/CastlePacket.h>
#include <Network/Dispatch/DBAgent/DBAgentDispatch.h>
#include <Network/Dispatch/DBAgent/DBAgentRequest.h>
#include <Network/Dispatch/GameClient/SendCharCastle.h>
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
// class CWorldWeapon
///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------------------------------------------
// Constrcutor, Destructor
//--------------------------------------------------------------------------------------------------------------------------
CWorldWeapon::CWorldWeapon(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, const CampRight& campRight, bool bFullHP)
: CCamp(MonsterCreate, dwCampID, dwGID, dwHP, wObjectType, cState, cSubState, cUpgradeStep, cMaterial, cSiegeCount, campRight, bFullHP),
m_iFireX(0), m_iFireZ(0)
{
}
CWorldWeapon::~CWorldWeapon()
{
}
//--------------------------------------------------------------------------------------------------------------------------
// Member Functions
//--------------------------------------------------------------------------------------------------------------------------
bool CWorldWeapon::Build(unsigned char cUpgradeStep)
{
CCamp::Build(cUpgradeStep);
// ¿ùµå ¿þÆù ÀÎæƮ Àû¿ë
unsigned char cNation = Creature::STATELESS;
switch (m_wObjectType)
{
case Siege::KARTERANT_WEAPON: cNation = Creature::KARTERANT; break;
case Siege::MERKADIA_WEAPON: cNation = Creature::MERKADIA; break;
}
CCreatureManager::GetInstance().AddWorldWeaponEnchant(reinterpret_cast<CAggresiveCreature*>(this), cNation);
return true;
}
bool CWorldWeapon::Destroy(unsigned long dwOffencerGID)
{
// ¿ùµå ¿þÆùÀÏ °æ¿ì ÆÄ±« Á¤º¸ ¾÷µ¥ÀÌÆ®
if (Siege::KARTERANT_WEAPON == m_wObjectType)
{
CSiegeObjectMgr::GetInstance().UpdateWorldWeaponInfo(Creature::KARTERANT, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
}
else if (Siege::MERKADIA_WEAPON == m_wObjectType)
{
CSiegeObjectMgr::GetInstance().UpdateWorldWeaponInfo(Creature::MERKADIA, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
}
return CCamp::Destroy(dwOffencerGID);
}
bool CWorldWeapon::UpdateWeaponState(unsigned char cWeaponState, int iX, int iZ)
{
m_iFireX = iX;
m_iFireZ = iZ;
m_cSubState = cWeaponState;
m_iWorldWeaponCount = Siege::WEAPON_FIRE_WARNING_COUNT;
// ÇØ´ç ÁøÁö°¡ ÀÖ´Â ¹Ý°æ 5¼¿ À̳»¿¡ Àü¼Û
PktCampCmd pktCC;
pktCC.m_dwCID = m_dwCID;
pktCC.m_dwCampID = GetCampID();
pktCC.m_cState = m_cState;
pktCC.m_dwValue1 = iX;
pktCC.m_dwValue2 = iZ;
pktCC.m_cSubCmd = 0;
switch (cWeaponState)
{
case Siege::WEAPON_CHARGE:
{
pktCC.m_cSubCmd = PktCampCmd::WORLDWEAPON_CHARGE;
pktCC.m_dwValue1 = m_cMaterial;
pktCC.m_dwValue2 = 0;
}
break;
case Siege::WEAPON_READY: pktCC.m_cSubCmd = PktCampCmd::WORLDWEAPON_CHARGE_COMPLETE; break;
case Siege::WEAPON_FIRE: pktCC.m_cSubCmd = PktCampCmd::WORLDWEAPON_FIRE; break;
}
char* szPacket = reinterpret_cast<char *>(&pktCC);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCampCmd), CmdCampCmd, 0, 0))
{
// Vincent - ºê·Îµå ij½ºÆ® Å×½ºÆ® ÄÚµå
//SendToRadiusCell(szPacket, sizeof(PktCampCmd), CmdCampCmd);
SendToRange(Siege::BROADCAST_RADIUS, szPacket, sizeof(PktCampCmd), CmdCampCmd);
}
return true;
}
bool CWorldWeapon::FireWarning()
{
// °æ°í ¸Þ¼¼Áö¸¦ ¸ðµç ij¸¯ÅÍ¿¡°Ô Àü¼Û
PktCampMessage pktCampMessage;
memset(&pktCampMessage, 0, sizeof(PktCampMessage));
pktCampMessage.m_dwCampID = GetCampID();
pktCampMessage.m_dwGID = GetGID();
pktCampMessage.m_cZone = CServerSetup::GetInstance().GetServerZone();
pktCampMessage.m_cMsgCmd = PktCampMessage::MSGCMD_WEAPON_FIRE_WARNING;
pktCampMessage.m_cRemainTime = static_cast<unsigned char>(m_iWorldWeaponCount);
pktCampMessage.m_cNation = GetNation();
pktCampMessage.m_bNotify = true;
pktCampMessage.m_nValue1 = m_iFireX;
pktCampMessage.m_nValue2 = m_iFireZ;
Guild::CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(m_dwGID);
if (NULL != lpGuild)
{
strcpy(pktCampMessage.m_szGuildName, lpGuild->GetName());
}
char* szPacket = reinterpret_cast<char* >(&pktCampMessage);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCampMessage), CmdCampMessage, 0, 0))
{
CCreatureManager::GetInstance().SendAllCharacter(szPacket, sizeof(PktCampMessage), CmdCampMessage);
}
--m_iWorldWeaponCount;
return true;
}
bool CWorldWeapon::Fire()
{
// ¿ùµå ¿þÆùÀÏ °æ¿ì ÆÄ±« Á¤º¸ ¾÷µ¥ÀÌÆ®
if (Siege::KARTERANT_WEAPON == m_wObjectType)
{
CSiegeObjectMgr::GetInstance().UpdateWorldWeaponInfo(Creature::KARTERANT, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
}
else if (Siege::MERKADIA_WEAPON == m_wObjectType)
{
CSiegeObjectMgr::GetInstance().UpdateWorldWeaponInfo(Creature::MERKADIA, Siege::WEAPON_REBUILD_SIEGE_TIME_COUNT);
}
// DB Áß°è ¼­¹ö¿¡ ¿ùµå ¿þÆù °´Ã¼ »èÁ¦ ¸í·É Àü¼Û (¹ß»ç ¿Ï·á, ½Ã°£ ±â·Ï)
// Áß°è ¼­¹ö·Î ÆÐŶ Àü¼Û
GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable());
if (NULL != lpDBAgentDispatch)
{
GameClientSendPacket::SendCharCampCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), 0, GetCampID(),
0, 0, PktCampCmd::WORLDWEAPON_FIRE_COMPLETE, PktBase::NO_SERVER_ERR);
}
// ¸ðµç ij¸¯ÅÍ¿¡°Ô ¿ùµå ¿þÆù ¹ß»ç ¸í·É Àü¼Û (ÀÌÆåÆ® ó¸® ¹× ¿ùµå ¿þÆù °´Ã¼ »èÁ¦¸¦ À§ÇØ)
PktCampCmd pktCampCmd;
pktCampCmd.m_dwCID = m_dwCID;
pktCampCmd.m_dwCampID = GetCampID();
pktCampCmd.m_cState = GetState();
pktCampCmd.m_dwValue1 = m_iFireX;
pktCampCmd.m_dwValue2 = m_iFireZ;
pktCampCmd.m_cSubCmd = PktCampCmd::WORLDWEAPON_FIRE_COMPLETE;
char* szPacket = reinterpret_cast<char *>(&pktCampCmd);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktCampCmd), CmdCampCmd, 0, 0))
{
CCreatureManager::GetInstance().SendAllCharacter(szPacket, sizeof(PktCampCmd), CmdCampCmd);
}
// ¸ðµç ij¸¯ÅÍ ¹× °ø¼º ¿ÀºêÁ§Æ®¿¡ ´ëÇØ¼­ µ¥¹ÌÁö ó¸®
CCreatureManager::GetInstance().ProcessWorldWeaponDamage(m_iFireX, m_iFireZ, m_cUpgradeStep);
// ¸ðµç ij¸¯ÅÍÀÇ ¿ùµå ¿þÆù ÀÎæƮ ÇØÁ¦
CCreatureManager::GetInstance().ClearWorldWeaponEnchant();
return true;
}