Skip to content

Commit 5c2a6aa

Browse files
authored
ModContentRegistry: Filter item descriptor by resource form (#246)
In the `IsDescriptorFilteredOut()` function, add additional checks to filter out item descriptors depending on their resource form. Without this change, the `IncludeNonSolid` flag does absolutely nothing. Also filter out any non-subclasses of `UFGItemDescriptor`, which shouldn't have been registered in the item registry to begin with. Signed-off-by: Angel Pons <th3fanbus@gmail.com>
1 parent 0b8e889 commit 5c2a6aa

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

Mods/SML/Source/SML/Private/Registry/ModContentRegistry.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,13 +860,39 @@ void UModContentRegistry::AutoRegisterRecipeReferences( TSubclassOf<UFGRecipe> R
860860
}
861861
}
862862

863+
static bool IsResourceFormFilteredOut(EResourceForm ResourceForm, EGetObtainableItemDescriptorsFlags Flags)
864+
{
865+
using enum EGetObtainableItemDescriptorsFlags;
866+
using enum EResourceForm;
867+
868+
switch (ResourceForm) {
869+
case RF_INVALID:
870+
return !EnumHasAnyFlags(Flags, EGetObtainableItemDescriptorsFlags(IncludeBuildings | IncludeCustomizations | IncludeVehicles | IncludeCreatures | IncludeSpecial));
871+
case RF_SOLID:
872+
return false;
873+
case RF_LIQUID:
874+
case RF_GAS:
875+
return !EnumHasAnyFlags(Flags, EGetObtainableItemDescriptorsFlags(IncludeNonSolid));
876+
case RF_HEAT: /* FIXME: Could be omitted, so that the default case handles it */
877+
return true;
878+
default:
879+
return true;
880+
}
881+
}
882+
863883
bool UModContentRegistry::IsDescriptorFilteredOut( const UObject* ItemDescriptor, EGetObtainableItemDescriptorsFlags Flags )
864884
{
865885
if (!ItemDescriptor) {
866886
UE_LOG(LogContentRegistry, Warning, TEXT("IsDescriptorFilteredOut called with null ItemDescriptor, returning true (filtering out)"));
867887
return true;
868888
}
869-
const auto descriptorClass = Cast<UClass>(ItemDescriptor);
889+
const TSubclassOf<UFGItemDescriptor> descriptorClass = const_cast<UClass*>(Cast<UClass>(ItemDescriptor));
890+
if (!descriptorClass) {
891+
return true;
892+
}
893+
if (IsResourceFormFilteredOut(UFGItemDescriptor::GetForm(descriptorClass), Flags)) {
894+
return true;
895+
}
870896

871897
if (!EnumHasAnyFlags(Flags, EGetObtainableItemDescriptorsFlags::IncludeBuildings) && descriptorClass->IsChildOf<UFGBuildingDescriptor>()) {
872898
return true;

Mods/SML/Source/SML/Public/Registry/ModContentRegistry.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "FGRecipe.h"
66
#include "FGResourceSinkSubsystem.h"
77
#include "Engine/DataTable.h"
8+
#include "Misc/EnumClassFlags.h"
89
#include "ModContentRegistry.generated.h"
910

1011
DECLARE_LOG_CATEGORY_EXTERN(LogContentRegistry, Log, All);
@@ -140,6 +141,8 @@ enum class EGetObtainableItemDescriptorsFlags : uint8
140141
Default = None,
141142
};
142143

144+
ENUM_CLASS_FLAGS(EGetObtainableItemDescriptorsFlags);
145+
143146
/**
144147
* Manages registration and lifetime of the modded content
145148
*

0 commit comments

Comments
 (0)