#pragma once #include #include #include #include #include #include #include "PalTypes.hpp" namespace PalUIExtension::Api::Pal { enum class EPalGenderType_ : uint8 { None = 0, Male = 1, Female = 2 }; enum class EPalElementType_ : uint8 { None = 0, Normal = 1, Fire = 2, Water = 3, Leaf = 4, Electricity = 5, Ice = 6, Earth = 7, Dark = 8, Dragon = 9, MAX = 10, }; enum class EPalWorkSuitability_ : uint8 { None = 0, EmitFlame = 1, Watering = 2, Seeding = 3, GenerateElectricity = 4, Handcraft = 5, Collection = 6, Deforest = 7, Mining = 8, OilExtraction = 9, ProductMedicine = 10, Cool = 11, Transport = 12, MonsterFarm = 13, Anyone = 14, MAX = 15, }; class LooseObject : public UnrealWrapper { public: LooseObject() = default; explicit LooseObject(UObject* Obj, const TCHAR* Tag = STR("Loose")) : UnrealWrapper(Obj, UncheckedTag{}, Tag) { } using UnrealWrapper::Call; using UnrealWrapper::CallVoid; using UnrealWrapper::CallForReturn; using UnrealWrapper::PropertyPtr; using UnrealWrapper::PropertyValue; }; // this struct is now redundant. watch it never get removed. struct FPalInstanceID { FGuid_ PlayerUID; FGuid_ InstanceID; FString DebugName; }; struct PalIdentity { UObject* Handle{}; UObject* IndividualParameter{}; std::optional CharacterId; // the species. "SheepBall", etc. std::optional Level; std::optional Rank; std::optional Gender; std::optional bRare; explicit operator bool() const { return CharacterId.has_value(); } }; class PalIndividual { public: static auto ParameterFromHandle(UObject* Handle) -> UObject* { if (!Handle) return nullptr; LooseObject H{ Handle, STR("PalIndividualCharacter") }; return H.CallForReturn(STR("TryGetIndividualParameter")).value_or(nullptr); } static auto CharacterId(UObject* Parameter) -> std::optional { if (!Parameter) return std::nullopt; LooseObject P{ Parameter, STR("PalIndividualCharacterParameter") }; return P.CallForReturn(STR("GetCharacterID")); } static auto CharacterIdFromHandle(UObject* Handle) -> std::optional { return CharacterId(ParameterFromHandle(Handle)); } static auto IdentifyFromParameter(UObject* Parameter) -> PalIdentity { PalIdentity Out{}; Out.IndividualParameter = Parameter; if (!Parameter) return Out; LooseObject P{ Parameter, STR("PalIndividualCharacterParameter") }; Out.CharacterId = P.CallForReturn(STR("GetCharacterID")); Out.Level = P.CallForReturn(STR("GetLevel")); Out.Rank = P.CallForReturn(STR("GetRank")); Out.Gender = P.CallForReturn(STR("GetGenderType")); Out.bRare = P.CallForReturn(STR("IsRarePal")); return Out; } static auto Identify(UObject* Handle) -> PalIdentity { PalIdentity Out = IdentifyFromParameter(ParameterFromHandle(Handle)); Out.Handle = Handle; return Out; } static auto GetInstanceIds(UObject* Handle) -> std::optional { if (!Handle) return std::nullopt; // FPalInstanceID LooseObject H{ Handle, STR("PalIndividualCharacterHandle") }; auto _Out = H.CallForReturn(STR("GetIndividualID")); if (!_Out.has_value()) return std::nullopt; return FPalInstanceID{ _Out.value().PlayerUID, _Out.value().InstanceID, _Out.value().DebugName }; } }; }