diff --git a/dGame/dComponents/InventoryComponent.cpp b/dGame/dComponents/InventoryComponent.cpp index 922b2de3..f1bd8db7 100644 --- a/dGame/dComponents/InventoryComponent.cpp +++ b/dGame/dComponents/InventoryComponent.cpp @@ -23,6 +23,7 @@ #include "CharacterComponent.h" #include "dZoneManager.h" #include "PropertyManagementComponent.h" +#include "DestroyableComponent.h" InventoryComponent::InventoryComponent(Entity* parent, tinyxml2::XMLDocument* document) : Component(parent) { @@ -909,27 +910,45 @@ void InventoryComponent::EquipItem(Item* item, const bool skipChecks) const auto type = static_cast(item->GetInfo().itemType); - if (item->GetLot() == 8092 && m_Parent->GetGMLevel() >= GAME_MASTER_LEVEL_DEVELOPER) - { + if (item->GetLot() == 8092 && m_Parent->GetGMLevel() >= GAME_MASTER_LEVEL_OPERATOR && hasCarEquipped == false) + { + auto startPosition = m_Parent->GetPosition(); + + auto startRotation = NiQuaternion::LookAt(startPosition, startPosition + NiPoint3::UNIT_X); + auto angles = startRotation.GetEulerAngles(); + angles.y -= PI; + startRotation = NiQuaternion::FromEulerAngles(angles); + + GameMessages::SendTeleport(m_Parent->GetObjectID(), startPosition, startRotation, m_Parent->GetSystemAddress(), true, true); + EntityInfo info {}; info.lot = 8092; - info.pos = m_Parent->GetPosition(); - info.rot = m_Parent->GetRotation(); + info.pos = startPosition; + info.rot = startRotation; info.spawnerID = m_Parent->GetObjectID(); - auto* carEntity = EntityManager::Instance()->CreateEntity(info, nullptr, dZoneManager::Instance()->GetZoneControlObject()); - dZoneManager::Instance()->GetZoneControlObject()->AddChild(carEntity); + auto* carEntity = EntityManager::Instance()->CreateEntity(info, nullptr, m_Parent); + m_Parent->AddChild(carEntity); + auto *destroyableComponent = carEntity->GetComponent(); + + // Setup the vehicle stats. + if (destroyableComponent != nullptr) { + destroyableComponent->SetIsSmashable(false); + destroyableComponent->SetIsImmune(true); + } + // #108 auto* possessableComponent = carEntity->GetComponent(); if (possessableComponent != nullptr) { + previousPossessableID = possessableComponent->GetPossessor(); possessableComponent->SetPossessor(m_Parent->GetObjectID()); } auto* moduleAssemblyComponent = carEntity->GetComponent(); - if (moduleAssemblyComponent) + if (moduleAssemblyComponent != nullptr) { moduleAssemblyComponent->SetSubKey(item->GetSubKey()); moduleAssemblyComponent->SetUseOptionalParts(false); @@ -942,11 +961,12 @@ void InventoryComponent::EquipItem(Item* item, const bool skipChecks) } } } - + // #107 auto* possessorComponent = m_Parent->GetComponent(); if (possessorComponent != nullptr) { + previousPossessorID = possessorComponent->GetPossessable(); possessorComponent->SetPossessable(carEntity->GetObjectID()); } @@ -960,13 +980,26 @@ void InventoryComponent::EquipItem(Item* item, const bool skipChecks) EntityManager::Instance()->ConstructEntity(carEntity); EntityManager::Instance()->SerializeEntity(m_Parent); - //EntityManager::Instance()->SerializeEntity(dZoneManager::Instance()->GetZoneControlObject()); + GameMessages::SendSetJetPackMode(m_Parent, false); - GameMessages::SendNotifyVehicleOfRacingObject(carEntity->GetObjectID(), dZoneManager::Instance()->GetZoneControlObject()->GetObjectID(), UNASSIGNED_SYSTEM_ADDRESS); - GameMessages::SendRacingPlayerLoaded(m_Parent->GetObjectID(), m_Parent->GetObjectID(), carEntity->GetObjectID(), UNASSIGNED_SYSTEM_ADDRESS); + GameMessages::SendNotifyVehicleOfRacingObject(carEntity->GetObjectID(), m_Parent->GetObjectID(), UNASSIGNED_SYSTEM_ADDRESS); + GameMessages::SendRacingPlayerLoaded(LWOOBJID_EMPTY, m_Parent->GetObjectID(), carEntity->GetObjectID(), UNASSIGNED_SYSTEM_ADDRESS); GameMessages::SendVehicleUnlockInput(carEntity->GetObjectID(), false, UNASSIGNED_SYSTEM_ADDRESS); - //GameMessages::SendVehicleSetWheelLockState(carEntity->GetObjectID(), false, false, UNASSIGNED_SYSTEM_ADDRESS); + GameMessages::SendTeleport(m_Parent->GetObjectID(), startPosition, startRotation, m_Parent->GetSystemAddress(), true, true); + GameMessages::SendTeleport(carEntity->GetObjectID(), startPosition, startRotation, m_Parent->GetSystemAddress(), true, true); + EntityManager::Instance()->SerializeEntity(m_Parent); + hasCarEquipped = true; + equippedCarEntity = carEntity; + return; + } else if (item->GetLot() == 8092 && m_Parent->GetGMLevel() >= GAME_MASTER_LEVEL_OPERATOR && hasCarEquipped == true) + { + GameMessages::SendNotifyRacingClient(LWOOBJID_EMPTY, 3, 0, LWOOBJID_EMPTY, u"", m_Parent->GetObjectID(), UNASSIGNED_SYSTEM_ADDRESS); + auto player = dynamic_cast(m_Parent); + player->SendToZone(player->GetCharacter()->GetZoneID()); + equippedCarEntity->Kill(); + hasCarEquipped = false; + equippedCarEntity = nullptr; return; } diff --git a/dGame/dComponents/InventoryComponent.h b/dGame/dComponents/InventoryComponent.h index 7082cfff..7c62170d 100644 --- a/dGame/dComponents/InventoryComponent.h +++ b/dGame/dComponents/InventoryComponent.h @@ -15,6 +15,7 @@ #include "Component.h" #include "ItemSetPassiveAbility.h" #include "ItemSetPassiveAbilityID.h" +#include "PossessorComponent.h" class Entity; class ItemSet; @@ -384,6 +385,13 @@ private: */ LOT m_Consumable; + /** + * Currently has a car equipped + */ + bool hasCarEquipped = false; + Entity* equippedCarEntity = nullptr; + LWOOBJID previousPossessableID = LWOOBJID_EMPTY; + LWOOBJID previousPossessorID = LWOOBJID_EMPTY; /** * Creates all the proxy items (subitems) for a parent item * @param parent the parent item to generate all the subitems for