/** * This data store can be used for cases where both static and dynamic information about a particular game concept must be displayed together. * For example, this data store could be used to display a list of levels which have been unlocked by the player. The information about the * levels themselves would probably be exposed by a UIResourceDataProvider, but resource data providers cannot provide data about the player's * progress since they are static by nature. The player's progress must come from something like a profile data provider that can provide * information about which of the levels have been unlocked. This data store brings these two types of information together in order to * provide a combination of static and dynamic information about a game resource from a single location. * * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved. */ class UIDataStore_DynamicResource extends UIDataStore native(UIPrivate) config(Game); /** Provides access to the player's profile data */ var transient UIDataProvider_OnlineProfileSettings ProfileProvider; var transient UIDataStore_GameResource GameResourceDataStore; struct native DynamicResourceProviderDefinition { /** * the tag that is used to access this provider, i.e. Players, Teams, etc.; should be the same value as the ProviderTag for the * static resource this provider type is associated with. */ var config name ProviderTag; /** the name of the class associated with this data provider */ var config string ProviderClassName; /** the UIDataProvider class that exposes the data for this data field tag */ var transient class ProviderClass; }; /** the list of data providers supported by this data store that correspond to list element data */ var config array ResourceProviderDefinitions; /** collection of list element provider instances that are associated with each ElementProviderType */ var const private native transient MultiMap_Mirror ResourceProviders{TMultiMap}; /* - init the profile provider ref - init the game resource ds ref - create all resource providers - initialize all resource providers - implement all methods, just like game resource ds */ cpptext { /* === UUIDataStore_GameResource interface === */ /** * Finds or creates the UIResourceDataProvider instances referenced by ElementProviderTypes, and stores the result * into the ListElementProvider map. */ virtual void InitializeListElementProviders(); /* === UIDataStore interface === */ /** * Loads the classes referenced by the ElementProviderTypes array. */ virtual void LoadDependentClasses(); /** * Called when this data store is added to the data store manager's list of active data stores. * * @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is * associated with a particular player; NULL if this is a global data store. */ virtual void OnRegister( ULocalPlayer* PlayerOwner ); /* === UObject interface === */ /** Required since maps are not yet supported by script serialization */ virtual void AddReferencedObjects( TArray& ObjectArray ); virtual void Serialize( FArchive& Ar ); /** * Called from ReloadConfig after the object has reloaded its configuration data. Reinitializes the collection of list element providers. */ virtual void PostReloadConfig( UProperty* PropertyThatWasLoaded ); /** * Callback for retrieving a textual representation of natively serialized properties. Child classes should implement this method if they wish * to have natively serialized property values included in things like diffcommandlet output. * * @param out_PropertyValues receives the property names and values which should be reported for this object. The map's key should be the name of * the property and the map's value should be the textual representation of the property's value. The property value should * be formatted the same way that UProperty::ExportText formats property values (i.e. for arrays, wrap in quotes and use a comma * as the delimiter between elements, etc.) * @param ExportFlags bitmask of EPropertyPortFlags used for modifying the format of the property values * * @return return TRUE if property values were added to the map. */ virtual UBOOL GetNativePropertyValues( TMap& out_PropertyValues, DWORD ExportFlags=0 ) const; } /** * Finds the index for the GameResourceDataProvider with a tag matching ProviderTag. * * @return the index into the ElementProviderTypes array for the GameResourceDataProvider element that has the * tag specified, or INDEX_NONE if there are no elements of the ElementProviderTypes array that have that tag. */ native final function int FindProviderTypeIndex( name ProviderTag ) const; /** * Get the UIResourceDataProvider instances associated with the tag. * * @param ProviderTag the tag to find instances for; should match the ProviderTag value of an element in the ElementProviderTypes array. * @param out_Providers receives the list of provider instances. this array is always emptied first. * * @return the list of UIResourceDataProvider instances registered for ProviderTag. */ native final function bool GetResourceProviders( name ProviderTag, out array out_Providers ) const; /** * Re-initializes all dynamic providers. * * @param LocalUserNum the player that had a login change */ native final function OnLoginChange(byte LocalUserNum); /** * Called when this data store is added to the data store manager's list of active data stores. * * @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is * associated with a particular player; NULL if this is a global data store. */ event Registered( LocalPlayer PlayerOwner ) { local OnlineSubsystem OnlineSub; local OnlinePlayerInterface PlayerInterface; local UIDataStore_OnlinePlayerData PlayerProfileDS; Super.Registered(PlayerOwner); PlayerProfileDS = UIDataStore_OnlinePlayerData(class'UIRoot'.static.StaticResolveDataStore(class'UIDataStore_OnlinePlayerData'.default.Tag, PlayerOwner)); if ( PlayerProfileDS != None ) { ProfileProvider = PlayerProfileDS.ProfileProvider; } GameResourceDataStore = UIDataStore_GameResource(class'UIRoot'.static.StaticResolveDataStore(class'UIDataStore_GameResource'.default.Tag, PlayerOwner)); // Figure out if we have an online subsystem registered OnlineSub = class'GameEngine'.static.GetOnlineSubsystem(); if (OnlineSub != None) { // Grab the player interface to verify the subsystem supports it PlayerInterface = OnlineSub.PlayerInterface; if (PlayerInterface != None) { // We need to know when the player's login changes PlayerInterface.AddLoginChangeDelegate(OnLoginChange); } } } /** * Called when this data store is removed from the data store manager's list of active data stores. * * @param PlayerOwner the player that will be associated with this DataStore. Only relevant if this data store is * associated with a particular player; NULL if this is a global data store. */ event Unregistered( LocalPlayer PlayerOwner ) { local int TypeIndex, ProviderIndex; local array ProviderInstances; local OnlineSubsystem OnlineSub; local OnlinePlayerInterface PlayerInterface; Super.Unregistered(PlayerOwner); /* if ( ProfileProvider.Player == PlayerOwner || ProfileProvider.Player == None ) { ProfileProvider = None; }*/ GameResourceDataStore = None; // now tell all our providers to clear their profile reference as well.... for ( TypeIndex = 0; TypeIndex < ResourceProviderDefinitions.Length; TypeIndex++ ) { if ( GetResourceProviders(ResourceProviderDefinitions[TypeIndex].ProviderTag, ProviderInstances) ) { for ( ProviderIndex = 0; ProviderIndex < ProviderInstances.Length; ProviderIndex++ ) { ProviderInstances[ProviderIndex].ClearProviderReferences(); } } } // Figure out if we have an online subsystem registered OnlineSub = class'GameEngine'.static.GetOnlineSubsystem(); if (OnlineSub != None) { // Grab the player interface to verify the subsystem supports it PlayerInterface = OnlineSub.PlayerInterface; if (PlayerInterface != None) { // Clear our delegate PlayerInterface.ClearLoginChangeDelegate(OnLoginChange); } } } DefaultProperties { Tag=DynamicGameResource }