diff --git a/SDK b/SDK index 3ee7bc4ab..568e1bd39 160000 --- a/SDK +++ b/SDK @@ -1 +1 @@ -Subproject commit 3ee7bc4ab20c22359c34c08c38f93815b44bffd5 +Subproject commit 568e1bd39c0be9d0a76a1c5d915053e355262b1c diff --git a/Server/Components/CAPI/Impl/Objects/APIs.cpp b/Server/Components/CAPI/Impl/Objects/APIs.cpp index c869f7c29..e6fdf4d3b 100644 --- a/Server/Components/CAPI/Impl/Objects/APIs.cpp +++ b/Server/Components/CAPI/Impl/Objects/APIs.cpp @@ -821,10 +821,10 @@ OMP_CAPI(Player_GetSurfingPlayerObject, objectPtr(objectPtr player)) OMP_CAPI(Player_GetCameraTargetPlayerObject, objectPtr(objectPtr player)) { POOL_ENTITY_RET(players, IPlayer, player, player_, nullptr); - IObject* object = player_->getCameraTargetObject(); - if (object) + IPlayerCameraTargetData* data = queryExtension(player_); + if (!data) { - return object; + return nullptr; } - return nullptr; + return data->getCameraTargetPlayerObject(); } diff --git a/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp b/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp index 296a07b3a..41f97efbc 100644 --- a/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp +++ b/Server/Components/Pawn/Scripting/Object/PlayerNatives.cpp @@ -287,7 +287,12 @@ SCRIPT_API(GetPlayerSurfingPlayerObjectID, int(IPlayer& player)) SCRIPT_API(GetPlayerCameraTargetPlayerObj, int(IPlayer& player)) { - IObject* object = player.getCameraTargetObject(); + IPlayerCameraTargetData* data = queryExtension(player); + if (!data) + { + return INVALID_OBJECT_ID; + } + IPlayerObject* object = data->getCameraTargetPlayerObject(); if (object) { return object->getID(); diff --git a/Server/Source/player.cpp b/Server/Source/player.cpp index c503d5674..06f5e418b 100644 --- a/Server/Source/player.cpp +++ b/Server/Source/player.cpp @@ -123,23 +123,23 @@ IObject* Player::getCameraTargetObject() return nullptr; } - IObject* object = component->get(cameraTargetObject_); + return component->get(cameraTargetObject_); +} - if (!object) +IPlayerObject* PlayerCameraTargetData::getCameraTargetPlayerObject() +{ + if (!player_.enableCameraTargeting_) { - IPlayerObjectData* data = queryExtension(this); + return nullptr; + } - if (data) - { - IPlayerObject* player_object = data->get(cameraTargetObject_); - if (player_object) - { - return reinterpret_cast(player_object); - } - } + IPlayerObjectData* data = queryExtension(&player_); + if (!data) + { + return nullptr; } - return object; + return data->get(player_.cameraTargetObject_); } IPlayer* Player::getTargetPlayer() diff --git a/Server/Source/player_impl.hpp b/Server/Source/player_impl.hpp index 0d8eb820a..49dac14c5 100644 --- a/Server/Source/player_impl.hpp +++ b/Server/Source/player_impl.hpp @@ -53,6 +53,31 @@ enum SecondarySyncUpdateType SecondarySyncUpdateType_Trailer = (1 << 2), }; +struct Player; + +class PlayerCameraTargetData final : public IPlayerCameraTargetData +{ +private: + Player& player_; + +public: + PlayerCameraTargetData(Player& player) + : player_(player) + { + } + + IPlayerObject* getCameraTargetPlayerObject() override; + + void freeExtension() override + { + delete this; + } + + void reset() override + { + } +}; + struct Player final : public IPlayer, public PoolIDProvider, public NoCopy { PlayerPool& pool_; @@ -275,6 +300,7 @@ struct Player final : public IPlayer, public PoolIDProvider, public NoCopy { weapons_.fill({ 0, 0 }); skillLevels_.fill(MAX_SKILL_LEVEL); + addExtension(new PlayerCameraTargetData(*this), true); } void ban(StringView reason) override;