Files
DarkflameServer/dGame/dComponents/Property/PropertyVendorComponent.h
Aaron Kimbrell baf8b24ad1 fix: a property is rented only with the level's required mission
LWOPropertyVendorComponent::onCheckUseRequirements (0x00c2e210) lets a
player use the property guard only when the level's
property_required_mission (LoadConfigData 0x00c2e550) is finished. The
server opened the vendor and rented the property on any request.

The guard is now not opened without the mission, and a rent request
without it is answered with PropertyRentalResponse code 9, which
onPropertyRentalResponse (0x00c56d70) shows as "you failed to rent" with
UGG_PROPRENT_Dont_have_achievement. A mission that was finished and is
being repeated counts, as in the client's list of finished missions. A
guard without the key asks for nothing.

The six property maps name missions 768, 872, 873, 874, 1293 and 1322.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-10 15:28:18 -06:00

50 lines
2.0 KiB
C++

#pragma once
#include "Entity.h"
#include "Component.h"
#include "eReplicaComponentType.h"
/**
* The property guard that stands on a property before it's claimed, allows entities to attempt claiming this property.
*/
class PropertyVendorComponent final : public Component {
public:
static constexpr eReplicaComponentType ComponentType = eReplicaComponentType::PROPERTY_VENDOR;
explicit PropertyVendorComponent(Entity* parent, const int32_t componentID);
/**
* Handles a use event from some entity, if the property is cleared this allows the entity to claim it
* @param originator the entity that triggered this event
*/
bool OnRequestUse(GameMessages::RequestUseEvent& event);
/**
* Handles a property data query after the property has been claimed, sending information about the property to the
* triggering entity.
* @param originator the entity that triggered the event
* @param sysAddr the system address to send game message response to
*/
void OnQueryPropertyData(Entity* originator, const SystemAddress& sysAddr);
/**
* Claims the property
* @param originator the entity that attempted to claim the property
* @param confirmed unused
* @param lot unused
* @param count unused
*/
void OnBuyFromVendor(Entity* originator, bool confirmed, LOT lot, uint32_t count);
// PropertyRentalResponse code the client shows as "you failed to rent" with UGG_PROPRENT_Dont_have_achievement
// (LWOPropertyVendorComponent::onPropertyRentalResponse 0x00c56d70; 0 is a rented property)
static constexpr uint32_t RENTAL_MISSING_ACHIEVEMENT = 9;
// The level's property_required_mission (LWOPropertyVendorComponent::LoadConfigData 0x00c2e550), 0 without one
uint32_t GetRequiredMission() const;
// Whether the player has finished the level's property_required_mission, which the client asks for before the
// vendor can be used (LWOPropertyVendorComponent::onCheckUseRequirements 0x00c2e210). A vendor without the key
// asks for nothing here.
bool MayRent(Entity& player) const;
};