PT-BR/Composição de Gamemodes

From Multi Theft Auto: Wiki
Revision as of 23:44, 6 July 2014 by Cristiano Cardoso (talk | contribs) (Page completely revised.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Este guia tenta explicar o processo de como escrever um gamemode adequado. Se você ainda não sabe fazer scripts para o MTA, é recomendado começar pela Introdução ao Scripting.

Antes de começar

Um gamemode ou modo de jogo é o recurso principal do jogo, pois define todas as regras e tutela boa parte dos acontecimentos. Isto pode incluir: informar aos jogadores como jogar, fazer os seus bonecos nascerem, criar equipes, definir como eles ganharão dinheiro ou pontos, e assim por diante. Alguns exemplos de gamemodes são: Race e Deathmatch.

Como é um gamemode adequado?

Para ser simples, adequado ou bem feito, você deve utilizar todo potencial do sistema de arquivos map do MTA. Isto significa que um gamemode não carrega dentro de si elementos específicos de um mapa, como pickups, objetos, spawnpoints e veículos. Em vez disso, ele deve carregar-los através de arquivos coma a extensão .map, os quais a única função é listar esses elementos. Desta maneira, ele terá a sua disposição certos mapas instalados no servidor. Além disso, os usuários também podem criar novos mapas com o Map Editor - de um jeito mais intuitivo que escrever códigos.

Com certeza, um gamemode competente é o Race, pois ele permite aos jogadores fazerem upload de mapas personalizados para partidas de corrida. Mediante a isso, não é preciso abrir o recurso e edita-lo para adicionar novos circuitos.

Os arquivos de mapas são basicamente documentos em XML com uma extensão .map. Eles criam um cenário para um ou mais gamemodes específicos, a modo de não provocar alterações nas regras do jogo definidas inicialmente pelo próprio gamemode.

Cada elemento em um mapa corresponde a uma tag (instância) em seu respectivo arquivo. Há uma sintaxe definida a cada elemento padrão do MTA, como objetos, veículos e assim por diante. Porém, no caso de elementos customizados pelos recursos, é necessário criar uma sintaxe nova para cada um.

Premier Exmaple

Vamos examinar o modo de jogo chamado Capture the Flag. A função de um mapa criado para ele é definir onde estão os spawnpoints, as bandeiras, e possivelmente outros objetos, como veículos ou pickups. Um simples arquivo .map seria assim:

<map>
    <spawnpoint id="spawnpoint1" posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" rot="63.350006103516" model="0"/>
    <pickup id="Armor 1" posX="1911.083984375" posY="-1658.8798828125" posZ="885.40216064453" type="armor" health="50" respawn="60000"/>
    <flag posX="1959.5487060547" posY="-1714.4613037109" posZ="877.25219726563" team="blue" />
    ...
</map>

Aqui você pode ver dois elementos comuns ao MTA: um spawnpoint e um pickup. Mais importante ainda, este contém uma tag chamada flag, definindo a localização e a cor da bandeira. O spawnpoint e pickup até podem ser normalmente criados por outros recursos, mas qualquer elemento personalizado têm de ser processados pelo gamemode em questão.

Resumindo, o objetivo de todo modo de jogo é que os jogadores criem seus próprios mapas como acontece no MTA Race.

Exemplo de como obter as informações do mapa

Como mencionado anteriormente, seu recurso precisa encontrar elementos customizados contidos em um arquivo, e processá-los. O exemplo a seguir mostra isso:

-- Crie uma tabela com todos os elementos do tipo bandeira
local flagElements = getElementsByType ( "flag" )
-- Crie uma relação entre eles
for key, value in pairs(flagElements) do
	-- Obtenha informações
	local posX = getElementData ( value, "posX" )
	local posY = getElementData ( value, "posY" )
	local posZ = getElementData ( value, "posZ" )
	local team = getElementData ( value, "team" )
	-- Crie um objeto de acordo com a posição da bandeira
	createObject ( 1337, posX, posY, posZ )
	-- Escreva no chat da equipe
	outputChatBox ( "Uma base para o time " .. team .. " foi criada." )
end

A função getElementsByType retorna uma tabela contendo todos os elementos de um determinado tipo. Este tipo é o nome da tag, como o exemplo da bandeira no mapa citado acima. Isso funciona para ambos os elementos customizados e os comuns ao MTA, como veículo ou jogador. Já getElementData é usada para carregar os atributos definidos no XML. Nesse simples exemplo, um objeto é criado nas coordenadas da bandeira, e em seguida, uma mensagem informando seu posicionamento aparece no chat. Você deve proceder com a criação de elementos customizados durante o carregamento do mapa, como também gerenciar sua interação com o mundo. Um exemplo seria o trecho omitido do script acima: ele cria colisores para informar a captura da bandeira por um jogador do outro time.

Map manager

Depois de lidas as seções acima, deve ficar claro que um modo de jogo deve sempre é constituído de duas coisas:

  • Seu próprio recurso, sempre intacto.
  • Vários mapas, os quais fornecem informações a respeito dos objetos do jogo.

Agora, em vez de escrever um script para cada mapa diferente, o Map manager fornece funções para carregar tanto os gamemodes, quanto seus mapas. Simplificando, quando você digitar o comando, por exemplo "gamemode ctf ctf-italy", ele irá iniciar ambos os recursos ctf e o seu mapa: ctf-Italy. Ele também provoca o evento onGamemodeMapStart para avisar ao recurso ctf que o mapa especificado no comando será carregado. O recurso ctf pode, então, acessar as informações contidas nele e começar a fazer os jogadores nascerem.

Como usar o Map Manager?

Para utilizar o recurso Map Manager, o modo de jogo deverá ser definido, obviamente, como "gamemode". Em outras palavras, é só definir, no arquivo meta, o atributo "type" da tag <info> como "gamemode". Além disso, você pode criar o atributo "name" para indicar um nome mais amigável para seu recurso, como "Capture the flag". Ou seja, em vez de ser mostrado no Server Browser "ctf" como o gamemode atual, será mostrado "Capture the Flag". Um exemplo seria:

<!-- retirado do meta.xml de "cowcatapult" -->
<meta>
    <info type="gamemode" name="Cow catapulting 2.0"/>
</meta>

Se o seu modo de jogo irá carregar mapas personalizados, você deverá adicionar eventos:

  • onGamemodeMapStart, se um mapa for carregado.
  • onGamemodeMapStop, se um mapa for for descarregado.

Esses eventos são chamados quando um mapa para o seu recurso é iniciado ou parado, e irá definir como parâmetros do evento o mapa em questão. Nas funções destinadas a esses eventos, podes obter todas as informações necessárias sobre o arquivo .map.

Um exemplo

function startCtfMap( startedMap ) -- startedMap se refere ao recurso do mapa
    local mapRoot = getResourceRootElement( startedMap )        -- retorna a raiz do XML
    local flagElements = getElementsByType ( "flag" , mapRoot ) -- retorna todas as bandeiras do mapa e salva-os em uma tabela 
    -- agora é só proceder com o carregamento das informações obtidas acima:
    -- As bandeiras seriam criadas, e os jogadores, nasceriam.
end
addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap)

Como fazer um mapa compatível?

Os mapas são nada mais que recursos a parte. Isso porque é necessário o modo de jogo permanecer inalterado e o mapa, é claro, não alterar as regras do jogo. Simples assim. Para fazer um mapa compatível com o seu modo de jogo, abra o seu arquivo meta e faça assim:

  • O atributo "type" deve ser definido como "map"
  • O atributo "gamemodes" deverá conter uma lista separada por vírgula (sem espaços) de nomes de gamemodes compatíveis com o mapa.

Um exemplo:

<!--meta.xml de um mapa qualquer-->
<meta>
    <info type="map" gamemodes="cowcatapult,assault,tdm"/>
</meta>

Quando tudo estiver pronto, o administrador poderá usar os seguintes comandos para iniciar ou parar a partida:

  • /gamemode nome-do-Gamemode [nome-do-mapa]: Com este comando, podes iniciar um mapa, e consequentemente, seu gamemode; caso ele não estiver rodando.
  • /changemap nome-do-mapa [nome-do-Gamemode]: Com ele, podes iniciar um mapa e um gamemode junto. Se não for especificado, o gamemode rodando no momento será mantido.

obs: Os termos em colchetes ([]) são opcionais.


[[{{{image}}}|link=|]] Dica: O map manager exporta algumas funções não descritas neste exemplo, podendo ser úteis.

E agora?

Há alguns recursos úteis para incrementar seu jogo. É bom ter conhecimento deles!

Help Manager

O Help Manager é, em teoria, a interface padrão para os jogadores necessitando de ajuda. Portanto, se você usar o helpmanager para exibir informativos a respeito do seu jogo, qualquer jogador que tenha usado o helpmanager antes (em um outro servidor), imediatamente saberá como chegar lá. Além disso, o utilitário cria na mesma janela, outras abas para cada recurso que utiliza suas funcionalidades.

De uma forma geral, há duas maneiras de usa-lo:

  • Fornecer um texto simples no chat explicando como usar o seu recurso
  • Mostrar informações mais extensas em uma janela.

Leia a página do Help Manager para obter detalhes de como utilizá-lo.

Scoreboard

Scoreboard ou painel de avaliação, mostra jogadores e equipes presentes no servidor. Você pode adicionar colunas personalizadas para fornecer informações adicionais, caso necessário. Por exemplo, a coluna "points" do gamemode "ctf" representa os pontos adquiridos pelo jogador através de assassinatos ou capturas.

Map cycler

O map cycler ou mapa termociclador, controla os mapas e gamemode que estão rodando no servidor. Por exemplo, você pode especificar quantas vezes um modo de jogo vai ser repetido antes de ir para o próximo. Para fazer isso, você deve dizer ao mapa termociclador em que rodada ele termina.