Corpse
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
allowedWorldseexcludedWorlds. - 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
- Instale as extensões TypeWriter Basic, Quest e Entity na aba Extensions do painel web (veja a documentação do TypeWriter).
- Instale a extensão GUI: o menu de saque é construído sobre ela.
- Opcional: instale o backend de modelos que quiser para a aparência do corpo (ModelEngine, BetterModel, MythicMobs NPC ou BTC Mob NPC).
- 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. - 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:
- 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).
- Defina
durationcomo300,onlyOwnerCanLootcomo desligado eownerProtectionSecondscomo60. - Escolha
lootMode:GUIabre o menu de saque ao clicar com o botão direito,DIRECTmove tudo para o inventário de quem saqueia,DROPsolta tudo no chão. Clicar agachado usa outro modo (sneakSwapsLootMode). - Adicione uma Corpse Model Definition. Deixe
definitionRefvazio para o modelo de jogador simples, ou escolha uma definição de entidade para usar um modelo. Definapose,rotationModee a hitboxinteraction*se necessário. - 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.
- Para transformar a recuperação em uma etapa de quest, adicione um Corpse Recovery Objective vinculado a uma quest.
- Publique, morra uma vez em um mundo de teste e clique com o botão direito no corpo.
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 venceallowedWorlds.
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, edgbuildé 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
worldsda 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;
keepInventoryestá 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.
Menus
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:
| Armazenamento | Quando | Local |
|---|---|---|
| MySQL | a extensão MySQL fornece uma fonte de dados | tabela corpse_corpses, criada automaticamente |
| Arquivo local | sem fonte de dados, ou o MySQL falhou ao inicializar | plugins/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.
| Comando | Descrição |
|---|---|
/corpses list | Lista todos os corpos do servidor, seja qual for o mundo, com dono, posição, mundo, quantidade de itens e experiência. |
/corpses clear | Remove 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ão | Concede |
|---|---|
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
- On Corpse ExpireWhen a corpse expires unlooted
- On Corpse LootWhen a corpse is looted
- On Corpse SpawnWhen a corpse spawns
Objetivos1
- Corpse Recovery ObjectiveRecover your corpse
Fatos2
- Corpse CountHow many corpses the player has
- Has CorpseWhether the player has a corpse waiting
Audiências2
- Corpse Owner AudiencePlayers who have a corpse waiting
- Corpse WaypointPoints players back to their corpse
Comandos1
- Corpse Admin CommandAdmin command for corpses
Manifestos2
- Corpse DefinitionCorpse Model Definition
- Corpse SettingsCorpse Global Settings
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
- GUI — fornece o menu de saque.
- BetterModel e MythicMobs NPC — backends de modelos para o corpo.
- MySQL — armazenamento dos corpos em banco de dados.