mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
227 lines
6.7 KiB
Lua
227 lines
6.7 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/
|
||
|
|
--]]
|
||
|
|
|
||
|
|
local PLUGIN = PLUGIN
|
||
|
|
|
||
|
|
PLUGIN.minDist = 500 * 500
|
||
|
|
PLUGIN.maxDist = 1000 * 1000
|
||
|
|
PLUGIN.newOverlay = ix.util.GetMaterial("effects/combine_mockup5")
|
||
|
|
PLUGIN.traceFilter = {false, false}
|
||
|
|
|
||
|
|
local COMMAND_PREFIX = "/"
|
||
|
|
local validBeeps = {
|
||
|
|
["w"] = true,
|
||
|
|
["y"] = true,
|
||
|
|
}
|
||
|
|
|
||
|
|
function PLUGIN:GetHookCallPriority(hook)
|
||
|
|
if (hook == "GetCharacterName") then
|
||
|
|
return 1100
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:GetAdminESPTargets()
|
||
|
|
local client = LocalPlayer()
|
||
|
|
if (client:IsDispatch()) then
|
||
|
|
local targets = {}
|
||
|
|
for _ , v in ipairs(player.GetAll()) do
|
||
|
|
if (v == client) then continue end
|
||
|
|
if (!IsValid(v) or !v:Alive()) then continue end
|
||
|
|
if (v:GetNetVar("combineSuitTracked") or v:IsDispatch()) then
|
||
|
|
targets[#targets + 1] = v
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return targets
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:GetCharacterName(client, chatType)
|
||
|
|
if (!client) then return end
|
||
|
|
if (LocalPlayer():HasActiveCombineMask() and client:GetNetVar("combineMaskEquipped") and client:GetNetVar("combineSuitName")) then
|
||
|
|
return client:GetNetVar("combineSuitName")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:PopulateCharacterInfo(client, character, tooltip)
|
||
|
|
if (client:GetNetVar("combineSuitActive") and client:GetNetVar("combineSuitType") != 0) then
|
||
|
|
local faction = ix.faction.Get(client:GetNetVar("combineSuitType"))
|
||
|
|
if (!faction) then return end
|
||
|
|
|
||
|
|
local name = tooltip:GetRow("name")
|
||
|
|
name:SetBackgroundColor(faction.color)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:RenderScreenspaceEffects()
|
||
|
|
if (LocalPlayer():HasActiveCombineMask()) then
|
||
|
|
if (ix.option.Get("ColorModify", true)) then
|
||
|
|
local colorModify = {}
|
||
|
|
colorModify["$pp_colour_colour"] = 0.5 + ix.option.Get("ColorSaturation", 0)
|
||
|
|
if (system.IsWindows()) then
|
||
|
|
colorModify["$pp_colour_brightness"] = -0.02
|
||
|
|
colorModify["$pp_colour_contrast"] = 1.2
|
||
|
|
end
|
||
|
|
DrawColorModify(colorModify)
|
||
|
|
end
|
||
|
|
|
||
|
|
render.UpdateScreenEffectTexture()
|
||
|
|
self.newOverlay:SetFloat("$alpha", ix.option.Get("CPGUIAlpha") / 100)
|
||
|
|
self.newOverlay:SetInt("$ignorez", 1)
|
||
|
|
render.SetMaterial(self.newOverlay)
|
||
|
|
render.DrawScreenQuad()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:IsPlayerRecognized(client)
|
||
|
|
if ((LocalPlayer():HasActiveCombineMask() or LocalPlayer():IsDispatch()) and client:GetNetVar("combineSuitActive")) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
if (LocalPlayer():IsDispatch() and (client:IsOTA() or client:IsCP() or client:IsDispatch())) then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:InitializedPlugins()
|
||
|
|
if (!IsValid(ix.gui.combine)) then
|
||
|
|
vgui.Create("ixCombineDisplay")
|
||
|
|
end
|
||
|
|
|
||
|
|
if (!IsValid(ix.gui.visor)) then
|
||
|
|
vgui.Create("ixVisorScroller")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:ChatTextChanged(text)
|
||
|
|
local client = LocalPlayer()
|
||
|
|
|
||
|
|
if (!client:HasActiveCombineMask() or (client:GetMoveType() == MOVETYPE_NOCLIP and !client:InVehicle())) then return end
|
||
|
|
|
||
|
|
local isTyping = text != ""
|
||
|
|
|
||
|
|
-- If it's starting with slash, it's a command
|
||
|
|
if (text:utf8sub(1, 1) == COMMAND_PREFIX) then
|
||
|
|
isTyping = false
|
||
|
|
local start, _, commandTxt = text:find("/(%w+)%s")
|
||
|
|
local command = ix.command.list[commandTxt]
|
||
|
|
|
||
|
|
-- If the command has the "combineBeep" property, we consider it as if the user is typing
|
||
|
|
if (start == 1 and ((command and command.combineBeep) or validBeeps[commandTxt])) then
|
||
|
|
isTyping = true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (self.lastTypingState != isTyping) then
|
||
|
|
self.lastTypingState = isTyping
|
||
|
|
net.Start("ixTypingBeep")
|
||
|
|
net.WriteBool(isTyping)
|
||
|
|
net.SendToServer()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:FinishChat()
|
||
|
|
if (self.lastTypingState != false) then
|
||
|
|
self.lastTypingState = false
|
||
|
|
net.Start("ixTypingBeep")
|
||
|
|
net.WriteBool(false)
|
||
|
|
net.SendToServer()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local mat1 = CreateMaterial("GA0249aSFJ3","VertexLitGeneric",{
|
||
|
|
["$basetexture"] = "models/debug/debugwhite",
|
||
|
|
["$model"] = 1,
|
||
|
|
["$translucent"] = 1,
|
||
|
|
["$alpha"] = 1,
|
||
|
|
["$nocull"] = 1,
|
||
|
|
["$ignorez"] = 1
|
||
|
|
})
|
||
|
|
|
||
|
|
function PLUGIN:HUDPaint()
|
||
|
|
if (!ix.option.Get("CombineHud") or ix.config.Get("suitsNoConnection")) then return end
|
||
|
|
|
||
|
|
local client = LocalPlayer()
|
||
|
|
local isDispatch = client:IsDispatch()
|
||
|
|
|
||
|
|
if (client:GetMoveType() == MOVETYPE_NOCLIP and !client:InVehicle() and !isDispatch) then return end
|
||
|
|
if (!client:GetCharacter()) then return end
|
||
|
|
|
||
|
|
if (client:HasActiveCombineMask() or isDispatch) then
|
||
|
|
local item = ix.item.instances[client:GetCharacter():GetCombineSuit()]
|
||
|
|
|
||
|
|
-- If the client it's dispatch then we don't care about the item at all
|
||
|
|
-- the item must be a valid ota or cp suit
|
||
|
|
if (!isDispatch and (!item or !item.isOTA and !item.isCP)) then return end
|
||
|
|
|
||
|
|
self.aimPoints = {}
|
||
|
|
self.names = {}
|
||
|
|
|
||
|
|
cam.Start3D()
|
||
|
|
local pos = client:EyePos()
|
||
|
|
self.traceFilter[1] = client
|
||
|
|
|
||
|
|
for _ , p in ipairs(player.GetAll()) do
|
||
|
|
if (p == client) then continue end
|
||
|
|
if (!IsValid(p) or !p:Alive() or (p:GetMoveType() == MOVETYPE_NOCLIP and !p:InVehicle())) then continue end
|
||
|
|
|
||
|
|
local vEyePos = p:EyePos()
|
||
|
|
local dist = vEyePos:DistToSqr(pos)
|
||
|
|
local cAngle = client:GetAngles().y
|
||
|
|
local pAngle = (p:GetPos() - client:GetPos()):Angle().y
|
||
|
|
local angDiff = math.AngleDifference(cAngle, pAngle)
|
||
|
|
local angCheck = 60
|
||
|
|
|
||
|
|
if (dist < self.maxDist and p:GetNetVar("combineSuitTracked") and client:IsLineOfSightClear(p:LocalToWorld(p:OBBCenter())) and math.abs(angDiff) <= angCheck) then
|
||
|
|
local isOTA = p:GetNetVar("combineSuitType") == FACTION_OTA
|
||
|
|
local isCP = p:GetNetVar("combineSuitType") == FACTION_CP
|
||
|
|
|
||
|
|
if (!isOTA and !isCP) then return end
|
||
|
|
|
||
|
|
local name = p:GetNetVar("combineSuitActive") and p:GetNetVar("combineSuitName") or "UNKNOWN"
|
||
|
|
|
||
|
|
if ((item and item.isOTA or isDispatch) and ix.option.Get("OTAESP")) then
|
||
|
|
render.SuppressEngineLighting(true)
|
||
|
|
render.SetColorModulation(isOTA and 255 or 0, 0, isCP and 255 or 0)
|
||
|
|
|
||
|
|
self.traceFilter[2] = p
|
||
|
|
if (util.QuickTrace(pos, vEyePos - pos, self.traceFilter).Fraction < 0.95 or client:FlashlightIsOn()) then
|
||
|
|
render.SetBlend(math.Remap(math.max(dist, self.minDist), self.minDist, self.maxDist, 1, 0))
|
||
|
|
else
|
||
|
|
render.SetBlend(math.Remap(math.max(dist, self.minDist), self.minDist, self.maxDist, 0.01, 0))
|
||
|
|
end
|
||
|
|
render.MaterialOverride(mat1)
|
||
|
|
p:DrawModel()
|
||
|
|
|
||
|
|
render.MaterialOverride()
|
||
|
|
render.SuppressEngineLighting(false)
|
||
|
|
|
||
|
|
if (isOTA and p:IsWepRaised()) then
|
||
|
|
local trace2 = p:GetEyeTraceNoCursor()
|
||
|
|
|
||
|
|
local onScreen = trace2.HitPos:ToScreen()
|
||
|
|
local x, y = onScreen.x, onScreen.y
|
||
|
|
self.aimPoints[#self.aimPoints + 1] = {x, y, client:IsLineOfSightClear(trace2.HitPos), name}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
self.names[#self.names + 1] = {p, isOTA, isCP, dist}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
cam.End3D()
|
||
|
|
|
||
|
|
self:RenderESPNames(item and item.isOTA or isDispatch)
|
||
|
|
|
||
|
|
if (item and item.isOTA or isDispatch) then
|
||
|
|
self:RenderESPAimpoints()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|