--by pavetr.top/ds surface.CreateFont("minecraft", { font = "Minecraft", -- Police de style point extended = true, size = 24, weight = 800, antialias = true, shadow = false, }) local damageDisplay = {} local displayDuration = 2 -- Durée d'affichage des dégâts en secondes local lastHealth = {} -- Table pour stocker la santé précédente des joueurs local animationDuration = 0.5 -- Durée de l'animation de 0 à nombre réel en secondes -- Fonction pour attribuer une couleur en fonction des dégâts local function GetDamageColor(damage) if damage <= 10 then return Color(0, 255, 0, 255) -- Vert pour des dégâts faibles elseif damage <= 50 then return Color(255, 255, 0, 255) -- Jaune pour des dégâts moyens else return Color(255, 0, 0, 255) -- Rouge pour des dégâts élevés end end -- Fonction pour afficher les dégâts local function ShowDamage(damage, victim) if damage > 0 and IsValid(victim) then -- Calcul de la position de la tête de l'ennemi à l'écran local headPos = victim:LocalToWorld(victim:OBBMaxs()):ToScreen() -- Ajouter les données du dégât à afficher table.insert(damageDisplay, { amount = damage, pos = headPos, startTime = CurTime(), endTime = CurTime() + displayDuration, color = GetDamageColor(damage), -- Couleur basée sur les dégâts victim = victim }) end end -- Capture de l'événement `player_hurt` gameevent.Listen("player_hurt") hook.Add("player_hurt", "ShowDamageOnHit", function(data) local victim = Player(data.userid) local attacker = Player(data.attacker) local health = data.health if not IsValid(victim) or not IsValid(attacker) or attacker ~= LocalPlayer() then return end -- Si la santé précédente n'est pas enregistrée, l'initialiser à la santé maximale if not lastHealth[victim:UserID()] then lastHealth[victim:UserID()] = victim:GetMaxHealth() end -- Calcul des dégâts local dmg = lastHealth[victim:UserID()] - health -- Si le joueur est mort, ajuster les dégâts pour afficher la santé restante comme dégâts infligés if health <= 0 then dmg = lastHealth[victim:UserID()] end -- Affichage des dégâts au-dessus de la tête de l'ennemi ShowDamage(dmg, victim) -- Mise à jour de la santé précédente lastHealth[victim:UserID()] = health -- Réinitialisation de la santé si le joueur est mort if health <= 0 then lastHealth[victim:UserID()] = nil end end) -- Capture de l'événement `player_death` gameevent.Listen("player_death") hook.Add("player_death", "ShowDamageOnDeath", function(data) local victim = Player(data.userid) local attacker = Player(data.attacker) if not IsValid(victim) or not IsValid(attacker) or attacker ~= LocalPlayer() then return end -- Calcul des dégâts basés sur la santé restante local dmg = lastHealth[victim:UserID()] or victim:GetMaxHealth() -- Affichage des dégâts au-dessus de la tête de l'ennemi ShowDamage(dmg, victim) -- Réinitialisation de la santé après la mort lastHealth[victim:UserID()] = nil end) -- Affichage à l'écran hook.Add("HUDPaint", "DrawDamageAmount", function() local toRemove = {} -- Itère à l'envers pour gérer l'affichage sans superposition for i = #damageDisplay, 1, -1 do local v = damageDisplay[i] -- Vérifie si le délai est dépassé if CurTime() > v.endTime then table.insert(toRemove, i) else -- Met à jour la position du texte en fonction de la position actuelle de la tête de l'ennemi if IsValid(v.victim) then v.pos = v.victim:LocalToWorld(v.victim:OBBMaxs()):ToScreen() v.pos.y = v.pos.y - (i - 1) * 20 -- Ajuste la position pour éviter la superposition end -- Animation rapide du nombre de dégâts (de 0 à l'amount réel) local timeElapsed = CurTime() - v.startTime local timeFraction = math.min(timeElapsed / animationDuration, 1) -- Limite à 1 pour éviter de dépasser la durée d'animation local animatedAmount = math.ceil(Lerp(timeFraction, 0, v.amount)) -- Dessin du texte avec la couleur et animation draw.SimpleTextOutlined( tostring(animatedAmount), "minecraft", -- Utilise la police de points v.pos.x, v.pos.y, v.color, -- Utilise la couleur basée sur les dégâts TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 2, Color(0, 0, 0, 255) ) end end -- Supprime les anciennes entrées de dégâts for i = #toRemove, 1, -1 do table.remove(damageDisplay, toRemove[i]) end end)