The Ultimate Basic Admin Essentials Guide

For the migration to the new ban api I’ve spent a while trying to do so and this is what I’ve come up with so far and it does kinda work, any suggested improvements are welcome.

function Funcs.Ban(Args)
	local Player = Args[1]
	local playerPermissions = returnPermission(Player)
	local Victims = returnPlayers(Player,Args[3],Args[2])

	local Command = Args[2]
	if Command == "unban" then
		local UnbanConfig: UnbanConfigType = {
			UserIds = { playerService:GetUserIdFromNameAsync(Args[3]) },
			ApplyToUniverse = true
		}
		
		playerService:UnbanAsync(UnbanConfig)
	elseif Command == "ban" then
		if not Victims then
			remoteEvent:FireClient(Player,'Hint','Error',(Args[3] or 'nil')..' was not found.')
			return
		end
		for a,b in next,Victims do
			local victimPermissions = returnPermission(b)
			
			local banConfig: BanConfigType = {
				UserIds = {b.UserId},
				Duration = tonumber(Args[5]),
				DisplayReason = Args[4],
				PrivateReason = Args[4],
				ExcludeAltAccounts = false
			}
			
			if not sysTable.Permissions.Banned[tostring(b.UserId)] and victimPermissions < playerPermissions then
				sysTable.Permissions.Banned[tostring(b.UserId)] = b.Name
				pluginEvent:Fire("Ban Logs",{Player,"Banned "..b.Name})
				playerService:BanAsync(banConfig)			
			end
		end
	end
end
3 Likes

Very helpful BAE Guide, thank you.

1 Like

Hey owen! There is a way to bind the console bar into the top bar, needed the top bar module.

Just add into basic admin client

‘‘‘lua
local icon = (the code for the icon module)
icon.new()
:setLabel(“Silent command”)

:bindEvent(“deselected”, function()
:console()
end)
:oneClick()

‘‘‘

Wrote on my phone so might be wrong.
dm cuzangaming on discord if issues

1 Like

If you’re binding the console button a topbar icon using TopbarPlus, you should keep in mind that you won’t be able to leverage the functionality that you can with the BindableEvent solution proposed in my original post, because you can’t open the console from outside of the module itself. With my solution, you can.

This is not a bad solution though - if you’re using TopbarPlus and don’t care about accessing the console outside the module, the following code will do it for you:

-- At the bottom of the Basic Admin Client LocalScript
local Icon = require(replicatedStorage.Packages.Icon)

local myIcon = Icon.new()
myIcon:setLabel("Command Bar")

myIcon:bindEvent("selected", function()
    myIcon:deselect()
    Console()
end)
1 Like

Hello everybody. I am glad to find this active. Unfortunately, I was late in finding this guide and never knew what I could do with it. Furthermore, the module script has been locked and I did not have it saved in my inventory. This no longer works.

Does anyone have a copy of the module they could share? Does anybody know what happened?

Thank you.

It’s in the toolbox if you click your inv, then click models then packages it should be there. I would show a video but roblox studio is down. Major Outage Affecting Several Components: Studio, Groups, Settings, etc

1 Like

Thank you! Like I said, I did not have the module in my inventory. I was able to find a modified version on the forum though! Thanks.

Hey there! Could you send me the link to the module you found?

Module Loading Issue

There is an issue that has appeared in the past few days which is due to the main module being setup as a Package and not as an actual model which is now no longer able to be distributed on the marketplace. It means people can’t load it into their game since the model is privated.

Statement from the creator of Basic Admin Essentials:

“in 2020 i made basic admins main module into a package linked model and roblox just made it so that you can’t have that type of asset as publicly available…it looks like i’m gonna have to migrate the asset id for the main module to a new asset id”

Since if you don’t own the module you can’t import it now, this is a severe problem for people relying on the asset ID from the module and it has caused the admin to break in a lot of games. I’ve uploaded the MainModule as a real model that you can take for free from the creator marketplace for now, linked below.

To put this in your game (and fix your admin), do one of the following:

  1. Take the model above and import it into your game. Drag it under the original Basic Admin script and change the Loader ID section in that Basic Admin Essentials 2.0 loader script to script.MainModule.
  2. Change the number for Loader ID in your Basic Admin Essentials 2.0 script to the ID of the model above (89905715840090).

I assume the creator of Basic Admin Essentials will migrate the module to a new module as soon as possible and I will change the link/ID above to his official model when this is the case.

cc @Evxtra @bgonzalezseeya11

7 Likes

I have an issue,

local Plugin = function(...)
	local Data = {...}

	local remoteEvent = Data[1][1]
	local remoteFunction = Data[1][2]
	local returnPermissions = Data[1][3]
	local Commands = Data[1][4]
	local Prefix = Data[1][5]
	local actionPrefix = Data[1][6]
	local returnPlayers = Data[1][7]
	local cleanData = Data[1][8] 
	local pluginName = 'uniform'
	local pluginPrefix = actionPrefix
	local pluginLevel = 1
	local pluginUsage = "<Gender>" 
	local pluginDescription = ""
	local playerService = game:GetService('Players')
	local function pluginFunction(Args)
		local Player = Args[1]
		local gender = Args[3]		
		print(gender)
		if gender == 'male' or 'Male' then
			Player.Character.Shirt.ShirtTemplate = script.male.ShirtM.ShirtTemplate
			Player.Character.Pants.PantsTemplate = script.male.pantsm.PantsTemplate	
			print(Player.Name.. " has put on the male uniform.")
		end
		if  gender == "female" or "Female" then	
			Player.Character.Shirt.ShirtTemplate = script.female.shirtf.ShirtTemplate
			Player.Character.Pants.PantsTemplate = script.female.pantsf.PantsTemplate
			print(Player.Name.. " has put on the female uniform")
		end
	end


	local descToReturn
	if pluginUsage ~= "" then
		descToReturn = pluginPrefix..pluginName..' '..pluginUsage..'\n'..pluginDescription
	else
		descToReturn = pluginPrefix..pluginName..'\n'..pluginDescription
	end

	return pluginName,pluginFunction,pluginLevel,pluginPrefix,{pluginName,pluginUsage,pluginDescription}
end




return Plugin

image
it does both when i do !uniform male, and yes i checked, shirt and pants are different assets

1 Like

When doing if statements in Luau, you must specify each condition individually. What’s happening under the hood with your current script is that it’s checking if the gender is equal to “male”, but the second condition is a string (always a truthy value) so the check for male is always true.

There are two ways you can fix this:

  1. Convert the string into lowercase so that the input case doesn’t matter (recommended)
  2. Check both conditions using “or” (if gender == "male" or gender == "Male" then)

Here’s how you’d do option 1 which is best as the input case shouldn’t matter in this scenario.

local function pluginFunction(Args)
    local Player = Args[1]
    local gender = Args[3]

    if string.lower(gender) == "male" then
        Player.Character.Shirt.ShirtTemplate = script.male.ShirtM.ShirtTemplate
	    Player.Character.Pants.PantsTemplate = script.male.pantsm.PantsTemplate	
	    print(Player.Name.. " has put on the male uniform.")
    elseif string.lower(gender) == "female" then
        Player.Character.Shirt.ShirtTemplate = script.female.shirtf.ShirtTemplate
	    Player.Character.Pants.PantsTemplate = script.female.pantsf.PantsTemplate
	    print(Player.Name.. " has put on the female uniform")
    end
end
1 Like

Oh thanks! char limmit!!!111111

I believe there is a custom model made for sticky messages and it was public before, here’s the script:

--[[
	
	 ____                                   
	/\  _`\                    __           
	\ \ \L\ \     __      ____/\_\    ___   
	 \ \  _ <'  /'__`\   /',__\/\ \  /'___\ 
	  \ \ \L\ \/\ \L\.\_/\__, `\ \ \/\ \__/ 
	   \ \____/\ \__/.\_\/\____/\ \_\ \____\
	    \/___/  \/__/\/_/\/___/  \/_/\/____/
	                                        
	            
	Admin Essentials v2
	Plugin Documentation
	*coming soon^tm
	
	If you have any questions regarding Plugins, contact TheFurryFish.
	
--]]

local Plugin = function(...)
	local Data = {...}
	
	local ReplicatedStorage = game:GetService("ReplicatedStorage")
	local StickyEvent = ReplicatedStorage:WaitForChild("StickyMessage")
	local FetchSticky = ReplicatedStorage:WaitForChild("FetchSticky")
	
	local Sticky = false
	local StickyMessage = ""
	local StickyPlayer
	
	-- Included Functions and Info --
	local remoteEvent = Data[1][1]
	local remoteFunction = Data[1][2]
	local returnPermissions = Data[1][3]
	local Commands = Data[1][4]
	local Prefix = Data[1][5]
	local actionPrefix = Data[1][6]
	local returnPlayers = Data[1][7]
	local cleanData = Data[1][8] -- cleanData(Sender,Receiver,Data)
	-- Practical example, for a gui specifically for a player, from another player
	-- cleanData(Sender,Receiver,"hi") -- You need receiver because it's being sent to everyone
	-- Or for a broadcast (something everyone sees, from one person, to nobody specific)
	-- cleanData(Sender,nil,"hi") -- Receiver is nil because it is a broadcast
	
	-- Plugin Configuration --
	local pluginName = 'n'
	local pluginPrefix = Prefix
	local pluginLevel = 2
	local pluginUsage = "<Message?>" -- leave blank if the command has no arguments
	local pluginDescription = "Allow for a sticky hint to be placed at the top of the screen"
	
	-- Example Plugin Function --
	local function pluginFunction(Args) -- keep the name of the function as "pluginFunction"
		local Player = Args[1]
		
		if Args[3] then
			local combinedMessage

			for a,b in pairs(Args) do
				if a >= 3 then
					if not combinedMessage then
						combinedMessage = b
					else
						combinedMessage = combinedMessage..' '..b
					end
				end
			end
		
			
			for a,b in next, game:GetService("Players"):GetPlayers() do
				local Cleaned,newData = cleanData(combinedMessage,Player,b)
				local cleansedData = ""
				local cannotShow = false
				
				if Cleaned and newData then
					cleansedData = newData
				elseif not Cleaned then
					if newData and newData:lower():match('cannot communicate with') then
						cannotShow = true
						StickyEvent:FireClient(b, true, Player, 'Your chat settings prevent you from seeing messages.')
					else
						if not newData then
							
							remoteEvent:FireClient(Player,'Hint', "Warning",'Your chat settings prevent you from sending messages.')
							return
						else
							cleansedData = newData
						end
					end
				end
				
				if not cannotShow then
					StickyEvent:FireAllClients(true, Player, cleansedData)
					Sticky = true
					StickyMessage = combinedMessage
					StickyPlayer = Player
				end
			end
		else
			StickyEvent:FireAllClients(false, Player, "")
			Sticky = false
			StickyMessage = ""
			StickyPlayer = nil
		end
	end
	
	FetchSticky.OnServerInvoke = function(Player)
		local Cleaned, newData = cleanData(StickyMessage, Player, nil)
		
		local cleansedData = ""
		local cannotShow = false

		if Cleaned and newData then
			cleansedData = newData
		elseif not Cleaned then
			if newData and newData:lower():match('cannot communicate with') then
				cannotShow = true
				StickyEvent:FireClient(Player, true, Player, 'Your chat settings prevent you from seeing messages.')
			else
				cannotShow = true
			end
		end

		if not cannotShow then
			return {
				Active = Sticky,
				Message = cleansedData,
				Player = StickyPlayer
			}
		end
	end
	
	-- Return Everything to the MainModule --
	local descToReturn
	if pluginUsage ~= "" then
		descToReturn = pluginPrefix..pluginName..' '..pluginUsage..'\n'..pluginDescription
	else
		descToReturn = pluginPrefix..pluginName..'\n'..pluginDescription
	end
	
	return pluginName,pluginFunction,pluginLevel,pluginPrefix,{pluginName,pluginUsage,pluginDescription}
end

return Plugin

just make sure to create a remote function and remote event inside of replicatedstorage, rf naming: FetchSticky and re naming: StickyMessage

i pretty much recommend updating the script if necessary since it is kinda old

Furthermore, the developer can implement the module without any package linked to it (or atleast works for me) by using the command in the output:

game:GetService("InsertService"):LoadAsset(563619835).Parent = game.ServerStorage -- user can parent this anywhere
1 Like

I think thats a free model. char limit

it was indeed a free model, but i cannot find it anywhere in the toolbox

What happened to the main module asset?

It was uploaded as a package which can no longer be distributed on the marketplace. You can fix this by referring to my post below.

The Ultimate Basic Admin Essentials Guide - #45 by LegendOJ1

I know this is out of your control,
but whenever you modify the bae main module, and upload it to roblox you get a warning because it’s “misuse of roblox’s sytems” “sexual content” “spam” and more.

Are there any solutions to logs and chat logs not fully showing for mobile players after enabling copy and pasting?

This is a slightly more complicated thing to achieve so I’ve made a video explaining how you might go about achieving this type of functionality. By no means is this the best solution and it still needs improvement if you want to emulate the PC behavior exactly, but it should be at least a good starting point for restoring the functionality on mobile.

2 Likes