2021-12-05 17:54:36 +00:00
|
|
|
#include "ModelComponent.h"
|
|
|
|
#include "Entity.h"
|
|
|
|
|
2024-01-03 13:34:38 +00:00
|
|
|
#include "Game.h"
|
|
|
|
#include "Logger.h"
|
|
|
|
|
|
|
|
#include "BehaviorStates.h"
|
|
|
|
#include "ControlBehaviorMsgs.h"
|
|
|
|
|
2022-07-19 21:51:35 +00:00
|
|
|
ModelComponent::ModelComponent(Entity* parent) : Component(parent) {
|
|
|
|
m_OriginalPosition = m_Parent->GetDefaultPosition();
|
|
|
|
m_OriginalRotation = m_Parent->GetDefaultRotation();
|
2021-12-05 17:54:36 +00:00
|
|
|
|
|
|
|
m_userModelID = m_Parent->GetVarAs<LWOOBJID>(u"userModelID");
|
|
|
|
}
|
|
|
|
|
2023-08-10 21:33:15 +00:00
|
|
|
void ModelComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate) {
|
2022-07-19 21:51:35 +00:00
|
|
|
// ItemComponent Serialization. Pets do not get this serialization.
|
2023-03-04 07:16:37 +00:00
|
|
|
if (!m_Parent->HasComponent(eReplicaComponentType::PET)) {
|
2022-07-19 21:51:35 +00:00
|
|
|
outBitStream->Write1();
|
|
|
|
outBitStream->Write<LWOOBJID>(m_userModelID != LWOOBJID_EMPTY ? m_userModelID : m_Parent->GetObjectID());
|
|
|
|
outBitStream->Write<int>(0);
|
|
|
|
outBitStream->Write0();
|
|
|
|
}
|
2022-07-28 13:39:57 +00:00
|
|
|
|
2021-12-05 17:54:36 +00:00
|
|
|
//actual model component:
|
2022-07-19 21:51:35 +00:00
|
|
|
outBitStream->Write1(); // Yes we are writing model info
|
|
|
|
outBitStream->Write0(); // Is pickable
|
|
|
|
outBitStream->Write<uint32_t>(2); // Physics type
|
|
|
|
outBitStream->Write(m_OriginalPosition); // Original position
|
|
|
|
outBitStream->Write(m_OriginalRotation); // Original rotation
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2022-07-19 21:51:35 +00:00
|
|
|
outBitStream->Write1(); // We are writing behavior info
|
|
|
|
outBitStream->Write<uint32_t>(0); // Number of behaviors
|
|
|
|
outBitStream->Write1(); // Is this model paused
|
|
|
|
if (bIsInitialUpdate) outBitStream->Write0(); // We are not writing model editing info
|
2021-12-05 17:54:36 +00:00
|
|
|
}
|
2024-01-03 13:34:38 +00:00
|
|
|
|
|
|
|
void ModelComponent::UpdatePendingBehaviorId(const int32_t newId) {
|
|
|
|
for (auto& behavior : m_Behaviors) if (behavior.GetBehaviorId() == -1) behavior.SetBehaviorId(newId);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModelComponent::SendBehaviorListToClient(AMFArrayValue& args) const {
|
|
|
|
args.Insert("objectID", std::to_string(m_Parent->GetObjectID()));
|
|
|
|
|
|
|
|
auto* behaviorArray = args.InsertArray("behaviors");
|
|
|
|
for (auto& behavior : m_Behaviors) {
|
|
|
|
auto* behaviorArgs = behaviorArray->PushArray();
|
|
|
|
behavior.SendBehaviorListToClient(*behaviorArgs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModelComponent::VerifyBehaviors() {
|
|
|
|
for (auto& behavior : m_Behaviors) behavior.VerifyLastEditedState();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModelComponent::SendBehaviorBlocksToClient(int32_t behaviorToSend, AMFArrayValue& args) const {
|
|
|
|
args.Insert("BehaviorID", std::to_string(behaviorToSend));
|
|
|
|
args.Insert("objectID", std::to_string(m_Parent->GetObjectID()));
|
|
|
|
for (auto& behavior : m_Behaviors) if (behavior.GetBehaviorId() == behaviorToSend) behavior.SendBehaviorBlocksToClient(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModelComponent::AddBehavior(AddMessage& msg) {
|
|
|
|
// Can only have 1 of the loot behaviors
|
|
|
|
for (auto& behavior : m_Behaviors) if (behavior.GetBehaviorId() == msg.GetBehaviorId()) return;
|
|
|
|
m_Behaviors.insert(m_Behaviors.begin() + msg.GetBehaviorIndex(), PropertyBehavior());
|
|
|
|
m_Behaviors.at(msg.GetBehaviorIndex()).HandleMsg(msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ModelComponent::MoveToInventory(MoveToInventoryMessage& msg) {
|
|
|
|
if (msg.GetBehaviorIndex() >= m_Behaviors.size() || m_Behaviors.at(msg.GetBehaviorIndex()).GetBehaviorId() != msg.GetBehaviorId()) return;
|
|
|
|
m_Behaviors.erase(m_Behaviors.begin() + msg.GetBehaviorIndex());
|
|
|
|
// TODO move to the inventory
|
|
|
|
}
|