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>
426 lines
10 KiB
C++
426 lines
10 KiB
C++
#include "stdafx.h"
|
|
#include "SiegeObjectDB.h"
|
|
#include "SiegeObjectDBMgr.h"
|
|
|
|
#include <Network/Packet/PacketCommand.h>
|
|
#include <Network/Packet/WrapPacket.h>
|
|
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
|
#include <Network/Dispatch/GameDispatch.h>
|
|
|
|
#include <Community/Guild/GuildDB.h>
|
|
#include <Community/Guild/GuildDBMgr.h>
|
|
|
|
#include <Castle/Castle.h>
|
|
#include <Castle/CastleMgr.h>
|
|
|
|
#include <DB/DBComponent.h>
|
|
#include <Castle/CastleDBComponent.h>
|
|
|
|
#include <Utility/Setup/ServerSetup.h>
|
|
|
|
#include <atltime.h>
|
|
|
|
|
|
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, const CastleObjectInfoDB& CastleObject)
|
|
: m_dwCID(Creature::SIEGE_OBJECT_BIT | CastleObject.m_dwCID),
|
|
m_dwCampOrCastleID(CastleObject.m_dwCastleID),
|
|
m_dwOwnerID(CastleObject.m_dwOwnerID),
|
|
m_dwGID(0),
|
|
m_cNation(0),
|
|
m_dwHP(CastleObject.m_dwHP),
|
|
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_cZone(0),
|
|
m_cChannel(0),
|
|
m_TimeValue(CastleObject.m_RemainUpTime),
|
|
m_LastUseTime(CastleObject.m_LastUseTime),
|
|
m_Pos(CastleObject.m_Pos),
|
|
m_cMaterial(0),
|
|
m_cSiegeCount(0),
|
|
m_dwRepairHP(0),
|
|
m_fDefaultDir(CastleObject.m_fDefaultDir),
|
|
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
|
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_DBComponent(DBComponent)
|
|
{
|
|
}
|
|
|
|
|
|
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, const CampInfoDB& CampInfo)
|
|
: m_dwCID(0),
|
|
m_dwCampOrCastleID(Castle::CAMP_BIT | CampInfo.m_dwCampID),
|
|
m_dwOwnerID(0),
|
|
m_dwGID(CampInfo.m_dwGID),
|
|
m_cNation(0),
|
|
m_dwHP(CampInfo.m_dwHP),
|
|
m_wObjectType(CampInfo.m_wObjectType),
|
|
m_cState(CampInfo.m_cState),
|
|
m_cSubState(CampInfo.m_cSubState),
|
|
m_cUpgradeStep(CampInfo.m_cUpgradeStep),
|
|
m_cUpgradeType(0),
|
|
m_cZone(CampInfo.m_cZone),
|
|
m_cChannel(CampInfo.m_cChannel),
|
|
m_TimeValue(CampInfo.m_TimeValue),
|
|
m_LastUseTime(CampInfo.m_LastUseTime),
|
|
m_Pos(CampInfo.m_Pos),
|
|
m_cMaterial(CampInfo.m_cMaterial),
|
|
m_cSiegeCount(CampInfo.m_cSiegeCount),
|
|
m_dwRepairHP(0),
|
|
m_fDefaultDir(0),
|
|
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
|
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_DBComponent(DBComponent)
|
|
{
|
|
}
|
|
|
|
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, unsigned long dwCampID,
|
|
unsigned long dwGID, unsigned char cZone,
|
|
unsigned char cChannel, Position Pos)
|
|
: m_dwCID(0),
|
|
m_dwCampOrCastleID(dwCampID),
|
|
m_dwOwnerID(0),
|
|
m_dwGID(dwGID),
|
|
m_cNation(0),
|
|
m_dwHP(0),
|
|
m_wObjectType(Siege::CAMP),
|
|
m_cSubState(0),
|
|
m_cState(DEVELOPING),
|
|
m_cUpgradeStep(0),
|
|
m_cUpgradeType(0),
|
|
m_cZone(cZone),
|
|
m_cChannel(cChannel),
|
|
m_Pos(Pos),
|
|
m_cMaterial(0),
|
|
m_cSiegeCount(0),
|
|
m_dwRepairHP(0),
|
|
m_fDefaultDir(0),
|
|
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
|
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_DBComponent(DBComponent)
|
|
{
|
|
SYSTEMTIME sysTime;
|
|
GetLocalTime(&sysTime);
|
|
|
|
m_TimeValue.Year = sysTime.wYear;
|
|
m_TimeValue.Month = sysTime.wMonth;
|
|
m_TimeValue.Day = sysTime.wDay;
|
|
m_TimeValue.Hour = sysTime.wHour;
|
|
m_TimeValue.Minute = sysTime.wMinute;
|
|
m_TimeValue.Second = sysTime.wSecond;
|
|
|
|
m_LastUseTime = m_TimeValue;
|
|
}
|
|
|
|
CSiegeObjectDB::CSiegeObjectDB(CDBComponent& DBComponent, unsigned long dwOwnerID,
|
|
unsigned char cNation, unsigned short wObjectType,
|
|
unsigned char cUpgradeStep, unsigned char cZone, unsigned char cChannel,
|
|
Position Pos)
|
|
: m_dwCID(0),
|
|
m_dwCampOrCastleID(0),
|
|
m_dwOwnerID(dwOwnerID),
|
|
m_dwGID(0),
|
|
m_cNation(cNation),
|
|
m_dwHP(0),
|
|
m_wObjectType(wObjectType),
|
|
m_cSubState(0),
|
|
m_cState(DEVELOPING),
|
|
m_cUpgradeStep(cUpgradeStep),
|
|
m_cUpgradeType(0),
|
|
m_cZone(cZone),
|
|
m_cChannel(cChannel),
|
|
m_Pos(Pos),
|
|
m_cMaterial(0),
|
|
m_cSiegeCount(0),
|
|
m_dwRepairHP(0),
|
|
m_fDefaultDir(0),
|
|
m_cDevelopTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cUpgradeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_cRepairTime(Siege::DEFAULT_REPAIR_TIME),
|
|
m_cChangeTime(Siege::DEFAULT_TIME_VALUE),
|
|
m_DBComponent(DBComponent)
|
|
{
|
|
SYSTEMTIME sysTime;
|
|
GetLocalTime(&sysTime);
|
|
|
|
m_TimeValue.Year = sysTime.wYear;
|
|
m_TimeValue.Month = sysTime.wMonth;
|
|
m_TimeValue.Day = sysTime.wDay;
|
|
m_TimeValue.Hour = sysTime.wHour;
|
|
m_TimeValue.Minute = sysTime.wMinute;
|
|
m_TimeValue.Second = sysTime.wSecond;
|
|
|
|
m_LastUseTime = m_TimeValue;
|
|
}
|
|
|
|
CSiegeObjectDB::~CSiegeObjectDB()
|
|
{
|
|
}
|
|
|
|
|
|
void CSiegeObjectDB::SendCampCmd(unsigned char cSubCmd, unsigned long dwValue1, unsigned long dwValue2)
|
|
{
|
|
if ( IsCamp() )
|
|
{
|
|
SERVER_ID serverID;
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
|
serverID.sID.Channel = m_cChannel;
|
|
serverID.sID.ID = m_cZone;
|
|
|
|
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
|
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
|
|
|
if(0 != lpGameDispatch)
|
|
{
|
|
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
|
|
|
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCampCmd));
|
|
if(0 != lpBuffer)
|
|
{
|
|
PktCampCmd* lpPktCampCmd = reinterpret_cast<PktCampCmd*>(lpBuffer);
|
|
|
|
lpPktCampCmd->m_dwCID = m_dwCID;
|
|
lpPktCampCmd->m_dwCampID = GetCampID();
|
|
lpPktCampCmd->m_cState = m_cState;
|
|
lpPktCampCmd->m_dwValue1 = dwValue1;
|
|
lpPktCampCmd->m_dwValue2 = dwValue2;
|
|
lpPktCampCmd->m_cSubCmd = cSubCmd;
|
|
|
|
SendStream.WrapHeader(sizeof(PktCampCmd), CmdCampCmd, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CSiegeObjectDB::SendCastleCmd(unsigned long dwValue, unsigned char cSubCmd)
|
|
{
|
|
if ( IsCastleObject() )
|
|
{
|
|
SERVER_ID serverID;
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
|
serverID.sID.Channel = m_cChannel;
|
|
serverID.sID.ID = m_cZone;
|
|
|
|
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
|
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
|
|
|
if (0 != lpGameDispatch)
|
|
{
|
|
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
|
|
|
char* lpBuffer = SendStream.GetBuffer(sizeof(PktCampCmd));
|
|
if (0 != lpBuffer)
|
|
{
|
|
PktCastleCmd* lpPktCastleCmd = reinterpret_cast<PktCastleCmd*>(lpBuffer);
|
|
|
|
lpPktCastleCmd->m_dwCastleID = GetCastleID();
|
|
lpPktCastleCmd->m_dwCastleObjectID = m_dwCID;
|
|
lpPktCastleCmd->m_cState = m_cState;
|
|
lpPktCastleCmd->m_dwValue1 = dwValue;
|
|
lpPktCastleCmd->m_dwValue2 = 0;
|
|
lpPktCastleCmd->m_cSubCmd = cSubCmd;
|
|
|
|
SendStream.WrapHeader(sizeof(PktCastleCmd), CmdCastleCmd, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CSiegeObjectDB::SendSiegeArmsCmd(unsigned long dwValue, unsigned char cSubCmd)
|
|
{
|
|
if ( IsSiegeArms() )
|
|
{
|
|
SERVER_ID serverID;
|
|
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
serverID.sID.Group = CServerSetup::GetInstance().GetServerGroup();
|
|
serverID.sID.Channel = m_cChannel;
|
|
serverID.sID.ID = m_cZone;
|
|
|
|
GET_MULTI_DISPATCH(lpGameDispatch, serverID.dwID,
|
|
DBAgent::CGameDispatch, DBAgent::CGameDispatch::GetDispatchTable());
|
|
|
|
if(0 != lpGameDispatch)
|
|
{
|
|
CSendStream& SendStream = lpGameDispatch->GetSendStream();
|
|
|
|
char* lpBuffer = SendStream.GetBuffer(sizeof(PktSiegeArmsCmd));
|
|
if(0 != lpBuffer)
|
|
{
|
|
PktSiegeArmsCmd* lpPktSiegeArmsCmd = reinterpret_cast<PktSiegeArmsCmd*>(lpBuffer);
|
|
|
|
lpPktSiegeArmsCmd->m_dwCID = m_dwOwnerID;
|
|
lpPktSiegeArmsCmd->m_dwArmsID = m_dwCID;
|
|
lpPktSiegeArmsCmd->m_cState = m_cState;
|
|
lpPktSiegeArmsCmd->m_dwValue = dwValue;
|
|
lpPktSiegeArmsCmd->m_cSubCmd = cSubCmd;
|
|
|
|
SendStream.WrapHeader(sizeof(PktSiegeArmsCmd), CmdSiegeArmsCmd, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CSiegeObjectDB::UpdateLastUseTime(bool bInit)
|
|
{
|
|
if (bInit)
|
|
{
|
|
m_LastUseTime.Year = 0;
|
|
m_LastUseTime.Month = 0;
|
|
m_LastUseTime.Day = 0;
|
|
m_LastUseTime.Hour = 0;
|
|
m_LastUseTime.Minute = 0;
|
|
m_LastUseTime.Second = 0;
|
|
}
|
|
else
|
|
{
|
|
SYSTEMTIME sysTime;
|
|
GetLocalTime(&sysTime);
|
|
|
|
m_LastUseTime.Year = sysTime.wYear;
|
|
m_LastUseTime.Month = sysTime.wMonth;
|
|
m_LastUseTime.Day = sysTime.wDay;
|
|
m_LastUseTime.Hour = sysTime.wHour;
|
|
m_LastUseTime.Minute = sysTime.wMinute;
|
|
m_LastUseTime.Second = sysTime.wSecond;
|
|
}
|
|
}
|
|
|
|
bool CSiegeObjectDB::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 CSiegeObjectDB::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 CSiegeObjectDB::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 CSiegeObjectDB::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 CSiegeObjectDB::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;
|
|
}
|
|
|
|
bool CSiegeObjectDB::IsWorldWeapon() const
|
|
{
|
|
if (Siege::KARTERANT_WEAPON == m_wObjectType || Siege::MERKADIA_WEAPON == m_wObjectType)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CSiegeObjectDB::SetGID(unsigned long dwGID)
|
|
{
|
|
m_dwGID = dwGID;
|
|
|
|
// if (IsEmblem() && 0 == dwGID)
|
|
// {
|
|
// m_cState = Siege::COMPLETE;
|
|
// m_cSubState = Siege::NONE;
|
|
// }
|
|
}
|
|
|
|
void CSiegeObjectDB::SetNation(unsigned char cNation)
|
|
{
|
|
m_cNation = cNation ;
|
|
|
|
if (IsEmblem() && Creature::STATELESS == cNation)
|
|
{
|
|
m_cState = Siege::COMPLETE;
|
|
m_cSubState = Siege::NONE;
|
|
}
|
|
}
|
|
|
|
void CSiegeObjectDB::SetZoneChannel(unsigned char cZone, unsigned char cChannel)
|
|
{
|
|
m_cZone = cZone;
|
|
m_cChannel = cChannel;
|
|
}
|
|
|
|
void CSiegeObjectDB::SetMaterialNum(unsigned char cMaterial)
|
|
{
|
|
m_cMaterial = cMaterial;
|
|
}
|