#include "stdafx.h" #include "Airship.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include CAirship::CAirship(MonsterCreateInfo& MonsterCreate, unsigned long dwOwnerID, unsigned char cNation, unsigned long dwHP, unsigned short wObjectType, unsigned char cState, unsigned char cUpgradeStep) : CSiegeArms(MonsterCreate, dwOwnerID, cNation, dwHP, wObjectType, cState, cUpgradeStep) { std::fill_n(&m_dwPassengerCID[0], int(Siege::AIRSHIP_PASSENGER_NUM), 0); } CAirship::~CAirship() { } bool CAirship::Dead(CAggresiveCreature* pOffencer) { if (NULL == pOffencer) return false; if (STATE_ID_DIE == m_nCurrentState) return false; m_CreatureStatus.m_nNowHP = 0; m_dwLastBehaviorTick = m_dwLastTime = CPulse::GetInstance().GetLastTick(); m_lCurrentFrame = FPS; m_bAttacking = false; m_bCasting = false; // Ÿ°í ÀÖ´ø ij¸¯ÅÍ´Â Á״´Ù. CCharacter* lpRider = NULL; if (m_dwRiderCID) { lpRider = CCreatureManager::GetInstance().GetCharacter(m_dwRiderCID); if ( lpRider ) { lpRider->GetOff(); lpRider->Kill(pOffencer); } m_dwRiderCID = 0; } for (int i=0; iGetOff(); lpRider->Kill(pOffencer); } m_dwPassengerCID[i] = 0; } // Å©¸®ÃÄ ¸Å´ÏÁ®¿¡¼­ »èÁ¦ (ÇØ´ç ¼¿¿¡¼­µµ »èÁ¦ÇÑ´Ù.) CCreatureManager::GetInstance().DeleteCreature(m_dwCID); // Áß°è ¼­¹ö·Î ÆÐŶ Àü¼Û GET_SINGLE_DISPATCH(lpDBAgentDispatch, CDBAgentDispatch, CDBAgentDispatch::GetDispatchTable()); if (lpDBAgentDispatch) { return GameClientSendPacket::SendCharSiegeArmsCmdToDBAgent(lpDBAgentDispatch->GetSendStream(), 0, m_dwCID, 0, PktSiegeArmsCmd::SIEGE_DESTROY_ARMS, PktSiegeArmsCmd::NO_SERVER_ERR); } return false; } void CAirship::MoveTo(const Position& NewPosition) { CSiegeObject::MoveTo(NewPosition); for (int i=0; iMoveTo(NewPosition, false); } } } } unsigned char CAirship::IsRider(unsigned long dwCID) const { if (m_dwRiderCID == dwCID) { return Siege::RIDER_FOR_OWNER; } else { for (int i=0; iGetNation()) { m_dwPassengerCID[i] = dwCID; lpRider->Ride(m_dwCID); lpRider->SkillClear(); // Ride ÇÔ¼ö ÀÚü¿¡¼­ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ÆÐŶÀ» º¸³»ÁØ´Ù. PktSiegeArmsCmd pktSAC; pktSAC.m_dwCID = GetOwnerID(); pktSAC.m_dwArmsID = m_dwCID; pktSAC.m_cState = m_cState; pktSAC.m_dwValue = dwCID; pktSAC.m_cSubCmd = PktSiegeArmsCmd::SIEGE_RIDE_ARMS; char* szPacket = reinterpret_cast(&pktSAC); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktSiegeArmsCmd), CmdSiegeArmsCmd, 0, 0)) { SendToRange(Siege::BROADCAST_RADIUS, szPacket, sizeof(PktSiegeArmsCmd), CmdSiegeArmsCmd); } return true; } } } } return false; } bool CAirship::GetOff(unsigned long dwCID) { if (dwCID == m_dwRiderCID) { return CSiegeArms::GetOff(dwCID); } else if (Siege::NOT_RIDER != IsRider(dwCID)) { CCharacter* lpRider = CCreatureManager::GetInstance().GetCharacter(dwCID); if (lpRider) { for (int i=0; iGetOff(); // GetOff ÇÔ¼ö ÀÚü¿¡¼­ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ÆÐŶÀ» º¸³»ÁØ´Ù. PktSiegeArmsCmd pktSAC; pktSAC.m_dwCID = GetOwnerID(); pktSAC.m_dwArmsID = m_dwCID; pktSAC.m_cState = m_cState; pktSAC.m_dwValue = dwCID; pktSAC.m_cSubCmd = PktSiegeArmsCmd::SIEGE_GETOFF_ARMS; char* szPacket = reinterpret_cast(&pktSAC); if (PacketWrap::WrapCrypt(szPacket, sizeof(PktSiegeArmsCmd), CmdSiegeArmsCmd, 0, 0)) { SendToRange(Siege::BROADCAST_RADIUS, szPacket, sizeof(PktSiegeArmsCmd), CmdSiegeArmsCmd); } return true; } } } } return false; } void CAirship::AllGetOff() { // ÁÖÀÎÀÌ Å¸°í ÀÖÀ¸¸é, ÁÖÀκÎÅÍ ³»¸°´Ù. if (0 != m_dwRiderCID) { GetOff(m_dwRiderCID); } // ¼Õ´Ô ³»¸®±â for (int i=0; i