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)