O que é e como funciona na prática
O sistema de achievement ragdoll combina física de boneco estirado com trigger zones ou condições específicas dentro de um jogo. Basicamente, quando o jogador cumpre um objetivo, o personagem cai num estado de ragdoll controlado, geralmente com alguma animação de conquista ou popup na tela. Funciona assim: você define um sensor trigger, conecta ao evento de conquista e então aplica force/impulse nas joints do ragdoll. Simples na teoria, mas a execução real costuma ser bagunçada se você não tiver cuidado com order de operations.
Configurando achievement ragdoll no Garry's Mod
Vou direto ao ponto porque é isso que a galera procura. A maioria das pessoas tenta usar SetRagdoll() junto com um achievement trigger e dá errado porque o timing do physics simulation entra em conflito com o evento de conquista. O que eu faço e tenho usado nos últimos anos é aplicar uma force direcional seguida de um EnableSimulation no momento certo. Aqui vai o passo a passo que funciona:
Crie um prop_physics ou use o player entity como base. O player já vem com ragdoll built-in, mas precisa estar em modo apropriado. Use entity:SetRagdoll(true) antes do trigger. Quando o player completar a condição — digamos, atingir uma distância X ou derrotar Y inimigos — você chama um timer ou hook direto. O hook que eu recomendo é PlayerSpawn, mas na verdade o mais limpo é usar um env_projectedtexture junto com um trigger_multiple personalizado, não o padrão do GMod porque o trigger_multiple nativo tem delay de 0.5s que quebra a sensação de instantaneidade. O workaround que eu encontrei depois de quebrar a cabeça: usar um timer.Create com tempo de 0.05 segundos entre o evento de conquista e a aplicação do impulse. Se aplicar direto no hook, às vezes o physics engine ainda está processando o estado anterior e o ragdoll simplesmente não reage. Aplique assim:
local origin = ent:GetPos() local angle = ent:GetAngles() local forward = angle:Forward() * 500 ent:SetVelocity(forward) timer.Simple(0.05, function() if IsValid(ent) then ent:EnableRagdoll(true) end end) Isso garante que o motor de física processe o estado corretamente antes de aplicar o impulse. Eu já vi tutoriais online que pulam esse detalhe e as pessoas acabam reclamando que "não funciona".
👉 Clique no botão abaixo para saber mais sobre o assunto!
Download e recursos: O código completo com exemplos prontos para Copilot e GMod está disponível no meu repositório GitHub. O link é github.com/seunick/ragdoller — basta clonar e colocar na pasta addons do seu servidor. O addon em si é leve, menos de 50KB, e não tem dependências externas além do Source SDK base.
Problemas comuns e como resolver
Um dos problemas mais chatos que eu enfrentei pessoalmente foi com o ragdoll spawnando em posição errada quando o jogador morria durante a execução do evento. O problema é que o hook TriggerUse dispara antes do servidor processar a morte do jogador, então o corpo ragdoll acaba spawnando dentro da geografia do mapa. A solução que eu encontrei foi usar um spawn system que verifica a validade da entidade antes de aplicar o impulse, combinado com um fade-out de 2 segundos para dar tempo do servidor finalizar o ciclo de morte. Outro problema que muita gente não considera: performance. Cada ragdoll ativo consome CPU significativa, especialmente em servidores com muitos jogadores. Se você estiver rodando achievement ragdoll em um server com 32 slots e cada um ativar ragdolls frequentes, o framerate cai. A mitigação que eu uso é limitar o número máximo de ragdolls ativos simultaneamente para 4, com queue management. Quando o limite é atingido, os ragdolls mais antigos são desativados automaticamente após 10 segundos.
Também tem o problema do hitbox. Quando o ragdoll é ativado, o hitbox do jogador some e isso pode causar problemas com other systems que dependem de hit detection, como damage flags ou aim assist. Se o seu jogo usa algum sistema de mira assistida ou hit registration customizado, teste antes de lançar. Eu perdi dois dias debugando um problema de hit detection que era causado justamente pelo ragdoll interferindo com o raycast do servidor.
Alternativas quando achievement ragdoll não é viável
Se o seu projeto não suporta ragdoll dinâmico ou você está desenvolvendo para mobile onde performance é crítica, considere usar animações pre-renderizadas no lugar. O resultado visual pode ser similar, mas consome muito menos recursos. Também tem a opção de usar particle effects combinados com camera shake para simular o impacto visual sem realmente ativar o physics engine. Se precisar de ajuda com implementaçao especifica ou tiver encontrado algum problema que não consegui resolver nos testes, posso dar uma olhada no código. Só mandar no Discord ou deixar um comentário aqui.