Saltar para o conteúdo principal

Criar Poderes

webapp_banner.jpg

Duas formas de escrever um poder​

Os poderes definidos em ficheiros ficam em plugins/EliteMobs/powers, incluindo subpastas. Há dois formatos:

FormatoFicheiroUtilização
Lua*.luaComportamento programado com hooks de boss, ciclos e estado. A maioria dos poderes incluídos usa este formato.
EliteScript*.ymlO formato declarativo de evento/ação documentado no resto desta página. Continua totalmente suportado.

Dos 71 poderes incluídos, 68 usam Lua. Apenas bonus_coins.yml, custom_summon.yml e elite_script.yml permanecem como poderes Java baseados em YAML. Para novos comportamentos programados, 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.

Usa nomes de ficheiro únicos entre todas as subpastas. O registo usa o nome do ficheiro, não um caminho com a pasta, pelo que as subpastas não isolam nomes duplicados. Quando dois ficheiros têm o mesmo nome, o EliteMobs carrega aquele cujo caminho completo vem primeiro na ordenação e regista Duplicate content filename para o outro, a não ser que os dois ficheiros tenham o mesmo conteúdo. Depois de editares os ficheiros, executa /em reload e verifica os avisos de carregamento.

Um poder .lua tem prioridade sobre um poder .yml com o mesmo nome

Quando um boss pede attack_fire.yml, o EliteMobs procura primeiro um attack_fire.lua carregado com sucesso. A mesma pesquisa aplica-se a pedidos .yaml. Isto preserva as referências antigas quando a substituição Lua é carregada. As configurações novas devem indicar diretamente o ficheiro .lua. Respeita as maiúsculas e minúsculas do nome registado.

Os ficheiros .lua predefinidos são escritos uma vez, e os ficheiros editados nunca são substituídos

Cada poder Lua incluído só é escrito quando não é encontrado um ficheiro correspondente dentro de powers. Quando uma atualização corrige um poder incluído, o EliteMobs lista as somas de verificação das versões incluídas anteriores. Uma cópia não editada que corresponda a uma delas é movida para plugins/MagmaCore/outdated files/EliteMobs/, e a versão atual é escrita no mesmo arranque. Um ficheiro que editaste nunca corresponde, por isso fica como está e não recebe as correções oficiais. Dá nomes próprios às cópias modificadas e compara os ficheiros predefinidos mantidos com a versão que pretendes usar.

As zonas Lua não acionam on_zone_enter / on_zone_leave

Ambos os nomes de hook são aceites, mas criar uma zona Lua não os aciona. A fonte integrada é um listener de zonas EliteScript, iniciado quando um script YAML do mesmo boss inclui ZoneEnterEvent ou ZoneLeaveEvent em Events: e define uma zona utilizável. Estes eventos chegam a todos os poderes correspondentes desse boss e não identificam a zona YAML que os originou. Declarar os hooks num boss que só usa Lua não basta para os executar.

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 cinco secções: Events, Conditions, Zone, Actions e Cooldowns. Fornece uma lista Actions não vazia para o script funcionar. Podes omitir Events em scripts chamados por outros scripts ou por callbacks de aterragem; sem quem o chame, esse script não se executa sozinho. Conditions e Cooldowns são estruturas de chave e valor, não listas.

Vejamos um exemplo simples:

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

Num golpe de jogador que cumpra os requisitos, este script empurra o elite para cima e inicia um tempo de recarga local de 60 ticks e global de 20 ticks. A 20 TPS, são três segundos e um segundo. A recarga global só afeta os poderes que a verificam; não bloqueia todos os hooks ou ações. Os scripts YAML acionados por eventos verificam os tempos de recarga quando o valor local ou o global é positivo. Consulta o guia de tempos de recarga abaixo para o comportamento dos scripts chamados.

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


Eventos

Eventos

Clica no link acima para aprender a usar eventos!

Alvos

Alvos

Clica no link acima para aprender a usar alvos!

Ações

Ações

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

Zonas

Zonas

Clica no link acima para aprender a usar zonas!

Condições

Condições

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

Tempos de recarga

Tempos de recarga

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
duration: 20
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 200
global: 60

O Example2 incendeia o jogador atingido durante 20 ticks usando DIRECT_TARGET. O seu tempo local de 200 ticks impede outra execução deste script acionada por eventos durante dez segundos a 20 TPS. O tempo global de 60 ticks é partilhado com os poderes que verificam a recarga do boss. Outros scripts podem continuar a aplicar fogo de forma independente.

Criar poderes autónomos​

Coloca os poderes YAML autónomos em plugins/EliteMobs/powers. O bloco eliteScript contém o comportamento; os campos opcionais de metadados abaixo controlam o carregamento, a categoria, a apresentação e os metadados de recarga. Exemplo:

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

isEnabled​

Controla se o poder configurado está ativado; o valor predefinido é true. Para Lua personalizado, um ficheiro de metadados associado desativado impede a descoberta desse ficheiro Lua. Um poder Lua incluído continua a carregar com um ficheiro associado desativado, mas fica marcado como desativado, como explicado abaixo.

powerType​

O tipo fornece metadados de categoria para as listas predefinidas e a classificação dos anéis de postura. Os valores são:

  • UNIQUE: Destinado à atribuição explícita. Fica excluído das listas partilhadas geradas automaticamente, mas podes adicioná-lo explicitamente a uma lista de poderes naturais.
  • DEFENSIVE / MISCELLANEOUS / OFFENSIVE: Usados para gerar a lista partilhada correspondente quando esta não existe. A elegibilidade depende das listas configuradas, do estado de ativação e do nível do mob.
  • MAJOR_ZOMBIE, MAJOR_SKELETON, MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_GHAST: Estes cinco contam como poderes maiores; todos os restantes são menores. A atribuição natural usa a lista majorPowers da entidade, sem verificar em execução se o sufixo do tipo corresponde à entidade.

Como o powerType chega aos elites naturais: EliteMobPowers.yml​

Os elites naturais sorteiam poderes de plugins/EliteMobs/EliteMobPowers.yml, não apenas de powerType. O ficheiro contém:

ChaveSignificado
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

As listas partilhadas defensivas, ofensivas e diversas em falta são geradas com os poderes carregados do tipo correspondente. Os poderes maiores predefinidos são escolhidos explicitamente por tipo de entidade. As listas existentes são mantidas, pelo que adicionar um poder mais tarde não o inclui nessas listas: edita a lista adequada. Por outro lado, um poder Lua personalizado presente quando uma lista diversa em falta é gerada pode entrar nessa lista predefinida.

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.

Os espaços de poderes naturais são desbloqueados nos níveis 10, 20, 30 e 40 para poderes defensivos, ofensivos, diversos e maiores, respetivamente. Um segundo espaço de cada categoria é desbloqueado nos níveis 50, 60, 70 e 80. Listas vazias ou desativadas podem produzir menos poderes. Editar as listas não altera a classificação maior ou menor de um poder.

effect​

Define o material do objeto que orbita no anel de postura do poder. Os tipos MAJOR_* usam o anel maior; os restantes usam o menor. O valor tem de ser um material de item ou um nome de partícula que não precise de dados extra, que orbita como partícula. Qualquer outro valor desativa o efeito e regista Disabled invalid power trail.

Um poder sem effect, ou com um valor vazio, não acrescenta nenhum objeto ao anel. É o comportamento predefinido dos poderes Lua personalizados sem effect no seu ficheiro YAML opcional de metadados.

Atualmente, os EliteScripts YAML autónomos não copiam estes metadados para o seu rasto em execução. Definir effect num desses poderes YAML não acrescenta, por isso, um objeto de postura. Os poderes Lua personalizados copiam o effect do ficheiro associado.

ChaveValoresPadrão
effectMaterialnenhum

powerCooldown​

Define o tempo de recarga dos metadados do poder, em ticks. Os EliteScripts YAML usam os seus próprios valores Cooldowns.local e Cooldowns.global, que substituem estes metadados quando o script é inicializado. Os poderes Lua têm de usar a API de recarga documentada para verificar e definir os seus tempos.

ChaveValoresPadrão
powerCooldownInteger0

globalCooldown​

Define os metadados do tempo de recarga global em ticks. A recarga global só bloqueia os poderes que a verificam; não bloqueia incondicionalmente todos os hooks ou ações. Para scripts YAML, configura a secção Cooldowns do próprio script.

ChaveValoresPadrão
globalCooldownInteger0

Criar poderes Lua autónomos​

Um poder Lua autónomo é um ficheiro .lua em plugins/EliteMobs/powers, incluindo subpastas. Um ficheiro YAML de metadados é opcional.

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
}

Sem um ficheiro de metadados .yml com o mesmo nome base na mesma pasta, um poder Lua personalizado recebe estes valores predefinidos:

  • powerType é MISCELLANEOUS.
  • effect fica por definir.

Para um my_power.lua personalizado, podes adicionar ao lado my_power.yml com isEnabled, powerType, effect, powerCooldown e globalCooldown. Por exemplo, powerType: UNIQUE exclui-o da lista diversa predefinida. Um ficheiro de metadados desativado impede o carregamento desse ficheiro Lua personalizado.

Um .yml ou .yaml com o mesmo nome base ao lado de um poder Lua incluído também se aplica a ele. Os seus valores isEnabled, effect, powerCooldown e globalCooldown substituem os integrados, incluindo os valores predefinidos das chaves que omitires, pelo que um effect omitido remove o objeto de postura do poder. powerType só substitui o tipo integrado quando está definido. Um ficheiro desativado não impede o poder incluído de carregar.

Os elites naturais usam as listas explícitas de EliteMobPowers.yml; verifica-as quando adicionares poderes personalizados. Adiciona o nome do ficheiro .lua à lista powers: de um boss para o atribuíres diretamente.

Hooks disponíveis para poderes Lua de boss​

HookÉ acionado quando
on_spawnO boss aparece
on_game_tickA cada tick do servidor enquanto a instância de execução está ativa, sem pausa nem supressão
on_boss_damagedO boss recebe dano de qualquer fonte
on_boss_damaged_by_playerO boss recebe dano de um jogador
on_reinforcement_damaged_by_playerUm reforço recebe dano de um jogador; o hook corre no seu invocador
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_changedOcorre o evento de alvo jogador, incluindo a aquisição inicial; não corresponde a todas as mudanças ou perdas de alvo
on_deathO boss morre
on_phase_switchO boss troca de fase
on_mind_actionUm Mind nativo pede uma ação aos poderes associados

on_zone_enter e on_zone_leave também são aceites. O distribuidor integrado recebe-os de um listener de zonas EliteScript do mesmo boss, não dos observadores de zonas Lua. Consulta o aviso no início desta página.

Cada poder Lua associado tem a sua própria instância de execução e estado para esse boss. O exemplo acima não tem tempo de recarga de propósito e executa-se em cada golpe correspondente encaminhado para o hook. Adiciona verificações e definições explícitas dos tempos quando necessário; os metadados, por si só, não limitam os hooks Lua. O dano pode acionar tanto o hook geral como um mais específico, pelo que definir ambos pode executar dois handlers. Consulta o guia do ciclo de vida para o comportamento de cancelamento, remoção e falha.

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.