terça-feira, 19 de junho de 2012

Platformer Kit: SPG_InventoryManager class (UnrealScript)

A classe SPG_InventoryManager existe para permitir a criação de itens de inventário baseados em Archetypes. No Platformer Kit ela é usada para a criação da arma do jogador.

O código da classe está abaixo:
class SPG_InventoryManager extends InventoryManager;

simulated function Inventory CreateInventoryArchetype(Inventory NewInventoryItemArchetype, optional bool bDoNotActivate)
{
    local Inventory    Inv;
  
    // Ensure the inventory archetype is valid
    if (NewInventoryItemArchetype != None)
    {
        // Spawn the inventory archetype
        Inv = Spawn(NewInventoryItemArchetype.Class, Owner,,,, NewInventoryItemArchetype);
      
        // Spawned the inventory, and add the inventory
        if (Inv != None && !AddInventory(Inv, bDoNotActivate))
        {
            // Unable to add the inventory, so destroy the spawned inventory
            Inv.Destroy();
            Inv = None;
        }
    }

    // Return the spawned inventory
    return Inv;
}

defaultproperties
{
    // Create the pending fire array
    PendingFire(0)=0
    PendingFire(1)=0
}

A função CreateInventoryArchetype() é chamada a partir da classe SPG_GameInfo. Ela utiliza a função Spawn() para criar uma instância da classe Inventory baseada no Archetype recebido como parâmetro.

A função Spawn() é definida na classe Actor e possui os seguintes parâmetros:
native noexport final function coerce actor Spawn
(
    class<actor>      SpawnClass,
    optional actor    SpawnOwner,
    optional name     SpawnTag,
    optional vector   SpawnLocation,
    optional rotator  SpawnRotation,
    optional Actor    ActorTemplate,
    optional bool     bNoCollisionFail
);

Depois de criada a instância de Inventory, ela é adicionado ao inventário do jogador através da função AddInventory(). Você encontra o código desta função no meu artigo "PickupFactory e Inventory em UnrealScript".

Se por alguma razão não for possível adicionar o Inventory, deve ser chamada a função Destroy() para remover o objeto da memória. A função Destroy() não é executada imediatamente, por isso é necessário atribuir "None" à variável logo após a chamada à função Destroy().