Files
esx_core/[esx_addons]/instance/client/main.lua
T
Linden 104479eaab feat: Update all resources to version legacy
- Resources updated to use `@es_extended/imports.lua` instead of calling ESX manually

- Replaced all xPlayer loops with ESX.GetExtendedPlayers()

- Reverted NUI chunking for esx_menu_default

- Performance improvements for several resources

- Added events and checks for the player to be loaded for several resources

- Changed all PlayerData tables to use ESX.PlayerData
2021-06-26 13:33:59 +10:00

224 lines
5.1 KiB
Lua

local instance, instancedPlayers, registeredInstanceTypes, playersToHide = {}, {}, {}, {}
local instanceInvite, insideInstance
function GetInstance()
return instance
end
function CreateInstance(type, data)
TriggerServerEvent('instance:create', type, data)
end
function CloseInstance()
instance = {}
TriggerServerEvent('instance:close')
insideInstance = false
end
function EnterInstance(instance)
insideInstance = true
-- Fix vehicles randomly spawning nearby the player inside an instance
Citizen.CreateThread(function()
while insideInstance do
Citizen.Wait(0) -- must be run every frame
SetVehicleDensityMultiplierThisFrame(0.0)
SetParkedVehicleDensityMultiplierThisFrame(0.0)
local pos = GetEntityCoords(PlayerPedId())
RemoveVehiclesFromGeneratorsInArea(pos.x - 900.0, pos.y - 900.0, pos.z - 900.0, pos.x + 900.0, pos.y + 900.0, pos.z + 900.0)
end
end)
TriggerServerEvent('instance:enter', instance.host)
if registeredInstanceTypes[instance.type].enter then
registeredInstanceTypes[instance.type].enter(instance)
end
end
function LeaveInstance()
if instance.host then
if #instance.players > 1 then
ESX.ShowNotification(_U('left_instance'))
end
if registeredInstanceTypes[instance.type].exit then
registeredInstanceTypes[instance.type].exit(instance)
end
TriggerServerEvent('instance:leave', instance.host)
end
insideInstance = false
end
function InviteToInstance(type, player, data)
TriggerServerEvent('instance:invite', instance.host, type, player, data)
end
function RegisterInstanceType(type, enter, exit)
registeredInstanceTypes[type] = {
enter = enter,
exit = exit
}
end
AddEventHandler('instance:get', function(cb)
cb(GetInstance())
end)
AddEventHandler('instance:create', function(type, data)
CreateInstance(type, data)
end)
AddEventHandler('instance:close', function()
CloseInstance()
end)
AddEventHandler('instance:enter', function(_instance)
EnterInstance(_instance)
end)
AddEventHandler('instance:leave', function()
LeaveInstance()
end)
AddEventHandler('instance:invite', function(type, player, data)
InviteToInstance(type, player, data)
end)
AddEventHandler('instance:registerType', function(name, enter, exit)
RegisterInstanceType(name, enter, exit)
end)
RegisterNetEvent('instance:onInstancedPlayersData')
AddEventHandler('instance:onInstancedPlayersData', function(_instancedPlayers)
instancedPlayers = _instancedPlayers
end)
RegisterNetEvent('instance:onCreate')
AddEventHandler('instance:onCreate', function(_instance)
instance = {}
end)
RegisterNetEvent('instance:onEnter')
AddEventHandler('instance:onEnter', function(_instance)
instance = _instance
end)
RegisterNetEvent('instance:onLeave')
AddEventHandler('instance:onLeave', function(_instance)
instance = {}
end)
RegisterNetEvent('instance:onClose')
AddEventHandler('instance:onClose', function(_instance)
instance = {}
end)
RegisterNetEvent('instance:onPlayerEntered')
AddEventHandler('instance:onPlayerEntered', function(_instance, player)
instance = _instance
local playerName = GetPlayerName(GetPlayerFromServerId(player))
ESX.ShowNotification(_('entered_into', playerName))
end)
RegisterNetEvent('instance:onPlayerLeft')
AddEventHandler('instance:onPlayerLeft', function(_instance, player)
instance = _instance
local playerName = GetPlayerName(GetPlayerFromServerId(player))
ESX.ShowNotification(_('left_out', playerName))
end)
RegisterNetEvent('instance:onInvite')
AddEventHandler('instance:onInvite', function(_instance, type, data)
instanceInvite = {
type = type,
host = _instance,
data = data
}
Citizen.CreateThread(function()
while instanceInvite do
Citizen.Wait(0)
ESX.ShowHelpNotification(_U('press_to_enter'))
if IsControlJustReleased(0, 38) then
EnterInstance(instanceInvite)
ESX.ShowNotification(_U('entered_instance'))
instanceInvite = nil
end
end
end)
Citizen.CreateThread(function()
-- Controls for invite
Citizen.Wait(10000)
if instanceInvite then
ESX.ShowNotification(_U('invite_expired'))
instanceInvite = nil
end
end)
end)
RegisterInstanceType('default')
-- Instance players
Citizen.CreateThread(function()
while true do
Citizen.Wait(1000)
playersToHide = {}
if instance.host then
-- Get players and sets them as pairs
for k,v in ipairs(GetActivePlayers()) do
playersToHide[GetPlayerServerId(v)] = true
end
-- Dont set our instanced players invisible
for _,player in ipairs(instance.players) do
playersToHide[player] = nil
end
else
for player,_ in pairs(instancedPlayers) do
playersToHide[player] = true
end
end
end
end)
local letSleep = true
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local playerPed = PlayerPedId()
letSleep = true
-- Hide all these players
for serverId,_ in pairs(playersToHide) do
local player = GetPlayerFromServerId(serverId)
if NetworkIsPlayerActive(player) then
local otherPlayerPed = GetPlayerPed(player)
SetEntityVisible(otherPlayerPed, false, false)
SetEntityNoCollisionEntity(otherPlayerPed, playerPed, true)
letSleep = false
end
end
if letSleep then
Citizen.Wait(1000)
end
end
end)
Citizen.CreateThread(function()
TriggerEvent('instance:loaded')
end)