Documentação do Steamworks
Guia de implementação do Steam Workshop

Introdução

O Steam Workshop é um sistema de armazenamento back-end e páginas da web front-end que facilitam o armazenamento, a organização, a ordenação, a classificação e a transferência de conteúdo para o seu jogo ou aplicação.

Esta página contém detalhes técnicos sobre a implementação do Steam Workshop para o seu produto. Para mais informações e definições sobre os vários tipos de integração do Workshop que pode usar e como usar de forma mais eficiente as ferramentas fornecidas pelo Steam, consulte a documentação sobre o Steam Workshop antes de dar início à integração do Steam Workshop com o seu jogo.

Numa configuração típica, os utilizadores do seu jogo usam ferramentas fornecidas por si com a compra do seu jogo para criar modificações ou conteúdo totalmente novo. Esses utilizadores poderão enviar o conteúdo para o Steam Workshop através de um formulário integrado na sua ferramenta. Desta forma, outros utilizadores poderão aceder ao Steam Workshop, na Comunidade Steam, para procurar, ordenar, avaliar e subscrever itens que gostariam de adicionar ao jogo. De seguida, os itens serão descarregados através do Steam. Se o jogo foi registado para receber o callback ISteamUGC::ItemInstalled_t, chame a função ISteamUGC::GetItemInstallInfo para obter o local de instalação e ler os dados diretamente dessa pasta. O novo conteúdo será reconhecido pelo jogo da forma que fizer sentido para o seu jogo e para o conteúdo criado.

Tipos de Steam Workshop, monetização e boas práticas

Para mais informações e definições sobre os vários tipos de integração do Workshop disponíveis e como usar de forma mais eficiente as ferramentas fornecidas pelo Steam, consulte a documentação sobre o Steam Workshop.

Gestão da visibilidade do Steam Workshop

O Steam Workshop é o site hospedado pelo Steam que enumera conteúdo partilhado e permite aos utilizadores votarem e comentarem no conteúdo visível pela comunidade. Por predefinição, as aplicações não estão configuradas para terem visibilidade pública no Steam Workshop. Esta medida impede conteúdo não destinado a ser partilhado através do Steam Workshop de ser visível, a não ser que o Workshop seja definido como público.
Siga os seguintes passos para definir o estado de visibilidade do Workshop:
  1. Navegue até à página inicial da aplicação no site do Steamworks.
  2. Clique em Editar definições do Steamworks.
  3. No separador Workshop, selecione Geral.
  4. No lado direito da página, encontra-se a secção Estado de visibilidade.
  5. Use os botões para selecionar o nível desejado de visibilidade. As opções disponíveis são: "Apenas developers", "Developers e jogadores de teste", "Clientes e developers" e "Visível para todos".
  6. No separador Publicar, clique em Preparar para publicação.
  7. Clique em Publicar no Steam e conclua o processo para publicar a alteração.
Atenção: de forma a alterar o estado de visibilidade para "Visível para todos", é necessário concluir todos os passos da lista de tarefas do Workshop, a qual inclui a imagem representativa, o título, a descrição e, pelo menos, um item com visibilidade pública.

Vista geral técnica

O processo de partilha e utilização de conteúdo gerado por utilizadores é realizado através da API ISteamUGC, disponível no SDK do Steamworks. Os métodos expostos oferecem uma forma de partilhar conteúdo do Workshop, que poderá depois ser descoberto através do Steam Workshop ou de uma interface dentro do jogo.

É necessário aceder à API do Workshop através do ponteiro retornado por SteamUGC().

Por exemplo:
SteamAPICall_t hSteamAPICall = SteamUGC()->CreateItem( SteamUtils()->GetAppID(), k_EWorkshopFileTypeMicrotransaction );

Ativação de ISteamUGC para um jogo ou uma aplicação

Antes que itens do Workshop possam ser enviados ao back-end do Steamworks, existem duas configurações que têm de ser realizadas: configuração de quotas da Steam Cloud e ativação da API ISteamUGC.

A Steam Cloud é uma funcionalidade usada para armazenar as imagens de pré-visualização associadas aos itens do Workshop. A quota da Steam Cloud pode ser configurada através dos seguintes passos:
  1. Aceda à página de definições da Steam Cloud no painel de administração da aplicação.
  2. Defina a Quota de bytes por utilizador e o Número de ficheiros permitidos por utilizador com valores adequados ao armazenamento de imagens de pré-visualização.
  3. Clique em "Guardar".
  4. No separador Publicar, clique em Preparar para publicação.
  5. Clique em Publicar no Steam e conclua o processo para publicar a alteração.

Siga os seguintes passos para ativar a API ISteamUGC:
  1. Aceda à página de configuração do Steam Workshop no painel de administração da aplicação.
  2. Procure a secção Opções de configuração adicionais.
  3. Assinale a opção Ativar ISteamUGC para transferência de ficheiros.
  4. Clique em Guardar.
  5. No separador Publicar, clique em Preparar para publicação.
  6. Clique em Publicar no Steam e conclua o processo para publicar a alteração.
Assim que tiver configurado estas definições, será possível enviar conteúdo para o Workshop através da API.

Criação e envio de conteúdo

O processo de criação e envio de conteúdo do Workshop é simples e repetível, como ilustrado abaixo.

ISteamUGCFlow-CreateUpload-Web2.png

Criação de um item do Workshop

  1. Todos os itens do Workshop começam com uma chamada a ISteamUGC::CreateItem.
    • A variável nConsumerAppId deve conter o AppID do jogo ou da aplicação. Não passe o AppID da ferramenta de criação de itens do Workshop, caso seja uma aplicação separada com um AppID diferente.
    • EWorkshopFileType é uma enumeração que define como o ficheiro será partilhado com a comunidade. Os valores válidos são:
      • k_EWorkshopFileTypeCommunity – Este tipo é usado para descrever ficheiros que serão enviados por utilizadores e disponibilizados para download a qualquer pessoa na comunidade. Usado normalmente para a partilha de mods criados por utilizadores.
      • k_EWorkshopFileTypeMicrotransaction – Este tipo é usado para descrever ficheiros enviados por utilizadores, mas que devem passar por um processo de análise para serem adicionados ao jogo como conteúdo oficial. Estes ficheiros não serão descarregados por utilizadores através do Workshop, mas poderão ser vistos e avaliados pela comunidade.
        Este é o tipo de implementação usado pelo Team Fortress 2.
  2. Registe um handler de resultados de chamada para CreateItemResult_t.
  3. Primeiro, verifique o valor de m_eResult para garantir que o item foi criado com sucesso.
  4. Quando o handler do resultado da chamada for executado, consulte o valor de m_nPublishedFileId e armazene-o para atualizações futuras do item do Workshop (por ex.: num ficheiro de projeto associado à ferramenta de criação).
  5. A variável m_bUserNeedsToAcceptWorkshopLegalAgreement também deve ser verificada e, se for true, o utilizador deve ser reencaminhado para aceitar os termos do acordo legal. Consulte a secção Acordo Legal do Workshop para mais detalhes.

Envio de um item do Workshop

  1. Assim que um item do Workshop tiver sido criado e um valor PublishedFileId_t tiver sido retornado, o conteúdo do item do Workshop pode ser populado e enviado para o Steam Workshop.
  2. Uma atualização do item começa com uma chamada a ISteamUGC::StartItemUpdate.
  3. Usando o UGCUpdateHandle_t retornado por ISteamUGC::StartItemUpdate, chamadas podem ser realizadas para atualizar o título, descrição, visibilidade, marcadores, conteúdo e imagem de pré-visualização do item através dos vários métodos que começam por ISteamUGC::SetItem[...].
  4. Assim que as chamadas de atualização tiverem sido realizadas, chamar ISteamUGC::SubmitItemUpdate irá iniciar o processo de envio para o Steam Workshop.
    • Registe um handler de resultados de chamada para SubmitItemUpdateResult_t.
    • Quando este handler for executado, verifique o valor de m_eResult para confirmar que o envio foi realizado com sucesso.
    • Atenção: não existe um método de cancelar a atualização e o envio de um item assim que as respetivas chamadas tiverem sido realizadas.
  5. Se desejar acompanhar o progresso do envio, pode usar ISteamUGC::GetItemUpdateProgress:
    • EItemUpdateStatus define o progresso do envio e da atualização.
    • punBytesProcessed e punBytesTotal podem ser usados como input para uma interface de utilizador, como uma barra de progresso para indicar o progresso do envio.
    • punBytesTotal pode ser atualizado durante o processo de envio com base no estado da atualização do item.
  6. Tal como no passo "Criação de um item do Workshop", confirme que o utilizador aceitou os termos do acordo legal. Este passo é necessário em casos onde o utilizador não tenha criado o item, mas o esteja a editar.

Notas adicionais

  • Anteriormente, os itens do Workshop eram designados como ficheiros individuais. Com a API ISteamUGC, um item do Workshop é uma representação de uma pasta com ficheiros.
  • Se um item do Workshop requer metadados adicionais para utilização pela aplicação consumidora, pode chamar ISteamUGC::SetItemMetadata para os anexar. Estes metadados podem ser retornados em consultas sem ser necessário descarregar e instalar o conteúdo do item.
    No passado, sugeríamos guardar estes metadados num ficheiro dentro da pasta de itens do Workshop, o que ainda pode fazer.

Consumo de conteúdo

O consumo de conteúdo do Workshop é dividido em duas categorias: subscrição de itens e instalação de itens.

Subscrição de itens

Muitos dos itens do Workshop são subscritos através do portal do Steam Workshop. É um local conhecido que todos os jogos e aplicações têm em comum, logo é provável que os utilizadores encontrem e subscrevam itens regularmente no site do Steam Workshop.

Contudo, a API ISteamUGC oferece dois métodos para realizar e anular a subscrição de itens do Workshop de forma programática, tornando possível aos utilizadores gerir subscrições dentro do jogo.
  • ISteamUGC::SubscribeItem – Subscreve um item do Workshop. O item será descarregado e instalado assim que possível.
  • ISteamUGC::UnsubscribeItem – Anula a subscrição de um item do Workshop. Resulta na remoção do item da lista de subscrições após o encerramento do jogo.

Existem dois métodos adicionais para a enumeração de itens subscritos de um utilizador:

Notificações para ações externas de subscrição

É possível receber notificações no jogo quando um utilizador realiza ou anula a subscrição de um ficheiro através de qualquer mecanismo (ex.: ISteamUGC, site do Steam Workshop):

Instalação de itens

Assim que as informações da subscrição de um item forem obtidas, os métodos de consumo restantes podem ser utilizados. Estes métodos fornecem informações ao jogo sobre o estado do download e da instalação do item. Os downloads de itens do Workshop são executados através da aplicação Steam e ocorrem automaticamente do seguinte modo:
  1. Quando a aplicação Steam indica que um jogo está para ser iniciado, todos os depots da aplicação que foram atualizados serão descarregados e instalados.
  2. Todos os itens do Workshop instalados serão atualizados, caso necessário.
  3. De seguida, a aplicação Steam inicia o jogo ou a aplicação.
  4. Itens do Workshop subscritos recentemente que ainda não tiverem sido descarregados serão descarregados e instalados em segundo plano.
    • Os ficheiros subscritos serão descarregados pela aplicação Steam por ordem de subscrição.
    • Cada download de um item do Workshop será devidamente identificado por um banner específico na página de downloads do Steam.
Atenção: usar a funcionalidade "Verificar integridade dos ficheiros" na aplicação Steam também dará início ao download de itens do Workshop.

Como o jogo será iniciado antes que o conteúdo subscrito novo termine de descarregar e instalar, os métodos restantes de consumo existem para ajudar na monitorização e gestão do progresso da instalação. Também podem ser usados quando os itens são subscritos dentro do jogo de forma a mostrar o estado da instalação em tempo real.

Estado de um item do Workshop

Progresso do download de um item do Workshop

Inicialização ou aumento da prioridade do download de um item do Workshop

  • ISteamUGC::DownloadItem
    • Defina bHighPriority com o valor true para pausar downloads ativos e começar imediatamente a descarregar este item do Workshop.
    • Se o valor de retorno for true, registe e espere pelo callback ISteamUGC::DownloadItemResult_t antes de chamar ISteamUGC::GetItemInstallInfo ou de aceder ao item do Workshop no disco.
    • Se o utilizador não subscreveu o item (ex.: servidor do jogo a usar início de sessão anónimo), o item do Workshop será descarregado e armazenado em cache temporariamente.
    • Se o item do Workshop tiver um campo ISteamUGC::EItemState com o valor k_EItemStateNeedsUpdate, é possível chamar ISteamUGC::DownloadItem para iniciar a atualização. Não aceda ao item do Workshop no disco até que o callback ISteamUGC::DownloadItemResult_t ocorra.
    • Este método funciona apenas com itens do Workshop criados com a API ISteamUGC. Não irá funcionar com itens do Workshop criados com a API ISteamRemoteStorage.
    • A struct do callback ISteamUGC::DownloadItemResult_t contém o ID da aplicação (m_unAppID) associada ao item do Workshop. Deve ser comparado com o ID da aplicação em execução, uma vez que o handler será chamado para todos os downloads de itens, independentemente da aplicação.

Obtenção de informações sobre a cópia local do item do Workshop

Notificação de instalação ou atualização de um item do Workshop

Consulta de conteúdos

A interface ISteamUGC oferece uma forma flexível de enumerar os vários tipos de conteúdo gerado por utilizadores no Steam (ex.: itens do Workshop, capturas de ecrã, vídeos, etc.).

ISteamUGCFlows-QueryingContent-web2.png

  1. Registe um handler de resultados de chamada para SteamUGCQueryCompleted_t.
  2. Existem alguns métodos disponíveis para a criação da consulta dependendo do cenário: consultar conteúdos associados a um utilizador, consultar todos os conteúdos ou obter os detalhes dos conteúdos cujos IDs possui.
  3. Personalize a consulta conforme apropriado ao chamar os seguintes métodos:
    • Ao consultar conteúdos do utilizador:
    • Ao consultar todos os conteúdos gerados por utilizadores:
      • ISteamUGC::SetMatchAnyTag – Define uma consulta pendente de conteúdo para que sejam retornados apenas os itens com um ou mais marcadores correspondentes ou apenas os itens com todos os marcadores introduzidos.
      • ISteamUGC::SetSearchText – Define uma consulta pendente de conteúdo para que sejam retornados apenas os itens com uma string específica no título ou na descrição.
      • ISteamUGC::SetRankedByTrendDays – Define uma consulta pendente de conteúdo para que a ordem dos resultados seja atualizada com base na avaliação dos itens num determinado número de dias.
    • Ao consultar com qualquer um dos métodos acima:
      • ISteamUGC::AddRequiredTag – Adiciona um marcador obrigatório a uma consulta pendente de conteúdo para que sejam retornados apenas conteúdos com esse marcador.
      • ISteamUGC::AddExcludedTag – Adiciona um marcador excluído a uma consulta pendente de conteúdo para que sejam retornados apenas conteúdos sem esse marcador.
      • ISteamUGC::AddRequiredKeyValueTag – Adiciona um marcador de par de chave-valor a uma consulta pendente de conteúdo para que sejam retornados apenas itens do Workshop com uma chave = [param]pKey[/param] e um valor = [param]pValue[/param].
      • ISteamUGC::SetReturnOnlyIDs – Define uma consulta pendente de conteúdo para que sejam retornados apenas IDs em vez de todos os detalhes ou não. Útil para situações em que não necessita de todas as informações (por exemplo, apenas pretende obter os IDs dos itens que um utilizador tem na lista de favoritos).
      • ISteamUGC::SetReturnKeyValueTags – Define uma consulta pendente de conteúdo para que sejam retornados os marcadores de par de chave-valor dos itens ou não.
      • ISteamUGC::SetReturnLongDescription – Define uma consulta pendente de conteúdo para que seja retornada a descrição completa dos itens ou não.
      • ISteamUGC::SetReturnMetadata – Define uma consulta pendente de conteúdo para que sejam retornados os metadados especificados pelo developer ou não.
      • ISteamUGC::SetReturnChildren – Define uma consulta pendente de conteúdo para que sejam retornados os IDs dos itens subordinados dos itens ou não.
      • ISteamUGC::SetReturnAdditionalPreviews – Define uma consulta pendente de conteúdo para retornar imagens e vídeos adicionais anexados aos itens ou não.
      • ISteamUGC::SetReturnTotalOnly – Define uma consulta pendente de conteúdo para que seja retornado apenas o número total de resultados ou não. Os itens em si não serão retornados quando ISteamUGC::SteamUGCQueryCompleted_t for chamado.
      • ISteamUGC::SetLanguage – Define uma consulta pendente de conteúdo para retornar apenas o título e a descrição dos itens no idioma especificado.
      • ISteamUGC::SetAllowCachedResponse – Define uma consulta pendente de conteúdo para que sejam retornados os resultados da cache referentes ao período especificado ou não.
  4. Envie a consulta para o Steam através da função ISteamUGC::SendQueryUGCRequest, que irá invocar o handler do resultado de chamada ISteamUGC::SteamUGCQueryCompleted_t registado no passo 1.
  5. No handler do resultado de chamada ISteamUGC::SteamUGCQueryCompleted_t, chame ISteamUGC::GetQueryUGCResult para obter os detalhes de cada item retornado.

  6. Também pode chamar estas funções para obter informações adicionais sobre cada item (alguns destes dados não são retornados por predefinição se não configurar a consulta devidamente):
  7. Chame ISteamUGC::ReleaseQueryUGCRequest para libertar a memória alocada para consultas ou obtenções de resultados.

Paginação de resultados

Até 50 resultados serão retornados com cada consulta. Para obter mais resultados, crie uma consulta que incremente o parâmetro unPage (cujo valor deve começar a 1).

Acompanhamento de tempo de uso

Para acompanhar o tempo de uso de itens do Workshop, chame ISteamUGC::StartPlaytimeTracking com os IDs dos itens pretendidos. De seguida, quando os itens forem removidos, chame ISteamUGC::StopPlaytimeTracking com os IDs dos itens que pretende parar de acompanhar ou chame ISteamUGC::StopPlaytimeTrackingForAllItems para parar de acompanhar o tempo de uso de todos os itens de uma só vez.
Quando a sua aplicação é encerrada, o acompanhamento do tempo de jogo é interrompido automaticamente.

Também é possível ordenar itens por várias métricas de tempo de uso em consultas ISteamUGC::CreateQueryAllUGCRequest. Seguem-se os tipos de consulta baseados em tempo de jogo que pode utilizar:

Eliminação do conteúdo de um item do Workshop

Para eliminar um item do Workshop, chame ISteamUGC::DeleteItem. Tenha em atenção que esta ação não requer confirmação por parte do utilizador e é irreversível.

Integração do exemplo do Steamworks (Spacewar)

A Steamworks API Example Application (SpaceWar) incluída no SDK do Steamworks demonstra um subconjunto da API ISteamUGC.
  • CSpaceWarClient::LoadWorkshopItem demonstra se um item do Workshop foi descarregado e instalado no disco, para além de pedir informações sobre um item do Workshop através de ISteamRemoteStorage::PublishedFileId_t.
  • CSpaceWarClient::LoadWorkshopItems demonstra a obtenção da lista de itens do Workshop da aplicação Spacewar subscritos pelo utilizador atual.
  • CSpaceWarClient::OnWorkshopItemInstalled demonstra um handler para o callback ISteamUGC::ItemInstalled_t.

Acordo Legal do Workshop

Por predefinição, os itens do Workshop serão ocultados até que o respetivo autor concorde com os termos do Acordo Legal do Steam Workshop. Siga os passos abaixo para que o utilizador não tenha dificuldade em tornar o item publicamente visível:
  1. Ao lado do botão usado para enviar um item para o Workshop, inclua uma descrição semelhante ao seguinte texto: "Ao enviar este item, o utilizador concorda com os Termos de Serviço do Steam Workshop" (inclua o link).
  2. Após o utilizador enviar um item, abra uma janela do browser com a página do item no Steam Workshop (chame ISteamFriends::ActivateGameOverlayToWebPage com pchURL definido como steam://url/CommunityFilePage/<PublishedFileId_t>; substitua <PublishedFileId_t> pelo ID do item no Workshop).
Este processo tem a vantagem de encaminhar o autor para a página do Workshop onde poderá ver o item e efetuar as configurações necessárias, para além de permitir que o utilizador aceda facilmente ao Acordo Legal do Steam Workshop e aceite os respetivos termos.

Web API

Além destes métodos, existe um conjunto de interfaces da Web API que oferecem funcionalidades semelhantes, assim como APIs de filtragem baseadas na comunidade que listam todos os conteúdos partilhados. Consulte a documentação sobre a interface ISteamRemoteStorage na lista da Web API.

Servidores dedicados de jogos

Servidores de jogos também podem descarregar e instalar itens.
  • O servidor terá de conhecer o PublishedFileId_t para pedir um item do Workshop, que pode ser fornecido pelos clientes ou definido pelo operador do servidor. De seguida, chame ISteamUGC::DownloadItem para obter uma cópia temporária do item do Workshop.
  • De seguida, pode chamar ISteamUGC::GetItemInstallInfo para obter informações para localizar e usar o item do Workshop.
  • Consulte a secção Instalação de itens acima para mais informações sobre estes métodos da API.

Integração com SteamCmd

Tal como a API ISteamUGC API, a ferramenta de linha de comandos steamcmd.exe pode ser usada para criar a atualizar itens do Workshop para testes. Deve usá-la apenas para fins de teste, pois a ferramenta requer que o utilizador introduza as credenciais da conta Steam (algo que não queremos que os utilizadores façam).

Para criar um novo item do Steam Workshop com steamcmd.exe, deve criar primeiro um ficheiro VDF. O ficheiro VDF é um ficheiro de texto simples que deve conter as seguintes chaves:
"workshopitem" { "appid" "480" "publishedfileid" "5674" "contentfolder" "D:\\Content\\workshopitem" "previewfile" "D:\\Content\\preview.jpg" "visibility" "0" "title" "Team Fortress Green Hat" "description" "A green hat for Team Fortress" "changenote" "Version 1.2" }

Notas:
  • As chaves são mapeadas aos vários métodos ISteamUGC::SetItem[...]. Consulte a documentação acima para mais detalhes.
  • Os valores acima são apenas exemplos e devem ser atualizados adequadamente.
  • Para criar um item novo, o valor de appid tem de ser definido e o valor de publishedfileid tem de estar vazio ou de ser 0.
  • Para atualizar um item existente, appid e publishedfileid têm ambos de ser definidos.
  • Os pares de chave-valor restantes têm de ser incluídos no VDF se a chave precisar de ser atualizada.
Assim que o ficheiro VDF tiver sido criado, execute steamcmd.exe com o parâmetro workshop_build_item <nome do ficheiro de configuração aqui>. Por exemplo:
steamcmd.exe +login myLoginName myPassword +workshop_build_item workshop_green_hat.vdf +quit
Se o comando for bem-sucedido, o valor publishedfileid no VDF será atualizado automaticamente para conter o ID do item do Workshop. Desta forma, chamadas subsequentes com steamcmd.exe para o mesmo ficheiro VDF irão resultar numa atualização e não na criação de um item novo.

Erros e relatórios

A maioria dos métodos da API ISteamUGC retorna valores booleanos. Para informações adicionais sobre erros específicos, existem vários locais que pode consultar:

Perguntas frequentes

P.: Pode uma aplicação separada publicar conteúdo no Workshop do meu jogo?

Sim. Uma aplicação separada, como uma ferramenta de edição e publicação, pode ser configurada para que o Workshop da aplicação base aceite conteúdo da aplicação de edição.

Para tal, aceda à secção "Configuração do Workshop" da página da aplicação base no Steamworks e desça até ao fim da página. Introduza o AppID da aplicação separada no campo "Permissões de publicação da aplicação" e clique em "Adicionar".

Assim que as definições do Steamworks forem publicadas, a aplicação de edição poderá publicar conteúdo no Workshop da aplicação base.