Files
wnsrc/gamemodes/helix/plugins/observer.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

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