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

454 lines
13 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/
----
------------------------------------
------------------------------------
players = {}
banlist = {}
cachedplayers = {}
reports = {}
MessageShortcuts = {}
FrozenPlayers = {}
MutedPlayers = {}
MyBucket = 0
local cachedInfo = {
ped = PlayerPedId(),
veh = 0,
player = PlayerId(),
}
local vehicleInfo = {
netId = nil,
seat = nil,
}
RegisterNetEvent("EasyAdmin:adminresponse", function(perms)
permissions = perms
for perm, val in pairs(perms) do
if val == true then
isAdmin = true
end
end
end)
function DoesPlayerHavePermission(player,perm)
if not player == -1 then
return false
end
return permissions[perm]
end
RegisterNetEvent("EasyAdmin:SetSetting", function(setting,state)
settings[setting] = state
end)
RegisterNetEvent('EasyAdmin:SetLanguage', function(newstrings)
strings = newstrings
end)
RegisterNetEvent("EasyAdmin:fillBanlist", function(thebanlist)
banlist = thebanlist
end)
RegisterNetEvent("EasyAdmin:fillCachedPlayers", function(thecached)
if permissions["player.ban.temporary"] or permissions["player.ban.permanent"] then
cachedplayers = thecached
end
end)
RegisterNetEvent("EasyAdmin:GetInfinityPlayerList", function(players)
playerlist = players
end)
RegisterNetEvent("EasyAdmin:NewReport", function(reportData)
reports[reportData.id] = reportData
end)
RegisterNetEvent("EasyAdmin:ClaimedReport", function(reportData)
reports[reportData.id] = reportData
if _menuPool and _menuPool:IsAnyMenuOpen() then
for i, menu in pairs(reportMenus) do
for o,item in pairs(menu.Items) do
if getMenuItemTitle(item) == GetLocalisedText("claimreport") then
setMenuItemTitle(item, GetLocalisedText("claimedby"))
item:RightLabel(reportData.claimedName)
end
end
end
end
end)
RegisterNetEvent("EasyAdmin:RemoveReport", function(reportData)
reports[reportData.id] = nil
end)
RegisterNetEvent("EasyAdmin:fillShortcuts", function (shortcuts)
MessageShortcuts = shortcuts
end)
RegisterNetEvent('EasyAdmin:SetPlayerFrozen', function(player,state)
FrozenPlayers[player] = state
if _menuPool and _menuPool:IsAnyMenuOpen() then
if playerMenus[tostring(player)].menu then
for o,item in pairs(playerMenus[tostring(player)].menu.Items) do
if getMenuItemTitle(item) == GetLocalisedText("setplayerfrozen") then
item.Checked = state
end
end
end
end
end)
RegisterNetEvent('EasyAdmin:SetPlayerMuted', function(player,state)
MutedPlayers[player] = state
if _menuPool and _menuPool:IsAnyMenuOpen() then
if playerMenus[tostring(player)].menu then
for o,item in pairs(playerMenus[tostring(player)].menu.Items) do
if getMenuItemTitle(item) == GetLocalisedText("mute") then
item.Checked = state
end
end
end
end
end)
function FreezeMyself(state)
if state then
if frozen then return end -- prevents double threads
CreateThread(function()
while frozen do
FreezeEntityPosition(cachedInfo.ped, frozen)
if cachedInfo.veh ~= 0 then
FreezeEntityPosition(cachedInfo.veh, frozen)
end
DisablePlayerFiring(cachedInfo.player, true)
Wait(0)
end
end)
else
-- unfreeze
local localPlayerPedId = PlayerPedId()
FreezeEntityPosition(localPlayerPedId, false)
if IsPedInAnyVehicle(localPlayerPedId, true) then
FreezeEntityPosition(GetVehiclePedIsIn(localPlayerPedId, true), false)
end
end
end
RegisterNetEvent("EasyAdmin:CopyDiscord", function(discord)
copyToClipboard(discord)
end)
RegisterNetEvent("EasyAdmin:requestSpectate", function(playerServerId, playerData)
local localPlayerPed = PlayerPedId()
if IsPedInAnyVehicle(localPlayerPed) then
local vehicle = GetVehiclePedIsIn(localPlayerPed, false)
local numVehSeats = GetVehicleModelNumberOfSeats(GetEntityModel(vehicle))
vehicleInfo.netId = VehToNet(vehicle)
for i = -1, numVehSeats do
if GetPedInVehicleSeat(vehicle, i) == localPlayerPed then
vehicleInfo.seat = i
break
end
end
end
if playerData.selfbucket then
-- cache old bucket to restore at end of spectate
if not IsSpectating then
MyBucket = playerData.selfbucket
end
end
local tgtCoords = playerData.coords
if ((not tgtCoords) or (tgtCoords.z == 0.0)) then tgtCoords = GetEntityCoords(GetPlayerPed(GetPlayerFromServerId(playerServerId))) end
if not IsSpectating then
oldCoords = GetEntityCoords(PlayerPedId())
end
SetEntityCoords(localPlayerPed, tgtCoords.x, tgtCoords.y, tgtCoords.z - 10.0, 0, 0, 0, false)
frozen = true
FreezeMyself(true)
stopSpectateUpdate = true
local playerId = GetPlayerFromServerId(playerServerId)
local timer = 0
repeat
Wait(200)
playerId = GetPlayerFromServerId(playerServerId)
timer = timer + 1
until ( (GetPlayerPed(playerId) > 0) and (playerId ~= -1) or timer > 25)
if timer >= 25 then
return
end
spectatePlayer(GetPlayerPed(playerId),playerId,GetPlayerName(playerId))
stopSpectateUpdate = false
end)
Citizen.CreateThread(function()
RegisterNetEvent("EasyAdmin:requestCleanup", function(type, radius)
local toDelete = {}
local deletionText = ""
if type == "cars" then
toDelete = GetGamePool("CVehicle")
deletionText = GetLocalisedText("cleaningcar")
elseif type == "peds" then
toDelete = GetGamePool("CPed")
deletionText = GetLocalisedText("cleaningped")
elseif type == "props" then
toDelete = mergeTables(GetGamePool("CObject"), GetGamePool("CPickup"))
deletionText = GetLocalisedText("cleaningprop")
end
for _,entity in pairs(toDelete) do
PrintDebugMessage("starting deletion for entity "..entity, 4)
if DoesEntityExist(entity) then
if (type == "cars" and not IsPedAPlayer(GetPedInVehicleSeat(entity, -1))) then
if not NetworkHasControlOfEntity(entity) then
local i=0
repeat
NetworkRequestControlOfEntity(entity)
i=i+1
Wait(150)
until (NetworkHasControlOfEntity(entity) or i==500)
end
-- draw text
SetTextFont(2)
SetTextColour(255, 255, 255, 200)
SetTextProportional(1)
SetTextScale(0.0, 0.6)
SetTextDropshadow(0, 0, 0, 0, 255)
SetTextEdge(1, 0, 0, 0, 255)
SetTextDropShadow()
SetTextOutline()
SetTextEntry("STRING")
AddTextComponentString(string.format(deletionText, entity))
EndTextCommandDisplayText(0.45, 0.95)
-- delete entity
if radius == "global" then
PrintDebugMessage("deleting entity "..entity, 3)
SetEntityAsNoLongerNeeded(entity)
DeleteEntity(entity)
else
local entityCoords = GetEntityCoords(entity)
local playerCoords = GetEntityCoords(PlayerPedId())
if #(playerCoords - entityCoords) < radius then
PrintDebugMessage("deleting entity "..entity, 3)
SetEntityAsNoLongerNeeded(entity)
DeleteEntity(entity)
end
end
Wait(1)
end
toDelete[i] = nil
end
end
end)
end)
Citizen.CreateThread( function()
while true do
Citizen.Wait(500)
local localPlayerPed = PlayerPedId()
if drawInfo and not stopSpectateUpdate then
local targetPed = GetPlayerPed(drawTarget)
local targetGod = GetPlayerInvincible(drawTarget)
local tgtCoords = GetEntityCoords(targetPed)
if tgtCoords and tgtCoords.x ~= 0 then
SetEntityCoords(localPlayerPed, tgtCoords.x, tgtCoords.y, tgtCoords.z - 10.0, 0, 0, 0, false)
end
else
Citizen.Wait(1000)
end
cachedInfo = {
ped = localPlayerPed,
veh = GetVehiclePedIsIn(localPlayerPed, false),
player = PlayerId(),
}
end
end)
RegisterNetEvent("EasyAdmin:TeleportPlayerBack", function(id, tgtCoords)
if lastLocation then
SetEntityCoords(PlayerPedId(), lastLocation,0,0,0, false)
lastLocation=nil
end
end)
RegisterNetEvent("EasyAdmin:TeleportRequest", function(id, tgtCoords)
if id then
if (tgtCoords.x == 0.0 and tgtCoords.y == 0.0 and tgtCoords.z == 0.0) then
local tgtPed = GetPlayerPed(GetPlayerFromServerId(id))
tgtCoords = GetEntityCoords(tgtPed)
end
lastLocation = GetEntityCoords(PlayerPedId())
SetEntityCoords(PlayerPedId(), tgtCoords,0,0,0, false)
else
lastLocation = GetEntityCoords(PlayerPedId())
SetEntityCoords(PlayerPedId(), tgtCoords,0,0,0, false)
end
end)
RegisterNetEvent("EasyAdmin:SlapPlayer", function(slapAmount)
local ped = PlayerPedId()
if slapAmount > GetEntityHealth(ped) then
ApplyDamageToPed(ped, 5000, false, true,true)
else
ApplyDamageToPed(ped, slapAmount, false, true,true)
end
end)
RegisterCommand("kick", function(source, args, rawCommand)
local source=source
local reason = ""
for i,theArg in pairs(args) do
if i ~= 1 then -- make sure we are not adding the kicked player as a reason
reason = reason.." "..theArg
end
end
if args[1] and tonumber(args[1]) then
TriggerServerEvent("EasyAdmin:kickPlayer", tonumber(args[1]), reason)
end
end, false)
RegisterCommand("ban", function(source, args, rawCommand)
if args[1] and tonumber(args[1]) then
local reason = ""
for i,theArg in pairs(args) do
if i ~= 1 then
reason = reason.." "..theArg
end
end
if args[1] and tonumber(args[1]) then
TriggerServerEvent("EasyAdmin:banPlayer", tonumber(args[1]), reason, false, GetPlayerName(args[1]))
end
end
end, false)
RegisterNetEvent("EasyAdmin:FreezePlayer", function(toggle)
frozen = toggle
FreezeMyself(frozen)
end)
RegisterNetEvent("EasyAdmin:CaptureScreenshot", function(toggle, url, field)
exports['screenshot-basic']:requestScreenshotUpload(GetConvar("ea_screenshoturl", 'https://wew.wtf/upload.php'), GetConvar("ea_screenshotfield", 'files[]'), function(data)
TriggerLatentServerEvent("EasyAdmin:TookScreenshot", 100000, data)
end)
end)
function spectatePlayer(targetPed,target,name)
local playerPed = PlayerPedId() -- yourself
enable = true
if (target == PlayerId() or target == -1) then
enable = false
end
if(enable)then
SetEntityVisible(playerPed, false, 0)
SetEntityCollision(playerPed, false, false)
SetEntityInvincible(playerPed, true)
NetworkSetEntityInvisibleToNetwork(playerPed, true)
Wait(200) -- to prevent target player seeing you
if targetPed == playerPed then
Wait(500)
targetPed = GetPlayerPed(target)
end
local targetx,targety,targetz = table.unpack(GetEntityCoords(targetPed, false))
RequestCollisionAtCoord(targetx,targety,targetz)
NetworkSetInSpectatorMode(true, targetPed)
DrawPlayerInfo(target)
TriggerEvent("EasyAdmin:showNotification", string.format(GetLocalisedText("spectatingUser"), name))
else
if oldCoords then
RequestCollisionAtCoord(oldCoords.x, oldCoords.y, oldCoords.z)
Wait(500)
SetEntityCoords(playerPed, oldCoords.x, oldCoords.y, oldCoords.z, 0, 0, 0, false)
end
NetworkSetInSpectatorMode(false, targetPed)
StopDrawPlayerInfo()
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("stoppedSpectating"))
frozen = false
FreezeMyself(false)
Wait(200) -- to prevent staying invisible
SetEntityVisible(playerPed, true, 0)
SetEntityCollision(playerPed, true, true)
SetEntityInvincible(playerPed, false)
NetworkSetEntityInvisibleToNetwork(playerPed, false)
if vehicleInfo.netId and vehicleInfo.seat then
local vehicle = NetToVeh(vehicleInfo.netId)
if DoesEntityExist(vehicle) then
if IsVehicleSeatFree(vehicle, vehicleInfo.seat) then
SetPedIntoVehicle(playerPed, vehicle, vehicleInfo.seat)
else
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("spectatevehicleseatoccupied"))
end
else
TriggerEvent("EasyAdmin:showNotification", GetLocalisedText("spectatenovehiclefound"))
end
vehicleInfo.netId = nil
vehicleInfo.seat = nil
end
end
end
---Displays a notification message to the player with EasyAdmin branding.
---@param text string @The message text to display in the notification
function ShowNotification(text)
if not RedM then
local notificationTxd = CreateRuntimeTxd("easyadmin_notification")
CreateRuntimeTextureFromImage(notificationTxd, 'small_logo', 'dependencies/images/small-logo-bg.png')
BeginTextCommandThefeedPost("STRING")
AddTextComponentSubstringPlayerName(text)
local title = "~bold~EasyAdmin"
local subtitle = GetLocalisedText("notification")
local iconType = 0
local flash = false
EndTextCommandThefeedPostMessagetext("easyadmin_notification", "small_logo", flash, iconType, title, subtitle)
local showInBrief = false
local blink = false
EndTextCommandThefeedPostTicker(blink, showInBrief)
else
-- someone who has RedM installed please write some code for this
end
end
RegisterNetEvent("EasyAdmin:showNotification", function(text, important)
TriggerEvent("EasyAdmin:receivedNotification")
if not WasEventCanceled() then
ShowNotification(text)
end
end)