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>
201 lines
7.3 KiB
C++
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;
|
|
}
|