mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
202 lines
5.9 KiB
Lua
202 lines
5.9 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
|
|
PLUGIN.name = "Observer"
|
|
PLUGIN.author = "Chessnut"
|
|
PLUGIN.description = "S'ajoute au mode sans clip pour empêcher l'intrusion."
|
|
|
|
CAMI.RegisterPrivilege({
|
|
Name = "Helix - Observer",
|
|
MinAccess = "admin"
|
|
})
|
|
|
|
ix.option.Add("observerTeleportBack", ix.type.bool, true, {
|
|
bNetworked = true,
|
|
category = "Observateur",
|
|
hidden = function()
|
|
return !CAMI.PlayerHasAccess(LocalPlayer(), "Helix - Observer", nil)
|
|
end
|
|
})
|
|
|
|
if (CLIENT) then
|
|
ix.option.Add("observerESP", ix.type.bool, true, {
|
|
category = "Observateur",
|
|
hidden = function()
|
|
return !CAMI.PlayerHasAccess(LocalPlayer(), "Helix - Observer", nil)
|
|
end
|
|
})
|
|
|
|
local dimDistance = 1024
|
|
local aimLength = 128
|
|
local barHeight = 2
|
|
|
|
function PLUGIN:HUDPaint()
|
|
local client = LocalPlayer()
|
|
|
|
if (ix.option.Get("observerESP", true) and client:GetMoveType() == MOVETYPE_NOCLIP and
|
|
!client:InVehicle() and CAMI.PlayerHasAccess(client, "Helix - Observer", nil)) then
|
|
local scrW, scrH = ScrW(), ScrH()
|
|
|
|
for _, v in ipairs(player.GetAll()) do
|
|
if (v == client or !v:GetCharacter() or client:GetAimVector():Dot((v:GetPos() - client:GetPos()):GetNormal()) < 0.65) then
|
|
continue
|
|
end
|
|
|
|
local screenPosition = v:GetPos():ToScreen()
|
|
local aimPosition = (v:GetPos() + v:GetAimVector() * aimLength):ToScreen()
|
|
|
|
local marginX, marginY = scrH * .1, scrH * .1
|
|
local x, y = math.Clamp(screenPosition.x, marginX, scrW - marginX), math.Clamp(screenPosition.y, marginY, scrH - marginY)
|
|
local aimX, aimY = math.Clamp(aimPosition.x, marginX, scrW - marginX), math.Clamp(aimPosition.y, marginY, scrH - marginY)
|
|
|
|
local teamColor = team.GetColor(v:Team())
|
|
local distance = client:GetPos():Distance(v:GetPos())
|
|
local factor = 1 - math.Clamp(distance / dimDistance, 0, 1)
|
|
local size = math.max(10, 32 * factor)
|
|
local alpha = math.max(255 * factor, 80)
|
|
local aimAlpha = (1 - factor * 1.5) * 80
|
|
|
|
surface.SetDrawColor(teamColor.r, teamColor.g, teamColor.b, alpha)
|
|
surface.SetFont("ixGenericFont")
|
|
|
|
local text = v:Name()
|
|
local textWidth, textHeight = surface.GetTextSize(text)
|
|
local barWidth = math.Clamp((v:Health() / v:GetMaxHealth()) * textWidth, 0, textWidth)
|
|
|
|
surface.DrawRect(x - size / 2, y - size / 2, size, size)
|
|
|
|
-- we can assume that if we're using cheap blur, we'd want to save some fps here
|
|
if (!ix.option.Get("cheapBlur", false)) then
|
|
local data = {}
|
|
data.start = client:EyePos()
|
|
data.endpos = v:EyePos()
|
|
data.filter = {client, v}
|
|
|
|
if (util.TraceLine(data).Hit) then
|
|
aimAlpha = alpha
|
|
else
|
|
aimAlpha = (1 - factor * 4) * 80
|
|
end
|
|
end
|
|
|
|
if (aimPosition.visible) then
|
|
surface.SetDrawColor(teamColor.r * 1.2, teamColor.g * 1.2, teamColor.b * 1.2, aimAlpha)
|
|
surface.DrawLine(x, y, aimX, aimY)
|
|
surface.DrawLine(x, y + 1, aimX, aimY + 1)
|
|
end
|
|
|
|
surface.SetDrawColor(teamColor.r * 1.6, teamColor.g * 1.6, teamColor.b * 1.6, alpha)
|
|
surface.DrawRect(x - barWidth / 2, y - size - textHeight / 2, barWidth, barHeight)
|
|
|
|
ix.util.DrawText(text, x, y - size, ColorAlpha(teamColor, alpha), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, nil, alpha)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:ShouldPopulateEntityInfo(entity)
|
|
if (IsValid(entity)) then
|
|
if ((entity:IsPlayer() or IsValid(entity:GetNetVar("player"))) and entity:GetMoveType() == MOVETYPE_NOCLIP) then
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:DrawPhysgunBeam(client, physgun, enabled, target, bone, hitPos)
|
|
if (client != LocalPlayer() and client:GetMoveType() == MOVETYPE_NOCLIP) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
function PLUGIN:PrePlayerDraw(client)
|
|
if (client:GetMoveType() == MOVETYPE_NOCLIP and !client:InVehicle()) then
|
|
return true
|
|
end
|
|
end
|
|
else
|
|
ix.log.AddType("observerEnter", function(client, ...)
|
|
return string.format("%s entré observateur.", client:Name())
|
|
end)
|
|
|
|
ix.log.AddType("observerExit", function(client, ...)
|
|
if (ix.option.Get(client, "observerTeleportBack", true)) then
|
|
return string.format("%s observateur sorti.", client:Name())
|
|
else
|
|
return string.format("%s observateur sorti à leur emplacement.", client:Name())
|
|
end
|
|
end)
|
|
|
|
function PLUGIN:CanPlayerEnterObserver(client)
|
|
if (CAMI.PlayerHasAccess(client, "Helix - Observer", nil)) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
function PLUGIN:CanPlayerEnterVehicle(client, vehicle, role)
|
|
if (client:GetMoveType() == MOVETYPE_NOCLIP) then
|
|
return false
|
|
end
|
|
end
|
|
|
|
function PLUGIN:PlayerNoClip(client, state)
|
|
if (hook.Run("CanPlayerEnterObserver", client)) then
|
|
if (state) then
|
|
client.ixObsData = {client:GetPos(), client:EyeAngles()}
|
|
|
|
-- Hide them so they are not visible.
|
|
client:SetNoDraw(true)
|
|
client:SetNotSolid(true)
|
|
client:DrawWorldModel(false)
|
|
client:DrawShadow(false)
|
|
client:GodEnable()
|
|
client:SetNoTarget(true)
|
|
|
|
hook.Run("OnPlayerObserve", client, state)
|
|
else
|
|
if (client.ixObsData) then
|
|
-- Move they player back if they want.
|
|
if (ix.option.Get(client, "observerTeleportBack", true)) then
|
|
local position, angles = client.ixObsData[1], client.ixObsData[2]
|
|
|
|
-- Do it the next frame since the player can not be moved right now.
|
|
timer.Simple(0, function()
|
|
client:SetPos(position)
|
|
client:SetEyeAngles(angles)
|
|
client:SetVelocity(Vector(0, 0, 0))
|
|
end)
|
|
end
|
|
|
|
client.ixObsData = nil
|
|
end
|
|
|
|
-- Make the player visible again.
|
|
client:SetNoDraw(false)
|
|
client:SetNotSolid(false)
|
|
client:DrawWorldModel(true)
|
|
client:DrawShadow(true)
|
|
client:GodDisable()
|
|
client:SetNoTarget(false)
|
|
|
|
hook.Run("OnPlayerObserve", client, state)
|
|
end
|
|
|
|
return true
|
|
end
|
|
end
|
|
|
|
function PLUGIN:OnPlayerObserve(client, state)
|
|
if (state) then
|
|
ix.log.Add(client, "observerEnter")
|
|
else
|
|
ix.log.Add(client, "observerExit")
|
|
end
|
|
end
|
|
end
|