mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2025-08-06 10:44:08 +00:00
update component names, document heirarchy
This commit is contained in:
@@ -11,7 +11,7 @@ set(DGAME_DCOMPONENTS_SOURCES "BaseCombatAIComponent.cpp"
|
||||
"LUPExhibitComponent.cpp"
|
||||
"MissionComponent.cpp"
|
||||
"MissionOfferComponent.cpp"
|
||||
"ModelComponent.cpp"
|
||||
"ModelBehaviorComponent.cpp"
|
||||
"ModuleAssemblyComponent.cpp"
|
||||
"MovementAIComponent.cpp"
|
||||
"MovingPlatformComponent.cpp"
|
||||
@@ -30,7 +30,7 @@ set(DGAME_DCOMPONENTS_SOURCES "BaseCombatAIComponent.cpp"
|
||||
"RebuildComponent.cpp"
|
||||
"RenderComponent.cpp"
|
||||
"RigidbodyPhantomPhysicsComponent.cpp"
|
||||
"RocketLaunchLupComponent.cpp"
|
||||
"MultiZoneEntranceComponent.cpp"
|
||||
"RocketLaunchpadControlComponent.cpp"
|
||||
"ScriptedActivityComponent.cpp"
|
||||
"ShootingGalleryComponent.cpp"
|
||||
@@ -39,5 +39,5 @@ set(DGAME_DCOMPONENTS_SOURCES "BaseCombatAIComponent.cpp"
|
||||
"SoundTriggerComponent.cpp"
|
||||
"SwitchComponent.cpp"
|
||||
"TriggerComponent.cpp"
|
||||
"VehiclePhysicsComponent.cpp"
|
||||
"HavokVehiclePhysicsComponent.cpp"
|
||||
"VendorComponent.cpp" PARENT_SCOPE)
|
||||
|
@@ -10,7 +10,6 @@
|
||||
#include "InventoryComponent.h"
|
||||
#include "ControllablePhysicsComponent.h"
|
||||
#include "EntityManager.h"
|
||||
#include "VehiclePhysicsComponent.h"
|
||||
#include "GameMessages.h"
|
||||
#include "Item.h"
|
||||
#include "Amf3.h"
|
||||
|
148
dGame/dComponents/ComponentHeirachy.md
Normal file
148
dGame/dComponents/ComponentHeirachy.md
Normal file
@@ -0,0 +1,148 @@
|
||||
Legend
|
||||
```
|
||||
├── Explicit inheritance
|
||||
├~~ Loaded with Parent
|
||||
├-> SubComponent
|
||||
├-? idk lol, but related
|
||||
```
|
||||
|
||||
|
||||
```tree
|
||||
|
||||
LWOActivityComponent
|
||||
├── LWOShootingGalleryComponent
|
||||
├── LWOScriptedActivityComponent
|
||||
└── LWOBaseRacingControlComponent
|
||||
├── LWORacingControlComponent
|
||||
└── LWOGateRushControlComponent
|
||||
├── LWOQuickBuildComponent
|
||||
├── LWOMiniGameControlComponent
|
||||
LWOBaseCombatAIComponent
|
||||
├~~ LWOPathfindingControlComponent
|
||||
├~~ LWOProximityMonitorComponent
|
||||
LWOBasePhysComponent
|
||||
├── LWORigidBodyPhantomComponent
|
||||
├── LWOPhantomPhysComponent
|
||||
├── LWOVehiclePhysicsComponent
|
||||
├── LWOSimplePhysComponent
|
||||
├── LWOPhysicsSystemComponent
|
||||
├── LWOHavokVehiclePhysicsComponent
|
||||
├── LWOControllablePhysComponent
|
||||
LWOBaseRenderComponent
|
||||
├── LWOSkinnedRenderComponent
|
||||
LWOBaseVendorComponent
|
||||
├── LWOVendorComponent
|
||||
├~~ LWOProximityMonitorComponent
|
||||
├── LWODonationVendorComponent
|
||||
├~~ LWOProximityMonitorComponent
|
||||
├── LWOAchievementVendorComponent
|
||||
├~~ LWOProximityMonitorComponent
|
||||
LWOBBBComponent_Common
|
||||
├── LWOBBBComponent_Client
|
||||
LWOBlueprintComponent
|
||||
LWOBouncerComponent
|
||||
LWOBuildControllerComponentCommon
|
||||
├── LWOBuildControllerComponent
|
||||
LWOChangelingBuildComponent
|
||||
LWOCharacterComponent
|
||||
├── LWOMinifigComponent
|
||||
├~~ LWOPossessionControlComponent
|
||||
├~~ LWOMountControlComponent
|
||||
├~~ LWOPetCreatorComponent
|
||||
├~~ LWOLevelProgressionComponent
|
||||
├~~ LWOPlayerForcedMovementComponent
|
||||
├~? LWOPathfindingControlComponent
|
||||
LWOChestComponent
|
||||
LWOChoiceBuildComponent
|
||||
LWOCollectibleComponent
|
||||
LWOCustomBuildAssemblyComponent
|
||||
LWODestroyableComponent
|
||||
├~~ LWOBuffComponent
|
||||
├~~ LWOStatusEffectComponent
|
||||
LWODropEffectComponent
|
||||
LWODroppedLootComponent
|
||||
LWOExhibitComponent
|
||||
LWOFXComponent
|
||||
LWOGenericActivatorComponent
|
||||
LWOGhostComponent
|
||||
LWOHFLightDirectionGadgetComponent
|
||||
LWOInventoryComponent_Common
|
||||
├── LWOInventoryComponent_Client
|
||||
└── LWOInventoryComponent_EquippedItem
|
||||
LWOItemComponent
|
||||
LWOLUPExhibitComponent
|
||||
LWOMissionOfferComponent
|
||||
LWOModelBehaviorComponent
|
||||
├~~ LWOSimplePhysComponent
|
||||
├~~ LWOControllablePhysComponent
|
||||
├~~ LWOPathfindingControlComponent
|
||||
├~~ LWOMutableModelBehaviorComponent
|
||||
LWOModelBuilderComponent
|
||||
LWOModularBuildComponentCommon
|
||||
├── LWOModularBuildComponent
|
||||
LWOModuleAssemblyComponent
|
||||
├── LWOModuleAssemblyComponentCommon
|
||||
LWOModuleComponentCommon
|
||||
├── LWOModuleComponent
|
||||
LWOMovementAIComponent
|
||||
LWOMultiZoneEntranceComponent
|
||||
LWOOverheadIconComponent
|
||||
LWOPetComponent
|
||||
├~~ LWOPathfindingControlComponent
|
||||
├~? LWOItemComponent
|
||||
├~? LWOModelBehaviorComponent
|
||||
├~~ ...
|
||||
LWOPlatformBoundaryComponent
|
||||
LWOPlatformComponent
|
||||
├-> LWOMoverPlatformSubComponent
|
||||
├-> LWOSimpleMoverPlatformSubComponent
|
||||
├-> LWORotaterPlatformSubComponent
|
||||
LWOProjectilePhysComponent
|
||||
LWOPropertyComponent
|
||||
LWOPropertyEntranceComponent
|
||||
LWOPropertyManagementComponent
|
||||
LWOPropertyVendorComponent
|
||||
LWOProximityMonitorComponent
|
||||
LWOSoundTriggerComponent
|
||||
├── LWORacingSoundTriggerComponent
|
||||
LWORacingStatsComponentCommon
|
||||
├── LWORacingStatsComponent
|
||||
LWORocketAnimationControlComponentCommon
|
||||
├── LWORocketAnimationControlComponent
|
||||
LWORocketLaunchpadControlComponentCommon
|
||||
├── LWORocketLaunchpadControlComponent
|
||||
LWOScriptComponent
|
||||
├~~ LWOPathfindingControlComponent
|
||||
├~~ LWOProximityMonitorComponent
|
||||
LWOShowcaseModelHandlerComponent
|
||||
LWOSkillComponent
|
||||
LWOSoundAmbient2DComponent
|
||||
LWOSoundAmbient3DComponent
|
||||
LWOSoundRepeaterComponent
|
||||
LWOSpawnComponent
|
||||
LWOSpringpadComponent
|
||||
LWOSwitchComponent
|
||||
LWOTriggerComponent
|
||||
LocalPlayer (not a component)
|
||||
├~~ LWOInteractionManagerComponent
|
||||
├~~ LWOUserControlComponent
|
||||
├~~ LWOFriendsListComponent
|
||||
├~~ LWOIgnoreListComponent
|
||||
├~~ LWOTextEffectComponent
|
||||
├~~ LWOChatBubbleComponent
|
||||
├~~ LWOGuildComponent
|
||||
├~~ LWOPlayerPetTamingComponent
|
||||
├~~ LWOLocalSystemsComponent
|
||||
├~~ LWOSlashCommandComponent
|
||||
├~~ LWOMissionComponent
|
||||
├~~ LWOPropertyEditorComponent
|
||||
├~~ LWOComponent115
|
||||
├~~ LWOTeamsComponent
|
||||
├~~ LWOChatComponent
|
||||
├~~ LWOPetControlComponent
|
||||
├~~ LWOTradeComponent
|
||||
├~~ LWOPreconditionComponent
|
||||
├~~ LWOFlagComponent
|
||||
├~~ LWOFactionTriggerComponent
|
||||
|
||||
```
|
@@ -1,7 +1,7 @@
|
||||
#include "VehiclePhysicsComponent.h"
|
||||
#include "HavokVehiclePhysicsComponent.h"
|
||||
#include "EntityManager.h"
|
||||
|
||||
VehiclePhysicsComponent::VehiclePhysicsComponent(Entity* parent) : Component(parent) {
|
||||
HavokVehiclePhysicsComponent::HavokVehiclePhysicsComponent(Entity* parent) : Component(parent) {
|
||||
m_Position = NiPoint3::ZERO;
|
||||
m_Rotation = NiQuaternion::IDENTITY;
|
||||
m_Velocity = NiPoint3::ZERO;
|
||||
@@ -14,52 +14,52 @@ VehiclePhysicsComponent::VehiclePhysicsComponent(Entity* parent) : Component(par
|
||||
m_EndBehavior = GeneralUtils::GenerateRandomNumber<uint32_t>(0, 7);
|
||||
}
|
||||
|
||||
VehiclePhysicsComponent::~VehiclePhysicsComponent() {
|
||||
HavokVehiclePhysicsComponent::~HavokVehiclePhysicsComponent() {
|
||||
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetPosition(const NiPoint3& pos) {
|
||||
void HavokVehiclePhysicsComponent::SetPosition(const NiPoint3& pos) {
|
||||
m_Position = pos;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetRotation(const NiQuaternion& rot) {
|
||||
void HavokVehiclePhysicsComponent::SetRotation(const NiQuaternion& rot) {
|
||||
m_DirtyPosition = true;
|
||||
m_Rotation = rot;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetVelocity(const NiPoint3& vel) {
|
||||
void HavokVehiclePhysicsComponent::SetVelocity(const NiPoint3& vel) {
|
||||
m_DirtyPosition = true;
|
||||
m_Velocity = vel;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetAngularVelocity(const NiPoint3& vel) {
|
||||
void HavokVehiclePhysicsComponent::SetAngularVelocity(const NiPoint3& vel) {
|
||||
m_DirtyPosition = true;
|
||||
m_AngularVelocity = vel;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetIsOnGround(bool val) {
|
||||
void HavokVehiclePhysicsComponent::SetIsOnGround(bool val) {
|
||||
m_DirtyPosition = true;
|
||||
m_IsOnGround = val;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetIsOnRail(bool val) {
|
||||
void HavokVehiclePhysicsComponent::SetIsOnRail(bool val) {
|
||||
m_DirtyPosition = true;
|
||||
m_IsOnRail = val;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetDirtyPosition(bool val) {
|
||||
void HavokVehiclePhysicsComponent::SetDirtyPosition(bool val) {
|
||||
m_DirtyPosition = val;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetDirtyVelocity(bool val) {
|
||||
void HavokVehiclePhysicsComponent::SetDirtyVelocity(bool val) {
|
||||
m_DirtyVelocity = val;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::SetDirtyAngularVelocity(bool val) {
|
||||
void HavokVehiclePhysicsComponent::SetDirtyAngularVelocity(bool val) {
|
||||
m_DirtyAngularVelocity = val;
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) {
|
||||
void HavokVehiclePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) {
|
||||
outBitStream->Write(bIsInitialUpdate || m_DirtyPosition);
|
||||
|
||||
if (bIsInitialUpdate || m_DirtyPosition) {
|
||||
@@ -101,7 +101,7 @@ void VehiclePhysicsComponent::Serialize(RakNet::BitStream* outBitStream, bool bI
|
||||
outBitStream->Write0();
|
||||
}
|
||||
|
||||
void VehiclePhysicsComponent::Update(float deltaTime) {
|
||||
void HavokVehiclePhysicsComponent::Update(float deltaTime) {
|
||||
if (m_SoftUpdate > 5) {
|
||||
EntityManager::Instance()->SerializeEntity(m_OwningEntity);
|
||||
|
@@ -8,12 +8,12 @@
|
||||
/**
|
||||
* Physics component for vehicles.
|
||||
*/
|
||||
class VehiclePhysicsComponent : public Component {
|
||||
class HavokVehiclePhysicsComponent : public Component {
|
||||
public:
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::VEHICLE_PHYSICS;
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::HAVOK_VEHICLE_PHYSICS;
|
||||
|
||||
VehiclePhysicsComponent(Entity* parentEntity);
|
||||
~VehiclePhysicsComponent() override;
|
||||
HavokVehiclePhysicsComponent(Entity* parentEntity);
|
||||
~HavokVehiclePhysicsComponent() override;
|
||||
|
||||
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags);
|
||||
|
@@ -19,7 +19,7 @@
|
||||
#include "PossessorComponent.h"
|
||||
#include "PossessableComponent.h"
|
||||
#include "ModuleAssemblyComponent.h"
|
||||
#include "VehiclePhysicsComponent.h"
|
||||
#include "HavokVehiclePhysicsComponent.h"
|
||||
#include "CharacterComponent.h"
|
||||
#include "dZoneManager.h"
|
||||
#include "PropertyManagementComponent.h"
|
||||
@@ -826,7 +826,7 @@ void InventoryComponent::EquipItem(Item* item, const bool skipChecks) {
|
||||
if (character != nullptr && !skipChecks) {
|
||||
// Hacky proximity rocket
|
||||
if (item->GetLot() == 6416) {
|
||||
const auto rocketLauchPads = EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::ROCKET_LAUNCH);
|
||||
const auto rocketLauchPads = EntityManager::Instance()->GetEntitiesByComponent(eReplicaComponentType::ROCKET_LAUNCHPAD_CONTROL);
|
||||
|
||||
const auto position = m_OwningEntity->GetPosition();
|
||||
|
||||
@@ -986,8 +986,8 @@ void InventoryComponent::HandlePossession(Item* item) {
|
||||
auto* mount = EntityManager::Instance()->CreateEntity(info, nullptr, m_OwningEntity);
|
||||
|
||||
// Check to see if the mount is a vehicle, if so, flip it
|
||||
auto vehicleComponent = mount->GetComponent<VehiclePhysicsComponent>();
|
||||
if (vehicleComponent) {
|
||||
auto havokVehiclePhysicsComponent = mount->GetComponent<HavokVehiclePhysicsComponent>();
|
||||
if (havokVehiclePhysicsComponent) {
|
||||
auto angles = startRotation.GetEulerAngles();
|
||||
// Make it right side up
|
||||
angles.x -= PI;
|
||||
@@ -1024,7 +1024,7 @@ void InventoryComponent::HandlePossession(Item* item) {
|
||||
EntityManager::Instance()->SerializeEntity(m_OwningEntity);
|
||||
|
||||
// have to unlock the input so it vehicle can be driven
|
||||
if (vehicleComponent) GameMessages::SendVehicleUnlockInput(mount->GetObjectID(), false, m_OwningEntity->GetSystemAddress());
|
||||
if (havokVehiclePhysicsComponent) GameMessages::SendVehicleUnlockInput(mount->GetObjectID(), false, m_OwningEntity->GetSystemAddress());
|
||||
GameMessages::SendMarkInventoryItemAsActive(m_OwningEntity->GetObjectID(), true, eUnequippableActiveType::MOUNT, item->GetId(), m_OwningEntity->GetSystemAddress());
|
||||
}
|
||||
|
||||
|
@@ -1,14 +1,14 @@
|
||||
#include "ModelComponent.h"
|
||||
#include "ModelBehaviorComponent.h"
|
||||
#include "Entity.h"
|
||||
|
||||
ModelComponent::ModelComponent(Entity* parent) : Component(parent) {
|
||||
ModelBehaviorComponent::ModelBehaviorComponent(Entity* parent) : Component(parent) {
|
||||
m_OriginalPosition = m_OwningEntity->GetDefaultPosition();
|
||||
m_OriginalRotation = m_OwningEntity->GetDefaultRotation();
|
||||
|
||||
m_userModelID = m_OwningEntity->GetVarAs<LWOOBJID>(u"userModelID");
|
||||
}
|
||||
|
||||
void ModelComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) {
|
||||
void ModelBehaviorComponent::Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags) {
|
||||
// ItemComponent Serialization. Pets do not get this serialization.
|
||||
if (!m_OwningEntity->HasComponent(eReplicaComponentType::PET)) {
|
||||
outBitStream->Write1();
|
@@ -11,11 +11,11 @@ class Entity;
|
||||
/**
|
||||
* Component that represents entities that are a model, e.g. collectible models and BBB models.
|
||||
*/
|
||||
class ModelComponent : public Component {
|
||||
class ModelBehaviorComponent : public Component {
|
||||
public:
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::MODEL;
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::MODEL_BEHAVIOR;
|
||||
|
||||
ModelComponent(Entity* parent);
|
||||
ModelBehaviorComponent(Entity* parent);
|
||||
|
||||
void Serialize(RakNet::BitStream* outBitStream, bool bIsInitialUpdate, unsigned int& flags);
|
||||
|
@@ -1,9 +1,9 @@
|
||||
#include "RocketLaunchLupComponent.h"
|
||||
#include "MultiZoneEntranceComponent.h"
|
||||
#include "RocketLaunchpadControlComponent.h"
|
||||
#include "InventoryComponent.h"
|
||||
#include "CharacterComponent.h"
|
||||
|
||||
RocketLaunchLupComponent::RocketLaunchLupComponent(Entity* parent) : Component(parent) {
|
||||
MultiZoneEntranceComponent::MultiZoneEntranceComponent(Entity* parent) : Component(parent) {
|
||||
m_OwningEntity = parent;
|
||||
std::string zoneString = GeneralUtils::UTF16ToWTF8(m_OwningEntity->GetVar<std::u16string>(u"MultiZoneIDs"));
|
||||
std::stringstream ss(zoneString);
|
||||
@@ -14,9 +14,9 @@ RocketLaunchLupComponent::RocketLaunchLupComponent(Entity* parent) : Component(p
|
||||
}
|
||||
}
|
||||
|
||||
RocketLaunchLupComponent::~RocketLaunchLupComponent() {}
|
||||
MultiZoneEntranceComponent::~MultiZoneEntranceComponent() {}
|
||||
|
||||
void RocketLaunchLupComponent::OnUse(Entity* originator) {
|
||||
void MultiZoneEntranceComponent::OnUse(Entity* originator) {
|
||||
auto rocket = originator->GetComponent<CharacterComponent>()->RocketEquip(originator);
|
||||
if (!rocket) return;
|
||||
|
||||
@@ -24,7 +24,7 @@ void RocketLaunchLupComponent::OnUse(Entity* originator) {
|
||||
GameMessages::SendPropertyEntranceBegin(m_OwningEntity->GetObjectID(), m_OwningEntity->GetSystemAddress());
|
||||
}
|
||||
|
||||
void RocketLaunchLupComponent::OnSelectWorld(Entity* originator, uint32_t index) {
|
||||
void MultiZoneEntranceComponent::OnSelectWorld(Entity* originator, uint32_t index) {
|
||||
auto rocketLaunchpadControlComponent = m_OwningEntity->GetComponent<RocketLaunchpadControlComponent>();
|
||||
if (!rocketLaunchpadControlComponent) return;
|
||||
|
@@ -9,16 +9,16 @@
|
||||
* Component that handles the LUP/WBL rocket launchpad that can be interacted with to travel to WBL worlds.
|
||||
*
|
||||
*/
|
||||
class RocketLaunchLupComponent : public Component {
|
||||
class MultiZoneEntranceComponent : public Component {
|
||||
public:
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::ROCKET_LAUNCH_LUP;
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::MULTI_ZONE_ENTRANCE;
|
||||
|
||||
/**
|
||||
* Constructor for this component, builds the m_LUPWorlds vector
|
||||
* @param parent parent that contains this component
|
||||
*/
|
||||
RocketLaunchLupComponent(Entity* parent);
|
||||
~RocketLaunchLupComponent() override;
|
||||
MultiZoneEntranceComponent(Entity* parent);
|
||||
~MultiZoneEntranceComponent() override;
|
||||
|
||||
/**
|
||||
* Handles an OnUse event from some entity, preparing it for launch to some other world
|
@@ -17,7 +17,6 @@
|
||||
#include "PossessorComponent.h"
|
||||
#include "eRacingTaskParam.h"
|
||||
#include "Spawner.h"
|
||||
#include "VehiclePhysicsComponent.h"
|
||||
#include "dServer.h"
|
||||
#include "dZoneManager.h"
|
||||
#include "dConfig.h"
|
||||
|
@@ -13,7 +13,7 @@
|
||||
#include "ChatPackets.h"
|
||||
#include "MissionComponent.h"
|
||||
#include "PropertyEntranceComponent.h"
|
||||
#include "RocketLaunchLupComponent.h"
|
||||
#include "MultiZoneEntranceComponent.h"
|
||||
#include "dServer.h"
|
||||
#include "PacketUtils.h"
|
||||
#include "eObjectWorldState.h"
|
||||
@@ -94,8 +94,8 @@ void RocketLaunchpadControlComponent::OnUse(Entity* originator) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto rocketLaunchLUP = m_OwningEntity->GetComponent<RocketLaunchLupComponent>();
|
||||
if (rocketLaunchLUP) {
|
||||
auto multiZoneEntranceComponent = m_OwningEntity->GetComponent<MultiZoneEntranceComponent>();
|
||||
if (multiZoneEntranceComponent) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -18,7 +18,7 @@ class PreconditionExpression;
|
||||
*/
|
||||
class RocketLaunchpadControlComponent : public Component {
|
||||
public:
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::ROCKET_LAUNCH;
|
||||
static const eReplicaComponentType ComponentType = eReplicaComponentType::ROCKET_LAUNCHPAD_CONTROL;
|
||||
|
||||
RocketLaunchpadControlComponent(Entity* parent, int rocketId);
|
||||
~RocketLaunchpadControlComponent() override;
|
||||
|
Reference in New Issue
Block a user