264 lines
10 KiB
Lua
264 lines
10 KiB
Lua
local PLUGIN = PLUGIN
|
||
|
||
-- Обработка отправки опроса
|
||
net.Receive("ixMilitaryID_SubmitQuiz", function(len, client)
|
||
local answers = net.ReadTable()
|
||
local character = client:GetCharacter()
|
||
|
||
if not character then return end
|
||
|
||
-- Проверка правильности ответов (опционально)
|
||
local score = 0
|
||
for i, answer in ipairs(answers) do
|
||
local question = PLUGIN.quizQuestions[i]
|
||
if question.correctAnswer and answer == question.correctAnswer then
|
||
score = score + 1
|
||
end
|
||
end
|
||
|
||
-- Если есть минимальный балл
|
||
if PLUGIN.minimumScore and score < PLUGIN.minimumScore then
|
||
client:Notify("Вы не прошли опрос. Попробуйте снова.")
|
||
return
|
||
end
|
||
|
||
-- Создание военного билета
|
||
local inventory = character:GetInventory()
|
||
if not inventory or isnumber(inventory) then
|
||
client:Notify("Инвентарь еще не загрузился, подождите немного...")
|
||
return
|
||
end
|
||
|
||
-- Проверяем, есть ли уже военный билет
|
||
for _, item in pairs(inventory:GetItems()) do
|
||
if item.uniqueID == "military_id" then
|
||
client:Notify("У вас уже есть военный билет!")
|
||
return
|
||
end
|
||
end
|
||
|
||
-- Выдаем пустой военный билет (данные заполнятся при первом просмотре)
|
||
inventory:Add("military_id")
|
||
client:Notify("Вы получили военный билет!")
|
||
end)
|
||
|
||
-- Показать документ другому игроку
|
||
net.Receive("ixMilitaryID_ShowToPlayer", function(len, client)
|
||
local targetIndex = net.ReadUInt(16)
|
||
local itemID = net.ReadUInt(32)
|
||
print("Received ShowToPlayer request: targetIndex=" .. targetIndex .. ", itemID=" .. itemID)
|
||
local target = Entity(targetIndex)
|
||
if not IsValid(target) or not target:IsPlayer() or target:GetPos():Distance(client:GetPos()) > 200 then
|
||
client:Notify("Игрок слишком далеко!")
|
||
return
|
||
end
|
||
|
||
if (client.ixNextIDShow or 0) > CurTime() then
|
||
client:Notify("Подождите " .. math.ceil(client.ixNextIDShow - CurTime()) .. " сек. перед повторным показом")
|
||
return
|
||
end
|
||
|
||
if target.ixIsViewingID then
|
||
client:Notify("Этот человек уже изучает другой документ")
|
||
return
|
||
end
|
||
|
||
local item = ix.item.instances[itemID]
|
||
if not item or item.player ~= client then
|
||
return
|
||
end
|
||
|
||
-- Берем актуальные данные персонажа
|
||
local character = client:GetCharacter()
|
||
if not character then return end
|
||
|
||
local factionTable = ix.faction.Get(character:GetFaction())
|
||
local podrData = factionTable and factionTable.Podr and factionTable.Podr[character:GetPodr()]
|
||
local specData = factionTable and factionTable.Spec and factionTable.Spec[character:GetSpec()]
|
||
|
||
local data = {
|
||
name = character:GetName(),
|
||
faction = factionTable and factionTable.name or "Неизвестно",
|
||
subdivision = podrData and podrData.name or "Неизвестно",
|
||
specialization = specData and specData.name or "Неизвестно",
|
||
rank = client.GetRankName and client:GetRankName() or "Неизвестно",
|
||
wanted = character:GetData("wanted", false)
|
||
}
|
||
|
||
|
||
-- Устанавливаем статус просмотра для цели
|
||
target.ixIsViewingID = true
|
||
-- Ставим кулдаун отправителю
|
||
client.ixNextIDShow = CurTime() + 5
|
||
|
||
-- Отправляем данные документа целевому игроку
|
||
net.Start("ixMilitaryID_ViewDocument")
|
||
net.WriteTable(data)
|
||
net.Send(target)
|
||
|
||
client:Notify("Вы предъявили военный билет игроку " .. target:Name())
|
||
target:Notify(client:Name() .. " предъявил вам военный билет")
|
||
end)
|
||
|
||
-- Сохранение отредактированного документа
|
||
net.Receive("ixMilitaryID_SaveEdit", function(len, client)
|
||
if not client:IsAdmin() then
|
||
client:Notify("У вас нет прав для редактирования!")
|
||
return
|
||
end
|
||
|
||
local itemID = net.ReadUInt(32)
|
||
local newData = net.ReadTable()
|
||
|
||
local item = ix.item.instances[itemID]
|
||
if not item or item.uniqueID ~= "military_id" then
|
||
return
|
||
end
|
||
|
||
-- Обновляем данные
|
||
for key, value in pairs(newData) do
|
||
item:SetData(key, value)
|
||
end
|
||
|
||
client:Notify("Военный билет успешно отредактирован!")
|
||
|
||
-- Если владелец онлайн, уведомляем его
|
||
if IsValid(item.player) and item.player ~= client then
|
||
item.player:Notify("Ваш военный билет был отредактирован администратором")
|
||
end
|
||
end)
|
||
|
||
-- Сброс состояния просмотра документа
|
||
net.Receive("ixMilitaryID_StopView", function(len, client)
|
||
client.ixIsViewingID = nil
|
||
end)
|
||
|
||
function PLUGIN:PlayerDisconnected(client)
|
||
client.ixIsViewingID = nil
|
||
end
|
||
|
||
function PLUGIN:OnCharacterLoaded(character)
|
||
local ply = character:GetPlayer()
|
||
if IsValid(ply) then
|
||
ply:SetNWBool("ix_wanted", character:GetData("wanted", false))
|
||
end
|
||
end
|
||
|
||
-- Консольная команда для предъявления военного билета другому игроку
|
||
concommand.Add("show_military_id_to_player", function(ply)
|
||
local character = ply:GetCharacter()
|
||
if not character then
|
||
ply:Notify("У вас нет активного персонажа!")
|
||
return
|
||
end
|
||
|
||
-- Проверяем наличие военного билета в инвентаре
|
||
local inventory = character:GetInventory()
|
||
local hasItem = false
|
||
if inventory then
|
||
for _, item in pairs(inventory:GetItems()) do
|
||
if item.uniqueID == "military_id" then
|
||
hasItem = true
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if not hasItem then
|
||
ply:Notify("У вас нет военного билета! Вам нужно его получить.")
|
||
return
|
||
end
|
||
|
||
-- Трассировка взгляда от лица игрока
|
||
local trace = ply:GetEyeTrace()
|
||
local target = trace.Entity
|
||
|
||
-- Проверяем что смотрим на игрока и он близко
|
||
if IsValid(target) and target:IsPlayer() and target ~= ply and target:GetPos():Distance(ply:GetPos()) <= 200 then
|
||
if (ply.ixNextIDShow or 0) > CurTime() then
|
||
ply:Notify("Подождите " .. math.ceil(ply.ixNextIDShow - CurTime()) .. " сек. перед повторным показом")
|
||
return
|
||
end
|
||
|
||
if target.ixIsViewingID then
|
||
ply:Notify("Этот человек уже изучает другой документ")
|
||
return
|
||
end
|
||
local factionTable = ix.faction.Get(character:GetFaction())
|
||
local podrData = factionTable and factionTable.Podr and factionTable.Podr[character:GetPodr()]
|
||
local specData = factionTable and factionTable.Spec and factionTable.Spec[character:GetSpec()]
|
||
|
||
local data = {
|
||
name = character:GetName(),
|
||
faction = factionTable and factionTable.name or "Неизвестно",
|
||
subdivision = podrData and podrData.name or "Неизвестно",
|
||
specialization = specData and specData.name or "Неизвестно",
|
||
rank = ply.GetRankName and ply:GetRankName() or "Неизвестно",
|
||
wanted = character:GetData("wanted", false),
|
||
wanted_fsb = character:GetData("wanted_fsb", false),
|
||
wanted_sbu = character:GetData("wanted_sbu", false)
|
||
}
|
||
|
||
|
||
-- Устанавливаем статус просмотра для цели
|
||
target.ixIsViewingID = true
|
||
-- Ставим кулдаун отправителю
|
||
ply.ixNextIDShow = CurTime() + 5
|
||
|
||
-- Отправляем данные документа целевому игроку
|
||
net.Start("ixMilitaryID_ViewDocument")
|
||
net.WriteTable(data)
|
||
net.Send(target)
|
||
|
||
ply:Notify("Вы показали военный билет игроку " .. target:GetName())
|
||
else
|
||
ply:Notify("Посмотрите на игрока поблизости")
|
||
end
|
||
end)
|
||
|
||
-- Консольная команда для показа военного билета себе
|
||
concommand.Add("show_military_id", function(ply)
|
||
local character = ply:GetCharacter()
|
||
if not character then
|
||
ply:Notify("У вас нет активного персонажа!")
|
||
return
|
||
end
|
||
|
||
-- Проверяем наличие военного билета в инвентаре
|
||
local inventory = character:GetInventory()
|
||
local hasItem = false
|
||
if inventory then
|
||
for _, item in pairs(inventory:GetItems()) do
|
||
if item.uniqueID == "military_id" then
|
||
hasItem = true
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if not hasItem then
|
||
ply:Notify("У вас нет военного билета! Вам нужно его получить.")
|
||
return
|
||
end
|
||
|
||
local factionTable = ix.faction.Get(character:GetFaction())
|
||
local podrData = factionTable and factionTable.Podr and factionTable.Podr[character:GetPodr()]
|
||
local specData = factionTable and factionTable.Spec and factionTable.Spec[character:GetSpec()]
|
||
|
||
local data = {
|
||
name = character:GetName(),
|
||
faction = factionTable and factionTable.name or "Неизвестно",
|
||
subdivision = podrData and podrData.name or "Неизвестно",
|
||
specialization = specData and specData.name or "Неизвестно",
|
||
rank = ply.GetRankName and ply:GetRankName() or "Неизвестно",
|
||
wanted = character:GetData("wanted", false),
|
||
wanted_fsb = character:GetData("wanted_fsb", false),
|
||
wanted_sbu = character:GetData("wanted_sbu", false)
|
||
}
|
||
|
||
|
||
net.Start("ixMilitaryID_ViewDocument")
|
||
net.WriteTable(data)
|
||
net.Send(ply)
|
||
end)
|