✅ SAM AdminMode

Что-ж, часто на форуме и за его пределами слышу о том, что люди хотят иметь !adminmode в SAM админке (как в bAdmin), но не знают как его реализовать.

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

Идем по пути \addons\sam-148\lua\sam\modules\util.lua и открываем луашку

закидываем туда данный код

local rpadminmode = { // Кто может использовать !adminmode в РП профессии

	['superadmin'] = true,
	['НОВЫЙ_РАНГ'] = true,
	['НОВЫЙ_РАНГ'] = true,
}

do

	command.new("adminmode")

		:SetPermission("adminmode", "admin")

		:Help("adminmode_help")

		:OnExecute(function(ply)

			if IsValid(ply) && ply:IsPlayer() && ply:GetNWString('adminmode') == nil || ply:GetNWString('adminmode') ~= true then

				if not rpadminmode[ply:GetUserGroup()] then
					ply:changeTeam(TEAM_ADMIN, true)
				end
					ply:SetNWString('adminmode', true)

					sam.player.send_message(nil, "adminmode_on", {
						A = ply
					})

			else

				if not rpadminmode[ply:GetUserGroup()] then
					ply:changeTeam(TEAM_CITIZEN, true)
				end
					ply:SetNWString('adminmode', false)
					ply:SetMoveType(ply:GetMoveType() == MOVETYPE_NOCLIP && MOVETYPE_WALK || MOVETYPE_WALK)

					sam.player.send_message(nil, "adminmode_off", {
						A = ply
					})

			end
		end)
	:End()

	sam.permissions.add("can_adminmode", nil, "admin")

	hook.Add("PlayerAuthed", "SAM.AdminModeFix", function(ply)
			ply:SetNWString('adminmode', false)
	end)

	hook.Add("OnPlayerChangedTeam","SAM.AdminModeFixV2", function(ply, oldTeam, newTeam)
		if CLIENT then return end
		if rpadminmode[ply:GetUserGroup()] then return end
		if newTeam == TEAM_ADMIN then 
			ply:SetNWString('adminmode', true)
			sam.player.send_message(nil, "adminmode_on", {
				A = ply
			})
		end
		if oldTeam == TEAM_ADMIN then 
			ply:SetNWString('adminmode', false)
			ply:SetMoveType(ply:GetMoveType() == MOVETYPE_NOCLIP && MOVETYPE_WALK || MOVETYPE_WALK)
			sam.player.send_message(nil, "adminmode_off", {
				A = ply
			})
		end
	end)

end

В этой же луашке ищем command.new(“noclip”) и заменяем её на:

local NextUse = 0
local NextUseV = 0
do
	command.new("noclip")
		:SetPermission("noclip", "admin")

		:Help("noclip_help")

		:OnExecute(function(ply)

			if IsValid(ply) && ply:IsPlayer() && ply:GetNWString('adminmode') == true || ply:GetNWString('adminmode') ~= false then
			ply:SetMoveType(ply:GetMoveType() == MOVETYPE_WALK && MOVETYPE_NOCLIP || MOVETYPE_WALK)
			sam.player.send_message(nil, "noclip", {
				A = ply
			})
			else
			if CurTime() < NextUseV then return end
			ply:ChatPrint('Доступно в !adminmode')
			NextUseV = CurTime() + 1
			end
		end)
	:End()

	sam.permissions.add("can_noclip", nil, "admin")

	hook.Add("PlayerNoClip", "SAM.CanNoClip", function(ply)
		if ply:HasPermission("can_noclip") && IsValid(ply) && ply:IsPlayer() && ply:GetNWString('adminmode') == true || ply:GetNWString('adminmode') ~= false then
			return true
		end
		if CurTime() < NextUse then return end
		ply:ChatPrint('Доступно в !adminmode')
		NextUse = CurTime() + 1
	end)
end

В этой же луашке ищем sam.hook_first(“PhysgunPickup”, “SAM.CanPhysgunPlayer”, function(ply, target) и заменяем на

	sam.hook_first("PhysgunPickup", "SAM.CanPhysgunPlayer", function(ply, target)
		if sam.type(target) == "Player" and ply:HasPermission("can_physgun_players") and ply:CanTarget(target) && IsValid(ply) && ply:IsPlayer() && ply:GetNWString('adminmode') == true || ply:GetNWString('adminmode') ~= false then
			freeze_player(target)
			return true
		end
	end)

Теперь идем в \addons\sam-148\lua\sam_languages и открываем свой язык
Вставляем туда

adminmode_on = "{A} вошел в режим администратора.",
adminmode_off = "{A} вышел из режима администратора.",
adminmode_help = "Активирует режим администратора.",

АдминМод готов. Те, кто не указан в local rpadminmode = {} при написании команды !adminmode будут перекидываться за профессию Администратор.
Если же просто взять Администратора - то админмод будет включен, а если поменять профессию на любую другую - админмод будет выключен.


Два раза пишет что доступно в adminmode! Как пофиксить?
А также когда беру админ профу, то пишет что нужно зайти в админ мод, также 2 раза! Как фиксить?

  1. Убедись что профа админа называется TEAM_ADMIN, если нет, то замени в скрипте на своё название
  2. Хз почему дважды пишет, задержку я поставил. Можешь вместо

использовать

DarkRP.notify(ply, 1, 3, “Доступно в !adminmode”)

TEAM_ADMIN = DarkRP.createJob(“Администратор”, {
color = Color(255, 0, 149),
model = “models/custom_models/skeleton_tophat.mdl”,
description = [[
Админ и точка.
]],
weapons = {“admin_stick”},
command = “admin”,
max = 0,
salary = 0,
admin = 1,
vote = false,
hasLicense = false,
category = “Администрация”,
canDemote = false,
customCheck = function(ply)
return table.HasValue({“superadmin”, “admin”}, ply:GetUserGroup())
end,
CustomCheckFailMsg = “Вы не являетесь Администратором!”,
})

Но все равно не работет

в SAM админке самой настрой ранги и выдай доступ can_adminmode

у меня крашит сервер и выдаёт ошибку
image

Значит либо запятую пропустил где-то, либо хз
это именно в sh_lang (в языках) проблема, ищи ошибку там

Если честно то вообще не понимаю какое это имеет значение и какая тут может быть ошибка
image
Это файл sh_lang.lua

Файл где у тебя язык настраивается скинь


Вот, english.lua
Сделал все по инструкции

Молодец
image
запятая где на 280 строчке?

Исправил, ошибку не выдаёт но при привелегии “admin” не запрещает noclip в РП профе, пишет два раза в чат фразу “Доступно в !adminmode” но при этом ноклип включает и при прописывании команды !adminmode вбивает в чат два раза строку


С привилегией “superadmin” просто прописывает команду “Доступно в !adminmode” каждый раз при ноклипе

  1. убедись, что все сделал по инструкции
  2. убедись, что у тебя отключен FAdmin (скорее всего у тебя он включен и по факту на сервере у тебя 2 админ системы)

[adminmode] addons/adminmode/lua/sam/sh_lang.lua:169: attempt to index upvalue ‘Language’ (a nil value)

  1. get - addons/adminmode/lua/sam/sh_lang.lua:169
  2. Help - addons/adminmode/lua/sam/command/sh_command.lua:158
    3. func - addons/adminmode/lua/sam/modules/darkrp.lua:20
    4. unknown - addons/adminmode/lua/includes/modules/hook.lua:241

Боже, ну выше почитай
У человека такая же проблема была
Запятую поставь нужную

зображення
Два раза пишет!

Легче из самой badmin вырвать :innocent:

Хелп
[sam] addons/sam/lua/sam/modules/util.lua:207: attempt to call field ‘notify’ (a nil value)

  1. v - addons/sam/lua/sam/modules/util.lua:207
  2. unknown - addons/plib_v2/lua/plib/libraries/hook.lua:25
    После добавления этой строки : DarkRP.notify(ply, 1, 3, “Доступно в !adminmode”)

куда именно ты ее добавляешь? И еще - поставь кавычки свои, ибо когда ты копируешь сообщение с GMD, то кавычки меняются на другие.
“пример кавычек 1”
" пример кавычек 2 "

local NextUse = 0
local NextUseV = 0
do
command.new(“noclip”)
:SetPermission(“noclip”, “admin”)

	:Help("noclip_help")

	:OnExecute(function(ply)

		if IsValid(ply) && ply:IsPlayer() && ply:GetNWString('adminmode') == true || ply:GetNWString('adminmode') ~= false then
		ply:SetMoveType(ply:GetMoveType() == MOVETYPE_WALK && MOVETYPE_NOCLIP || MOVETYPE_WALK)
		sam.player.send_message(nil, "noclip", {
			A = ply
		})
		else
		if CurTime() < NextUseV then return end
		DarkRP.notify(ply, 1, 3, "Доступно в !adminmode")
		NextUseV = CurTime() + 1
		end
	end)
:End()

sam.permissions.add("can_noclip", nil, "admin")

hook.Add("PlayerNoClip", "SAM.CanNoClip", function(ply)
	if ply:HasPermission("can_noclip") && IsValid(ply) && ply:IsPlayer() && ply:GetNWString('adminmode') == true || ply:GetNWString('adminmode') ~= false then
		return true
	end
	if CurTime() < NextUse then return end
		DarkRP.notify(ply, 1, 3, "Доступно в !adminmode")
	NextUse = CurTime() + 1
end)

end