mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
500 lines
12 KiB
Lua
500 lines
12 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 = "Recognition"
|
||
PLUGIN.author = "Chessnut"
|
||
PLUGIN.description = "Adds the ability to recognize people."
|
||
|
||
ix.command.Add("Recognize", {
|
||
description = "Ask player in front of you about recognition",
|
||
OnRun = function(self, client, arguments)
|
||
local data = {}
|
||
data.start = client:GetShootPos()
|
||
data.endpos = data.start + client:GetAimVector() * 96
|
||
data.filter = client
|
||
local trace = util.TraceLine(data)
|
||
local entity = trace.Entity
|
||
|
||
if entity:IsPlayer() then
|
||
client:Notify("Kişiden kendisini tanıtmasını istedin")
|
||
else
|
||
client:Notify("Kişi bulunamadı")
|
||
return
|
||
end
|
||
net.Start("ixRecognizeMenuAsk")
|
||
net.WriteEntity(client)
|
||
net.Send(entity)
|
||
end
|
||
})
|
||
|
||
do
|
||
local character = ix.meta.character
|
||
|
||
if (SERVER) then
|
||
|
||
function character:Recognize(id)
|
||
if (!isnumber(id) and id.GetID) then
|
||
id = id:GetID()
|
||
end
|
||
|
||
local recognized = self:GetData("rgn", "")
|
||
|
||
if (recognized != "" and recognized:find(","..id..",")) then
|
||
return false
|
||
end
|
||
|
||
self:SetData("rgn", recognized..","..id..",")
|
||
|
||
return true
|
||
end
|
||
|
||
function character:RecognizeTemp(id)
|
||
if (!isnumber(id) and id.GetID) then
|
||
id = id:GetID()
|
||
end
|
||
|
||
local recognized = self:GetData("temprgn", "")
|
||
|
||
--[[if (recognized != nil and recognized[id] != nil) then
|
||
return false
|
||
end--]]
|
||
|
||
if recognized == "" then
|
||
recognized = {}
|
||
recognized[id] = 24
|
||
elseif recognized[id] then
|
||
recognized[id] = 24
|
||
else
|
||
recognized[id] = 24
|
||
end
|
||
|
||
self:SetData("temprgn", recognized)
|
||
|
||
return true
|
||
end
|
||
|
||
local playerMeta = FindMetaTable("Player")
|
||
|
||
function playerMeta:Recognize(level)
|
||
local targets = {}
|
||
|
||
if (level < 1) then
|
||
local entity = self:GetEyeTraceNoCursor().Entity
|
||
|
||
if (IsValid(entity) and entity:IsPlayer() and entity:GetCharacter()
|
||
and ix.chat.classes.ic:CanHear(self, entity)) then
|
||
targets[1] = entity
|
||
end
|
||
else
|
||
local class = "w"
|
||
|
||
if (level == 2) then
|
||
class = "ic"
|
||
elseif (level == 3) then
|
||
class = "y"
|
||
end
|
||
|
||
class = ix.chat.classes[class]
|
||
|
||
for _, v in ipairs(player.GetAll()) do
|
||
if (self != v and v:GetCharacter() and class:CanHear(self, v)) then
|
||
targets[#targets + 1] = v
|
||
end
|
||
end
|
||
end
|
||
|
||
if (#targets > 0) then
|
||
local id = self:GetCharacter():GetID()
|
||
local i = 0
|
||
|
||
for _, v in ipairs(targets) do
|
||
if (v:GetCharacter():Recognize(id)) then
|
||
i = i + 1
|
||
end
|
||
end
|
||
|
||
if (i > 0) then
|
||
net.Start("ixRecognizeDone")
|
||
net.Send(self)
|
||
end
|
||
|
||
hook.Run("CharacterRecognized", self, id, targets)
|
||
end
|
||
end
|
||
|
||
function playerMeta:RecognizeTemp(level)
|
||
local targets = {}
|
||
|
||
if (level < 1) then
|
||
local entity = self:GetEyeTraceNoCursor().Entity
|
||
|
||
if (IsValid(entity) and entity:IsPlayer() and entity:GetCharacter()
|
||
and ix.chat.classes.ic:CanHear(self, entity)) then
|
||
targets[1] = entity
|
||
end
|
||
else
|
||
local class = "w"
|
||
|
||
if (level == 2) then
|
||
class = "ic"
|
||
elseif (level == 3) then
|
||
class = "y"
|
||
end
|
||
|
||
class = ix.chat.classes[class]
|
||
|
||
for _, v in ipairs(player.GetAll()) do
|
||
if (self != v and v:GetCharacter() and class:CanHear(self, v)) then
|
||
targets[#targets + 1] = v
|
||
end
|
||
end
|
||
end
|
||
|
||
if (#targets > 0) then
|
||
local id = self:GetCharacter():GetID()
|
||
local i = 0
|
||
|
||
for _, v in ipairs(targets) do
|
||
if (v:GetCharacter():RecognizeTemp(id)) then
|
||
i = i + 1
|
||
end
|
||
end
|
||
|
||
if (i > 0) then
|
||
net.Start("ixRecognizeDone")
|
||
net.Send(self)
|
||
end
|
||
|
||
hook.Run("CharacterRecognized", self, id, targets)
|
||
end
|
||
end
|
||
end
|
||
|
||
function character:DoesRecognize(id)
|
||
if (!isnumber(id) and id.GetID) then
|
||
id = id:GetID()
|
||
end
|
||
|
||
return hook.Run("IsCharacterRecognized", self, id)
|
||
end
|
||
|
||
function PLUGIN:IsCharacterRecognized(char, id)
|
||
if (char.id == id) then
|
||
return true
|
||
end
|
||
|
||
local other = ix.char.loaded[id]
|
||
|
||
if (other) then
|
||
local faction = ix.faction.indices[other:GetFaction()]
|
||
|
||
if (faction and faction.isGloballyRecognized) then
|
||
return true
|
||
end
|
||
end
|
||
|
||
local recognized = char:GetData("rgn", "")
|
||
|
||
if (recognized != "" and recognized:find(","..id..",")) then
|
||
return true
|
||
end
|
||
|
||
local recognized = char:GetData("temprgn", "")
|
||
|
||
if recognized == "" then
|
||
return false
|
||
end
|
||
|
||
if recognized[id] then
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
|
||
if (CLIENT) then
|
||
CHAT_RECOGNIZED = CHAT_RECOGNIZED or {}
|
||
CHAT_RECOGNIZED["ic"] = true
|
||
CHAT_RECOGNIZED["y"] = true
|
||
CHAT_RECOGNIZED["w"] = true
|
||
CHAT_RECOGNIZED["me"] = true
|
||
|
||
local function doubleCalling(char)
|
||
timer.Simple(3600, function()
|
||
net.Start("ixRecognizeTempHour")
|
||
net.SendToServer()
|
||
doubleCalling(char)
|
||
end)
|
||
end
|
||
|
||
|
||
function PLUGIN:CharacterLoaded(character)
|
||
doubleCalling(character)
|
||
end
|
||
|
||
function PLUGIN:IsRecognizedChatType(chatType)
|
||
if (CHAT_RECOGNIZED[chatType]) then
|
||
return true
|
||
end
|
||
end
|
||
|
||
function PLUGIN:GetCharacterDescription(client)
|
||
if (client:GetCharacter() and client != LocalPlayer() and LocalPlayer():GetCharacter() and
|
||
!LocalPlayer():GetCharacter():DoesRecognize(client:GetCharacter()) and !hook.Run("IsPlayerRecognized", client)) then
|
||
return L"noRecog"
|
||
end
|
||
end
|
||
|
||
function PLUGIN:ShouldAllowScoreboardOverride(client)
|
||
if (ix.config.Get("scoreboardRecognition")) then
|
||
return true
|
||
end
|
||
end
|
||
|
||
function PLUGIN:GetCharacterName(client, chatType)
|
||
if (client != LocalPlayer() and IsValid(client)) then
|
||
local character = client:GetCharacter()
|
||
local ourCharacter = LocalPlayer():GetCharacter()
|
||
|
||
if (ourCharacter and character and !ourCharacter:DoesRecognize(character) and !hook.Run("IsPlayerRecognized", client)) then
|
||
if (chatType and hook.Run("IsRecognizedChatType", chatType)) then
|
||
local description = character:GetDescription()
|
||
|
||
if (#description > 40) then
|
||
description = description:utf8sub(1, 37).."..."
|
||
end
|
||
|
||
return "["..description.."]"
|
||
elseif (!chatType) then
|
||
return L"unknown"
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local function Recognize(level)
|
||
net.Start("ixRecognize")
|
||
net.WriteUInt(level, 2)
|
||
net.SendToServer()
|
||
end
|
||
|
||
local function RecognizeTemporary(level)
|
||
net.Start("ixRecognizeTemp")
|
||
net.WriteUInt(level, 2)
|
||
net.SendToServer()
|
||
end
|
||
|
||
net.Receive("ixRecognizeMenu", function(length)
|
||
local menu = DermaMenu()
|
||
menu:AddOption(L"rgnLookingAt", function()
|
||
Recognize(0)
|
||
end)
|
||
menu:AddOption(L"rgnWhisper", function()
|
||
Recognize(1)
|
||
end)
|
||
menu:AddOption(L"rgnTalk", function()
|
||
Recognize(2)
|
||
end)
|
||
menu:AddOption(L"rgnYell", function()
|
||
Recognize(3)
|
||
end)
|
||
menu:AddOption(L"rgnLookingAtTemp", function()
|
||
RecognizeTemporary(0)
|
||
end)
|
||
menu:AddOption(L"rgnWhisperTemp", function()
|
||
RecognizeTemporary(1)
|
||
end)
|
||
menu:AddOption(L"rgnTalkTemp", function()
|
||
RecognizeTemporary(2)
|
||
end)
|
||
menu:AddOption(L"rgnYellTemp", function()
|
||
RecognizeTemporary(3)
|
||
end)
|
||
menu:Open()
|
||
for _, v in pairs(menu:GetChildren()[1]:GetChildren()) do
|
||
v:SetFont("MenuFontNoClamp")
|
||
end
|
||
|
||
menu:MakePopup()
|
||
menu:Center()
|
||
|
||
ix.gui.recognize = menu
|
||
|
||
hook.Run("RecognizeMenuOpened", menu)
|
||
end)
|
||
|
||
net.Receive("ixRecognizeMenuAsk", function(length)
|
||
local ent = net.ReadEntity()
|
||
local scrh = ScrH()
|
||
|
||
local mainContainer = vgui.Create("EditablePanel")
|
||
mainContainer:SetSize(ScrW(), ScrH())
|
||
mainContainer:SetAlpha(0)
|
||
mainContainer:AlphaTo(255, 0.5, 0)
|
||
mainContainer.Paint = function(self, pw, ph)
|
||
surface.SetDrawColor(Color(63, 58, 115, 220))
|
||
surface.DrawRect(0, 0, pw, ph)
|
||
|
||
Derma_DrawBackgroundBlur(self, 1)
|
||
end
|
||
|
||
local mainPanel = vgui.Create("DPanel")
|
||
mainPanel:MakePopup()
|
||
mainPanel:SetPos( ScrW() * 0.31, scrh * 0.4)
|
||
mainPanel:SetSize(scrh * 0.6, scrh * 0.2)
|
||
mainPanel:SetBackgroundColor(Color(0, 0, 0, 130))
|
||
--[[mainPanel.PaintOver = function(self, w, h)
|
||
surface.SetDrawColor(Color(228, 71, 63, 150))
|
||
surface.DrawOutlinedRect(0, 0, w, h, 5)
|
||
end--]]
|
||
|
||
local topBar = mainPanel:Add("Panel")
|
||
topBar:Dock(TOP)
|
||
topBar:SetHeight(scrh * 0.05)
|
||
topBar.Paint = function(self, width, height)
|
||
surface.SetDrawColor(0, 0, 0, 130)
|
||
surface.DrawRect(0, 0, width, height)
|
||
end
|
||
|
||
local label = topBar:Add("DLabel")
|
||
label:Dock(FILL)
|
||
label:Center()
|
||
label:SetContentAlignment(5)
|
||
label:SetFont("ixMenuButtonFontSmall")
|
||
label:SetHeight(scrh * 0.05)
|
||
label:SetText("Person in front of you is asking you about recognizing you")
|
||
|
||
local buttons = mainPanel:Add("Panel")
|
||
buttons.Paint = nil
|
||
buttons:Dock(BOTTOM)
|
||
buttons:DockMargin(scrh * 0.13, 0, 0, scrh * 0.02)
|
||
buttons:SetHeight(scrh * 0.05)
|
||
|
||
local allowPerm = buttons:Add("DButton")
|
||
allowPerm:SetText("PERM")
|
||
allowPerm:Dock(LEFT)
|
||
allowPerm:SetWide(scrh * 0.1)
|
||
allowPerm:SetFont("ixGenericFont")
|
||
allowPerm:SetColor(ix.config.Get("color", Color(255, 255, 255)))
|
||
allowPerm.DoClick = function()
|
||
net.Start("ixRecognizeMenuAnswer")
|
||
net.WriteEntity(ent)
|
||
net.WriteUInt(0, 2)
|
||
net.SendToServer()
|
||
mainPanel:Remove()
|
||
mainContainer:Remove()
|
||
end
|
||
|
||
local allowPerm = buttons:Add("DButton")
|
||
allowPerm:SetText("TEMP")
|
||
allowPerm:Dock(LEFT)
|
||
allowPerm:DockMargin(scrh * 0.01, 0, 0, 0)
|
||
allowPerm:SetWide(scrh * 0.1)
|
||
allowPerm:SetFont("ixGenericFont")
|
||
allowPerm:SetColor(ix.config.Get("color", Color(255, 255, 255)))
|
||
allowPerm.DoClick = function()
|
||
net.Start("ixRecognizeMenuAnswer")
|
||
net.WriteEntity(ent)
|
||
net.WriteUInt(1, 2)
|
||
net.SendToServer()
|
||
mainPanel:Remove()
|
||
mainContainer:Remove()
|
||
end
|
||
|
||
local allowPerm = buttons:Add("DButton")
|
||
allowPerm:SetText("DENY")
|
||
allowPerm:Dock(LEFT)
|
||
allowPerm:DockMargin(scrh * 0.01, 0, 0, 0)
|
||
allowPerm:SetWide(scrh * 0.1)
|
||
allowPerm:SetFont("ixGenericFont")
|
||
allowPerm:SetColor(ix.config.Get("color", Color(255, 255, 255)))
|
||
allowPerm.DoClick = function()
|
||
mainPanel:Remove()
|
||
mainContainer:Remove()
|
||
end
|
||
end)
|
||
|
||
net.Receive("ixRecognizeDone", function(length)
|
||
hook.Run("CharacterRecognized")
|
||
end)
|
||
|
||
function PLUGIN:CharacterRecognized(client, recogCharID)
|
||
surface.PlaySound("buttons/button17.wav")
|
||
end
|
||
else
|
||
util.AddNetworkString("ixRecognize")
|
||
util.AddNetworkString("ixRecognizeTemp")
|
||
util.AddNetworkString("ixRecognizeTempHour")
|
||
util.AddNetworkString("ixRecognizeMenu")
|
||
util.AddNetworkString("ixRecognizeMenuAsk")
|
||
util.AddNetworkString("ixRecognizeMenuAnswer")
|
||
util.AddNetworkString("ixRecognizeDone")
|
||
|
||
function PLUGIN:ShowSpare1(client)
|
||
if (client:GetCharacter()) then
|
||
net.Start("ixRecognizeMenu")
|
||
net.Send(client)
|
||
end
|
||
end
|
||
|
||
net.Receive("ixRecognize", function(length, client)
|
||
local level = net.ReadUInt(2)
|
||
|
||
if (isnumber(level)) then
|
||
client:Recognize(level)
|
||
end
|
||
end)
|
||
|
||
net.Receive("ixRecognizeMenuAnswer", function(length, client)
|
||
local ent = net.ReadEntity()
|
||
local level = net.ReadUInt(2)
|
||
|
||
local char = ent:GetCharacter()
|
||
|
||
local char2 = client:GetCharacter():GetID()
|
||
|
||
if not char then return end
|
||
|
||
if level == 1 then
|
||
char:RecognizeTemp(char2)
|
||
elseif level == 0 then
|
||
char:Recognize(char2)
|
||
end
|
||
|
||
end)
|
||
|
||
|
||
net.Receive("ixRecognizeTemp", function(length, client)
|
||
local level = net.ReadUInt(2)
|
||
|
||
if (isnumber(level)) then
|
||
client:RecognizeTemp(level)
|
||
end
|
||
end)
|
||
|
||
net.Receive("ixRecognizeTempHour", function(length, client)
|
||
local char = client:GetCharacter()
|
||
if not char then return end
|
||
|
||
local tempRecog = char:GetData("temprgn", "")
|
||
|
||
if tempRecog != "" then
|
||
for k, v in pairs(tempRecog) do
|
||
tempRecog[k] = v - 1
|
||
|
||
if v == 0 then
|
||
v = nil
|
||
end
|
||
end
|
||
|
||
char:SetData("temprgn", tempRecog)
|
||
end
|
||
end)
|
||
end |