.
This commit is contained in:
@@ -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
|
||||||
char:GiveMoney(self.moneyReward)
|
if (canGiveMoney) then
|
||||||
ply:Notify("Вы получили " .. self.moneyReward .. " за захват точки!")
|
char:GiveMoney(self.moneyReward)
|
||||||
|
ply:Notify("Вы получили " .. self.moneyReward .. " за захват точки!")
|
||||||
|
else
|
||||||
|
ply:Notify("Денежная награда не выдана: необходимо минимум 5 противников онлайн.")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
-- Match SteamID64
|
||||||
|
for id in string.gmatch(text, "7656119[0-9]{10}") do
|
||||||
|
table.insert(ids, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
return ids
|
||||||
end
|
end
|
||||||
|
|
||||||
local extractedID = findSteamID(log.message)
|
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
|
||||||
|
|||||||
@@ -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 = "Выполнена админ-команда"},
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user