71 lines
2.2 KiB
Lua
71 lines
2.2 KiB
Lua
local function drawIndicator(ply)
|
|
if not ply:IsTyping() then
|
|
if ply.indicator then
|
|
ply.indicator:Remove()
|
|
ply.indicator = nil
|
|
end
|
|
return
|
|
end
|
|
|
|
local chatIndicator = hook.Call("DrawChatIndicator", nil, ply)
|
|
if chatIndicator == true then return end
|
|
|
|
local indicator = ply.indicator
|
|
if not IsValid(indicator) then
|
|
indicator = ClientsideModel("models/extras/info_speech.mdl", RENDERGROUP_OPAQUE)
|
|
if not IsValid(indicator) then return end -- In case the non networked entity limit is hit (still prints a red error message, but doesn't spam client console with lua errors)
|
|
ply.indicator = indicator
|
|
end
|
|
indicator:SetNoDraw(true)
|
|
indicator:SetModelScale(0.6)
|
|
|
|
local ragdoll = ply:GetRagdollEntity()
|
|
if IsValid(ragdoll) then
|
|
local maxs = ragdoll:OBBMaxs()
|
|
indicator:SetPos(ragdoll:GetPos() + Vector(0, 0, maxs.z) + Vector(0, 0, 12))
|
|
else
|
|
indicator:SetPos(ply:GetPos() + Vector(0, 0, 72 * ply:GetModelScale()) + Vector(0, 0, 12))
|
|
end
|
|
|
|
local curTime = CurTime()
|
|
local angle = indicator:GetAngles()
|
|
angle.y = (angle.y + (360 * (curTime - (indicator.lastDraw or 0)))) % 360
|
|
indicator:SetAngles(angle)
|
|
indicator.lastDraw = curTime
|
|
|
|
indicator:SetupBones()
|
|
indicator:DrawModel()
|
|
end
|
|
|
|
hook.Add("PostPlayerDraw", "DarkRP_ChatIndicator", drawIndicator)
|
|
hook.Add("CreateClientsideRagdoll", "DarkRP_ChatIndicator", function(ent, ragdoll)
|
|
if not ent:IsPlayer() then return end
|
|
|
|
local oldRenderOverride = ragdoll.RenderOverride -- Just in case - best be safe
|
|
ragdoll.RenderOverride = function(self)
|
|
if ent:IsValid() then
|
|
drawIndicator(ent)
|
|
end
|
|
|
|
if oldRenderOverride then
|
|
oldRenderOverride(self)
|
|
else
|
|
self:DrawModel()
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- CSEnts aren't GC'd.
|
|
-- https://github.com/Facepunch/garrysmod-issues/issues/1387
|
|
gameevent.Listen("player_disconnect")
|
|
hook.Add("player_disconnect", "DarkRP_ChatIndicator", function(data)
|
|
local ply = Player(data.userid)
|
|
|
|
if not IsValid(ply) then return end -- disconnected while joining
|
|
|
|
if ply.indicator then
|
|
ply.indicator:Remove()
|
|
ply.indicator = nil
|
|
end
|
|
end)
|