454 lines
13 KiB
Lua
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) |