mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-08-05 18:24:12 +00:00
Mounts v2 (#726)
* Mounts -v2 * fix stun state and make comments a bit nicer * remove extra serilization * update the char position a bit more correctly * make vehicles face thr player's direction * address feedback * fix compiling for real this time * removed uneeded check
This commit is contained in:
@@ -653,6 +653,10 @@ void GameMessageHandler::HandleMessage(RakNet::BitStream* inStream, const System
|
||||
GameMessages::HandleUpdatePlayerStatistic(inStream, entity);
|
||||
break;
|
||||
|
||||
case GAME_MSG_DISMOUNT_COMPLETE:
|
||||
GameMessages::HandleDismountComplete(inStream, entity, sysAddr);
|
||||
break;
|
||||
|
||||
default:
|
||||
//Game::logger->Log("GameMessageHandler", "Unknown game message ID: %X", messageID);
|
||||
break;
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include "ChatPackets.h"
|
||||
#include "GameConfig.h"
|
||||
#include "RocketLaunchLupComponent.h"
|
||||
#include "eUnequippableActiveType.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <future>
|
||||
@@ -3414,7 +3415,7 @@ void GameMessages::SendRegisterPetDBID(LWOOBJID objectId, LWOOBJID petDBID, cons
|
||||
SEND_PACKET;
|
||||
}
|
||||
|
||||
void GameMessages::SendMarkInventoryItemAsActive(LWOOBJID objectId, bool bActive, int32_t iType, LWOOBJID itemID, const SystemAddress& sysAddr) {
|
||||
void GameMessages::SendMarkInventoryItemAsActive(LWOOBJID objectId, bool bActive, eUnequippableActiveType iType, LWOOBJID itemID, const SystemAddress& sysAddr) {
|
||||
CBITSTREAM;
|
||||
CMSGHEADER;
|
||||
|
||||
@@ -3423,8 +3424,8 @@ void GameMessages::SendMarkInventoryItemAsActive(LWOOBJID objectId, bool bActive
|
||||
|
||||
bitStream.Write(bActive);
|
||||
|
||||
bitStream.Write(iType != 0);
|
||||
if (iType != 0) bitStream.Write(iType);
|
||||
bitStream.Write(iType != eUnequippableActiveType::INVALID);
|
||||
if (iType != eUnequippableActiveType::INVALID) bitStream.Write(iType);
|
||||
|
||||
bitStream.Write(itemID != LWOOBJID_EMPTY);
|
||||
if (itemID != LWOOBJID_EMPTY) bitStream.Write(itemID);
|
||||
@@ -3861,7 +3862,6 @@ void GameMessages::SendDisplayChatBubble(LWOOBJID objectId, const std::u16string
|
||||
void GameMessages::SendSetMountInventoryID(Entity* entity, const LWOOBJID& objectID, const SystemAddress& sysAddr) {
|
||||
CBITSTREAM;
|
||||
CMSGHEADER;
|
||||
|
||||
bitStream.Write(entity->GetObjectID());
|
||||
bitStream.Write(GAME_MSG::GAME_MSG_SET_MOUNT_INVENTORY_ID);
|
||||
bitStream.Write(objectID);
|
||||
@@ -3871,30 +3871,53 @@ void GameMessages::SendSetMountInventoryID(Entity* entity, const LWOOBJID& objec
|
||||
|
||||
|
||||
void GameMessages::HandleDismountComplete(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) {
|
||||
// Get the objectID from the bitstream
|
||||
LWOOBJID objectId{};
|
||||
inStream->Read(objectId);
|
||||
auto* mount = EntityManager::Instance()->GetEntity(objectId);
|
||||
|
||||
// If we aren't possessing somethings, the don't do anything
|
||||
if (objectId != LWOOBJID_EMPTY) {
|
||||
PossessorComponent* possessor;
|
||||
if (entity->TryGetComponent(COMPONENT_TYPE_POSSESSOR, possessor)) {
|
||||
if (mount) {
|
||||
possessor->SetIsBusy(false);
|
||||
possessor->SetPossessable(LWOOBJID_EMPTY);
|
||||
possessor->SetPossessableType(ePossessionType::NO_POSSESSION);
|
||||
auto* possessorComponent = entity->GetComponent<PossessorComponent>();
|
||||
auto* mount = EntityManager::Instance()->GetEntity(objectId);
|
||||
// make sure we have the things we need and they aren't null
|
||||
if (possessorComponent && mount) {
|
||||
if (!possessorComponent->GetIsDismounting()) return;
|
||||
possessorComponent->SetIsDismounting(false);
|
||||
possessorComponent->SetPossessable(LWOOBJID_EMPTY);
|
||||
possessorComponent->SetPossessableType(ePossessionType::NO_POSSESSION);
|
||||
|
||||
GameMessages::SendSetStunned(entity->GetObjectID(), eStunState::POP, UNASSIGNED_SYSTEM_ADDRESS, LWOOBJID_EMPTY, true, false, true, false, false, false, false, true, true, true, true, true, true, true, true, true);
|
||||
|
||||
EntityManager::Instance()->SerializeEntity(entity);
|
||||
// character related things
|
||||
auto* character = entity->GetComponent<CharacterComponent>();
|
||||
if (character) {
|
||||
// If we had an active item turn it off
|
||||
if (possessorComponent->GetMountItemID() != LWOOBJID_EMPTY) GameMessages::SendMarkInventoryItemAsActive(entity->GetObjectID(), false, eUnequippableActiveType::MOUNT, possessorComponent->GetMountItemID(), entity->GetSystemAddress());
|
||||
possessorComponent->SetMountItemID(LWOOBJID_EMPTY);
|
||||
}
|
||||
|
||||
// Set that the controllabel phsyics comp is teleporting
|
||||
auto* controllablePhysicsComponent = entity->GetComponent<ControllablePhysicsComponent>();
|
||||
if (controllablePhysicsComponent) controllablePhysicsComponent->SetIsTeleporting(true);
|
||||
|
||||
// Call dismoint on the possessable comp to let it handle killing the possessable
|
||||
auto* possessableComponent = mount->GetComponent<PossessableComponent>();
|
||||
if (possessableComponent) possessableComponent->Dismount();
|
||||
|
||||
// Update the entity that was possessing
|
||||
EntityManager::Instance()->SerializeEntity(entity);
|
||||
|
||||
// We aren't mounted so remove the stun
|
||||
GameMessages::SendSetStunned(entity->GetObjectID(), eStunState::POP, UNASSIGNED_SYSTEM_ADDRESS, LWOOBJID_EMPTY, true, false, true, false, false, false, false, true, true, true, true, true, true, true, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void GameMessages::HandleAcknowledgePossession(RakNet::BitStream* inStream, Entity* entity, const SystemAddress& sysAddr) {
|
||||
Game::logger->Log("HandleAcknowledgePossession", "Got AcknowledgePossession from %i", entity->GetLOT());
|
||||
EntityManager::Instance()->SerializeEntity(entity);
|
||||
LWOOBJID objectId{};
|
||||
inStream->Read(objectId);
|
||||
auto* mount = EntityManager::Instance()->GetEntity(objectId);
|
||||
if (mount) EntityManager::Instance()->SerializeEntity(mount);
|
||||
}
|
||||
|
||||
//Racing
|
||||
|
@@ -19,6 +19,7 @@ class NiQuaternion;
|
||||
class User;
|
||||
class Entity;
|
||||
class NiPoint3;
|
||||
enum class eUnequippableActiveType;
|
||||
|
||||
namespace GameMessages {
|
||||
class PropertyDataMessage;
|
||||
@@ -318,7 +319,7 @@ namespace GameMessages {
|
||||
|
||||
void SendRegisterPetDBID(LWOOBJID objectId, LWOOBJID petDBID, const SystemAddress& sysAddr);
|
||||
|
||||
void SendMarkInventoryItemAsActive(LWOOBJID objectId, bool bActive, int32_t iType, LWOOBJID itemID, const SystemAddress& sysAddr);
|
||||
void SendMarkInventoryItemAsActive(LWOOBJID objectId, bool bActive, eUnequippableActiveType iType, LWOOBJID itemID, const SystemAddress& sysAddr);
|
||||
|
||||
void SendClientExitTamingMinigame(LWOOBJID objectId, bool bVoluntaryExit, const SystemAddress& sysAddr);
|
||||
|
||||
|
Reference in New Issue
Block a user