PT-BR/Composição de Gamemodes: Difference between revisions
No edit summary |
(Page completely revised.) |
||
(2 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
Este guia tenta | 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 [[PT-BR/Introdução_ao_Scripting|Introdução ao Scripting]]. | ||
Um gamemode é | ==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: | ||
Um simples arquivo map seria assim : | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<map> | <map> | ||
Line 26: | Line 24: | ||
</map> | </map> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Aqui você pode ver dois elementos MTA | 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, | 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 | ====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: | |||
Como mencionado anteriormente, | |||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
-- | -- Crie uma tabela com todos os elementos do tipo bandeira | ||
local flagElements = getElementsByType ( "flag" ) | local flagElements = getElementsByType ( "flag" ) | ||
-- | -- Crie uma relação entre eles | ||
for key, value in pairs(flagElements) do | for key, value in pairs(flagElements) do | ||
-- | -- Obtenha informações | ||
local posX = getElementData ( value, "posX" ) | local posX = getElementData ( value, "posX" ) | ||
local posY = getElementData ( value, "posY" ) | local posY = getElementData ( value, "posY" ) | ||
local posZ = getElementData ( value, "posZ" ) | local posZ = getElementData ( value, "posZ" ) | ||
local team = getElementData ( value, "team" ) | local team = getElementData ( value, "team" ) | ||
-- | -- Crie um objeto de acordo com a posição da bandeira | ||
createObject ( 1337, posX, posY, posZ ) | createObject ( 1337, posX, posY, posZ ) | ||
-- | -- Escreva no chat da equipe | ||
outputChatBox ( " | outputChatBox ( "Uma base para o time " .. team .. " foi criada." ) | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
A função [[getElementsByType]] retorna uma tabela contendo todos os elementos de um determinado tipo | 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== | ==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 [[Map_manager#Fired_events|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: | |||
===Como usar o | |||
Para utilizar o recurso | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<!-- meta.xml "cowcatapult" | <!-- retirado do meta.xml de "cowcatapult" --> | ||
<meta> | <meta> | ||
<info type="gamemode" name="Cow catapulting 2.0"/> | <info type="gamemode" name="Cow catapulting 2.0"/> | ||
Line 69: | Line 64: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Se o seu modo de jogo | Se o seu modo de jogo irá carregar mapas personalizados, você deverá adicionar eventos: | ||
* onGamemodeMapStart | * onGamemodeMapStart, se um mapa for carregado. | ||
* onGamemodeMapStop | * onGamemodeMapStop, se um mapa for for descarregado. | ||
Esses eventos são chamados quando um mapa para o seu | 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==== | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
function startCtfMap( startedMap ) -- startedMap | function startCtfMap( startedMap ) -- startedMap se refere ao recurso do mapa | ||
local mapRoot = getResourceRootElement( startedMap ) -- | local mapRoot = getResourceRootElement( startedMap ) -- retorna a raiz do XML | ||
local flagElements = getElementsByType ( "flag" , mapRoot ) -- | 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: | ||
-- os jogadores | -- As bandeiras seriam criadas, e os jogadores, nasceriam. | ||
end | end | ||
addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap) | addEventHandler("onGamemodeMapStart", getRootElement(), startCtfMap) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== | ===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. | |||
Os mapas são recursos | Para fazer um mapa compatível com o seu modo de jogo, abra o seu arquivo meta e faça assim: | ||
Para fazer um mapa compatível com o seu modo de jogo, abra o seu arquivo meta | * 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: | |||
<syntaxhighlight lang="xml"> | <syntaxhighlight lang="xml"> | ||
<!-- | <!--meta.xml de um mapa qualquer--> | ||
<meta> | <meta> | ||
<info type="map" gamemodes="cowcatapult,assault,tdm"/> | <info type="map" gamemodes="cowcatapult,assault,tdm"/> | ||
Line 98: | Line 95: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Quando tudo estiver pronto, o administrador | Quando tudo estiver pronto, o administrador poderá usar os seguintes comandos para iniciar ou parar a partida: | ||
*/gamemode | */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 | */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. | |||
{{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=== | |||
*Fornecer um texto simples | 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. | ||
*Mostrar informações mais | |||
Leia a página | 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=== | ||
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. | |||
Scoreboard ou painel de avaliação, | |||
===Map cycler=== | ===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. | |||
[[en:Writing Gamemodes]] | |||
[[en:Writing | |||
[[it:Scrivere una gamemode]] | [[it:Scrivere una gamemode]] | ||
[[ru:Writing Gamemodes]] | [[ru:Writing Gamemodes]] | ||
[[de:Gamemodes schreiben]] | [[de:Gamemodes schreiben]] |
Latest revision as of 23:44, 6 July 2014
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.
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.