1
0
KF2-Dev-Scripts/Engine/Classes/PrefabInstance.uc
2020-12-13 18:01:13 +03:00

151 lines
5.8 KiB
Ucode

/**
* An Actor representing an instance of a Prefab in a level.
*
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
*/
class PrefabInstance extends Actor
native(Prefab);
/** The prefab that this is an instance of. */
var const Prefab TemplatePrefab;
/**
* The version of the Prefab that this is an instance of.
* This allows us to detect if the prefab has changed, and the instance needs to be updated.
*/
var const int TemplateVersion;
/** Mapping from archetypes in the source prefab (TemplatePrefab) to instances of those archetypes in this PrefabInstance. */
var const native Map{UObject*,UObject*} ArchetypeToInstanceMap;
/** Kismet sequence that was created for this PrefabInstance. */
var const PrefabSequence SequenceInstance;
/** Contains the epic+licensee version that this PrefabInstance's package was saved with. */
var const int PI_PackageVersion;
var const int PI_LicenseePackageVersion;
var const array<byte> PI_Bytes;
var const array<object> PI_CompleteObjects;
var const array<object> PI_ReferencedObjects;
var const array<string> PI_SavedNames;
var const native Map{UObject*,INT} PI_ObjectMap;
cpptext
{
// UObject interface
virtual void Serialize(FArchive& Ar);
virtual void PreSave();
virtual void PostLoad();
#if REQUIRES_SAMECLASS_ARCHETYPE
/**
* Provides PrefabInstance objects with a way to override incorrect behavior in ConditionalPostLoad()
* until different-class archetypes are supported.
*
* @fixme - temporary hack; correct fix would be to support archetypes of a different class
*
* @return pointer to an object instancing graph to use for logic in ConditionalPostLoad().
*/
virtual struct FObjectInstancingGraph* GetCustomPostLoadInstanceGraph();
#endif
/**
* Callback used to allow object register its direct object references that are not already covered by
* the token stream.
*
* @param ObjectArray array to add referenced objects to via AddReferencedObject
*/
void AddReferencedObjects( TArray<UObject*>& ObjectArray );
/**
* Create an instance of the supplied Prefab, including creating all objects and Kismet sequence.
*/
void InstancePrefab(UPrefab* InPrefab);
/**
* Do any teardown to destroy anything instanced for this PrefabInstance.
* Sets TemplatePrefab back to NULL.
*/
void DestroyPrefab(class USelection* Selection);
/**
* Update this instance of a prefab to match the template prefab.
* This will destroy/create objects as necessary.
* It also recreates the Kismet sequence.
*/
void UpdatePrefabInstance(class USelection* Selection);
/**
* Convert this prefab instance to look like the Prefab archetype version of it (by changing object refs to archetype refs and
* converting positions to local space). Then serialise it, so we only get things that are unique to this instance. We store this
* archive in the PrefabInstance.
*/
void SavePrefabDifferences();
/**
* Iterates through the ArchetypeToInstanceMap and verifies that the archetypes for each of this PrefabInstance's actors exist.
* For any actors contained by this PrefabInstance that do not have a corresponding archetype, removes the actor from the
* ArchetypeToInstanceMap. This is normally caused by adding a new actor to a PrefabInstance, updating the source Prefab, then loading
* a new map without first saving the package containing the updated Prefab. When the original map is reloaded, though it contains
* an entry for the newly added actor, the source Prefab's linker does not contain an entry for the corresponding archetype.
*
* @return TRUE if each pair in the ArchetypeToInstanceMap had a valid archetype. FALSE if one or more archetypes were NULL.
*/
UBOOL VerifyMemberArchetypes();
/**
* Utility for getting all Actors that are part of this PrefabInstance.
*/
void GetActorsInPrefabInstance( TArray<AActor*>& OutActors ) const;
/**
* Examines the selection status of each actor in this prefab instance, and
* returns TRUE if the selection state of all actors matches the input state.
*/
UBOOL GetActorSelectionStatus(UBOOL bInSelected) const;
/** Instance the Kismet sequence if we have one into the 'Prefabs' subsequence. */
void InstanceKismetSequence(USequence* SrcSequence, const FString& InSeqName);
/** Destroy the Kismet sequence associated with this Prefab instance. */
void DestroyKismetSequence();
/** Copy information to a FPrefabUpdateArchive from this PrefabInstance for updating a PrefabInstance with. */
void CopyToArchive(FPrefabUpdateArc* InArc);
/** Copy information from a FPrefabUpdateArchive into this PrefabInstance for saving etc. */
void CopyFromArchive(FPrefabUpdateArc* InArc);
/** Applies a transform to the object if its an actor. */
static void ApplyTransformIfActor(UObject* Obj, const FMatrix& Transform);
/** Utility for taking a map and inverting it. */
static void CreateInverseMap(TMap<UObject*, UObject*>& OutMap, TMap<UObject*, UObject*>& InMap);
/**
* Utility for copying UModel from one ABrush to another.
* Sees if DestActor is an ABrush. If so, assumes SrcActor is one. Then uses StaticDuplicateObject to copy UModel from
* SrcActor to DestActor.
*/
static void CopyModelIfBrush(UObject* DestObj, UObject* SrcObj);
}
defaultproperties
{
Begin Object Class=SpriteComponent Name=Sprite
Sprite=Texture2D'EditorResources.PrefabSprite'
HiddenGame=True
AlwaysLoadOnClient=False
AlwaysLoadOnServer=False
bIsScreenSizeScaled=True
ScreenSize=0.0025
SpriteCategoryName="Prefabs"
End Object
Components.Add(Sprite)
// the defaults for the PrefabInstance file versions MUST be -1 (@see APrefabInstance::Copy*Archive)
PI_PackageVersion=-1
PI_LicenseePackageVersion=-1
}