PlayerHUD

Bloco de gamificação modular para o Moodle — documentação completa.

English | Português

View on GitHub Download .zip

Moodle License Status Latest Release PlayerGames Ecosystem Core Component Author

Moodle Plugin CI MDL Shield Last Commit Open Issues

O Bloco PlayerHUD é um sistema modular de gamificação para Moodle que introduz mecânicas estruturadas de progressão baseadas em XP, Níveis, Inventário, Missões, Trocas e progressão RPG.

Ele fornece um HUD (Head-Up Display) dinâmico dentro do curso, permitindo que os alunos acompanhem seu progresso em tempo real, enquanto o professor configura as mecânicas de engajamento de acordo com seus objetivos pedagógicos.

👈 Use a barra lateral para ir a qualquer seção desta página.


🖼️ Capturas de Tela

Navegue pelas setas, pelos pontos, ou pelas teclas de seta do teclado. Clique na imagem para ampliar.

✨ Funcionalidades

🏆 Comportamento do Ranking de Grupos

Quando o ranking de grupos está habilitado, a média de XP de cada grupo é calculada apenas com os membros que estão participando ativamente — ou seja, membros que tenham simultaneamente:

Membros que optaram por não participar da gamificação ou que ocultaram seu ranking são completamente excluídos da soma e da contagem do grupo. O denominador usado para calcular a média reflete apenas a quantidade de participantes ativos, não o total de membros do grupo.

Implicação prática: um grupo com muitos membros inativos pode apresentar uma média mais alta do que o esperado, pois o cálculo é feito sobre um subconjunto menor. Professores devem ter em mente que a média exibida não representa todos os matriculados no grupo — apenas os que estão participando ativamente do ranking.

Integração com o PlayerGroup

O ranking de grupos lê diretamente das tabelas nativas de grupos do Moodle ({groups} / {groups_members}). Funciona com qualquer grupo do Moodle — criado manualmente pelo professor ou automaticamente pela atividade PlayerGroup.

Quando o PlayerGroup (mod_playergroup) está instalado junto ao PlayerHUD, uma integração adicional é ativada no cabeçalho do bloco (não na aba de ranking): o badge do grupo do estudante, o nome do grupo, a quantidade de membros e a capacidade (ex.: 3/5) são exibidos no topo do bloco. Essa informação é obtida via API pública do PlayerGroup (\mod_playergroup\api\group_info) e está disponível apenas para grupos criados por atividades do PlayerGroup — grupos manuais do Moodle não aparecem ali.

As duas funcionalidades são independentes:

Cenário Aba de Ranking de Grupos Info de grupo no cabeçalho do HUD
PlayerGroup não instalado ✅ Funciona com qualquer grupo do Moodle — Não exibido
PlayerGroup instalado, estudante tem grupo do PlayerGroup ✅ Grupo aparece no ranking ✅ Badge + nome + vagas exibidos
PlayerGroup instalado, estudante está só em grupo manual ✅ Grupo aparece no ranking — Não exibido (grupos manuais não estão na API do PlayerGroup)

Estudante em mais de um grupo do PlayerGroup

Um curso pode ter várias instâncias da atividade PlayerGroup, cada uma com seu próprio agrupamento. Dentro de uma mesma instância o estudante só pode pertencer a um grupo, mas nada impede que ele participe de um grupo em cada instância diferente do mesmo curso.

Quando isso acontece, o cabeçalho do bloco exibe o grupo em que o estudante entrou por último (o de timeadded mais recente na tabela groups_members), não um grupo “principal” ou de uma instância específica. A aba de Ranking de Grupos não tem essa limitação — como lê diretamente das tabelas nativas do Moodle, todos os grupos do estudante aparecem normalmente.

⚖️ Painel de Saúde da Economia

A aba Configurações do painel de gerenciamento inclui um widget de Saúde da Economia que compara o total de XP que um estudante pode ganhar (todos os itens × seus limites de drop + recompensas de missões) com o teto de XP configurado (XP por nível × número de níveis).

Cobertura Status
Exatamente 100% ✅ Verde — “Configuração equilibrada”
Abaixo de 100% ⚠️ Amarelo — os estudantes não conseguem atingir o nível máximo; adicione mais itens ou missões, ou reduza o teto
Acima de 100% 🔴 Vermelho — os estudantes podem ultrapassar o teto; reduza o XP de itens/missões ou aumente o teto

O widget também exibe uma tabela expansível com o detalhamento de cada item e missão e sua contribuição individual de XP, facilitando a identificação do conteúdo que está contribuindo mais ou menos para a economia.

Drops que ainda não foram colocados

Os números acima contam todos os drops, mas um drop só paga XP quando o shortcode dele está num lugar que os estudantes enxergam. Quando o painel encontra drops que não estão na descrição de nenhuma atividade, no conteúdo de nenhuma página nem no fórum de avisos, ele acrescenta um aviso abaixo da mensagem de equilíbrio, com quantos drops são e quanto XP eles pagariam, e um link para Distribuir drops. Esse XP faz parte do total acima, mas não pode ser ganho enquanto os drops não forem colocados.

A verificação lê os mesmos lugares que a tela Distribuir drops. Um drop colocado onde ela não olha (um capítulo de livro, o resumo de uma seção, uma postagem de fórum) aparece como “não encontrado”; nesse caso, o aviso pode ser ignorado.

🩺 Página de Uso e Diagnóstico

Administradores do site têm uma página em Administração do site > Relatórios > PlayerHUD: uso e diagnóstico (permissão moodle/site:config). Todos os números são contados no próprio site — nada é enviado para fora dele.

Adoção

Quanto o bloco é usado, contado por curso (o bloco permite uma instância por curso):

Engajamento

Os números ficam em cache por 10 minutos; o botão Atualizar recalcula na hora.

Integridade dos dados e limpeza

Sites que removeram o bloco antes da v1.7.0 podem ainda guardar os dados desses blocos, e versões anteriores podiam deixar registros para trás ao apagar um item, missão, capítulo, cena, troca ou execução do assistente. Nada disso aparece em nenhuma tela nem entra em nenhuma conta do jogo.

A exclusão exige confirmação explícita e roda numa única transação. Antes de apagar, uma cópia de cada registro é salva num arquivo JSON no diretório de dados do site (moodledata/block_playerhud/orphan_backups/). A página lista essas cópias com os botões Baixar e Apagar. As cópias contêm dados pessoais (identificadores de usuários e XP) dos registros apagados, então uma tarefa agendada as exclui automaticamente após 30 dias (você pode apagá-las antes pela página), e elas são removidas quando o plugin é desinstalado.

🎓 Finalidade Educacional

O PlayerHUD foi projetado para:

Indicado para:

🕹️ Ecossistema PlayerGames

O PlayerHUD faz parte do ecossistema de gamificação PlayerGames. Juntos, esses plugins transformam o Moodle em uma experiência imersiva:

🧩 Integração Opcional: AI Hub

Os recursos opcionais de IA do PlayerHUD (Gerador de Conteúdo e Assistente Game Master) podem recorrer ao AI Hub (local_aihub, do mesmo autor, parte dos serviços compartilhados do ecossistema PlayerGames). Quando o AI Hub está instalado, qualquer chave pessoal ou de site que um professor ou administrador já tenha configurado nele fica automaticamente disponível para o PlayerHUD — sem precisar reinserir a chave. As chaves do AI Hub ficam entre as próprias chaves do PlayerHUD e o fallback core_ai do Moodle na Cadeia de Provedores de IA. Sem o AI Hub instalado, o PlayerHUD simplesmente pula esses dois níveis e resolve a partir das próprias chaves ou do core_ai.

👉 https://github.com/jeanlucio/moodle-local_aihub

🧩 Integração Opcional: Late Penalty

O poder de item Extensão de Prazo (veja Funcionalidades) não funciona sozinho — ele depende do plugin separado Late Penalty (local_latepenalty, do mesmo autor, mas que não faz parte da família PlayerGames). Quando instalado, resgatar um item de Extensão de Prazo adia o prazo efetivo da atividade para aquele estudante e aciona o recálculo automático do Late Penalty, dispensando ou reduzindo qualquer penalidade de nota por atraso já aplicada. Sem o Late Penalty instalado, o poder do item falha de forma controlada, mostrando uma mensagem de “não instalado” em vez de conceder a extensão.

👉 https://github.com/jeanlucio/moodle-local_latepenalty

📦 Requisitos

Componente Versão
Moodle 4.5+
PHP 8.1+

🛠️ Instalação

  1. Baixe o arquivo .zip ou clone este repositório.
  2. Extraia na pasta blocks/ do seu Moodle.
  3. Renomeie para playerhud (se necessário). Caminho final: seu-moodle/blocks/playerhud/
  4. Instale o plugin recomendado Filtro PlayerHUD (necessário para posicionar drops de itens via shortcodes no conteúdo do curso).
  5. Acesse Administração do site > Notificações para concluir a instalação.
  6. Adicione o bloco ao curso.

Administradores podem acompanhar o uso do bloco, e limpar dados deixados por blocos removidos, em Administração do site > Relatórios > PlayerHUD: uso e diagnóstico — veja Página de Uso e Diagnóstico.

📖 Como Usar

  1. Adicione o Bloco PlayerHUD ao seu curso.
  2. Acesse o Painel de Gerenciamento (necessário perfil de Professor).
  3. Escolha como configurar:
    • Início rápido: rode o Assistente de Gamificação para gerar automaticamente itens, missões, ranking e outras mecânicas em uma única rodada (veja Funcionalidades acima).
    • Configuração manual: configure cada mecânica você mesmo:
      • Itens
      • Valores de XP
      • Quantidade de níveis
      • Limiares de XP para progressão
      • Posicionamento de drops
      • Tempo de Recarga (intervalo entre coletas)
      • Limites de coleta
  4. Os alunos coletam itens diretamente nas seções do curso.
  5. O sistema atualiza automaticamente XP, níveis e ranking.

Remover o bloco de um curso apaga na hora todo o jogo e o progresso de todos os estudantes, e não é possível desfazer pelo bloco. Faça antes um backup do curso com os dados dos usuários, ou use Ocultar no menu do bloco para tirar o jogo da vista sem perder nada. O Manual do Mestre (botão ? do painel de gerenciamento) explica isso em Remover o bloco.

🌱 Ambiente de Demonstração (Quick Start)

O plugin inclui dois scripts CLI de seed que criam um curso de demonstração completamente configurado em minutos — útil para desenvolvimento local ou para avaliar o conjunto completo de funcionalidades sem configuração manual.

Script Idioma do curso
cli/seed.php Inglês
cli/seed_pt_br.php Português (Brasil)

O que é criado:

Ranking resultante após o seed:

Pos. Usuário Nome XP
1 seed_carol Carol Staff 195
2 seed_bob Bob Bow 150
3 seed_alice Alice Sword 65
4 seed_dave Dave Shield 60
5 seed_eve Eve Dagger 10

Uso:

# Executar uma vez
php blocks/playerhud/cli/seed_pt_br.php --password=SuaSenhaDev

# Apagar e recriar do zero
php blocks/playerhud/cli/seed_pt_br.php --password=SuaSenhaDev --reset

# Ignorar o guard de site não-desenvolvimento (domínios customizados)
php blocks/playerhud/cli/seed_pt_br.php --password=SuaSenhaDev --force

O parâmetro --password é obrigatório e define a senha de login de todas as contas seed. O script recusa executar em URLs que não sejam de desenvolvimento (localhost, *.local, *.test), a menos que --force seja passado.

Via Docker Compose: docker compose exec <servico-webserver> php blocks/playerhud/cli/seed_pt_br.php --password=SuaSenhaDev

🧪 Testes Automatizados

O PlayerHUD inclui uma suíte de testes extensa que cobre tanto a lógica de negócio (PHPUnit) quanto a aceitação em navegador (Behat). Todo push de CI executa a matriz completa (Moodle 4.5 → 5.x, PostgreSQL e MariaDB).

PHPUnit — Testes Unitários e de Integração

Arquivo de teste Casos
ai/chat_test.php 2
ai/generator_test.php 19
ai/hub_usage_reporting_test.php 2
backup_restore_item_images_test.php 1
backup_restore_test.php 3
block_dashboard_test.php 3
collection_tab_test.php 17
db_access_test.php 2
db_upgrade_test.php 9
drop_guard_test.php 11
edit_form_test.php 5
form/edit_item_form_test.php 8
form/edit_scene_form_test.php 3
game_test.php 48
gamemaster_test.php 6
instance_delete_test.php 2
item_delete_cascade_test.php 25
karma_test.php 11
lib_test.php 27
privacy_provider_test.php 26
quest_test.php 53
rpg_classes_test.php 3
story_manager_test.php 34
suggest_trades_state_test.php 4
template_strings_test.php 3
trade_test.php 12
uninstall_test.php 2
utils_test.php 23
Subtotal 364

Testes de Lógica de Negócio Compartilhada (tests/local/)

Arquivo de teste Casos
analytics_test.php 13
audit_log_test.php 16
diagnostics/integrity_test.php 14
diagnostics/report_test.php 3
diagnostics/usage_test.php 2
drop_distribution_test.php 13
external_items_test.php 27
latepenalty_bridge_test.php 2
wizard_test.php 22
xp_budget_test.php 15
Subtotal 127

Testes de Web Services (tests/external/)

Arquivo de teste Casos
chat_message_test.php 4
collect_item_test.php 5
create_avatar_pack_test.php 7
create_class_pack_test.php 8
create_playercoin_test.php 4
execute_chat_action_test.php 6
generate_ai_content_test.php 4
generate_class_oracle_test.php 4
generate_story_test.php 4
insert_drop_shortcode_test.php 12
load_recap_test.php 3
load_scene_test.php 4
make_choice_test.php 3
remove_drop_shortcode_test.php 8
setup_playercoin_drop_test.php 7
use_item_test.php 13
wizard_apply_suggested_levels_test.php 3
wizard_generate_helpers_test.php 13
wizard_list_runs_test.php 4
wizard_rollback_test.php 4
wizard_run_step_test.php 57
wizard_start_test.php 9
Subtotal 186

Testes de Controlador (tests/controller/)

Arquivo de teste Casos
aikeys_test.php 4
chapters_test.php 17
classes_test.php 7
drops_test.php 19
export_test.php 10
items_test.php 26
manage_entry_points_test.php 34
quests_test.php 14
scenes_test.php 6
suggestions_test.php 4
trades_test.php 10
Subtotal 151

Testes de Saída / Renderer (tests/output/)

Arquivo de teste Casos
admin/diagnostics_test.php 6
chapters_escaping_test.php 8
manage/item_delete_confirm_test.php 12
manage/item_disable_confirm_test.php 3
manage/quest_delete_confirm_test.php 3
manage/tab_chapters_test.php 4
manage/tab_config_test.php 4
manage/tab_items_escaping_test.php 7
manage/tab_items_test.php 3
manage/tab_quests_test.php 4
manage/tab_reports_test.php 22
player_screens_escaping_test.php 18
profile_content_test.php 1
quests_escaping_test.php 5
reports_escaping_test.php 6
trades_escaping_test.php 4
view/header_test.php 2
view/tab_chapters_test.php 6
view/tab_history_test.php 4
view/tab_quests_test.php 6
view/tab_ranking_test.php 13
view/tab_rules_test.php 2
view/tab_shop_test.php 4
Subtotal 147
Total geral 975
vendor/bin/phpunit --testsuite block_playerhud

Cobertura de linhas geral (moodle-coverage, PHPUnit + Xdebug): 81%.

Ver o detalhamento completo de cada teste e a tabela de cobertura →

🔐 Segurança e Conformidade

🔎 Divulgação de Serviço de Terceiros

O PlayerHUD inclui recursos opcionais de IA: um Gerador de Conteúdo (itens, capítulos, backstories de classes) e um Assistente Game Master (chat conversacional para professores que também pode acionar ações no jogo).

O recurso de IA é obrigatório?

Não. O plugin funciona de forma completa sem qualquer serviço externo. Todo o conteúdo pode ser criado manualmente dentro do Moodle. Os recursos de IA são ferramentas de produtividade — o assistente exige confirmação antes de salvar qualquer coisa.

Cadeia de Provedores de IA

O PlayerHUD seleciona o provedor de IA nível por nível, seguindo a escada compartilhada do ecossistema PlayerGames. Uma chave explicitamente configurada sempre prevalece sobre o padrão institucional; o core_ai fica na base.

Escada de resolução (maior prioridade primeiro):

Nível Origem
1 Chave pessoal própria — chave do professor cadastrada no PlayerHUD (aba Configurações → Chaves de API)
2 Chave pessoal do hub — chave do professor cadastrada no local_aihub (se instalado)
3 Chave de site própria — chave cadastrada pelo admin nas configurações do PlayerHUD
4 Chave de site do hub — chave cadastrada pelo admin nas configurações do local_aihub (se instalado)
5 Moodle core_ai — provedores configurados em Administração do site → IA → Provedores de IA. Nenhuma chave armazenada no PlayerHUD.

Nível primeiro, não provedor primeiro. Cada nível acima é avaliado como um todo: o primeiro nível que contiver qualquer chave é usado exclusivamente. Assim, a chave pessoal do professor (nível 1) sempre prevalece sobre uma chave do hub (nível 2) — mesmo que a chave do hub seja de um provedor de maior prioridade. Por exemplo, a chave de endpoint personalizado do professor não é substituída por uma chave Gemini que esteja no hub. O core_ai é consultado apenas quando nenhum nível possui uma chave.

Dentro do nível escolhido, os provedores diretos são testados na ordem Gemini → Groq → OpenAI-compatível (a primeira chave encontrada é usada; se a chamada falhar, o próximo é tentado).

Isso também significa: se o professor configurou sua própria chave no hub PlayerGames, o PlayerHUD a utiliza automaticamente — sem necessidade de recadastrar no PlayerHUD.

Provedores diretos suportados

Esses serviços seguem seus próprios termos de uso e políticas de privacidade.

Como obter a chave de API

As chaves de API devem ser criadas diretamente no site oficial do provedor:

Gemini e Groq atualmente oferecem planos gratuitos, porém as políticas de preços podem variar conforme o volume de uso.

O PlayerHUD não fornece chaves de API.

Onde a chave é configurada

As chaves de API podem ser configuradas por qualquer uma das seguintes origens (em ordem decrescente de prioridade):

  1. Chave pessoal no PlayerHUD — configurada individualmente por cada professor na aba Configurações do painel de gerenciamento.
  2. Chave pessoal na Central de IA — configurada pelo professor em local_aihub → Minhas chaves de IA (se o hub estiver instalado).
  3. Chave de site no PlayerHUD — configurada pelo admin em Administração do site → Plugins → Blocos → PlayerHUD.
  4. Chave de site na Central de IA — configurada pelo admin nas configurações do local_aihub (se o hub estiver instalado).
  5. Moodle core_ai — configurado pelo admin em Administração do site → IA → Provedores de IA (nenhuma chave armazenada no PlayerHUD; consultado apenas quando nenhuma das origens acima tiver chave configurada).

Transmissão de dados

Quando o recurso de IA é utilizado, os prompts informados são enviados ao provedor selecionado para processamento.

O plugin:

Nenhuma comunicação externa ocorre sem ativação explícita de um recurso de IA.

Credenciais de Demonstração

Não aplicável — o PlayerHUD não exige nenhuma credencial para instalar ou usar. Todo recurso de IA é totalmente opcional e o bloco funciona plenamente sem nenhuma chave configurada.

📄 Licença

Este projeto é licenciado sob a GNU General Public License v3 (GPLv3).

Copyright: 2026 Jean Lúcio