2026-04-14 17:41:39 +02:00

1759 lines
58 KiB
Lua

------------------------------------
------------------------------------
------------------------------------
---- DONT TOUCH ANY OF THIS IF YOU DON'T KNOW WHAT YOU ARE DOING
---- THESE ARE **NOT** CONFIG VALUES, USE THE CONVARS IF YOU WANT TO CHANGE SOMETHING
----
----
---- If you are a developer and want to change something, consider writing a plugin instead:
---- https://easyadmin.readthedocs.io/en/latest/plugins/
----
------------------------------------
------------------------------------
isAdmin = false
showLicenses = false
RedM = false
settings = {
button = "none",
forceShowGUIButtons = false,
}
-- generate "slap" table once
local SlapAmount = {}
for i=1,20 do
table.insert(SlapAmount,i)
end
function handleOrientation(orientation)
if orientation == "right" then
return 1300-menuWidth
elseif orientation == "middle" then
return 730
elseif orientation == "left" then
return 0
end
end
playlist = nil
RegisterCommand('easyadmin', function(source, args)
CreateThread(function()
if not isAdmin == true then
TriggerServerEvent("EasyAdmin:amiadmin")
local waitTime = 0
repeat
Wait(10)
waitTime=waitTime+1
until (isAdmin or waitTime==1000)
if not isAdmin then
return
end
end
if not mainMenu or not mainMenu:Visible() then
if ((RedM and settings.infinity) or not RedM) and isAdmin then
playerlist = nil
if DoesPlayerHavePermissionForCategory(-1, "player") then
TriggerServerEvent("EasyAdmin:GetInfinityPlayerList")
repeat
Wait(10)
until playerlist
else
playerlist = {}
end
end
if strings and isAdmin then
banLength = {}
if permissions["player.ban.permanent"] then
table.insert(banLength, {label = GetLocalisedText("permanent"), time = 10444633200})
end
if permissions["player.ban.temporary"] then
table.insert(banLength, {label = "6 "..GetLocalisedText("hours"), time = 21600})
table.insert(banLength, {label = "12 "..GetLocalisedText("hours"), time = 43200})
table.insert(banLength, {label = "1 "..GetLocalisedText("day"), time = 86400})
table.insert(banLength, {label = "3 "..GetLocalisedText("days"), time = 259200})
table.insert(banLength, {label = "1 "..GetLocalisedText("week"), time = 518400})
table.insert(banLength, {label = "2 "..GetLocalisedText("weeks"), time = 1123200})
table.insert(banLength, {label = "1 "..GetLocalisedText("month"), time = 2678400})
table.insert(banLength, {label = "1 "..GetLocalisedText("year"), time = 31536000})
table.insert(banLength, {label = GetLocalisedText("customtime"), time = -1})
end
GenerateMenu()
if (args[1]) then
local id = tonumber(args[1])
if (reportMenus[id]) then
reportMenus[id]:Visible(true)
return
elseif playerMenus[args[1]] then
local menu = playerMenus[args[1]]
menu.generate(menu.menu)
menu.menu:Visible(true)
return
end
end
SendNUIMessage({action= "speak", text="EasyAdmin"})
mainMenu:Visible(true)
else
TriggerServerEvent("EasyAdmin:amiadmin")
end
else
mainMenu:Visible(false)
_menuPool:Remove()
ExecutePluginsFunction("menuRemoved")
collectgarbage()
end
end)
end, false)
RegisterCommand('ea', function(source,args)
ExecuteCommand('easyadmin '..table.concat(args, " "))
end)
Citizen.CreateThread(function()
if CompendiumHorseObserved then -- https://www.youtube.com/watch?v=r7qovpFAGrQ
RedM = true
settings.button = "PhotoModePc"
end
if not RedM then
RegisterKeyMapping('easyadmin', 'Open EasyAdmin', 'keyboard', "")
end
repeat
Wait(100)
until NativeUI
TriggerServerEvent("EasyAdmin:amiadmin")
TriggerServerEvent("EasyAdmin:requestBanlist")
TriggerServerEvent("EasyAdmin:requestCachedPlayers")
if not GetResourceKvpString("ea_menuorientation") then
SetResourceKvp("ea_menuorientation", "middle")
SetResourceKvpInt("ea_menuwidth", 0)
menuWidth = 0
menuOrientation = handleOrientation("middle")
else
menuWidth = GetResourceKvpInt("ea_menuwidth")
menuOrientation = handleOrientation(GetResourceKvpString("ea_menuorientation"))
end
if not GetResourceKvpInt("ea_tts") then
SetResourceKvpInt("ea_tts", 0)
SetResourceKvpInt("ea_ttsspeed", 4)
else
if GetResourceKvpInt("ea_ttsspeed") == 0 then
SetResourceKvpInt("ea_ttsspeed", 4)
end
if GetResourceKvpInt("ea_tts") == 1 then
SendNUIMessage({
action = "toggle_speak",
enabled = true,
rate = GetResourceKvpInt("ea_ttsspeed") or 4
})
end
end
local subtitle = "~b~Admin Menu"
if settings.updateAvailable then
subtitle = "~g~UPDATE "..settings.updateAvailable.." AVAILABLE!"
elseif settings.alternativeTitle then
-- if you remove this code then you're a killjoy, can't we have nice things? just once? it's not like this changes the whole admin menu or how it behaves, its a single subtitle.
subtitle = settings.alternativeTitle
end
while true do
if _menuPool then
if not _menuPool:IsAnyMenuOpen() then
_menuPool:Remove()
ExecutePluginsFunction("menuRemoved")
_menuPool = nil
collectgarbage()
elseif _menuPool:IsAnyMenuOpen() then
_menuPool:ProcessMenus()
end
end
if RedM then -- since RedM doesn't have the new key bindings yet, watch for button press actively.
if (RedM and IsControlJustReleased(0, Controls[settings.button]) ) then
ExecuteCommand("easyadmin")
end
end
Citizen.Wait(1)
end
end)
IsSpectating = false
function DrawPlayerInfo(target)
drawTarget = target
drawServerId = GetPlayerServerId(target)
drawInfo = true
IsSpectating = true
DrawPlayerInfoLoop()
end
function StopDrawPlayerInfo()
drawInfo = false
drawTarget = 0
drawServerId = 0
IsSpectating = false
end
local banlistPage = 1
playerMenus = {}
cachedMenus = {}
reportMenus = {}
local easterChance = math.random(0,101)
local overrideEgg, currentEgg
-- note: we dont support dui banner and dui logo at the same time yet.
local eastereggs = {
pipes = {
duibanner = "http://legacy.furfag.de/eggs/pipes",
banner = false,
logo = "dependencies/images/banner-logo.png",
},
nom = {
duilogo = "http://legacy.furfag.de/eggs/nom",
banner = "dependencies/images/banner-gradient.png",
logo = false,
},
pride = {
banner = "dependencies/images/banner-gradient.png",
logo = "dependencies/images/pride.png",
},
ukraine = {
banner = "dependencies/images/banner-gradient.png",
logo = "dependencies/images/ukraine.png"
},
EOA = {
banner = "dependencies/images/banner-eoa.png",
logo = "dependencies/images/logo-eoa.png"
},
HardAdmin = {
banner = "dependencies/images/banner-hardadmin.png",
logo = "dependencies/images/logo-hardadmin.png"
}
}
function generateTextures()
if not RedM and not txd or (overrideEgg ~= currentEgg) then
if dui then
DestroyDui(dui)
dui = nil
end
txd = CreateRuntimeTxd("easyadmin")
CreateRuntimeTextureFromImage(txd, 'badge_dev', 'dependencies/images/pl_badge_dev.png')
CreateRuntimeTextureFromImage(txd, 'badge_contrib', 'dependencies/images/pl_badge_contr.png')
if ((overrideEgg == nil) and easterChance == 100) or (overrideEgg or overrideEgg == false) then
local chance = overrideEgg
if ((overrideEgg == nil) and easterChance == 100) then
-- dirty function to select random easter egg
local tbl = {}
for k,v in pairs(eastereggs) do
table.insert(tbl, k)
end
chance = tbl[math.random( #tbl )]
end
local egg = eastereggs[chance]
if egg then
if egg.duibanner then
dui = CreateDui(egg.duibanner, 512,128)
local duihandle = GetDuiHandle(dui)
CreateRuntimeTextureFromDuiHandle(txd, 'banner-gradient', duihandle)
Wait(800)
elseif egg.duilogo then
dui = CreateDui(egg.duilogo, 512,128)
local duihandle = GetDuiHandle(dui)
CreateRuntimeTextureFromDuiHandle(txd, 'logo', duihandle)
Wait(800)
end
if egg.logo then
CreateRuntimeTextureFromImage(txd, 'logo', egg.logo)
end
if egg.banner then
CreateRuntimeTextureFromImage(txd, 'banner-gradient', egg.banner)
end
currentEgg = chance
else
CreateRuntimeTextureFromImage(txd, 'logo', 'dependencies/images/banner-logo.png')
CreateRuntimeTextureFromImage(txd, 'banner-gradient', 'dependencies/images/banner-gradient.png')
currentEgg = false
end
else
if settings.alternativeLogo then
CreateRuntimeTextureFromImage(txd, 'logo', 'dependencies/images/'..settings.alternativeLogo..'.png')
else
CreateRuntimeTextureFromImage(txd, 'logo', 'dependencies/images/banner-logo.png')
end
if settings.alternativeBanner then
CreateRuntimeTextureFromImage(txd, 'banner-gradient', 'dependencies/images/'..settings.alternativeBanner..'.png')
else
CreateRuntimeTextureFromImage(txd, 'banner-gradient', 'dependencies/images/banner-gradient.png')
end
currentEgg=nil
end
end
end
function ExecutePluginsFunction(funcName, ...)
for i, plugin in pairs(plugins) do
if plugin.functions[funcName] then
PrintDebugMessage("Processing Plugin: "..plugin.name, 4)
local ran, errorMsg = pcall(plugin.functions[funcName], ...)
if not ran then
PrintDebugMessage("Error in plugin "..plugin.name..": \n"..errorMsg, 1)
end
end
end
end
function GenerateMenu() -- this is a big ass function
generateTextures()
TriggerServerEvent("EasyAdmin:requestCachedPlayers")
if _menuPool then
_menuPool:Remove()
ExecutePluginsFunction("menuRemoved")
collectgarbage()
end
_menuPool = NativeUI.CreatePool()
collectgarbage()
if not GetResourceKvpString("ea_menuorientation") then
SetResourceKvp("ea_menuorientation", "middle")
SetResourceKvpInt("ea_menuwidth", 0)
menuWidth = 0
menuOrientation = handleOrientation("middle")
else
menuWidth = GetResourceKvpInt("ea_menuwidth")
menuOrientation = handleOrientation(GetResourceKvpString("ea_menuorientation"))
end
maxRightTextWidth = math.floor((24+(menuWidth*0.12)))
local subtitle = "Admin Menu"
if settings.updateAvailable then
subtitle = "~g~UPDATE "..settings.updateAvailable.." AVAILABLE!" elseif settings.alternativeTitle then subtitle = settings.alternativeTitle
end
mainMenu = NativeUI.CreateMenu(RedM and "EasyAdmin" or "", subtitle, menuOrientation, 0, "easyadmin", "banner-gradient", "logo")
_menuPool:Add(mainMenu)
_menuPool:ControlDisablingEnabled(false)
_menuPool:MouseControlsEnabled(false)
if DoesPlayerHavePermissionForCategory(-1, "player") then
playermanagement = _menuPool:AddSubMenu(mainMenu, GetLocalisedText("playermanagement"),"",true, true)
playermanagement:SetMenuWidthOffset(menuWidth)
end
if DoesPlayerHavePermissionForCategory(-1, "server") or permissions["player.ban.view"] then
servermanagement = _menuPool:AddSubMenu(mainMenu, GetLocalisedText("servermanagement"),"",true, true)
servermanagement:SetMenuWidthOffset(menuWidth)
end
settingsMenu = _menuPool:AddSubMenu(mainMenu, GetLocalisedText("settings"),"",true, true)
mainMenu:SetMenuWidthOffset(menuWidth)
settingsMenu:SetMenuWidthOffset(menuWidth)
-- util stuff
players = {}
local localplayers = {}
if (RedM and settings.infinity) or not RedM then
local localplayers = playerlist
local temp = {}
--table.sort(localplayers)
for i,thePlayer in pairs(localplayers) do
table.insert(temp, thePlayer.id)
end
table.sort(temp)
for i, thePlayerId in pairs(temp) do
for _, thePlayer in pairs(localplayers) do
if thePlayerId == thePlayer.id then
players[i] = thePlayer
end
end
end
temp=nil
else
for i = 0, 128 do
if NetworkIsPlayerActive( i ) then
table.insert( localplayers, GetPlayerServerId(i) )
end
end
table.sort(localplayers)
for i,thePlayer in ipairs(localplayers) do
table.insert(players,GetPlayerFromServerId(thePlayer))
end
end
ExecutePluginsFunction("mainMenu")
if DoesPlayerHavePermissionForCategory(-1, "player") then
local userSearch = NativeUI.CreateItem(GetLocalisedText("searchuser"), GetLocalisedText("searchuserguide"))
playermanagement:AddItem(userSearch)
userSearch.Activated = function(ParentMenu, SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 60)
if result and result ~= "" then
local found = false
local foundbyid = playerMenus[result] or false
local temp = {}
if foundbyid then
found = true
table.insert(temp, {id = foundbyid.id, name = foundbyid.name, menu = foundbyid.menu})
end
for k,v in pairs(playerMenus) do
if string.find(string.lower(v.name), string.lower(result)) then
found = true
table.insert(temp, {id = v.id, name = v.name, menu = v.menu})
end
end
for k,v in pairs(cachedMenus) do
if string.find(string.lower(v.name), string.lower(result)) then
found = true
table.insert(temp, {id = v.id, name = v.name, menu = v.menu, cached = true})
end
end
if found and (#temp > 1) then
local searchsubtitle = "Found "..tostring(#temp).." results!"
ttsSpeechText(searchsubtitle)
local resultMenu = NativeUI.CreateMenu("Search Results", searchsubtitle, menuOrientation, 0, "easyadmin", "banner-gradient", "logo")
_menuPool:Add(resultMenu)
_menuPool:ControlDisablingEnabled(false)
_menuPool:MouseControlsEnabled(false)
for i,thePlayer in ipairs(temp) do
local title = "["..thePlayer.id.."] "..thePlayer.name, ""
if thePlayer.cached then
title = thePlayer.name
end
local thisItem = NativeUI.CreateItem(title)
resultMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu, SelectedItem)
_menuPool:CloseAllMenus()
Citizen.Wait(300)
local thisMenu = thePlayer.menu
playerMenus[tostring(thePlayer.id)].generate(thisMenu)
thisMenu:Visible(true)
end
end
_menuPool:CloseAllMenus()
Citizen.Wait(300)
resultMenu:Visible(true)
return
end
if found and (#temp == 1) then
local thisMenu = temp[1].menu
_menuPool:CloseAllMenus()
Citizen.Wait(300)
ttsSpeechText("Found User.")
playerMenus[tostring(temp[1].id)].generate(thisMenu)
thisMenu:Visible(true)
return
end
TriggerEvent("EasyAdmin:showNotification", "~r~No results found!")
end
end
playerMenus = {}
cachedMenus = {}
reportMenus = {}
for i,thePlayer in pairs(players) do
if RedM and not settings.infinity then
thePlayer = {
id = GetPlayerServerId(thePlayer),
name = GetPlayerName(thePlayer)
}
end
local thisPlayerMenu = _menuPool:AddSubMenu(playermanagement,"["..thePlayer.id.."] "..thePlayer.name,"",true)
if not RedM and thePlayer.developer then
thisPlayerMenu.ParentItem:SetRightBadge(23)
elseif not RedM and thePlayer.contributor then
thisPlayerMenu.ParentItem:SetRightBadge(24)
end
playerMenus[tostring(thePlayer.id)] = {menu = thisPlayerMenu, name = thePlayer.name, id = thePlayer.id }
thisPlayerMenu:SetMenuWidthOffset(menuWidth)
playerMenus[tostring(thePlayer.id)].generate = function(menu)
thisPlayer = menu
if not playerMenus[tostring(thePlayer.id)].generated then
if permissions["player.kick"] then
local thisKickMenu = _menuPool:AddSubMenu(thisPlayer,GetLocalisedText("kickplayer"),"",true)
thisKickMenu:SetMenuWidthOffset(menuWidth)
local thisItem = NativeUI.CreateItem(GetLocalisedText("reason"),GetLocalisedText("kickreasonguide"))
thisKickMenu:AddItem(thisItem)
KickReason = GetLocalisedText("noreason")
thisItem:RightLabel(KickReason)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 128)
local formattedResult = formatRightString(formatShortcuts(result))
if result and result ~= "" then
KickReason = result
thisItem:RightLabel(formattedResult)
else
KickReason = GetLocalisedText("noreason")
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("confirmkick"),GetLocalisedText("confirmkickguide"))
thisKickMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if KickReason == "" then
KickReason = GetLocalisedText("noreason")
end
TriggerServerEvent("EasyAdmin:kickPlayer", thePlayer.id, KickReason)
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
playermanagement:Visible(true)
end
end
if permissions["player.ban.temporary"] or permissions["player.ban.permanent"] then
local thisBanMenu = _menuPool:AddSubMenu(thisPlayer,GetLocalisedText("banplayer"),"",true)
thisBanMenu:SetMenuWidthOffset(menuWidth)
local thisItem = NativeUI.CreateItem(GetLocalisedText("reason"),GetLocalisedText("banreasonguide"))
thisBanMenu:AddItem(thisItem)
BanReason = GetLocalisedText("noreason")
thisItem:RightLabel(BanReason)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 128)
local formattedResult = formatRightString(formatShortcuts(result))
if result and result ~= "" then
BanReason = result
thisItem:RightLabel(formattedResult)
else
BanReason = GetLocalisedText("noreason")
end
end
local bt = {}
for i,a in ipairs(banLength) do
table.insert(bt, a.label)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("banlength"),bt, 1,GetLocalisedText("banlengthguide") )
thisBanMenu:AddItem(thisItem)
local BanTime = banLength[1].time
thisItem.OnListChanged = function(sender,item,index)
BanTime = banLength[index].time
end
thisItem.OnListSelected = function (sender,item,index)
if banLength[index].time == -1 then
local thisBanTimeMenu = _menuPool:AddSubMenu(thisBanMenu, GetLocalisedText("banlength"), "",true)
thisBanTimeMenu:SetMenuWidthOffset(menuWidth)
local hours, days, weeks, months = 0, 0, 0, 0
-- generate our ban lengths
local hourArray = {}
for i=0, 24 do
table.insert(hourArray,i)
end
local dayArray = {}
for i=0, 31 do
table.insert(dayArray,i)
end
local weekArray = {}
for i=0, 4 do
table.insert(weekArray,i)
end
local monthArray = {}
for i=0, 12 do
table.insert(monthArray,i)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("hours"),hourArray, 1,"")
thisBanTimeMenu:AddItem(thisItem)
thisItem.OnListChanged = function(sender,item,index)
hours = item:IndexToItem(index)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("days"),dayArray, 1,"")
thisBanTimeMenu:AddItem(thisItem)
thisItem.OnListChanged = function(sender,item,index)
days = item:IndexToItem(index)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("weeks"),weekArray, 1,"")
thisBanTimeMenu:AddItem(thisItem)
thisItem.OnListChanged = function(sender,item,index)
weeks = item:IndexToItem(index)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("months"),monthArray, 1,"")
thisBanTimeMenu:AddItem(thisItem)
thisItem.OnListChanged = function(sender,item,index)
months = item:IndexToItem(index)
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("confirm"),"")
thisBanTimeMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
hours=hours*3600
days=days*86400
weeks=weeks*518400
months=months*2678400
BanTime = hours+days+weeks+months
thisBanMenu:Visible(true)
end
thisBanTimeMenu:RefreshIndexRecursively()
-- evil NativeUI hack to force it to select and open our submenu
thisBanMenu:CurrentSelection(#thisBanMenu.Items-1)
for i, item in pairs(thisBanMenu.Items) do
item:Selected(false)
end
thisBanMenu:SelectItem()
-- woosh
thisBanMenu:RemoveItemAt(#thisBanMenu.Items)
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("confirmban"),GetLocalisedText("confirmbanguide"))
thisBanMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if BanTime == -1 then
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("nocustombantime"))
return
end
if BanReason == "" then
BanReason = GetLocalisedText("noreason")
end
TriggerServerEvent("EasyAdmin:banPlayer", thePlayer.id, BanReason, BanTime, thePlayer.name )
BanTime = 1
BanReason = ""
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
playermanagement:Visible(true)
end
end
if permissions["player.mute"] then
local thisItem = NativeUI.CreateCheckboxItem(GetLocalisedText("mute"), MutedPlayers[thePlayer.id], GetLocalisedText("muteguide"))
thisPlayer:AddItem(thisItem)
thisItem.CheckboxEvent = function(sender, item, checked_)
TriggerServerEvent("EasyAdmin:mutePlayer", thePlayer.id)
end
end
if permissions["player.spectate"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("spectateplayer"), "")
thisPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:requestSpectate",thePlayer.id)
end
end
if permissions["player.teleport.single"] then
local sl = {GetLocalisedText("teleporttoplayer"), GetLocalisedText("teleportplayertome"), GetLocalisedText("teleportmeback"), GetLocalisedText("teleportplayerback"), GetLocalisedText("teleportintoclosestvehicle")}
local thisItem = NativeUI.CreateListItem(GetLocalisedText("teleportplayer"), sl, 1, "")
thisPlayer:AddItem(thisItem)
thisItem.OnListSelected = function(sender, item, index)
if item == thisItem then
i = item:IndexToItem(index)
local playerPed = PlayerPedId()
if i == GetLocalisedText("teleporttoplayer") then
if settings.infinity then
TriggerServerEvent('EasyAdmin:TeleportAdminToPlayer', thePlayer.id)
else
lastLocation = GetEntityCoords(playerPed)
local x,y,z = table.unpack(GetEntityCoords(GetPlayerPed(GetPlayerFromServerId(thePlayer.id)),true))
local heading = GetEntityHeading(GetPlayerPed(player))
SetEntityCoords(playerPed, x,y,z,0,0,heading, false)
end
elseif i == GetLocalisedText("teleportplayertome") then
local coords = GetEntityCoords(playerPed,true)
TriggerServerEvent("EasyAdmin:TeleportPlayerToCoords", thePlayer.id, coords)
elseif i == GetLocalisedText("teleportmeback") and lastLocation then
local heading = GetEntityHeading(playerPed)
SetEntityCoords(playerPed, lastLocation,0,0,heading, false)
lastLocation = nil
elseif i == GetLocalisedText("teleportplayerback") then
TriggerServerEvent("EasyAdmin:TeleportPlayerBack", thePlayer.id)
elseif i == GetLocalisedText("teleportintoclosestvehicle") then
local coords = GetEntityCoords(playerPed,true)
local vehicles = GetGamePool("CVehicle")
local closestDistance = -1
local closestVehicle = -1
for _,vehicle in pairs(vehicles) do
local vehcoords = GetEntityCoords(vehicle,true)
local distance = #(coords - vehcoords)
if closestDistance == -1 or closestDistance > distance then
closestDistance = distance
closestVehicle = vehicle
end
end
if closestVehicle ~= -1 then
for i=-1, GetVehicleMaxNumberOfPassengers(closestVehicle) do
if IsVehicleSeatFree(closestVehicle, i) then
SetPedIntoVehicle(playerPed, closestVehicle, i)
break
end
end
else
TriggerEvent("EasyAdmin:showNotification", "No Vehicles found nearby.")
end
end
end
end
end
if permissions["player.slap"] then
local thisItem = NativeUI.CreateSliderItem(GetLocalisedText("slapplayer"), SlapAmount, 20, false, false)
thisPlayer:AddItem(thisItem)
thisItem.OnSliderSelected = function(index)
TriggerServerEvent("EasyAdmin:SlapPlayer", thePlayer.id, index*10)
end
end
if permissions["player.freeze"] and not RedM then
local thisItem = NativeUI.CreateCheckboxItem(GetLocalisedText("setplayerfrozen"), FrozenPlayers[thePlayer.id])
thisPlayer:AddItem(thisItem)
thisItem.CheckboxEvent = function(sender, item, checked_)
TriggerServerEvent("EasyAdmin:FreezePlayer", thePlayer.id, checked_)
end
end
if permissions["player.screenshot"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("takescreenshot"),"")
thisPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:TakeScreenshot", thePlayer.id)
end
end
if permissions["player.warn"] then
local thisWarnMenu = _menuPool:AddSubMenu(thisPlayer,GetLocalisedText("warnplayer"),"",true)
thisWarnMenu:SetMenuWidthOffset(menuWidth)
local thisItem = NativeUI.CreateItem(GetLocalisedText("reason"),GetLocalisedText("warnreasonguide"))
thisWarnMenu:AddItem(thisItem)
WarnReason = GetLocalisedText("noreason")
thisItem:RightLabel(WarnReason)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 128)
local formattedResult = formatRightString(formatShortcuts(result))
if result and result ~= "" then
WarnReason = result
thisItem:RightLabel(formattedResult)
else
WarnReason = GetLocalisedText("noreason")
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("confirmwarn"),GetLocalisedText("confirmwarnguide"))
thisWarnMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if WarnReason == "" then
WarnReason = GetLocalisedText("noreason")
end
TriggerServerEvent("EasyAdmin:warnPlayer", thePlayer.id, WarnReason)
BanTime = 1
BanReason = ""
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
playermanagement:Visible(true)
end
end
if GetConvar("ea_routingBucketOptions", "false") == "true" and (permissions["player.bucket.join"] or permissions["player.bucket.force"]) then
local options = {}
if permissions["player.bucket.join"] then
table.insert(options, GetLocalisedText("joinplayerbucket"))
end
if permissions["player.bucket.force"] then
table.insert(options, GetLocalisedText("forceplayerbucket"))
end
local bucketItem = NativeUI.CreateListItem(GetLocalisedText("routingbucket"), options, 1, GetLocalisedText("bucketguide"))
thisPlayer:AddItem(bucketItem)
bucketItem.OnListSelected = function(sender, item, index)
if item == bucketItem then
i = item:IndexToItem(index)
if i == GetLocalisedText("joinplayerbucket") then
TriggerServerEvent("EasyAdmin:JoinPlayerRoutingBucket", thePlayer.id)
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("playerbucketjoined"))
elseif i == GetLocalisedText("forceplayerbucket") then
TriggerServerEvent("EasyAdmin:ForcePlayerRoutingBucket", thePlayer.id)
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("playerbucketforced"))
end
end
end
end
local copyDiscordItem = NativeUI.CreateItem(GetLocalisedText("copydiscord"), "")
thisPlayer:AddItem(copyDiscordItem)
copyDiscordItem.Activated = function(ParentMenu, SelectedItem)
if thePlayer.discord then
copyToClipboard(thePlayer.discord)
else
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("nodiscordpresent"))
end
end
ExecutePluginsFunction("playerMenu", thePlayer.id)
if GetResourceState("es_extended") == "started" and not ESX then
local thisItem = NativeUI.CreateItem("~y~[ESX]~s~ Options","You can buy the ESX Plugin from https://blumlaut.tebex.io to use this Feature.")
thisPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu, SelectedItem)
copyToClipboard("https://blumlaut.tebex.io/package/4455820")
end
end
if GetResourceState("qb-core") == "started" and not QBCore then
local thisItem = NativeUI.CreateItem("~b~[QBCore]~s~ Options","You can buy the QBCore Plugin from https://blumlaut.tebex.io to use this Feature.")
thisPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu, SelectedItem)
copyToClipboard("https://blumlaut.tebex.io/package/4842353")
end
end
_menuPool:ControlDisablingEnabled(false)
_menuPool:MouseControlsEnabled(false)
thisPlayer:RefreshIndexRecursively()
playerMenus[tostring(thePlayer.id)].generated = true
end
end
thisPlayerMenu.ParentItem.Activated = function(ParentMenu, SelectedItem)
thisPlayer = thisPlayerMenu
playerMenus[tostring(thePlayer.id)].generate(thisPlayer)
for i, menu in pairs(playerMenus) do
menu.menu.ParentMenu = playermanagement
end
end
end
playermanagement.ParentItem.Activated = function(ParentMenu, SelectedItem)
for i, menu in pairs(playerMenus) do
menu.menu.ParentMenu = playermanagement
end
end
if permissions["player.reports.view"] then
reportViewer = _menuPool:AddSubMenu(playermanagement, GetLocalisedText("reportviewer"),"",true)
local thisMenuWidth = menuWidth
if menuWidth < 150 then
thisMenuWidth = 150
else
thisMenuWidth = menuWidth
end
reportViewer:SetMenuWidthOffset(thisMenuWidth)
reportViewer.ParentItem:RightLabel(tostring(#reports).." "..GetLocalisedText("open"))
for i, report in pairs(reports) do
local reportColour = (report.type == 0 and "~y~" or "~r~")
if report.claimed then
reportColour = "~g~"
end
local thisMenu = _menuPool:AddSubMenu(reportViewer, reportColour.. "#"..report.id.." "..string.sub((report.reportedName or report.reporterName), 1, 12).."~w~", "", true)
thisMenu:SetMenuWidthOffset(thisMenuWidth)
thisMenu.ParentItem:RightLabel(formatRightString(report.reason, 32))
reportMenus[report.id] = thisMenu
if permissions["player.reports.claim"] then
local claimText = GetLocalisedText("claimreport")
local rightLabel = ""
if report.claimed then
claimText = GetLocalisedText("claimedby")
rightLabel = formatRightString(report.claimedName)
end
local thisItem = NativeUI.CreateItem(claimText, "")
thisItem:RightLabel(rightLabel)
thisMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if not report.claimed then
TriggerServerEvent("EasyAdmin:ClaimReport", i)
else
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("reportalreadyclaimed"))
end
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("reporter"), GetLocalisedText("entertoopen"))
thisItem:RightLabel(formatRightString(report.reporterName))
thisMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
_menuPool:CloseAllMenus()
Citizen.Wait(50)
GenerateMenu()
Wait(100)
if not playerMenus[tostring(report.reporter)] then
TriggerEvent("EasyAdmin:showNotification", "~r~Reporting player not found.")
reportViewer:Visible(true)
else
local ourMenu = playerMenus[tostring(report.reporter)].menu
playerMenus[tostring(report.reporter)].generate(ourMenu)
ourMenu.ParentMenu=reportMenus[report.id]
ourMenu:Visible(true)
end
end
if report.type == 1 then
local thisItem = NativeUI.CreateItem(GetLocalisedText("reported"), GetLocalisedText("entertoopen"))
thisItem:RightLabel(formatRightString(report.reportedName))
thisMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
_menuPool:CloseAllMenus()
Citizen.Wait(50)
GenerateMenu()
Wait(100)
if not playerMenus[tostring(report.reported)] then
TriggerEvent("EasyAdmin:showNotification", "~r~Reported player not found.")
reportViewer:Visible(true)
else
local ourMenu = playerMenus[tostring(report.reported)].menu
playerMenus[tostring(report.reported)].generate(ourMenu)
ourMenu.ParentMenu=reportMenus[report.id]
ourMenu:Visible(true)
end
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("reason"), "")
thisItem:RightLabel(formatRightString(report.reason, 48))
thisMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu, SelectedItem)
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("reason") .. ": " .. report.reason)
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("time"), "")
thisItem:RightLabel(report.reportTimeFormatted, 48)
thisMenu:AddItem(thisItem)
if permissions["player.reports.process"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("closereport"), "")
thisMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:RemoveReport", report)
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
reportViewer:Visible(true)
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("closesimilarreports"), GetLocalisedText("closesimilarreportsguide"))
thisMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:RemoveSimilarReports", report)
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
reportViewer:Visible(true)
end
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("refreshreports"), GetLocalisedText("refreshreportsguide"))
reportViewer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
_menuPool:CloseAllMenus()
repeat
Wait(100)
until reportViewer
GenerateMenu()
reportViewer:Visible(true)
end
end
allPlayers = _menuPool:AddSubMenu(playermanagement,GetLocalisedText("allplayers"),"",true)
allPlayers:SetMenuWidthOffset(menuWidth)
if permissions["player.teleport.everyone"] then
-- "all players" function
local thisItem = NativeUI.CreateItem(GetLocalisedText("teleporttome"), GetLocalisedText("teleporttomeguide"))
allPlayers:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local pCoords = GetEntityCoords(PlayerPedId(),true)
TriggerServerEvent("EasyAdmin:TeleportPlayerToCoords", -1, pCoords)
end
end
cachedListGenerated = false
CachedList = _menuPool:AddSubMenu(playermanagement,GetLocalisedText("cachedplayers"),"",true)
CachedList:SetMenuWidthOffset(menuWidth)
CachedList.ParentItem.Activated = function(ParentMenu, SelectedItem)
if not cachedListGenerated then
if permissions["player.ban.temporary"] or permissions["player.ban.permanent"] then
for i, cachedplayer in pairs(cachedplayers) do
if cachedplayer.droppedTime and not cachedplayer.immune then
local thisCachedPlayerMenu = _menuPool:AddSubMenu(CachedList,"["..cachedplayer.id.."] "..cachedplayer.name,"",true)
cachedMenus[tostring(cachedplayer.id)] = {menu = thisCachedPlayerMenu, name = cachedplayer.name, id = cachedplayer.id }
thisCachedPlayerMenu:SetMenuWidthOffset(menuWidth)
thisCachedPlayerMenu.ParentItem.Activated = function(ParentMenu, SelectedItem)
thisPlayer = thisCachedPlayerMenu
if not cachedMenus[tostring(cachedplayer.id)].generated then
local thisBanMenu = _menuPool:AddSubMenu(thisPlayer,GetLocalisedText("banplayer"),"",true)
thisBanMenu:SetMenuWidthOffset(menuWidth)
local thisItem = NativeUI.CreateItem(GetLocalisedText("reason"),GetLocalisedText("banreasonguide"))
thisBanMenu:AddItem(thisItem)
BanReason = GetLocalisedText("noreason")
thisItem:RightLabel(BanReason)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 128)
local formattedResult = formatRightString(formatShortcuts(result))
if result and result ~= "" then
BanReason = result
thisItem:RightLabel(formattedResult)
else
BanReason = GetLocalisedText("noreason")
end
end
local bt = {}
for i,a in ipairs(banLength) do
table.insert(bt, a.label)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("banlength"),bt, 1,GetLocalisedText("banlengthguide") )
thisBanMenu:AddItem(thisItem)
local BanTime = 1
thisItem.OnListChanged = function(sender,item,index)
BanTime = index
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("confirmban"),GetLocalisedText("confirmbanguide"))
thisBanMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if BanReason == "" then
BanReason = GetLocalisedText("noreason")
end
TriggerServerEvent("EasyAdmin:offlinebanPlayer", cachedplayer.id, BanReason, banLength[BanTime].time, cachedplayer.name)
BanTime = 1
BanReason = ""
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
playermanagement:Visible(true)
end
ExecutePluginsFunction("cachedMenu", cachedplayer.id)
thisPlayer:RefreshIndexRecursively()
end
end
end
end
end
cachedListGenerated=true
CachedList:RefreshIndexRecursively()
end
end
end
if DoesPlayerHavePermissionForCategory(-1, "server") then
if permissions["server.announce"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("announcement"), GetLocalisedText("announcementguide"))
servermanagement:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 128)
if result then
TriggerServerEvent("EasyAdmin:Announce", result)
end
end
end
if permissions["server.convars"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("setgametype"), GetLocalisedText("setgametypeguide"))
servermanagement:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 32)
if result then
TriggerServerEvent("EasyAdmin:SetGameType", result)
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("setmapname"), GetLocalisedText("setmapnameguide"))
servermanagement:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 32)
if result then
TriggerServerEvent("EasyAdmin:SetMapName", result)
end
end
end
if permissions["server.resources.start"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("startresourcebyname"), GetLocalisedText("startresourcebynameguide"))
servermanagement:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 32)
if result then
TriggerServerEvent("EasyAdmin:StartResource", result)
end
end
end
if permissions["server.resources.stop"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("stopresourcebyname"), GetLocalisedText("stopresourcebynameguide"))
servermanagement:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 32)
if result then
if result ~= GetCurrentResourceName() then
TriggerServerEvent("EasyAdmin:StopResource", result)
else
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("badidea"))
end
end
end
end
if permissions["server.convars"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("setconvar"), GetLocalisedText("setconvarguide"))
servermanagement:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
AddTextEntry("EA_SETCONVAR_1", GetLocalisedText("convarname"))
AddTextEntry("EA_SETCONVAR_2", GetLocalisedText("convarvalue"))
local result = displayKeyboardInput("EA_SETCONVAR_1", "", 64)
if result then
local result2 = displayKeyboardInput("EA_SETCONVAR_2", "", 64)
if result2 then
TriggerServerEvent("EasyAdmin:SetConvar", result, result2)
end
end
end
end
end
if permissions["player.ban.view"] then
unbanPlayer = _menuPool:AddSubMenu(servermanagement,GetLocalisedText("viewbanlist"),"",true)
local thisMenuWidth = menuWidth
if menuWidth < 150 then
thisMenuWidth = 150
else
thisMenuWidth = menuWidth
end
unbanPlayer:SetMenuWidthOffset(thisMenuWidth)
local reason = ""
local identifier = ""
local function generateBanOverview(banId)
_menuPool:Remove()
ExecutePluginsFunction("menuRemoved")
_menuPool = NativeUI.CreatePool()
collectgarbage()
if not GetResourceKvpString("ea_menuorientation") then
SetResourceKvp("ea_menuorientation", "middle")
SetResourceKvpInt("ea_menuwidth", 0)
menuWidth = 0
menuOrientation = handleOrientation("middle")
else
menuWidth = GetResourceKvpInt("ea_menuwidth")
menuOrientation = handleOrientation(GetResourceKvpString("ea_menuorientation"))
end
local mainMenu = NativeUI.CreateMenu("", "Ban Infos", menuOrientation, 0, "easyadmin", "banner-gradient", "logo")
_menuPool:Add(mainMenu)
local thisMenuWidth = menuWidth
if menuWidth < 150 then
thisMenuWidth = 150
else
thisMenuWidth = menuWidth
end
mainMenu:SetMenuWidthOffset(thisMenuWidth)
_menuPool:ControlDisablingEnabled(false)
_menuPool:MouseControlsEnabled(false)
if banlist[banId].banid then
local thisItem = NativeUI.CreateItem("Ban ID: "..banlist[banId].banid, "")
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
copyToClipboard(banlist[banId].banid)
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("reason"),banlist[banId].reason)
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
--nothing
end
if banlist[banId].name then
local thisItem = NativeUI.CreateItem("Name: "..banlist[banId].name, "")
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if permissions["player.ban.edit"] then
local result = displayKeyboardInput("", banlist[banId].name, 64)
if result then
banlist[banId].name = result
end
end
end
end
if banlist[banId].banner then
local thisItem = NativeUI.CreateItem("Banner: "..banlist[banId].banner, "")
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if permissions["player.ban.edit"] then
local result = displayKeyboardInput("", banlist[banId].banner, 64)
if result then
banlist[banId].banner = result
end
end
end
end
if banlist[banId].expireString then
local thisItem = NativeUI.CreateItem("Expires: "..banlist[banId].expireString, "")
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if permissions["player.ban.edit"] then
AddTextEntry("EA_ENTERTIME", "Enter Unix Timestamp")
local result = displayKeyboardInput("EA_ENTERTIME", banlist[banId].expire, 64)
if result then
banlist[banId].expire = tonumber(result)
end
end
end
end
for _, identifier in pairs(banlist[banId].identifiers) do
if not (GetConvar("ea_IpPrivacy", "true") == "true" and string.split(identifier, ":")[1] == "ip") then
local thisItem = NativeUI.CreateItem(string.format(GetLocalisedText("identifier"), string.split(identifier, ":")[1]),identifier)
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
copyToClipboard(identifier)
end
end
end
if permissions["player.ban.edit"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("savebanchanges"),GetLocalisedText("savebanguide"))
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:editBan", banlist[banId])
end
end
if permissions["player.ban.remove"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("unbanplayer"), GetLocalisedText("unbanplayerguide"))
mainMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:unbanPlayer", banlist[banId].banid)
TriggerServerEvent("EasyAdmin:requestBanlist")
_menuPool:CloseAllMenus()
Citizen.Wait(800)
GenerateMenu()
unbanPlayer:Visible(true)
end
mainMenu:Visible(true)
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("searchbans"), "")
unbanPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
local result = displayKeyboardInput("FMMC_KEY_TIP8", "", 128)
local foundBan = false
if result then
for i,theBanned in ipairs(banlist) do
if foundBan then
break
end
if tostring(theBanned.banid) == result then
foundBan=true
foundBanid=i
break
end
end
if not foundBan then
for i,theBanned in ipairs(banlist) do
if theBanned.name then
if string.find(string.lower(theBanned.name), string.lower(result)) then
foundBan=true
foundBanid=i
break
end
end
if string.find((string.lower(theBanned.reason) or "No Reason"), string.lower(result)) then
foundBan=true
foundBanid=i
break
end
for _, identifier in pairs(theBanned.identifiers) do
if string.find(identifier, result) then
foundBan=true
foundBanid=i
break
end
end
end
end
end
_menuPool:CloseAllMenus()
Citizen.Wait(300)
if foundBan then
generateBanOverview(foundBanid)
else
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("searchbansfail"))
GenerateMenu()
unbanPlayer:Visible(true)
end
end
for i,theBanned in ipairs(banlist) do
if i<(banlistPage*10)+1 and i>(banlistPage*10)-10 then
if theBanned then
reason = theBanned.reason or "No Reason"
local thisItem = NativeUI.CreateItem(string.sub(reason, 1,50), "")
unbanPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
generateBanOverview(i)
end
end
end
end
if #banlist > (banlistPage*10) then
local thisItem = NativeUI.CreateItem(GetLocalisedText("lastpage"), "")
unbanPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
banlistPage = math.ceil(#banlist/10)
_menuPool:CloseAllMenus()
Citizen.Wait(300)
GenerateMenu()
unbanPlayer:Visible(true)
end
end
if banlistPage>1 then
local thisItem = NativeUI.CreateItem(GetLocalisedText("firstpage"), "")
unbanPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
banlistPage = 1
_menuPool:CloseAllMenus()
Citizen.Wait(300)
GenerateMenu()
unbanPlayer:Visible(true)
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("previouspage"), "")
unbanPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
banlistPage=banlistPage-1
_menuPool:CloseAllMenus()
Citizen.Wait(300)
GenerateMenu()
unbanPlayer:Visible(true)
end
end
if #banlist > (banlistPage*10) then
local thisItem = NativeUI.CreateItem(GetLocalisedText("nextpage"), "")
unbanPlayer:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
banlistPage=banlistPage+1
_menuPool:CloseAllMenus()
Citizen.Wait(300)
GenerateMenu()
unbanPlayer:Visible(true)
end
end
end
if DoesPlayerHavePermissionForCategory(-1, "server") then
local sl = {}
if permissions["server.cleanup.cars"] then
table.insert(sl, GetLocalisedText('cars'))
end
if permissions["server.cleanup.peds"] then
table.insert(sl, GetLocalisedText('peds'))
end
if permissions["server.cleanup.props"] then
table.insert(sl, GetLocalisedText('props'))
end
local radi = {10,20,50,100,"global"}
if #sl > 0 and not RedM then
cleanType = sl[1]
cleanRadius = radi[1]
deepClean = true
cleanupMenu = _menuPool:AddSubMenu(servermanagement, GetLocalisedText("cleanarea"), GetLocalisedText("cleanareaguide"),true)
local thisItem = NativeUI.CreateListItem(GetLocalisedText("type"), sl, 1, GetLocalisedText("cleanareaguide"))
cleanupMenu:AddItem(thisItem)
thisItem.OnListChanged = function(sender, item, index)
if item == thisItem then
i = item:IndexToItem(index)
cleanType = i
end
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("radius"), radi, 1, "")
cleanupMenu:AddItem(thisItem)
thisItem.OnListChanged = function(sender, item, index)
if item == thisItem then
i = item:IndexToItem(index)
cleanRadius = i
end
end
local thisItem = NativeUI.CreateCheckboxItem(GetLocalisedText("deepclean"), deepClean, GetLocalisedText("deepcleanguide"))
cleanupMenu:AddItem(thisItem)
thisItem.CheckboxEvent = function(sender, item, checked_)
deepClean = checked_
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("cleanarea"), GetLocalisedText("cleanareaguide"))
cleanupMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
if cleanType == GetLocalisedText('cars') then
cleanType = "cars"
elseif cleanType == GetLocalisedText('peds') then
cleanType = "peds"
elseif cleanType == GetLocalisedText('props') then
cleanType = "props"
end
TriggerServerEvent("EasyAdmin:requestCleanup", cleanType, cleanRadius, deepClean)
end
end
ExecutePluginsFunction("serverMenu")
end
if permissions["player.ban.view"] then
local sl = {GetLocalisedText("unbanreasons"), GetLocalisedText("unbanlicenses")}
local thisItem = NativeUI.CreateListItem(GetLocalisedText("banlistshowtype"), sl, 1,GetLocalisedText("banlistshowtypeguide"))
settingsMenu:AddItem(thisItem)
thisItem.OnListSelected = function(sender, item, index)
if item == thisItem then
i = item:IndexToItem(index)
if i == GetLocalisedText(unbanreasons) then
showLicenses = false
else
showLicenses = true
end
end
end
end
if permissions["player.ban.view"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("refreshbanlist"), GetLocalisedText("refreshbanlistguide"))
settingsMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
banlist=nil
TriggerServerEvent("EasyAdmin:updateBanlist")
repeat
Wait(500)
until banlist
GenerateMenu()
settingsMenu:Visible(true)
collectgarbage()
end
end
if permissions["player.ban.temporary"] or permissions["player.ban.permanent"] then
local thisItem = NativeUI.CreateItem(GetLocalisedText("refreshcachedplayers"), GetLocalisedText("refreshcachedplayersguide"))
settingsMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
cachedplayers=nil
TriggerServerEvent("EasyAdmin:requestCachedPlayers")
repeat
Wait(500)
until cachedplayers
GenerateMenu()
settingsMenu:Visible(true)
collectgarbage()
end
end
local thisItem = NativeUI.CreateItem(GetLocalisedText("refreshpermissions"), GetLocalisedText("refreshpermissionsguide"))
settingsMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
TriggerServerEvent("EasyAdmin:amiadmin")
end
local orientationIndex = 1
if GetResourceKvpString("ea_menuorientation") == "middle" then
orientationIndex = 2
elseif GetResourceKvpString("ea_menuorientation") == "right" then
orientationIndex = 3
end
local sl = {GetLocalisedText("left"), GetLocalisedText("middle"), GetLocalisedText("right")}
local thisItem = NativeUI.CreateListItem(GetLocalisedText("menuOrientation"), sl, orientationIndex, GetLocalisedText("menuOrientationguide"))
settingsMenu:AddItem(thisItem)
thisItem.OnListSelected = function(sender, item, index)
if item == thisItem then
i = item:IndexToItem(index)
if i == GetLocalisedText("left") then
SetResourceKvp("ea_menuorientation", "left")
elseif i == GetLocalisedText("middle") then
SetResourceKvp("ea_menuorientation", "middle")
else
SetResourceKvp("ea_menuorientation", "right")
end
end
end
local sl = {}
for i=0,250,10 do
table.insert(sl,i)
end
local thisi = 0
for i,a in ipairs(sl) do
if menuWidth == a then
thisi = i
end
end
local thisItem = NativeUI.CreateSliderItem(GetLocalisedText("menuOffset"), sl, thisi, GetLocalisedText("menuOffsetguide"), false)
settingsMenu:AddItem(thisItem)
thisItem.OnSliderSelected = function(index)
i = thisItem:IndexToItem(index)
SetResourceKvpInt("ea_menuwidth", i)
menuWidth = i
end
thisi = nil
sl = nil
local thisItem = NativeUI.CreateItem(GetLocalisedText("resetmenuOffset"), "")
settingsMenu:AddItem(thisItem)
thisItem.Activated = function(ParentMenu,SelectedItem)
SetResourceKvpInt("ea_menuwidth", 0)
menuWidth = 0
end
if permissions["anon"] then
local thisItem = NativeUI.CreateCheckboxItem(GetLocalisedText("anonymous"), anonymous or false, GetLocalisedText("anonymousguide"))
settingsMenu:AddItem(thisItem)
thisItem.CheckboxEvent = function(sender, item, checked_)
anonymous = checked_
TriggerServerEvent("EasyAdmin:SetAnonymous", checked_)
end
end
local thisItem = NativeUI.CreateCheckboxItem(GetLocalisedText("screenreader"), GetResourceKvpInt('ea_tts') == 1 and true or false, GetLocalisedText("screenreaderguide"))
settingsMenu:AddItem(thisItem)
thisItem.CheckboxEvent = function(sender, item, checked_)
SendNUIMessage({
action = "toggle_speak",
rate = GetResourceKvpInt("ea_ttsspeed") or 4,
enabled = checked_
})
SetResourceKvpInt("ea_tts", checked_ and 1 or 0)
SendNUIMessage({action= "speak", text="Text to Speech"})
end
local speeds = {}
for i = 1, 10 do
table.insert(speeds, i)
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("screenreaderspeed"), speeds, GetResourceKvpInt("ea_ttsspeed"), GetLocalisedText("screenreaderspeedguide"))
settingsMenu:AddItem(thisItem)
thisItem.OnListSelected = function(sender, item, index)
local item = thisItem:IndexToItem(index)
SendNUIMessage({
action = "speak_rate",
rate = item
})
SetResourceKvpInt("ea_ttsspeed", item)
SendNUIMessage({action= "speak", tostring(item)})
end
if not RedM then
local sl = {"none"}
local currentEggIndex = 1
for k,v in pairs(eastereggs) do
table.insert(sl, k)
end
for k,v in pairs(sl) do
if v == overrideEgg or v == currentEgg then
currentEggIndex = k
end
end
local thisItem = NativeUI.CreateListItem(GetLocalisedText("forceeasteregg"), sl, currentEggIndex, "")
settingsMenu:AddItem(thisItem)
thisItem.OnListSelected = function(sender, item, index)
if item == thisItem then
i = item:IndexToItem(index)
if i == "none" then
overrideEgg = false
else
overrideEgg = i
end
end
end
end
ExecutePluginsFunction("settingsMenu")
_menuPool:ControlDisablingEnabled(false)
_menuPool:MouseControlsEnabled(false)
_menuPool:RefreshIndex() -- refresh indexes
end
function DrawPlayerInfoLoop()
CreateThread(function()
while drawInfo do
Wait(0)
local text = {}
-- cheat checks
local targetPed = GetPlayerPed(drawTarget)
if (not RedM) then
local targetGod = GetPlayerInvincible(drawTarget)
if targetGod then
table.insert(text,GetLocalisedText("godmodedetected"))
else
table.insert(text,GetLocalisedText("godmodenotdetected"))
end
if not CanPedRagdoll(targetPed) and not IsPedInAnyVehicle(targetPed, false) and (GetPedParachuteState(targetPed) == -1 or GetPedParachuteState(targetPed) == 0) and not IsPedInParachuteFreeFall(targetPed) then
table.insert(text,GetLocalisedText("antiragdoll"))
end
-- health info
table.insert(text,GetLocalisedText("health")..": "..GetEntityHealth(targetPed).."/"..GetEntityMaxHealth(targetPed))
table.insert(text,GetLocalisedText("armor")..": "..GetPedArmour(targetPed))
-- misc info
table.insert(text,GetLocalisedText("wantedlevel")..": "..GetPlayerWantedLevel(drawTarget))
table.insert(text,GetLocalisedText("exitspectator"))
for i,theText in pairs(text) do
SetTextFont(0)
SetTextProportional(1)
SetTextScale(0.0, 0.30)
SetTextDropshadow(0, 0, 0, 0, 255)
SetTextEdge(1, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()
SetTextEntry("STRING")
AddTextComponentString(theText)
EndTextCommandDisplayText(0.3, 0.7+(i/30))
end
elseif (RedM) then
local targetGod = GetPlayerInvincible(drawTarget)
if targetGod then
table.insert(text,GetLocalisedText("godmodedetected"))
else
table.insert(text,GetLocalisedText("godmodenotdetected"))
end
table.insert(text,GetLocalisedText("health")..": "..GetEntityHealth(targetPed).."/"..GetEntityMaxHealth(targetPed))
table.insert(text,GetLocalisedText("exitspectator"))
for i,theText in pairs(text) do
Citizen.InvokeNative(0xADA9255D,0)
SetTextScale(0.0, 0.30)
SetTextDropshadow(0, 0, 0, 0, 255)
local str = CreateVarString(10, "LITERAL_STRING",Text)
DisplayText(theText, 0.3, 0.7+(i/30))
end
end
if (not RedM and IsControlJustPressed(0,103) or (RedM and IsControlJustReleased(0, Controls["Enter"]))) then
local targetPed = PlayerPedId()
local targetPlayer = -1
local targetx,targety,targetz = table.unpack(GetEntityCoords(targetPed, false))
spectatePlayer(targetPed,targetPlayer,GetPlayerName(targetPlayer))
TriggerEvent('EasyAdmin:FreezePlayer', false)
--SetEntityCoords(PlayerPedId(), oldCoords.x, oldCoords.y, oldCoords.z, 0, 0, 0, false)
if not RedM then
TriggerEvent('EasyAdmin:FreezePlayer', false)
end
StopDrawPlayerInfo()
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("stoppedSpectating"))
TriggerServerEvent("EasyAdmin:resetBucket", MyBucket)
end
end
end)
CreateThread(function()
while drawInfo do
Wait(5000)
local targetPed = GetPlayerPed(drawTarget)
if not DoesEntityExist(targetPed) and drawServerId ~= 0 then
-- player no longer exists, lets contact the server to see if they changed bucket?
TriggerServerEvent("EasyAdmin:requestBucket", drawServerId)
end
end
end)
end