222 lines
8.3 KiB
Lua
222 lines
8.3 KiB
Lua
local PLUGIN = PLUGIN
|
||
|
||
if SERVER then
|
||
util.AddNetworkString("ixNLRStart")
|
||
util.AddNetworkString("ixNLREnd")
|
||
util.AddNetworkString("ixNLRWarning")
|
||
|
||
-- Таблица для хранения данных NLR игроков
|
||
PLUGIN.nlrData = PLUGIN.nlrData or {}
|
||
|
||
-- Начало NLR при смерти
|
||
function PLUGIN:PlayerDeath(ply, inflictor, attacker)
|
||
if not IsValid(ply) then return end
|
||
|
||
local char = ply:GetCharacter()
|
||
if not char then return end
|
||
|
||
-- Устанавливаем время окончания NLR
|
||
local nlrEndTime = CurTime() + self.config.nlrTime
|
||
|
||
self.nlrData[ply:SteamID()] = {
|
||
endTime = nlrEndTime,
|
||
inWarning = false,
|
||
warningStartTime = nil
|
||
}
|
||
|
||
-- Отправляем клиенту информацию о начале NLR
|
||
net.Start("ixNLRStart")
|
||
net.WriteFloat(nlrEndTime)
|
||
net.Send(ply)
|
||
|
||
ply:Notify("Вы мертвы. NLR активен на " .. math.floor(self.config.nlrTime / 60) .. " минут")
|
||
end
|
||
|
||
function PLUGIN:Think()
|
||
for _, ply in ipairs(player.GetAll()) do
|
||
if not IsValid(ply) or not ply:Alive() then continue end
|
||
|
||
if ply:IsAdminMode() then
|
||
local steamID = ply:SteamID()
|
||
local nlrData = self.nlrData[steamID]
|
||
|
||
if nlrData and nlrData.inWarning then
|
||
nlrData.inWarning = false
|
||
nlrData.warningStartTime = nil
|
||
|
||
net.Start("ixNLRWarning")
|
||
net.WriteBool(false)
|
||
net.WriteFloat(0)
|
||
net.Send(ply)
|
||
end
|
||
|
||
continue
|
||
end
|
||
|
||
local steamID = ply:SteamID()
|
||
local nlrData = self.nlrData[steamID]
|
||
|
||
if nlrData and CurTime() < nlrData.endTime then
|
||
local inZone, zoneName = self:IsPlayerInAllowedZone(ply)
|
||
|
||
if not inZone and not nlrData.inWarning then
|
||
nlrData.inWarning = true
|
||
nlrData.warningStartTime = CurTime()
|
||
|
||
net.Start("ixNLRWarning")
|
||
net.WriteBool(true)
|
||
net.WriteFloat(CurTime() + self.config.warningTime)
|
||
net.Send(ply)
|
||
|
||
--ply:Notify("Вернитесь на базу в течении " .. math.floor(self.config.warningTime / 60) .. " минуты или вы умрете!")
|
||
|
||
elseif inZone and nlrData.inWarning then
|
||
-- Игрок вернулся в зону
|
||
nlrData.inWarning = false
|
||
nlrData.warningStartTime = nil
|
||
|
||
net.Start("ixNLRWarning")
|
||
net.WriteBool(false)
|
||
net.WriteFloat(0)
|
||
net.Send(ply)
|
||
|
||
ply:Notify("Вы вернулись на базу. Предупреждение снято.")
|
||
|
||
elseif nlrData.inWarning and nlrData.warningStartTime then
|
||
-- Проверяем, истекло ли время предупреждения
|
||
if CurTime() - nlrData.warningStartTime >= self.config.warningTime then
|
||
ply:Kill()
|
||
ply:Notify("Вы не вернулись на базу вовремя")
|
||
|
||
nlrData.inWarning = false
|
||
nlrData.warningStartTime = nil
|
||
end
|
||
end
|
||
elseif nlrData and CurTime() >= nlrData.endTime then
|
||
-- NLR закончился
|
||
self.nlrData[steamID] = nil
|
||
|
||
net.Start("ixNLREnd")
|
||
net.Send(ply)
|
||
|
||
ply:Notify("NLR закончился. Вы можете свободно перемещаться")
|
||
end
|
||
end
|
||
end
|
||
|
||
-- Очистка данных при выходе игрока
|
||
function PLUGIN:PlayerDisconnected(ply)
|
||
if ply:SteamID() then
|
||
self.nlrData[ply:SteamID()] = nil
|
||
end
|
||
end
|
||
|
||
-- Очистка данных при смене персонажа
|
||
function PLUGIN:OnCharacterDeleted(ply, char)
|
||
if ply:SteamID() then
|
||
self.nlrData[ply:SteamID()] = nil
|
||
|
||
net.Start("ixNLREnd")
|
||
net.Send(ply)
|
||
end
|
||
end
|
||
|
||
-- Команда для проверки зоны
|
||
concommand.Add("nlr_check", function(ply)
|
||
if not IsValid(ply) then return end
|
||
|
||
local char = ply:GetCharacter()
|
||
if not char then
|
||
ply:ChatPrint("Нет персонажа")
|
||
return
|
||
end
|
||
|
||
local faction = char:GetFaction()
|
||
local zones = PLUGIN.config.zones[faction]
|
||
|
||
if not zones then
|
||
ply:ChatPrint("Для вашей фракции (" .. faction .. ") не настроены зоны")
|
||
return
|
||
end
|
||
|
||
local pos = ply:GetPos()
|
||
ply:ChatPrint("Ваша позиция: " .. tostring(pos))
|
||
ply:ChatPrint("Фракция: " .. tostring(faction))
|
||
ply:ChatPrint("Количество зон: " .. #zones)
|
||
|
||
for i, zone in ipairs(zones) do
|
||
ply:ChatPrint("Зона " .. i .. " (" .. zone.name .. "):")
|
||
ply:ChatPrint(" Min: " .. tostring(zone.min))
|
||
ply:ChatPrint(" Max: " .. tostring(zone.max))
|
||
|
||
local inZone = PLUGIN:IsInZone(pos, zone)
|
||
ply:ChatPrint(" В зоне: " .. tostring(inZone))
|
||
end
|
||
|
||
local inAnyZone, zoneName = PLUGIN:IsPlayerInAllowedZone(ply)
|
||
ply:ChatPrint("Итог: " .. (inAnyZone and ("В зоне: " .. zoneName) or "ВНЕ ЗОНЫ"))
|
||
end)
|
||
|
||
-- Команда Helix для сброса NLR
|
||
ix.command.Add("ResetNLR", {
|
||
description = "Сбросить NLR у игрока",
|
||
adminOnly = true,
|
||
arguments = {
|
||
ix.type.player
|
||
},
|
||
OnCheckAccess = function(self, client)
|
||
return AdminPrivs[client:GetUserGroup()]
|
||
end,
|
||
OnRun = function(self, client, target)
|
||
if not IsValid(target) then
|
||
return "@invalidTarget"
|
||
end
|
||
|
||
local steamID = target:SteamID()
|
||
local hadNLR = PLUGIN.nlrData[steamID] ~= nil
|
||
|
||
if hadNLR then
|
||
-- Очищаем данные NLR
|
||
PLUGIN.nlrData[steamID] = nil
|
||
|
||
-- Отправляем клиенту информацию об окончании NLR
|
||
net.Start("ixNLREnd")
|
||
net.Send(target)
|
||
|
||
-- Уведомляем игрока
|
||
target:Notify("Ваш NLR был сброшен администратором")
|
||
|
||
-- Логируем в serverlogs
|
||
local serverlogsPlugin = ix.plugin.list["serverlogs"]
|
||
if serverlogsPlugin then
|
||
local message = string.format("%s сбросил NLR игроку %s",
|
||
client:Nick(), target:Nick())
|
||
serverlogsPlugin:AddLog("ADMIN_COMMAND", message, client, {
|
||
targetSteamID = steamID,
|
||
targetName = target:Nick()
|
||
})
|
||
end
|
||
|
||
return "@nlrResetSuccess", target:Name()
|
||
else
|
||
return "@nlrNotActive", target:Name()
|
||
end
|
||
end
|
||
})
|
||
|
||
-- Сброс NLR при оживлении медиком
|
||
hook.Add("onPlayerRevived", "ixNLRResetOnRevival", function(ply)
|
||
if IsValid(ply) then
|
||
local steamID = ply:SteamID()
|
||
if PLUGIN.nlrData[steamID] then
|
||
PLUGIN.nlrData[steamID] = nil
|
||
|
||
net.Start("ixNLREnd")
|
||
net.Send(ply)
|
||
|
||
ply:Notify("Ваш NLR был сброшен, так как вас реанимировали")
|
||
end
|
||
end
|
||
end)
|
||
end
|