Pular para o conteúdo principal

Criar Poderes

webapp_banner.jpg

Duas formas de escrever um poder

Todo poder fica em ~/plugins/EliteMobs/powers (subpastas também são varridas), e há dois formatos:

FormatFileUse it for
Lua*.luaQualquer coisa nova. Linguagem de scripting completa, todos os hooks de boss, loops e estado. É o que os poderes distribuídos usam.
EliteScript*.ymlO formato declarativo de evento/ação documentado no resto desta página. Continua totalmente suportado.

Quase todos os 68 poderes que acompanham o EliteMobs agora são Lua. Apenas bonus_coins.yml, custom_summon.yml e elite_script.yml permanecem como poderes Java respaldados por YAML. Se vais escrever um poder novo do zero, Lua é o caminho com mais capacidade por trás — começa em Primeiros Passos com Lua e Hooks e Ciclo de Vida do Boss.

Qualquer um dos formatos é referenciado a partir de um boss da mesma maneira, pela lista powers.

A .lua power supersedes a same-named .yml power

Quando um boss pede attack_fire.yml, o EliteMobs procura primeiro por attack_fire.lua e usa esse, se existir. É por isso que configs de boss antigas escritas com os nomes de poder anteriores ao Lua continuam a funcionar sem alterações — não precisas de reescrever as tuas listas powers:. Configs novas devem nomear diretamente o ficheiro .lua.

Premade .lua files are written once, never overwritten

Cada poder Lua distribuído é escrito na pasta powers apenas se esse ficheiro ainda não existir. Assim que editas um deles, o EliteMobs não vai sobrescrever a tua versão numa atualização — mas também deixas de receber correcções upstream para ele. Se queres uma cópia modificada, prefere dar-lhe um nome de ficheiro novo.

on_zone_enter / on_zone_leave are not fired by Lua zones

Ambos os nomes de hook são aceites pelo provedor de scripts de boss e não geram erro de carregamento, mas nada num poder Lua consegue fazê-los disparar. Eles são despachados apenas pelo listener de zonas do EliteScript, que é iniciado quando um eliteScript: em YAML no mesmo boss lista ZoneEnterEvent ou ZoneLeaveEvent nos seus Events:. Um boss apenas com poderes Lua vai carregar um ficheiro que contenha estes hooks e depois nunca os chamar.

Não construas um poder Lua em torno destes dois hooks a não ser que o combines deliberadamente com um script de zona em YAML desse tipo. Usa context.zones:watch_zone(...) (cujos próprios callbacks on_enter / on_leave são invocados diretamente), um bloco Zone do EliteScript, ou polling a partir de on_game_tick. Ver Hooks e Ciclo de Vida e Eventos de Script.

Sistema de Scripting do EliteMobs

A página seguinte descreve como criar Elite Scripts!

Esta é uma funcionalidade avançada e requer um conhecimento aprofundado do EliteMobs.

Nota: Elite Scripts podem ser adicionados como ficheiros de poder ou a ficheiros de bosses personalizados! Se usados como ficheiros de poder, podes adicioná-los como poderes normais aos bosses usando a configuração powers dos Bosses Personalizados, como habitualmente.

Adicionar um EliteScript

Para começar a adicionar um EliteScript a um boss, adiciona a seguinte entrada ao ficheiro do boss:

eliteScript:

Nota: O seguinte é extremamente sensível a maiúsculas/minúsculas e espaços! Certifica-te de que os teus espaços, quebras de linha e formatação geral correspondem aos exemplos!

Agora que declaraste o início do teu script, podes adicionar o teu script específico. Para este exemplo, vamos criar um script chamado Example:

eliteScript:
Example:

Os EliteScripts têm 5 secções diferentes: Events, Conditions, Zones, Actions e Cooldowns. Apenas Actions é obrigatório.

Vejamos um exemplo simples:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20

Este script faz com que um elite seja empurrado para cima quando atingido por um jogador, e não o fará novamente durante 3 segundos (e impedirá que outros poderes sejam acionados durante 1 segundo devido às configurações na secção Cooldowns).

Agora que conheces o formato geral de como os scripts são estruturados, é hora de aprender o que podes fazer com cada secção!


Events

Events

Clica no link acima para aprender a usar eventos!

Targets

Targets

Clica no link acima para aprender a usar alvos!

Actions

Actions

Clica no link acima para aprender a usar ações!

Zones

Zones

Clica no link acima para aprender a usar zonas!

Conditions

Conditions

Clica no link acima para aprender a usar condições!

Cooldowns

Cooldowns

Clica no link acima para aprender a usar tempos de recarga!


Adicionar múltiplos EliteScripts

Podes ter múltiplas ações num evento, mas e se quiseres múltiplos scripts no mesmo boss? É tão simples como criar uma nova entrada de script! Vamos expandir o exemplo anterior e adicionar outro script:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,0.5,0
Cooldowns:
local: 60
global: 20
Example2:
Events:
- PlayerDamagedByEliteMobEvent
Actions:
- action: SET_ON_FIRE
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

Neste exemplo, adicionámos um segundo script chamado Example2. O Example2 vai incendiar o jogador que for danificado pelo boss, pois o targetType está definido como DIRECT_TARGET.
O cooldown deste script está definido para 200 ticks, o que significa que o boss só poderá incendiar jogadores a cada 10 segundos.

Criar poderes autónomos

Os poderes autónomos são quase inteiramente compostos pelo Elite Script. Existem apenas dois campos opcionais. Não te esqueças de que para os poderes autónomos funcionarem, devem ser colocados na pasta ~plugins/EliteMobs/powers.
Exemplo de poder autónomo:

isEnabled: true
powerType: UNIQUE
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: PUSH
Target:
targetType: SELF
vValue: 0,.3,0
Cooldowns:
local: 60
global: 20

isEnabled

Tal como em qualquer outro lugar do plugin, define se o poder está ativado.

powerType

O tipo de poder define como o poder é atribuído. Os valores são:

  • UNIQUE: O poder só será aplicado a bosses personalizados que tenham o poder definido na secção de poderes.
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE: QUALQUER elite poderá obter estes poderes, e contarão para um subconjunto específico de poderes.
  • MAJOR_ZOMBIE, MAJOR_SKELETON, MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_GHAST: Apenas elites do tipo de entidade adequado poderão surgir naturalmente com estes poderes, e contarão como poderes maiores.

Como o powerType chega aos elites naturais: EliteMobPowers.yml

O powerType por si só não coloca um poder à frente de um elite natural. O que os elites naturais realmente sorteiam vem de ~/plugins/EliteMobs/EliteMobPowers.yml, que tem estas listas:

KeyMeaning
defensivePowersPoderes defensivos que elites naturais podem sortear aleatoriamente
offensivePowersPoderes ofensivos que elites naturais podem sortear aleatoriamente
miscellaneousPowersPoderes diversos que elites naturais podem sortear aleatoriamente
majorPowers.<ENTITY_TYPE>Poderes maiores que aquele tipo de entidade pode sortear aleatoriamente
disabledPowers.<ENTITY_TYPE>Poderes removidos daquele tipo de entidade depois de as listas partilhadas serem aplicadas

Quando o ficheiro é gerado pela primeira vez, cada lista é semeada com todos os poderes carregados do powerType correspondente. Depois disso, o ficheiro passa a ser a autoridade e nunca é re-semeado, por isso um poder que adiciones mais tarde — incluindo qualquer ficheiro .lua que coloques na pasta powers — não vai começar a aparecer em elites naturais até que o adiciones à lista relevante à mão.

Tanto nomes de ficheiro .lua como os nomes .yml legados são aceites nestas listas; os valores por defeito gerados são escritos usando o alias .yml. Um nome que não resolva para nenhum poder é ignorado com um aviso na consola nomeando o ficheiro e a chave.

effect

Define o efeito visual ou material usado pelo poder. Isto é usado por alguns poderes codificados para definir o seu efeito visual de partículas ou material.

ChaveValoresPadrão
effectStringnone

powerCooldown

Define o tempo de recarga, em ticks, para o poder individual. Isto controla com que frequência este poder específico pode ser acionado.

ChaveValoresPadrão
powerCooldownInteger0

globalCooldown

Define o tempo de recarga global, em ticks, partilhado entre todos os poderes. Depois de este poder ser acionado, nenhum outro poder pode ser acionado até que o cooldown global expire.

ChaveValoresPadrão
globalCooldownInteger0

Criar poderes Lua autónomos

Um poder Lua autónomo é apenas um ficheiro .lua em ~/plugins/EliteMobs/powers (subpastas incluídas — a pasta é varrida recursivamente). Não há wrapper em YAML nem chaves de configuração: o ficheiro é o poder.

return {
api_version = 1,
on_player_damaged_by_boss = function(context)
if context.player == nil then
return
end
context.player:apply_potion_effect("BLINDNESS", 60, 0)
end
}

Como não há cabeçalho YAML de onde os ler, um poder Lua descoberto desta forma recebe metadados fixos:

  • powerType é MISCELLANEOUS. Não podes defini-lo como UNIQUE a partir do ficheiro. (Os poderes Lua que acompanham o EliteMobs carregam o seu tipo em Java, e é por isso que podem ser UNIQUE, OFFENSIVE, MAJOR_* e por aí fora.)
  • effect fica por definir.

Na prática isto não faz o teu poder vazar para elites aleatórios, porque os pools de sorteio de elites naturais vêm de EliteMobPowers.yml e esse ficheiro não é re-semeado depois de existir — ver acima. Adiciona o poder à lista powers: de um boss para o usar.

Hooks disponíveis para poderes Lua de boss

HookFires when
on_spawnO boss aparece
on_game_tickA cada tick do servidor
on_boss_damagedO boss recebe dano de qualquer fonte
on_boss_damaged_by_playerO boss recebe dano de um jogador
on_boss_damaged_by_eliteO boss recebe dano de outro elite
on_player_damaged_by_bossO boss causa dano a um jogador
on_enter_combatO boss entra em combate
on_exit_combatO boss sai de combate
on_healO boss cura-se
on_boss_target_changedO boss troca de alvo
on_deathO boss morre
on_phase_switchO boss troca de fase

on_zone_enter e on_zone_leave também são aceites pelo parser, mas nada num poder Lua consegue fazê-los disparar — são despachados apenas por um listener de zonas do EliteScript no mesmo boss. Ver o aviso no topo desta página.

Para o que podes de facto chamar dentro destes hooks, ver Primeiros Passos com Lua, Hooks e Ciclo de Vida do Boss e Entidades de Boss.