From 3f0319016c95b3ff616fa0a297b3ceeba0d8a8f8 Mon Sep 17 00:00:00 2001 From: Scripty Date: Tue, 31 Mar 2026 11:51:03 +0300 Subject: [PATCH] . --- .../militaryrp/plugins/capture/sv_plugin.lua | 19 ++++- .../plugins/serverlogs/cl_plugin.lua | 81 +++++++++++++------ .../plugins/serverlogs/sh_plugin.lua | 2 +- .../plugins/whitelistmenu/sv_plugin.lua | 8 +- .../lua/autorun/server/sv_hostname_force.lua | 31 ++++++- 5 files changed, 107 insertions(+), 34 deletions(-) diff --git a/garrysmod/gamemodes/militaryrp/plugins/capture/sv_plugin.lua b/garrysmod/gamemodes/militaryrp/plugins/capture/sv_plugin.lua index 740e094..2e49256 100644 --- a/garrysmod/gamemodes/militaryrp/plugins/capture/sv_plugin.lua +++ b/garrysmod/gamemodes/militaryrp/plugins/capture/sv_plugin.lua @@ -60,11 +60,26 @@ function PLUGIN:CanCapture(factions) end function PLUGIN:GiveRewards(faction, players) + -- Считаем количество противников (игроков не из захватывающей фракции) + local enemyCount = 0 + for _, ply in ipairs(player.GetAll()) do + local char = ply:GetCharacter() + if (char and char:GetFaction() ~= faction and not (ply.IsAdminMode and ply:IsAdminMode())) then + enemyCount = enemyCount + 1 + end + end + + local canGiveMoney = enemyCount >= 5 + for _, ply in ipairs(players) do local char = ply:GetCharacter() if (char) then - char:GiveMoney(self.moneyReward) - ply:Notify("Вы получили " .. self.moneyReward .. " за захват точки!") + if (canGiveMoney) then + char:GiveMoney(self.moneyReward) + ply:Notify("Вы получили " .. self.moneyReward .. " за захват точки!") + else + ply:Notify("Денежная награда не выдана: необходимо минимум 5 противников онлайн.") + end end end diff --git a/garrysmod/gamemodes/militaryrp/plugins/serverlogs/cl_plugin.lua b/garrysmod/gamemodes/militaryrp/plugins/serverlogs/cl_plugin.lua index 2823f3b..e9039f7 100644 --- a/garrysmod/gamemodes/militaryrp/plugins/serverlogs/cl_plugin.lua +++ b/garrysmod/gamemodes/militaryrp/plugins/serverlogs/cl_plugin.lua @@ -342,58 +342,91 @@ function PLUGIN:UpdateLogsList() -- Сообщение draw.SimpleText(log.message, "ixSmallFont", 15, 43, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP) + + if isHovered then + draw.SimpleText("Клик для копирования", "ixSmallFont", w - 10, h - 5, COLOR_TEXT_SECONDARY, TEXT_ALIGN_RIGHT, TEXT_ALIGN_BOTTOM) + end end - -- Поиск SteamID в тексте сообщения - local function findSteamID(text) - if not text then return nil end - return string.match(text, "STEAM_[0-5]:[0-9]:[0-9]+") + -- Поиск SteamID в тексте сообщения (SteamID2 и SteamID64) + local function findSteamIDs(text) + if not text then return {} end + local ids = {} + + -- Match SteamID2 + for id in string.gmatch(text, "STEAM_[0-5]:[0-9]:[1-9][0-9]*") do + table.insert(ids, id) + end + + -- Match SteamID64 + for id in string.gmatch(text, "7656119[0-9]{10}") do + table.insert(ids, id) + end + + return ids end - local extractedID = findSteamID(log.message) + local extractedIDs = findSteamIDs(log.message) + + logEntry.OnMousePressed = function(s, m) + s:DoRightClick() + end logEntry.DoRightClick = function(s) local menu = DermaMenu() -- Опция копирования основного сообщения - menu:AddOption("Копировать сообщение", function() + local msgOpt = menu:AddOption("Копировать сообщение", function() SetClipboardText(log.message) ix.util.Notify("Сообщение скопировано") - end):SetIcon("icon16/page_copy.png") + end) + msgOpt:SetIcon("icon16/page_copy.png") + + menu:AddSpacer() -- Копирование SteamID цели (если есть в метаданных) if log.target and log.target.steamid and log.target.steamid ~= "N/A" then - menu:AddOption("Копировать SteamID (" .. log.target.name .. ")", function() + local targetOpt = menu:AddOption("Копировать SteamID (" .. log.target.name .. ")", function() SetClipboardText(log.target.steamid) ix.util.Notify("SteamID скопирован: " .. log.target.steamid) - end):SetIcon("icon16/user_edit.png") - -- Если нет в метаданных, но нашли в тексте (для архива) - elseif extractedID then - menu:AddOption("Копировать найденный SteamID (" .. extractedID .. ")", function() - SetClipboardText(extractedID) - ix.util.Notify("SteamID скопирован: " .. extractedID) - end):SetIcon("icon16/user_magnify.png") + end) + targetOpt:SetIcon("icon16/user_edit.png") end - -- Копирование SteamID атакующего (для убийств) + -- Копирование SteamID атакующего (для убийств/урона) if log.data and log.data.attacker and log.data.attacker ~= "world" then - menu:AddOption("Копировать SteamID Атакующего", function() - SetClipboardText(log.data.attacker) - ix.util.Notify("SteamID атакующего скопирован: " .. log.data.attacker) - end):SetIcon("icon16/user_delete.png") + local attackerOpt = menu:AddOption("Копировать SteamID Атакующего", function() + local sid = log.data.attacker + SetClipboardText(sid) + ix.util.Notify("SteamID атакующего скопирован: " .. sid) + end) + attackerOpt:SetIcon("icon16/user_delete.png") + end + + -- Копирование найденных ID из текста + if #extractedIDs > 0 then + for _, eid in ipairs(extractedIDs) do + local extOpt = menu:AddOption("Копировать найденный " .. eid, function() + SetClipboardText(eid) + ix.util.Notify("ID скопирован: " .. eid) + end) + extOpt:SetIcon("icon16/user_magnify.png") + end end menu:AddSpacer() - menu:AddOption("Копировать время (" .. log.timeString .. ")", function() + local timeOpt = menu:AddOption("Копировать время (" .. log.timeString .. ")", function() SetClipboardText(log.timeString) - end):SetIcon("icon16/time.png") + end) + timeOpt:SetIcon("icon16/time.png") - menu:AddOption("Копировать полную строку", function() + local fullOpt = menu:AddOption("Копировать полную строку", function() local fullLog = string.format("[%s][%s] %s", log.timeString, category and category.name or log.category, log.message) SetClipboardText(fullLog) ix.util.Notify("Полная строка скопирована") - end):SetIcon("icon16/page_white_copy.png") + end) + fullOpt:SetIcon("icon16/page_white_copy.png") menu:Open() end diff --git a/garrysmod/gamemodes/militaryrp/plugins/serverlogs/sh_plugin.lua b/garrysmod/gamemodes/militaryrp/plugins/serverlogs/sh_plugin.lua index 00fe7b6..f600fd9 100644 --- a/garrysmod/gamemodes/militaryrp/plugins/serverlogs/sh_plugin.lua +++ b/garrysmod/gamemodes/militaryrp/plugins/serverlogs/sh_plugin.lua @@ -99,7 +99,7 @@ PLUGIN.LOG_TYPES = { CHARACTER_CREATE = {category = "CHARACTER", description = "Создание персонажа"}, CHARACTER_DELETE = {category = "CHARACTER", description = "Удаление персонажа"}, CHARACTER_SWITCH = {category = "CHARACTER", description = "Смена персонажа"}, - CHARACTER_WHITELIST = {category = "CHARACTER", description = "Изменение вайтлиста/статистики"}, + CHARACTER_WHITELIST = {category = "ADMIN", description = "Изменение вайтлиста/статистики"}, -- Команды COMMAND_RUN = {category = "ADMIN", description = "Выполнена админ-команда"}, diff --git a/garrysmod/gamemodes/militaryrp/plugins/whitelistmenu/sv_plugin.lua b/garrysmod/gamemodes/militaryrp/plugins/whitelistmenu/sv_plugin.lua index 12a8084..6b35c9a 100644 --- a/garrysmod/gamemodes/militaryrp/plugins/whitelistmenu/sv_plugin.lua +++ b/garrysmod/gamemodes/militaryrp/plugins/whitelistmenu/sv_plugin.lua @@ -97,14 +97,11 @@ net.Receive("ixWhitelistMenuApply", function(_, client) char:SetSpec(specID) char:SetRank(rankID) - -- Респавн игрока для применения изменений - target:Spawn() - client:Notify("Роль назначена: " .. target:Name()) target:Notify("Вам назначена новая роль!") -- Логирование в систему серверных логов - local serverlogs = ix.plugin.list["serverlogs"] + local serverlogs = ix.plugin.Get("serverlogs") if serverlogs then local factionName = faction.name or "Неизвестно" local podrName = faction.Podr[podrID] and faction.Podr[podrID].name or tostring(podrID) @@ -122,4 +119,7 @@ net.Receive("ixWhitelistMenuApply", function(_, client) rank = rankName }) end + + -- Респавн игрока для применения изменений (после логирования) + target:Spawn() end) diff --git a/garrysmod/lua/autorun/server/sv_hostname_force.lua b/garrysmod/lua/autorun/server/sv_hostname_force.lua index 30a3aaf..e43716f 100644 --- a/garrysmod/lua/autorun/server/sv_hostname_force.lua +++ b/garrysmod/lua/autorun/server/sv_hostname_force.lua @@ -1,17 +1,42 @@ local ForceHostname = "FT 4.0 | ТЕСТ СЕРВЕР" local function EnforceHostname() - if GetConVar("hostname"):GetString() ~= ForceHostname then + local hostnameCVar = GetConVar("hostname") + if not hostnameCVar then return end + + local current = hostnameCVar:GetString() + if current ~= ForceHostname then + print("[HOSTNAME FORCE] Detected name mismatch!") + print(" Current: '" .. current .. "'") + print(" Target: '" .. ForceHostname .. "'") + + -- Try to set it directly and via command + hostnameCVar:SetString(ForceHostname) RunConsoleCommand("hostname", ForceHostname) end end -hook.Add("Think", "ForceHostnameAggressive", function() +-- Monitor for external changes +cvars.AddChangeCallback("hostname", function(convar, old, new) + if new ~= ForceHostname then + print("[HOSTNAME FORCE] WRAPPER: Hostname was changed by an external source!") + print(" From: '" .. old .. "'") + print(" To: '" .. new .. "'") + + timer.Simple(0.1, EnforceHostname) + end +end, "ForceHostnameTracker") + +hook.Add("Initialize", "ForceHostnameInit", function() + print("[HOSTNAME FORCE] Script initialized.") EnforceHostname() end) -timer.Create("ForceHostnameTimer", 0.1, 0, function() +-- Keep it forced every 5 seconds (Think is overkill if we use callbacks) +timer.Create("ForceHostnameTimer", 5, 0, function() EnforceHostname() end) +-- Run once on load EnforceHostname() +