Pular para o conteúdo principal

Corpse

Cadáveres de jogadores com inventário e XP, com menu de saque, proteção, expiração e backends de modelos.

Gratuitasv0.7Entidades e modelos
RequerTypeWriter0.9Basic extensionEntity extensionQuest extensionGUIMySQLopcionalModelEngineopcionalBetterModelopcionalMythicMobs NPCopcionalBTC Mob NPCopcional

Visão geral​

Quando um jogador morre, o Corpse assume seus drops: o inventário inteiro (hotbar, armadura, mão secundária) e a experiência são movidos para um corpo que fica onde o jogador caiu. Os drops vanilla são removidos. O corpo permanece até que alguém o saqueie ou ele expire, e sobrevive a uma reinicialização.

O corpo é uma entidade de pacote, renderizada separadamente para cada jogador próximo. Pode ser um modelo de jogador simples na pose de morte, usando a skin e a armadura da vítima, ou qualquer modelo de um backend compatível. Duas entries de manifest controlam tudo: Corpse Global Settings para as regras do servidor inteiro e Corpse Model Definition para a aparência do corpo.

Recursos​

  • Captura completa do loot — inventário, armadura, mão secundária e experiência vão para o corpo; os drops e a experiência vanilla são removidos.
  • Três modos de saque — um menu de saque paginado, transferência direta para o inventário de quem saqueia, ou soltar tudo no chão.
  • Proteção do loot — saque exclusivo do dono, ou uma janela de proteção após a qual qualquer um pode saquear.
  • Expiração — os corpos desaparecem após um tempo configurável, ou nunca.
  • Persistência — os corpos sobrevivem a reinicializações, em MySQL quando disponível e, caso contrário, em um arquivo local.
  • Várias aparências — as definições são escolhidas por mundo e prioridade; modelos do EntityExtension, ModelEngine, BetterModel, BTC Mob NPC ou MythicMobs NPC.
  • Jogador simples como alternativa — skin, armadura, brilho e uma pose (deitado, caído, morrendo ou em pé) quando nenhum modelo é definido.
  • Ganchos de quest — eventos ao surgir, ao saquear e ao expirar, facts, um objetivo de recuperação e um waypoint que mostra o caminho de volta.
  • Filtro de mundos — deixe corpos apenas em alguns mundos (por exemplo, as dungeons) com allowedWorlds e excludedWorlds.
  • Todos os textos são configuráveis — mensagens, rótulos e materiais do menu, o formato do waypoint com suas setas e as respostas dos comandos são campos.
  • Comando de staff — liste e limpe os corpos de todo o servidor.
  • Pronto para Folia — as alterações no mundo são executadas na região que contém o corpo.

Instalação​

  1. Instale as extensões TypeWriter Basic, Quest e Entity na aba Extensions do painel web (veja a documentação do TypeWriter).
  2. Instale a extensão GUI: o menu de saque é construído sobre ela.
  3. Opcional: instale o backend de modelos que quiser para a aparência do corpo (ModelEngine, BetterModel, MythicMobs NPC ou BTC Mob NPC).
  4. Opcional: instale a extensão MySQL para armazenar os corpos em um banco de dados. Sem ela, os corpos são salvos em plugins/Typewriter/corpse/corpses.json.
  5. Coloque o JAR do Corpse em plugins/Typewriter/extensions/ e reinicie o servidor.

Na inicialização, o console registra quais backends de modelos foram encontrados. Se nenhum for encontrado, os corpos ainda guardam o loot e são renderizados como um jogador simples.

Primeiros passos​

Configure corpos que duram cinco minutos, ficam protegidos para o dono por um minuto e mostram o caminho de volta:

  1. No painel web do TypeWriter, abra uma página de manifest e adicione uma entry Corpse Global Settings. Sem ela, valem os padrões internos (300 segundos, menu de saque, qualquer um pode saquear).
  2. Defina duration como 300, onlyOwnerCanLoot como desligado e ownerProtectionSeconds como 60.
  3. Escolha lootMode: GUI abre o menu de saque ao clicar com o botão direito, DIRECT move tudo para o inventário de quem saqueia, DROP solta tudo no chão. Clicar agachado usa outro modo (sneakSwapsLootMode).
  4. Adicione uma Corpse Model Definition. Deixe definitionRef vazio para o modelo de jogador simples, ou escolha uma definição de entidade para usar um modelo. Defina pose, rotationMode e a hitbox interaction* se necessário.
  5. Adicione uma entry de audience Corpse Waypoint para mostrar na action bar a distância e uma seta até o corpo. Ela desaparece quando o corpo some.
  6. Para transformar a recuperação em uma etapa de quest, adicione um Corpse Recovery Objective vinculado a uma quest.
  7. Publique, morra uma vez em um mundo de teste e clique com o botão direito no corpo.
observação

O Corpse só pega o que a morte teria dropado. Com a game rule keepInventory ativada, o jogador mantém seus itens e nenhum corpo é criado: a morte é vanilla. Os itens que outros plugins mantêm para o jogador (Maldição do Desaparecimento, itens soulbound) não são duplicados no corpo.

Restringir a alguns mundos​

Por padrão, todos os mundos deixam um corpo. Duas listas das Corpse Global Settings escolhem onde:

  • allowedWorlds: os mundos em que uma morte deixa um corpo. Vazia significa todos os mundos.
  • excludedWorlds: os mundos em que uma morte nunca deixa um corpo. Sempre vence allowedWorlds.

Para ter corpos apenas nas dungeons e em nenhum outro lugar:

allowedWorlds:
- dungeon_*

Regras das duas listas:

  • Uma entrada por mundo. * corresponde a qualquer sequência de caracteres e ? a exatamente um: dungeon_* cobre todos os mundos que uma dungeon gera para uma partida, e dgbuild é um mundo específico.
  • Cada entrada é comparada, sem diferenciar maiúsculas de minúsculas, com o nome do mundo (o da sua pasta) e com a sua chave de dimensão, por exemplo minecraft:the_nether.
  • Fora dos mundos permitidos (ou em um mundo excluído), a morte é vanilla: drops e experiência normais, sem corpo.
  • Isso só decide se um corpo existe. A aparência continua sendo escolhida pela lista worlds da Corpse Model Definition, que aceita as mesmas entradas.

O que o jogador vê em um mundo recusado. filteredWorldDeath define isso. Não tem efeito quando as duas listas estão vazias.

  • VANILLA_DEATH_SCREEN (padrão): uma morte comum do Minecraft. O corpo deitado no chão e a tela de morte são desenhados pelo cliente do Minecraft, não pelo Corpse, e o Corpse não consegue removê-los.
  • INSTANT_RESPAWN: o jogador renasce no tick seguinte, sem tela de morte. Os itens e a experiência caem no chão como no vanilla, nos dois casos.

Para corpos apenas nas dungeons e renascimento instantâneo em todo o resto:

allowedWorlds:
- dungeon_*
filteredWorldDeath: INSTANT_RESPAWN

Uma morte não deixa corpo, e continua vanilla, quando:

  • o mundo não é permitido ou está excluído;
  • keepInventory está ativada;
  • outro plugin cancelou a morte (um totem ou plugin de ressurreição): o jogador não está morto;
  • não há nada a pegar: nenhum item e nenhuma experiência.

Como funciona​

A definição usada é decidida no momento da morte: entre as entries Corpse Model Definition cuja lista worlds contém o mundo da morte (uma lista vazia significa todos os mundos), vence a de maior priority. Sem nenhuma definição, uma padrão é usada. Sua duração vem de overrideDuration quando for maior que 0; caso contrário, do duration global. A regra de proteção do dono é fixada quando o corpo é criado.

Apenas um clique direito no corpo o saqueia. Saquear esvazia o corpo, e ele é removido. Um corpo que ninguém saqueia expira e seus itens se perdem.

No modo de saque GUI, clicar com o botão direito no corpo abre um menu de 54 slots construído com a extensão GUI.

  • As cinco primeiras linhas (45 slots) contêm os itens do corpo. Clique em um item para pegá-lo para o seu inventário (um item que não couber é solto aos seus pés); o corpo é salvo após cada item retirado. Retirar o último item esvazia o corpo, o que entrega a experiência e dispara on_corpse_loot.
  • A linha de baixo contém os botões: página anterior (à esquerda), próxima página, um botão que pega tudo e fechar (à direita). Os botões de paginação só aparecem quando há várias páginas.
  • O baú de pegar tudo mostra em seu lore a experiência guardada no corpo (e a página atual) e entrega tudo, inclusive a experiência, a quem saqueia.
  • O título e todos os rótulos podem ser alterados em Corpse Global Settings (guiTitle, guiLootAllLabel, guiCloseLabel, guiPreviousPageLabel, guiNextPageLabel, guiExperienceLabel, guiPageLabel).

Se o inventário de quem saqueia estiver cheio no modo DIRECT, o excedente é solto no corpo e inventoryFullMessage é exibida. Os itens soltos podem ser reservados a quem saqueia (reserveDroppedItems, reserveDroppedItemsSeconds).

Configuração​

Os corpos são armazenados fora do painel web:

ArmazenamentoQuandoLocal
MySQLa extensão MySQL fornece uma fonte de dadostabela corpse_corpses, criada automaticamente
Arquivo localsem fonte de dados, ou o MySQL falhou ao inicializarplugins/Typewriter/corpse/corpses.json

Os corpos cujo tempo de expiração passou enquanto o servidor estava desligado são excluídos na inicialização, sem disparar on_corpse_expire. Após uma reinicialização, o corpo é exibido com o nome e as configurações que são valores constantes: nomes e opções controlados por placeholders voltam aos valores padrão. Um corpo restaurado mantém a pose, o brilho, o nome e a animação, mas não a skin nem a armadura do dono: mostra o modelo simples. Um arquivo de armazenamento ilegível é posto de lado (.unreadable-<time>) em vez de ser sobrescrito.

Comandos​

O comando é uma entry Corpse Admin Command que você cria no painel web. O nome e a permissão são campos da entry; os padrões estão abaixo.

ComandoDescrição
/corpses listLista todos os corpos do servidor, seja qual for o mundo, com dono, posição, mundo, quantidade de itens e experiência.
/corpses clearRemove todos os corpos do servidor, não só os do seu mundo. Não dispara on_corpse_expire.

Os dois comandos são globais ao servidor, não por mundo. Suas respostas e o cabeçalho da lista são campos editáveis da entrada.

Permissões​

PermissãoConcede
typewriter.corpse.admin/corpses list e /corpses clear (valor padrão do campo permission da entry).

Entries​

11 entradas, geradas a partir do código-fonte da extensão.

Eventos3
Objetivos1
Fatos2
Audiências2
Comandos1
Manifestos2

Solução de problemas​

Nada acontece quando clico com o botão direito no corpo. O Corpse é clicável por meio de uma hitbox invisível de interactionWidth por interactionHeight blocos, que é 1.0 por padrão. Aumente-a para um modelo grande. Ative debugInteractions em Corpse Global Settings para registrar cada clique no console e depois desative-o novamente. Verifique também onlyOwnerCanLoot e ownerProtectionSeconds: os outros jogadores recebem cannotLootMessage.

O corpo é um jogador simples, não o meu modelo. definitionRef está vazio ou não pôde ser resolvido (o console mostra Failed to resolve entity definition). Confirme que a extensão do backend está instalada: o log de inicialização lista os backends detectados.

O menu de saque não abre. O menu precisa da extensão GUI. Verifique também lootMode e se você não está agachado: com sneakSwapsLootMode ativado, agachar usa o outro modo.

Não há corpo após uma morte. Verifique, nesta ordem: o mundo é permitido por allowedWorlds e não está em excludedWorlds (compare com o nome da pasta e com a chave de dimensão); a game rule keepInventory está desativada nesse mundo; nenhum outro plugin cancelou a morte; o jogador tinha pelo menos um item ou alguma experiência.

Clicar de longe não faz nada. Um clique só conta a até interactionReach blocos do corpo (6 por padrão, 0 = sem limite). Cliques repetidos dentro de interactionCooldownMillis são ignorados como um único gesto.

O corpo sumiu após uma reinicialização. Procure no console por Restored n corpse(s) from storage. Se o corpo expirou enquanto o servidor estava desligado, ele é excluído. Quando a inicialização do MySQL falha, o Corpse recorre ao arquivo local com um aviso no log.

Os placeholders no nome não funcionam. Use {player} para o nome do dono em displayName. Em respawnMessage, use <x>, <y>, <z> e <world>; em guiTitle, <player>. Os placeholders dos demais textos são preenchidos antes do MiniMessage, e o nome de um jogador é escapado para nunca virar uma tag clicável.

Extensões relacionadas​