mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-04-26 16:46:31 +00:00
PetFlag system now functioning correctly
This commit is contained in:
parent
e01fbfcc64
commit
9add2c944e
@ -86,7 +86,7 @@ PetComponent::PetComponent(Entity* parent, uint32_t componentId): Component(pare
|
|||||||
m_TimerAway = 0;
|
m_TimerAway = 0;
|
||||||
m_TimerBounce = 0;
|
m_TimerBounce = 0;
|
||||||
m_DatabaseId = LWOOBJID_EMPTY;
|
m_DatabaseId = LWOOBJID_EMPTY;
|
||||||
m_Flags = 1 << PetFlag::TAMEABLE; // Tameable
|
m_Flags = PetFlag::TAMEABLE; // Tameable
|
||||||
m_Ability = ePetAbilityType::Invalid;
|
m_Ability = ePetAbilityType::Invalid;
|
||||||
m_StartPosition = m_Parent->GetPosition(); //NiPoint3::ZERO;
|
m_StartPosition = m_Parent->GetPosition(); //NiPoint3::ZERO;
|
||||||
m_MovementAI = nullptr;
|
m_MovementAI = nullptr;
|
||||||
@ -720,7 +720,7 @@ void PetComponent::ClientExitTamingMinigame(bool voluntaryExit) {
|
|||||||
|
|
||||||
currentActivities.erase(m_Tamer);
|
currentActivities.erase(m_Tamer);
|
||||||
|
|
||||||
SetStatus(1 << PetFlag::TAMEABLE);
|
SetStatus(PetFlag::TAMEABLE);
|
||||||
m_Tamer = LWOOBJID_EMPTY;
|
m_Tamer = LWOOBJID_EMPTY;
|
||||||
m_Timer = 0;
|
m_Timer = 0;
|
||||||
|
|
||||||
@ -771,7 +771,7 @@ void PetComponent::ClientFailTamingMinigame() {
|
|||||||
|
|
||||||
currentActivities.erase(m_Tamer);
|
currentActivities.erase(m_Tamer);
|
||||||
|
|
||||||
SetStatus(1 << PetFlag::TAMEABLE);
|
SetStatus(PetFlag::TAMEABLE);
|
||||||
m_Tamer = LWOOBJID_EMPTY;
|
m_Tamer = LWOOBJID_EMPTY;
|
||||||
m_Timer = 0;
|
m_Timer = 0;
|
||||||
|
|
||||||
@ -836,7 +836,7 @@ void PetComponent::OnSpawn() {
|
|||||||
m_Parent->SetOwnerOverride(m_Owner);
|
m_Parent->SetOwnerOverride(m_Owner);
|
||||||
m_MovementAI->SetMaxSpeed(m_SprintSpeed);
|
m_MovementAI->SetMaxSpeed(m_SprintSpeed);
|
||||||
m_MovementAI->SetHaltDistance(m_FollowRadius);
|
m_MovementAI->SetHaltDistance(m_FollowRadius);
|
||||||
SetStatus(1 << PetFlag::NONE);
|
SetStatus(PetFlag::NONE);
|
||||||
SetPetAiState(PetAiState::follow);
|
SetPetAiState(PetAiState::follow);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -947,7 +947,7 @@ void PetComponent::StopInteract() {
|
|||||||
SetInteractType(PetInteractType::none);
|
SetInteractType(PetInteractType::none);
|
||||||
SetAbility(petAbility);
|
SetAbility(petAbility);
|
||||||
SetPetAiState(PetAiState::follow);
|
SetPetAiState(PetAiState::follow);
|
||||||
SetStatus(1 << PetFlag::NONE);
|
SetStatus(PetFlag::NONE);
|
||||||
SetIsReadyToInteract(false);
|
SetIsReadyToInteract(false);
|
||||||
SetIsHandlingInteraction(false); // Needed?
|
SetIsHandlingInteraction(false); // Needed?
|
||||||
m_MovementAI->SetMaxSpeed(m_SprintSpeed);
|
m_MovementAI->SetMaxSpeed(m_SprintSpeed);
|
||||||
@ -977,7 +977,7 @@ void PetComponent::SetupInteractTreasureDig() {
|
|||||||
auto petAbility = ePetAbilityType::DigAtPosition;
|
auto petAbility = ePetAbilityType::DigAtPosition;
|
||||||
|
|
||||||
SetAbility(petAbility);
|
SetAbility(petAbility);
|
||||||
SetStatus(1 << PetFlag::NOT_WAITING); // TODO: Double-check this is the right flag being set
|
SetStatus(PetFlag::NOT_WAITING); // TODO: Double-check this is the right flag being set
|
||||||
Game::entityManager->SerializeEntity(m_Parent); // TODO: Double-check pet packet captures
|
Game::entityManager->SerializeEntity(m_Parent); // TODO: Double-check pet packet captures
|
||||||
|
|
||||||
const auto sysAddr = owner->GetSystemAddress();
|
const auto sysAddr = owner->GetSystemAddress();
|
||||||
@ -1054,7 +1054,7 @@ void PetComponent::Activate(Item* item, bool registerPet, bool fromTaming) { //
|
|||||||
auto* owner = GetOwner();
|
auto* owner = GetOwner();
|
||||||
|
|
||||||
if (owner == nullptr) return;
|
if (owner == nullptr) return;
|
||||||
SetStatus(1 << PetFlag::SPAWNING);
|
SetFlag(SPAWNING); //SetStatus(PetFlag::SPAWNING);
|
||||||
|
|
||||||
auto databaseData = inventoryComponent->GetDatabasePet(m_DatabaseId);
|
auto databaseData = inventoryComponent->GetDatabasePet(m_DatabaseId);
|
||||||
|
|
||||||
|
@ -34,23 +34,15 @@ enum PetInteractType : uint8_t {
|
|||||||
*/
|
*/
|
||||||
enum PetFlag : uint32_t {
|
enum PetFlag : uint32_t {
|
||||||
NONE,
|
NONE,
|
||||||
BEING_TAMED = 4,
|
BEING_TAMED = 1 << 4, //0x10,
|
||||||
NOT_WAITING = 5,
|
NOT_WAITING = 1 << 5, //0x20,
|
||||||
SPAWNING = 7,
|
SPAWNING = 1 << 7, //0x80
|
||||||
TAMEABLE = 8
|
TAMEABLE = 1 << 26 //0x4000000
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* DEPRECATED The status of the pet: Governs the icon above their head and the interactions available
|
* The pet emote animation ids that can used in PetComponent::Command()
|
||||||
*/
|
*/
|
||||||
/*enum PetStatus : uint32_t {
|
|
||||||
NONE,
|
|
||||||
BEING_TAMED = 1 << 4, //PetFlag::BEING_TAMED, //0x10,
|
|
||||||
IS_NOT_WAITING = 1 << 5, //PetFlag::NOT_WAITING, //0x20,
|
|
||||||
PLAY_SPAWN_ANIM = 1 << 7, //PetFlag::PLAY_SPAWN_ANIM, //0x80,
|
|
||||||
TAMEABLE = 1 << 8 // PetFlag::TAMEABLE //0x4000000
|
|
||||||
};*/
|
|
||||||
|
|
||||||
enum PetEmote : int32_t {
|
enum PetEmote : int32_t {
|
||||||
ActivateSwitch = 201,
|
ActivateSwitch = 201,
|
||||||
DigTreasure,
|
DigTreasure,
|
||||||
@ -93,36 +85,43 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets one or more pet flags
|
* Sets one or more pet flags
|
||||||
|
* @param flag PetFlag(s) to set
|
||||||
*/
|
*/
|
||||||
template <typename... varArg>
|
template <typename... varArg>
|
||||||
void SetFlag(varArg... flag) {
|
void SetFlag(varArg... flag) { m_Flags |= (static_cast<uint32_t>(flag) | ...); }
|
||||||
const auto initFlags = m_Flags;
|
|
||||||
m_Flags |= (static_cast<uint32_t>(1 << flag) | ...);
|
/**
|
||||||
LOG_DEBUG("SetFlag: %d + %d = %d", initFlags, 1 << (flag | ...), m_Flags);
|
* Sets the pet to ONLY have the specified flag(s), clearing all others
|
||||||
}
|
* @param flag PetFlag(s) to set exclusively
|
||||||
|
*/
|
||||||
|
template <typename... varArg>
|
||||||
|
void SetOnlyFlag(varArg... flag) { m_Flags = (static_cast<uint32_t>(flag) | ...); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unsets one or more pet flags
|
* Unsets one or more pet flags
|
||||||
|
* @param flag PetFlag(s) to unset
|
||||||
*/
|
*/
|
||||||
template <typename... varArg>
|
template <typename... varArg>
|
||||||
void UnsetFlag(varArg... flag) {
|
void UnsetFlag(varArg... flag) { m_Flags &= ~(static_cast<uint32_t>(flag) | ...); }
|
||||||
const auto initFlags = m_Flags;
|
|
||||||
m_Flags &= ~(static_cast<uint32_t>(1 << flag) | ...);
|
|
||||||
LOG_DEBUG("UnsetFlag: %d - %d = %d", initFlags, 1 << (flag | ...), m_Flags);
|
|
||||||
} // THIS IS PROBLEMATIC
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets one or more pet flags
|
* Returns true if the pet has all the specified flag(s)
|
||||||
|
* @param flag PetFlag(s) to check
|
||||||
*/
|
*/
|
||||||
template <typename... varArg>
|
template <typename... varArg>
|
||||||
const bool HasFlag(varArg... flag) {
|
const bool HasFlag(varArg... flag) { return (m_Flags & (static_cast<uint32_t>(flag) | ...)) == (static_cast<uint32_t>(flag) | ...); }
|
||||||
const auto lside = (m_Flags & (static_cast<uint32_t>(1 << flag) | ...));
|
|
||||||
const auto rside = (static_cast<uint32_t>(1 << flag) | ...);
|
|
||||||
LOG_DEBUG("HasFlag: %d == %d", lside, rside);
|
|
||||||
return lside == rside;
|
|
||||||
//return (m_Flags & (static_cast<uint32_t>(flag) | ...)) == (static_cast<uint32_t>(flag) | ...);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the pet has ONLY the specified flag(s)
|
||||||
|
* @param flag PetFlag(s) to check if the pet has exclusively
|
||||||
|
*/
|
||||||
|
template <typename... varArg>
|
||||||
|
const bool HasOnlyFlag(varArg... flag) { return m_Flags == (static_cast<uint32_t>(flag) | ...); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Governs the pet update loop
|
||||||
|
* @param deltaTime Time elapsed since last update
|
||||||
|
*/
|
||||||
void Update(float deltaTime) override;
|
void Update(float deltaTime) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -22,9 +22,7 @@ protected:
|
|||||||
petComponent = baseEntity->AddComponent<PetComponent>(1);
|
petComponent = baseEntity->AddComponent<PetComponent>(1);
|
||||||
|
|
||||||
// Initialize some values to be not default
|
// Initialize some values to be not default
|
||||||
petComponent->SetStatus(0);
|
|
||||||
petComponent->SetPetAiState(PetAiState::spawn);
|
|
||||||
petComponent->SetAbility(ePetAbilityType::Invalid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TearDown() override {
|
void TearDown() override {
|
||||||
@ -34,11 +32,14 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(PetTest, PlacementNewAddComponentTest) {
|
TEST_F(PetTest, PlacementNewAddComponentTest) {
|
||||||
|
// Test adding component
|
||||||
ASSERT_NE(petComponent, nullptr);
|
ASSERT_NE(petComponent, nullptr);
|
||||||
baseEntity->AddComponent<PetComponent>(1);
|
baseEntity->AddComponent<PetComponent>(1);
|
||||||
ASSERT_NE(baseEntity->GetComponent<PetComponent>(), nullptr);
|
ASSERT_NE(baseEntity->GetComponent<PetComponent>(), nullptr);
|
||||||
|
|
||||||
|
// Test getting initial status
|
||||||
ASSERT_EQ(petComponent->GetParent()->GetObjectID(), 15);
|
ASSERT_EQ(petComponent->GetParent()->GetObjectID(), 15);
|
||||||
ASSERT_EQ(petComponent->GetStatus(), PetFlag::NONE);
|
ASSERT_TRUE(petComponent->HasFlag(NONE));
|
||||||
ASSERT_EQ(petComponent->GetPetAiState(), PetAiState::spawn);
|
ASSERT_EQ(petComponent->GetPetAiState(), PetAiState::spawn);
|
||||||
ASSERT_EQ(petComponent->GetAbility(), ePetAbilityType::Invalid);
|
ASSERT_EQ(petComponent->GetAbility(), ePetAbilityType::Invalid);
|
||||||
}
|
}
|
||||||
@ -47,12 +48,36 @@ TEST_F(PetTest, PlacementNewAddComponentTest) {
|
|||||||
* Test bitset pet flags
|
* Test bitset pet flags
|
||||||
*/
|
*/
|
||||||
TEST_F(PetTest, PetComponentFlagTest) {
|
TEST_F(PetTest, PetComponentFlagTest) {
|
||||||
// Test setting and reading single flags
|
// Test setting and reading single flags, exclusively
|
||||||
|
petComponent->SetOnlyFlag(NONE);
|
||||||
|
ASSERT_TRUE(petComponent->HasOnlyFlag(NONE));
|
||||||
|
petComponent->SetOnlyFlag(TAMEABLE);
|
||||||
|
ASSERT_TRUE(petComponent->HasOnlyFlag(TAMEABLE));
|
||||||
|
ASSERT_FALSE(petComponent->HasOnlyFlag(SPAWNING));
|
||||||
|
|
||||||
|
// Test setting and reading multiple flags, exclusively
|
||||||
|
petComponent->SetOnlyFlag(NOT_WAITING, SPAWNING);
|
||||||
|
ASSERT_FALSE(petComponent->HasFlag(TAMEABLE));
|
||||||
|
ASSERT_TRUE(petComponent->HasFlag(NOT_WAITING));
|
||||||
|
ASSERT_TRUE(petComponent->HasFlag(SPAWNING));
|
||||||
|
ASSERT_TRUE(petComponent->HasFlag(NOT_WAITING, SPAWNING));
|
||||||
|
ASSERT_FALSE(petComponent->HasOnlyFlag(NOT_WAITING));
|
||||||
|
ASSERT_FALSE(petComponent->HasOnlyFlag(SPAWNING));
|
||||||
|
ASSERT_TRUE(petComponent->HasOnlyFlag(NOT_WAITING, SPAWNING));
|
||||||
|
|
||||||
|
// Test flags are being properly reset for next batch of tests
|
||||||
|
petComponent->SetOnlyFlag(NONE);
|
||||||
|
ASSERT_TRUE(petComponent->HasFlag(NONE));
|
||||||
|
ASSERT_TRUE(petComponent->HasOnlyFlag(NONE));
|
||||||
|
ASSERT_FALSE(petComponent->HasFlag(NOT_WAITING));
|
||||||
|
ASSERT_FALSE(petComponent->HasFlag(NOT_WAITING, SPAWNING, TAMEABLE));
|
||||||
|
|
||||||
|
// Test setting and reading single flags, non-exclusively
|
||||||
petComponent->SetFlag(NOT_WAITING);
|
petComponent->SetFlag(NOT_WAITING);
|
||||||
ASSERT_TRUE(petComponent->HasFlag(NOT_WAITING));
|
ASSERT_TRUE(petComponent->HasFlag(NOT_WAITING));
|
||||||
ASSERT_FALSE(petComponent->HasFlag(SPAWNING));
|
ASSERT_FALSE(petComponent->HasFlag(SPAWNING));
|
||||||
|
|
||||||
// Test setting and reading multiple flags
|
// Test setting and reading multiple flags, non-exclusively
|
||||||
petComponent->SetFlag(TAMEABLE, BEING_TAMED);
|
petComponent->SetFlag(TAMEABLE, BEING_TAMED);
|
||||||
ASSERT_TRUE(petComponent->HasFlag(TAMEABLE, BEING_TAMED));
|
ASSERT_TRUE(petComponent->HasFlag(TAMEABLE, BEING_TAMED));
|
||||||
ASSERT_TRUE(petComponent->HasFlag(NOT_WAITING));
|
ASSERT_TRUE(petComponent->HasFlag(NOT_WAITING));
|
||||||
@ -61,7 +86,7 @@ TEST_F(PetTest, PetComponentFlagTest) {
|
|||||||
ASSERT_FALSE(petComponent->HasFlag(SPAWNING));
|
ASSERT_FALSE(petComponent->HasFlag(SPAWNING));
|
||||||
ASSERT_FALSE(petComponent->HasFlag(SPAWNING, NOT_WAITING, TAMEABLE, BEING_TAMED));
|
ASSERT_FALSE(petComponent->HasFlag(SPAWNING, NOT_WAITING, TAMEABLE, BEING_TAMED));
|
||||||
|
|
||||||
// Test unsetting and reading multiple flags
|
// Test unsetting and reading multiple flags, non-exclusively
|
||||||
petComponent->UnsetFlag(NOT_WAITING, SPAWNING);
|
petComponent->UnsetFlag(NOT_WAITING, SPAWNING);
|
||||||
ASSERT_FALSE(petComponent->HasFlag(NOT_WAITING, SPAWNING));
|
ASSERT_FALSE(petComponent->HasFlag(NOT_WAITING, SPAWNING));
|
||||||
ASSERT_FALSE(petComponent->HasFlag(NOT_WAITING));
|
ASSERT_FALSE(petComponent->HasFlag(NOT_WAITING));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user