This commit is contained in:
2026-03-31 11:51:03 +03:00
parent 5bdd797b73
commit 3f0319016c
5 changed files with 107 additions and 34 deletions

View File

@@ -60,11 +60,26 @@ function PLUGIN:CanCapture(factions)
end end
function PLUGIN:GiveRewards(faction, players) 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 for _, ply in ipairs(players) do
local char = ply:GetCharacter() local char = ply:GetCharacter()
if (char) then if (char) then
if (canGiveMoney) then
char:GiveMoney(self.moneyReward) char:GiveMoney(self.moneyReward)
ply:Notify("Вы получили " .. self.moneyReward .. " за захват точки!") ply:Notify("Вы получили " .. self.moneyReward .. " за захват точки!")
else
ply:Notify("Денежная награда не выдана: необходимо минимум 5 противников онлайн.")
end
end end
end end

View File

@@ -342,58 +342,91 @@ function PLUGIN:UpdateLogsList()
-- Сообщение -- Сообщение
draw.SimpleText(log.message, "ixSmallFont", 15, 43, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP) 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 end
-- Поиск SteamID в тексте сообщения -- Поиск SteamID в тексте сообщения (SteamID2 и SteamID64)
local function findSteamID(text) local function findSteamIDs(text)
if not text then return nil end if not text then return {} end
return string.match(text, "STEAM_[0-5]:[0-9]:[0-9]+") 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 end
local extractedID = findSteamID(log.message) -- Match SteamID64
for id in string.gmatch(text, "7656119[0-9]{10}") do
table.insert(ids, id)
end
return ids
end
local extractedIDs = findSteamIDs(log.message)
logEntry.OnMousePressed = function(s, m)
s:DoRightClick()
end
logEntry.DoRightClick = function(s) logEntry.DoRightClick = function(s)
local menu = DermaMenu() local menu = DermaMenu()
-- Опция копирования основного сообщения -- Опция копирования основного сообщения
menu:AddOption("Копировать сообщение", function() local msgOpt = menu:AddOption("Копировать сообщение", function()
SetClipboardText(log.message) SetClipboardText(log.message)
ix.util.Notify("Сообщение скопировано") ix.util.Notify("Сообщение скопировано")
end):SetIcon("icon16/page_copy.png") end)
msgOpt:SetIcon("icon16/page_copy.png")
menu:AddSpacer()
-- Копирование SteamID цели (если есть в метаданных) -- Копирование SteamID цели (если есть в метаданных)
if log.target and log.target.steamid and log.target.steamid ~= "N/A" then 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) SetClipboardText(log.target.steamid)
ix.util.Notify("SteamID скопирован: " .. log.target.steamid) ix.util.Notify("SteamID скопирован: " .. log.target.steamid)
end):SetIcon("icon16/user_edit.png") end)
-- Если нет в метаданных, но нашли в тексте (для архива) targetOpt: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 end
-- Копирование SteamID атакующего (для убийств) -- Копирование SteamID атакующего (для убийств/урона)
if log.data and log.data.attacker and log.data.attacker ~= "world" then if log.data and log.data.attacker and log.data.attacker ~= "world" then
menu:AddOption("Копировать SteamID Атакующего", function() local attackerOpt = menu:AddOption("Копировать SteamID Атакующего", function()
SetClipboardText(log.data.attacker) local sid = log.data.attacker
ix.util.Notify("SteamID атакующего скопирован: " .. log.data.attacker) SetClipboardText(sid)
end):SetIcon("icon16/user_delete.png") 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 end
menu:AddSpacer() menu:AddSpacer()
menu:AddOption("Копировать время (" .. log.timeString .. ")", function() local timeOpt = menu:AddOption("Копировать время (" .. log.timeString .. ")", function()
SetClipboardText(log.timeString) 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) local fullLog = string.format("[%s][%s] %s", log.timeString, category and category.name or log.category, log.message)
SetClipboardText(fullLog) SetClipboardText(fullLog)
ix.util.Notify("Полная строка скопирована") ix.util.Notify("Полная строка скопирована")
end):SetIcon("icon16/page_white_copy.png") end)
fullOpt:SetIcon("icon16/page_white_copy.png")
menu:Open() menu:Open()
end end

View File

@@ -99,7 +99,7 @@ PLUGIN.LOG_TYPES = {
CHARACTER_CREATE = {category = "CHARACTER", description = "Создание персонажа"}, CHARACTER_CREATE = {category = "CHARACTER", description = "Создание персонажа"},
CHARACTER_DELETE = {category = "CHARACTER", description = "Удаление персонажа"}, CHARACTER_DELETE = {category = "CHARACTER", description = "Удаление персонажа"},
CHARACTER_SWITCH = {category = "CHARACTER", description = "Смена персонажа"}, CHARACTER_SWITCH = {category = "CHARACTER", description = "Смена персонажа"},
CHARACTER_WHITELIST = {category = "CHARACTER", description = "Изменение вайтлиста/статистики"}, CHARACTER_WHITELIST = {category = "ADMIN", description = "Изменение вайтлиста/статистики"},
-- Команды -- Команды
COMMAND_RUN = {category = "ADMIN", description = "Выполнена админ-команда"}, COMMAND_RUN = {category = "ADMIN", description = "Выполнена админ-команда"},

View File

@@ -97,14 +97,11 @@ net.Receive("ixWhitelistMenuApply", function(_, client)
char:SetSpec(specID) char:SetSpec(specID)
char:SetRank(rankID) char:SetRank(rankID)
-- Респавн игрока для применения изменений
target:Spawn()
client:Notify("Роль назначена: " .. target:Name()) client:Notify("Роль назначена: " .. target:Name())
target:Notify("Вам назначена новая роль!") target:Notify("Вам назначена новая роль!")
-- Логирование в систему серверных логов -- Логирование в систему серверных логов
local serverlogs = ix.plugin.list["serverlogs"] local serverlogs = ix.plugin.Get("serverlogs")
if serverlogs then if serverlogs then
local factionName = faction.name or "Неизвестно" local factionName = faction.name or "Неизвестно"
local podrName = faction.Podr[podrID] and faction.Podr[podrID].name or tostring(podrID) local podrName = faction.Podr[podrID] and faction.Podr[podrID].name or tostring(podrID)
@@ -122,4 +119,7 @@ net.Receive("ixWhitelistMenuApply", function(_, client)
rank = rankName rank = rankName
}) })
end end
-- Респавн игрока для применения изменений (после логирования)
target:Spawn()
end) end)

View File

@@ -1,17 +1,42 @@
local ForceHostname = "FT 4.0 | ТЕСТ СЕРВЕР" local ForceHostname = "FT 4.0 | ТЕСТ СЕРВЕР"
local function EnforceHostname() 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) RunConsoleCommand("hostname", ForceHostname)
end end
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() EnforceHostname()
end) 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() EnforceHostname()
end) end)
-- Run once on load
EnforceHostname() EnforceHostname()