5#include "CoreMinimal.h"
6#include "Runtime/Json/Public/Dom/JsonObject.h"
9#include "Components/ActorComponent.h"
11#include "CosmeticsManager.generated.h"
17class UAfflictionInstance;
32 GENERATED_USTRUCT_BODY()
34 FEquipItem(
const FString& NewShortCode,
bool bMarkDirty) : ShortCode(NewShortCode), bDirty(bMarkDirty) {}
38 if (NewShortCode == ShortCode)
43 ShortCode = NewShortCode;
53 UPROPERTY(BlueprintReadOnly)
54 FString ShortCode = "";
61 GENERATED_USTRUCT_BODY()
66 if (!WeaponEquips.Contains(Key))
71 FoundItem = WeaponEquips[Key];
77 if (!WeaponEquips.Contains(Key))
82 FoundShortCode = WeaponEquips[Key].ShortCode;
86 bool UpdateEquipItem(
const FString& Key,
const FString& ShortCode,
bool bMarkDirty =
true)
88 if (!WeaponEquips.Contains(Key))
90 WeaponEquips.Add(Key,
FEquipItem(ShortCode, bMarkDirty));
95 return WeaponEquips[Key].UpdateShortCode(ShortCode, bMarkDirty);
99 UPROPERTY(BlueprintReadOnly)
103USTRUCT(BlueprintType)
106 GENERATED_USTRUCT_BODY()
117 if (!EquipsTypes.Contains(Type))
122 return EquipsTypes[Type].UpdateEquipItem(Key, ShortCode, bMarkDirty);
127 if (!EquipsTypes.Contains(Type))
132 return EquipsTypes[Type].GetEquipShortCode(Key, FoundKey);
137 if (!EquipsTypes.Contains(Type))
142 FoundEquipsList = EquipsTypes[Type];
146 UPROPERTY(BlueprintReadOnly)
148 bool bLoaded = false;
157USTRUCT(BlueprintType)
164 UPROPERTY(BlueprintReadWrite)
166 UPROPERTY(BlueprintReadWrite)
168 UPROPERTY(BlueprintReadWrite)
169 FString BannerID = "";
170 UPROPERTY(BlueprintReadWrite)
171 FString PlayerSkinID = "";
172 UPROPERTY(BlueprintReadWrite)
173 FString WeaponSkinID = "";
179USTRUCT(BlueprintType)
186 FCosmeticDeals(
int Year,
int Month,
int Day,
int Hour,
int Minutes,
int HourDuration)
188 DealEndTime = FDateTime(Year, Month, Day, Hour, Minutes);
189 Items = TMap<FString, int>();
192 UPROPERTY(BlueprintReadOnly)
193 FDateTime DealEndTime = FDateTime::MinValue();
194 UPROPERTY(BlueprintReadOnly)
195 TMap<FString,
int> Items = TMap<FString,
int>();
198USTRUCT(BlueprintType)
206 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category =
"Item Struct")
208 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item Struct")
210 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item Struct")
212 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item Struct")
218USTRUCT(BlueprintType)
221 GENERATED_USTRUCT_BODY()
224 UPROPERTY(BlueprintReadWrite)
225 FString GraffitiID = "";
226 UPROPERTY(BlueprintReadWrite)
227 FString AvatarBorderID = "";
228 UPROPERTY(BlueprintReadWrite)
229 FString BannerID = "";
230 UPROPERTY(BlueprintReadWrite)
231 TArray<FString> TauntIDs;
233 bool GetCosmeticID(FString& Output, const
ECosmeticType Type, uint8 Slot = -1) const;
234 void UpdateCosmeticID(const
ECosmeticType Type, const FString& CosmeticID, uint8 Slot = -1);
237USTRUCT(BlueprintType)
240 GENERATED_USTRUCT_BODY()
243 FCosmeticReward(
const FString& IDIn,
int CurrencyConversionIn) : ID(IDIn), CurrencyConversion(CurrencyConversionIn) {}
246 UPROPERTY(BlueprintReadWrite)
248 UPROPERTY(BlueprintReadOnly)
249 int CurrencyConversion = 0;
252USTRUCT(BlueprintType)
255 GENERATED_USTRUCT_BODY()
258 UPROPERTY(BlueprintReadWrite)
260 UPROPERTY(BlueprintReadWrite)
261 int CurrencyReward = -1;
265USTRUCT(BlueprintType)
268 GENERATED_USTRUCT_BODY()
271 FItem(
ECosmeticType ItemType,
const FString& ItemClassID,
const FText& ItemDisplayName,
UCosmeticAssetBase* ItemAsset,
ERarity NewRarity,
int OwnedAmount,
bool bIsStackable) : Type(ItemType), ClassID(ItemClassID),DisplayName(ItemDisplayName),Asset(ItemAsset),Rarity(NewRarity),Amount(OwnedAmount),bStackable(bIsStackable) {}
274 UPROPERTY(BlueprintReadWrite)
276 UPROPERTY(BlueprintReadWrite)
277 FString ClassID = "";
278 UPROPERTY(BlueprintReadWrite)
280 UPROPERTY(BlueprintReadWrite)
282 UPROPERTY(BlueprintReadWrite)
284 UPROPERTY(BlueprintReadWrite)
286 UPROPERTY(BlueprintReadWrite)
288 UPROPERTY(BlueprintReadWrite)
289 bool bStackable = false;
290 TSet<FString> EquipKeys;
294USTRUCT(BlueprintType)
297 GENERATED_USTRUCT_BODY()
299 UPROPERTY(BlueprintReadWrite)
301 UPROPERTY(BlueprintReadWrite)
302 float ConeSpread= 0.0f;
303 UPROPERTY(BlueprintReadWrite)
304 float RateOfFire = 0.0f;
305 UPROPERTY(BlueprintReadWrite)
306 float MagSize = 0.0f;
309USTRUCT(BlueprintType)
312 GENERATED_USTRUCT_BODY()
314 UPROPERTY(BlueprintReadWrite)
315 FString PlayerID = "";
316 UPROPERTY(BlueprintReadWrite)
317 FString EquipID = "";
333const TMap<FString,
int>
Months = { {
"Jan",1}, {
"Feb",2}, {
"Mar",3}, {
"Apr",4}, {
"May",5}, {
"Jun",6}, {
"Jul",7}, {
"Aug",8}, {
"Sep",9}, {
"Oct",10}, {
"Nov",11}, {
"Dec",12} };
335UCLASS( ClassGroup=(
Custom), meta=(BlueprintSpawnableComponent) )
336class PROJECTX_API UCosmeticsManager :
public UActorComponent
343 UFUNCTION(BlueprintPure, Category = PlayerProgressionManager, meta = (WorldContext = "WorldContextObject", CallableWithoutWorldContext))
344 static UCosmeticsManager* GetCosmeticManager(const UObject* WorldContextObject);
346 void EquipDefaults(
bool bPostLoadEquip);
348 virtual
void OnNakamaConnected();
349 UFUNCTION(BlueprintPure)
350 const TMap<FString,
FItem>& GetItemList()
const {
return InventoryItemList; }
351 UFUNCTION(BlueprintPure)
352 const FItem GetItemByShortCode(
const FString& Shortcode)
const {
return InventoryItemList.Contains(Shortcode) ? InventoryItemList[Shortcode] :
FItem(); }
353 UFUNCTION(BlueprintPure)
354 const bool DoesItemExist(
const FString& Shortcode)
const {
return InventoryItemList.Contains(Shortcode); }
355 UFUNCTION(BlueprintPure)
356 const FEquips& GetEquips()
const {
return Equips;}
357 UFUNCTION(BlueprintPure)
358 void GetPlayerEquipItem(
const TArray<FPlayerEquipRequest>& PlayerEquipRequests);
359 UFUNCTION(BlueprintPure)
360 const FString& GetLocalPlayerID()
const {
return CachedLocalPlayerID; }
361 UFUNCTION(BlueprintCallable)
363 UFUNCTION(BlueprintCallable)
364 const FCosmeticDeals& GetFeatureDeal()
const {
return FeatureDeals; }
365 UFUNCTION(BlueprintCallable)
366 const FBestWeaponInfos& GetBestWeaponInfos()
const {
return BestweaponInfos;}
367 UFUNCTION(BlueprintCallable, BlueprintPure)
369 UFUNCTION(BlueprintCallable)
371 UFUNCTION(BlueprintCallable)
372 bool GetPlayerInfo(
const FString& PlayerID,
FSharedPlayerInfo& FoundPlayerInfo)
const;
373 UFUNCTION(BlueprintCallable)
375 UFUNCTION(BlueprintCallable)
376 void UpdateLocalPlayerInfoFavouriteClass(TSubclassOf<AProjectXCharacter> CharacterClass);
377 UFUNCTION(BlueprintCallable)
378 void SaveLocalPlayerInfo();
379 UFUNCTION(BlueprintCallable)
380 void LoadSharedPlayerInfo(
const TArray<FString>& PlayerIDs);
381 UFUNCTION(BlueprintCallable)
382 void LoadEarnedRewards(
const FString& PlayerID)
const;
383 UFUNCTION(BlueprintCallable)
384 void LoadAllCosmeticData(
const FString& PlayerID);
385 UFUNCTION(BlueprintCallable)
386 void SavePlayerInventory();
387 UFUNCTION(BlueprintCallable)
388 bool PurchaseItemRequest(
const FString& ItemID);
389 UFUNCTION(BlueprintCallable)
390 bool IsItemUnlocked(
const FString& ItemID)
const;
391 UFUNCTION(BlueprintCallable)
392 TSubclassOf<AProjectXCharacter> GetCharacterClassFromID(
const FString& PlayerID)
const;
393 UFUNCTION(BlueprintCallable)
394 void EquipItem(
const FString& ShortCode,
const FString& EquipCode);
395 UFUNCTION(BlueprintCallable)
396 void AddItemToUnlockList(
const FString& ShortCode,
bool bMaxOne);
397 UFUNCTION(BlueprintCallable)
398 void OnMatchComplete();
399 void LoadInventoryFromItemList(
const TArray<FString>& ShortCodes);
400 void LoadPlayerInventory(std::string cursor =
"");
401 void UpdateSessionID(
const FString& PlayerID,
const FString& SessionID,
const FString& ShortCode);
403 void ClearCosmeticData();
404 void GetRandomCosmetic(FString& FoundID,
const TArray<ECosmeticType>& IgnoredTypes,
FItem& FoundCosmetic);
405 const FString& GetShortCodeFromList(uint16 Number)
const {
return ShortCodesList.IsValidIndex(Number) ? ShortCodesList[Number] : FallBackCode; }
406 const FString& GetEquipCodeFromList(uint16 Number)
const {
return EquipCodesList.IsValidIndex(Number) ? EquipCodesList[Number] : FallBackCode; }
407 uint16 GetEquipCodeNumber(
const FString& EquipCode)
const;
408 uint16 GetShortCodeNumber(
const FString& ShortCode)
const;
409 bool CanLockCosmeticToThisSession(
const FString& PlayerID,
const FString& ShortCode,
const FString& SessionId)
const;
410 const TMap<FString, FString>& GetSessionLockedCosmetics(
const FString& PlayerID)
const;
411 UFUNCTION(BlueprintPure)
412 static FString BuildCosmeticKeyFromClass(
ECosmeticType Type, TSubclassOf<AProjectXCharacter> CharacterClass, TSubclassOf<UWeaponInstance> WeaponClass, uint8 SlotID = 0,
EPerkType PerkType =
EPerkType::NONE);
413 UFUNCTION(BlueprintPure)
415 static void ParseCosmeticKey(
ECosmeticType Type,
const FString& EquipKey, FString& ClassID, FString& WeaponClassID, uint8& SlotID,
EPerkType& PerkType);
416 UFUNCTION(BlueprintPure)
417 static bool GetEquippedItem(UPARAM(ref)
const FEquips& Equips,
ECosmeticType Type, UPARAM(ref)
const FString& Key, FString& FoundItem);
418 UFUNCTION(BlueprintPure)
419 TSubclassOf<UWeaponInstance> GetEquippedWeaponInSlot(
EEquipSlot Slot, TSubclassOf<AProjectXCharacter> CharacterClass,
AProjectXPlayerState*
const PlayerState);
420 static void NakamaDateParser(
const FString& DateIn, FDateTime& DateOut);
421 static FCosmeticTable* FindRowByShortCode(
const FString& ShortCode, UDataTable* Table);
423 UPROPERTY(BlueprintAssignable)
424 FPurchaseSignature PurchaseResponseEvent;
425 UPROPERTY(BlueprintAssignable)
426 FCosmeticRewardSignature OnNewRewardsEarned;
427 UPROPERTY(BlueprintAssignable)
428 FMenuConfigsLoadedSignature OnSharedPlayerInfoLoaded;
429 UPROPERTY(BlueprintAssignable)
430 FGeneralCosmeticsChangedSignature OnGeneralCosmeticsChangedEvent;
431 UPROPERTY(BlueprintAssignable)
432 FChallengeRewardSignature OnChallengeRewardsReceived;
433 UPROPERTY(BlueprintAssignable)
434 FLoadOutLoadedSignature OnPlayerInventoryLoaded;
435 UPROPERTY(BlueprintAssignable)
436 FCosmeticsLoadedSignature OnItemsInitialized;
437 UPROPERTY(BlueprintAssignable)
438 FCosmeticsLoadedSignature OnStoreLoaded;
439 UPROPERTY(BlueprintAssignable)
440 FEquipItemUpdatedSignature OnItemEquipped;
441 UPROPERTY(BlueprintAssignable)
442 FPlayerEquipItemUpdatedSignature OnOtherUserEquipsUpdated;
444 TMap<FString, FSharedPlayerInfo> PlayerInfoList = TMap<FString, FSharedPlayerInfo>();
445 TMap<ERarity, uint8> RarityWeights = TMap<ERarity, uint8>();
447 TMap<FString, FItem> InventoryItemList;
452 TMap<ECosmeticCategory, TArray<ECosmeticType>> CosmeticTypes = TMap<ECosmeticCategory, TArray<ECosmeticType>>();
453 TMap<FString, TMap<FString,FString>> SessionLockedCosmetics = TMap<FString, TMap<FString, FString>>();
454 TMap<FString, FEquips> UserEquips = TMap<FString, FEquips>();
457 void InitializeItems();
458 void InitializeEquips();
459 void InitializeRarityWeights();
461 void PerkTableToInventory(UDataTable*
const Table, TSubclassOf<AProjectXCharacter>
Class,TSubclassOf<UWeaponInstance> WeaponClas,
EPerkType Type);
462 void PurchaseItemResponse(
bool bSuccess,
const FString& ItemID);
463 void LoadStoreResponse(TSharedPtr<FJsonObject> StoreJson);
464 void LoadPlayerInventoryResponse(std::vector<NAKAMA_NAMESPACE::NStorageObject>
Inventory);
465 void UnpackInventory(std::vector<NAKAMA_NAMESPACE::NStorageObject>
Inventory);
466 void RefreshFavouriteClassCosmetics();
468 UFUNCTION(BlueprintCallable,BlueprintPure)
469 static UDataTable* GetPerksList(UDataTable*
const PerksTable, TSubclassOf<AProjectXCharacter> CharacterClass, TSubclassOf<UWeaponInstance> WeaponInstanceClass,
EPerkType Type);
471 FString CachedLocalPlayerID =
"";
472 bool bUnlocksInitialized =
false;
473 bool bLoadoutsLoaded =
false;
474 bool bInventoryInitialized =
false;
475 FString FallBackCode =
"";
476 TArray<FString> ShortCodesList;
477 TArray<FString> EquipCodesList;
478 TWeakObjectPtr<UProjectXGameInstance> GameInstance;
479 TMap<FString, FString> DefaultFoundLockedCosmetics = TMap<FString, FString>();
481 UFUNCTION(BlueprintCallable)
482 static UDataTable*
const GetDataTableByType(
ECosmeticType Type, UObject* WorldContextObject);
EPerkType
Definition: CosmeticAssetBase.h:61
ERarity
Definition: CosmeticAssetBase.h:95
ECosmeticType
Definition: CosmeticAssetBase.h:21
const TMap< FString, int > Months
Definition: CosmeticsManager.h:333
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FCosmeticRewardSignature, const TArray< FCosmeticReward > &, ItemIDs, int, Currency, bool, bFoundRewards)
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FCosmeticsLoadedSignature)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FLoadOutLoadedSignature, bool, bSucess)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FPurchaseSignature, bool, bSucess, const FString &, ItemID)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FChallengeRewardSignature, const FString &, ChallengeID, int32, Currency, int32, Experience, const TArray< FCosmeticReward > &, ItemList)
EEquipType
Definition: CosmeticsManager.h:23
EColourSlot
Definition: CosmeticsManager.h:153
EEquipSlot
Definition: PlayerStructs.h:25
Definition: ProjectXCharacter.h:128
Definition: ProjectXPlayerState.h:238
uint16 Level
Definition: ProjectXPlayerState.h:714
TWeakObjectPtr< ADecalActor > Graffiti
Definition: ProjectXPlayerState.h:742
int32 Currency
Definition: ProjectXPlayerState.h:779
Definition: CosmeticAssetBase.h:106
Definition: ProjectXGameInstance.h:507
Definition: WeaponInstance.h:220
Definition: CosmeticsManager.h:296
Definition: CosmeticsManager.h:181
FCosmeticDeals(int Year, int Month, int Day, int Hour, int Minutes, int HourDuration)
Definition: CosmeticsManager.h:186
FCosmeticDeals()
Definition: CosmeticsManager.h:184
Definition: CosmeticsManager.h:239
FCosmeticReward(const FString &IDIn, int CurrencyConversionIn)
Definition: CosmeticsManager.h:243
Definition: CosmeticsManager.h:254
Definition: CosmeticsManager.h:200
FCosmeticStoreItem(ECosmeticType TypeIn, int32 CostIn, ERarity RarityIn, const FString &WeaponNameIn)
Definition: CosmeticsManager.h:204
Definition: CosmeticAssetBase.h:318
Definition: CosmeticsManager.h:31
FEquipItem(const FString &NewShortCode, bool bMarkDirty)
Definition: CosmeticsManager.h:34
bool UpdateShortCode(const FString &NewShortCode, bool bMarkDirty=true)
Definition: CosmeticsManager.h:36
Definition: CosmeticsManager.h:105
bool UpdateShortCode(ECosmeticType Type, const FString &Key, const FString &ShortCode, bool bMarkDirty=true)
Definition: CosmeticsManager.h:115
bool GetShortCode(ECosmeticType Type, const FString &Key, FString &FoundKey) const
Definition: CosmeticsManager.h:125
bool GetEquipsList(ECosmeticType Type, FEquipsList &FoundEquipsList)
Definition: CosmeticsManager.h:135
Definition: CosmeticsManager.h:60
bool GetEquipShortCode(const FString &Key, FString &FoundShortCode) const
Definition: CosmeticsManager.h:75
bool UpdateEquipItem(const FString &Key, const FString &ShortCode, bool bMarkDirty=true)
Definition: CosmeticsManager.h:86
bool GetEquipItem(const FString &Key, FEquipItem &FoundItem)
Definition: CosmeticsManager.h:64
Definition: CosmeticsManager.h:220
Definition: CosmeticsManager.h:267
FItem(ECosmeticType ItemType, const FString &ItemClassID, const FText &ItemDisplayName, UCosmeticAssetBase *ItemAsset, ERarity NewRarity, int OwnedAmount, bool bIsStackable)
Definition: CosmeticsManager.h:271
Definition: CosmeticsManager.h:311
Definition: CosmeticsManager.h:159
FSharedPlayerInfo()
Definition: CosmeticsManager.h:163