Проблема с playerpunishment в badmin

Не могу понять что не так с отображением истории наказаний в badmin.
Команда playerpunishment должна выводить таблицу также как в playerevents и показывать историю наказаний игрока (по типу jail mute mutevoice)
но мне постоянно выдает лишь ошибку в чате “Игрок еще не получал ни одного наказания.” Есть понимание только того что скорее всего просто не логируются никуда эти самые наказания, но я так и не справился с решением этой проблемы. Помогите пожалуйста.
logs_sv.lua (3,1 КБ)
logs_sh.lua (5,5 КБ)
logs_cl.lua (8,9 КБ)

У тебя хорошо сформулирована тема, что редкость для этого раздела и мне даже жаль выставлять таймер удаления, потому что я надеюсь, что тебе помогут. Но честно говоря, мне кажется, мало кто захочет лезть и разбираться в код, который ты скинул :frowning:

Тем не менее, выдам медальку и сниму таймер удаления темы, если кто-то поможет с решением

Действительно, таблица которая проверяется, не один из 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)

  1. gsub - [C]:-1
  2. func - addons/badmin/lua/ba/core/logging/logs_cl.lua:79
  3. 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 с функции, бери аргументы с функции команд
пример:

вот только значения игрока не заменяются автоматически так как это другая система терминов
по этому сам термин тоже нужно менять в нужный стиль:
из ‘# дал мут чата # на #.’
в_ ‘#(#) дал мут чата #(#) на #.’
image
Сюда пиши то что можно будет скопировать отдельно от цельной строки!.

бля, слишком много текста я вообще не могу разобраться, да и даже если разберусь я скорее всего где-то что-то упущу и будут ерорки вылезать. Можешь пожалуйста все что нужно составить в один код и скинуть, там уже по примеру с командами буду доделывать

Затуп 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 в нижнем регистре был.

IMG_1614

Это в консоли

Это когда использовал ph

Затуп 5.
PlayerEvents и PlayerPunishments на стороне Игрока используют одну таблицу!
по этому у тебя переписались данные!
если смотреть на то что написала консоль то ты использовал ph потом pe.
я не вижу в коде использование PlayerEvents