Не могу понять что не так с отображением истории наказаний в badmin.
Команда playerpunishment должна выводить таблицу также как в playerevents и показывать историю наказаний игрока (по типу jail mute mutevoice)
но мне постоянно выдает лишь ошибку в чате “Игрок еще не получал ни одного наказания.” Есть понимание только того что скорее всего просто не логируются никуда эти самые наказания, но я так и не справился с решением этой проблемы. Помогите пожалуйста.
logs_sv.lua (3,1 КБ)
logs_sh.lua (5,5 КБ)
logs_cl.lua (8,9 КБ)
У тебя хорошо сформулирована тема, что редкость для этого раздела и мне даже жаль выставлять таймер удаления, потому что я надеюсь, что тебе помогут. Но честно говоря, мне кажется, мало кто захочет лезть и разбираться в код, который ты скинул
Тем не менее, выдам медальку и сниму таймер удаления темы, если кто-то поможет с решением
Действительно, таблица которая проверяется, не один из 2 двух файлов связанных с Серверной частью (SH,SV) не пополняет её. Да же нет функции для “пополнения”
Так же я проверил 2 SUP сборки (новая и очень старая) в них нет playerpunishment , откуда скачивал это?
Я знаю что это файлы из
addons\base_badmin\lua\ba\core\logging
но повторю что в моих sup сборках там нет упоминание playerpunishment .
я с сборки justrp если не ошибаюсь достал этот код
Секунду, делаю код, но проверять не смогу мне ООООчень лень ставить mysql для sup’a
я смогу проверить сразу
Затуп 1.
замени оригинал на:
logs_sv.lua (3,5 КБ)
добавил функцию:
ba.log_mt:PlayerPh(Цель,термин,то что входит в термин)
если нужно что-бы тот кто “наказывал” то же сохранял у себя наказания то
ba.log_mt:PlayerPh({Цель,админ},термин,то что входит в термин)
я не уверен будет ли работь исправно если наказывает консоль.
Пример на команде kick:
term.Add('AdminKickedPlayer', '# кикнул #. Причина: #.')
ba.cmd.Create('Kick', function(pl, args)
if IsValid(pl) then --Если не консоль
pl.kickTimeLast = pl.kickTimeLast or 0
if (CurTime() > pl.kickTimeLast) then
---- наш код
ba.log_mt:PlayerPh(args.target,term.Get('AdminKickedPlayer'),pl, args.target, args.reason)
-----
ba.notify_all(term.Get('AdminKickedPlayer'), pl, args.target, args.reason)
args.target:Kick(args.reason)
pl.kickTimeLast = CurTime()+30
else
ba.notify_err(pl,"Подождите еще "..string.FormattedTime(30-math.abs( pl.kickTimeLast - CurTime() ),"%02i:%02i:%02i").." сек перед следующим киком.")
end
else
---- наш код
ba.log_mt:PlayerPh(args.target,term.Get('AdminKickedPlayer'),pl, args.target, args.reason)
-----
ba.notify_all(term.Get('AdminKickedPlayer'), pl, args.target, args.reason)
args.target:Kick(args.reason)
end
end)
:AddParam('player_entity', 'target')
:AddParam('string', 'reason')
:SetFlag 'M'
:SetHelp 'Кикнуть'
Можно и подругому(хук) но лучше уж сразу в нужных командах прописать
Ошибка в консоли появляется после кика
Ошибка в консоли появляется [badmin] addons/badmin/lua/ba/core/logging/logs_cl.lua:79: invalid replacement value (a Player)
- gsub - [C]:-1
- func - addons/badmin/lua/ba/core/logging/logs_cl.lua:79
- unknown - lua/includes/extensions/net.lua:38
И как я понял все наказания слетают после перезахода на сервер игрока которому выдавали наказание
Затуп 2.
логи не сохраняются между сессиями(Сервера), если тебе нужно что-бы было видно ВСЮ историю то нужно делать совершенно другой код.
Перезаход игрока не обнуляет таблицу, так как она сохраняет игрока “ключом” его SteamID.
Я забыл что для логов отдельные термины.
по этому меняем код.
-- текст что пишет в логах, названия значений по порядку для копирования, функция которая предоставит значения для текста в логах
--в название значений не обязательно писать, просто не будет возможности скопировать конкретное значение.
local CMDTRUE = {
MuteChat= {
'#(#) дал мут чата #(#) на #.',
{'Админ ник', 'Админ SteamID', 'Ник', 'SteamID', 'Время'},
function(pl,args)
local ipl = IsValid(pl)
return ipl and pl:Nick() or 'Console', ipl and pl:SteamID() or 'Console', args.target:Nick(), args.target:SteamID(), args.raw.time
end
}
}
local function AddTerm(cmd, msg, ...)
ba.logs.AddTerm('__' .. cmd, msg, ...)
end
for k, v in pairs(CMDTRUE) do
AddTerm(k, v[1], v[2])
end
local term = ba.logs.Term
hook.Add('playerRunCommand', 'GetplayerRunCommandLogsP', function(pl, cmd, args)
if not CMDTRUE[cmd] then return end
ba.log_mt:PlayerPh(args.target, term('__' .. cmd), CMDTRUE[cmd][3](pl, args))
end)
в команде kick убери ba.log_mt:PlayerPh, и добавь по примеру mute в конец файла logs_sv.lua
я может и перегрузил таблицу (не удобное чтение), но ведь это нужно сделать 1 раз и не трогать больше.
для return с функции, бери аргументы с функции команд
пример:
вот только значения игрока не заменяются автоматически так как это другая система терминов
по этому сам термин тоже нужно менять в нужный стиль:
из ‘# дал мут чата # на #.’
в_ ‘#(#) дал мут чата #(#) на #.’
Сюда пиши то что можно будет скопировать отдельно от цельной строки!.
бля, слишком много текста я вообще не могу разобраться, да и даже если разберусь я скорее всего где-то что-то упущу и будут ерорки вылезать. Можешь пожалуйста все что нужно составить в один код и скинуть, там уже по примеру с командами буду доделывать
Затуп 3.
logs_sv.lua (4,8 КБ)
Можешь еще пожалуйста скинуть пример с командой как нужно делать, тоже не понял
пример вшит.
local CMDTRUE = {
MuteChat= {
'#(#) дал мут чата #(#) на #.',
{'Админ ник', 'Админ SteamID', 'Ник', 'SteamID', 'Время'},
function(pl,args)
local ipl = IsValid(pl)
return ipl and pl:Nick() or 'Console', ipl and pl:SteamID() or 'Console', args.target:Nick(), args.target:SteamID(), args.raw.time
end
},
--т.д
}
А, все понял. Ща буду пробовать
Затуп 4.
добавь print(cmd), возможно cmd в нижнем регистре.
либо вот
logs_sv.lua (4,8 КБ)
в хуке есть print потом удали как не нужен будет а так используй команду и покажи что пишет (в консоль сервера), а так сразу добавил что-бы cmd в нижнем регистре был.
Это в консоли
Затуп 5.
PlayerEvents и PlayerPunishments на стороне Игрока используют одну таблицу!
по этому у тебя переписались данные!
если смотреть на то что написала консоль то ты использовал ph потом pe.
я не вижу в коде использование PlayerEvents