Início › Documentação › Localizações personalizadas · origen_ilegalv2
Config.Locations.Types define todos os tipos de localização que um líder de gangue pode colocar no mapa a partir do painel de gestão (stashes, garagens, vestiários, pontos de depósito bancário, secretárias de gestão…). Podes adicionar os teus próprios tipos de localização ampliando esta tabela, sem editar o núcleo.
Cada tipo controla:
Adiciona novas entradas dentro de Config.Locations.Types em config/locations.lua:
Config.Locations = {
DrawDistance = 50.0,
InteractDistance = 1.5,
MarkerDrawDistance = 15.0,
Types = {
stash = { --[[ ... ]] },
garage = { --[[ ... ]] },
-- your custom type
armory = {
label = 'Open gang armory',
default = false,
requiredPermission = 'access_armory',
blip = {
enabled = false,
sprite = 110,
color = 1,
scale = 0.7,
},
marker = {
type = 22,
offset = { x = 0.0, y = 0.0, z = 1.0 },
scale = { x = 0.25, y = 0.25, z = 0.25 },
color = { r = 255, g = 0, b = 0, a = 255 },
bobUpAndDown = true,
faceCamera = true,
rotationOrder = 2,
rotate = false,
},
onInteract = function(gangData, locationId, locationData)
-- client-side logic here
TriggerServerEvent('my_resource:openArmory', gangData.id)
end,
},
},
}A chave (armory no exemplo) é o locationType usado internamente. É o valor guardado na base de dados para cada ponto colocado.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
label |
string |
sim | Texto mostrado no aviso de interação. Pode ser uma string simples ou uma chave de idioma (por exemplo, locations.types.armory.label). |
default |
boolean |
sim | Se for true, o núcleo trata o tipo (stash, garagem, vestiário, banco, gestão). Define false para os tipos personalizados que definem o seu próprio onInteract. |
requiredPermission |
string | nil |
sim | Permissão de cargo necessária para interagir com um ponto colocado. Usa nil para permitir a qualquer membro. |
blip |
table |
sim | Configuração do blip do minimapa (ver abaixo). |
marker |
table |
sim | Configuração do marker 3D do mundo (ver abaixo). |
onInteract |
function |
não | Obrigatório para os tipos personalizados (default = false). Chamada no cliente quando um membro interage com o ponto. Recebe (gangData, locationId, locationData). |
placement_preview |
table |
não | Usado apenas por tipos especiais que precisam de uma pré-visualização no mundo durante a colocação (por exemplo, garage mostra um veículo para escolher a orientação). |
blip| Campo | Tipo | Descrição |
|---|---|---|
enabled |
boolean |
Mostra o blip no minimapa. |
sprite |
number |
ID do sprite de blip do GTA. |
color |
number |
ID da cor de blip do GTA. |
scale |
number |
Tamanho do blip. |
marker| Campo | Tipo | Descrição |
|---|---|---|
type |
number |
ID do tipo de marker; consulta a referência de markers do FiveM. |
offset |
{ x, y, z } |
Deslocamento em relação à coordenada base. O alias antigo offsetZ (float) continua a ser aceite. |
scale |
{ x, y, z } |
Tamanho do marker por eixo. |
color |
{ r, g, b, a } |
RGBA 0–255. |
bobUpAndDown |
boolean |
Animação de balanço. |
faceCamera |
boolean |
Olha sempre para a câmara. |
rotationOrder |
number |
Ordem dos eixos para a rotação (por omissão 2). |
rotate |
boolean |
Gira sobre o seu eixo. |
Quando default = false, o núcleo chama a função onInteract definida diretamente na configuração do tipo. Esta função é executada no cliente e recebe três argumentos:
| Argumento | Tipo | Descrição |
|---|---|---|
gangData |
table |
Os dados da gangue do jogador (id, nome, membros, cargos, etc.). |
locationId |
string |
O ID único do ponto colocado (por exemplo, gang_ballas_armory_1). |
locationData |
table |
Dados em bruto da localização, incluindo as coordenadas (x, y, z, h) e o type. |
A validação da permissão (requiredPermission) é feita pelo núcleo antes de chamar onInteract. Se o membro não tiver a permissão necessária, a interação é bloqueada em silêncio e onInteract nunca é executada.
onInteract é executada no cliente. Para executar lógica do lado do servidor (abrir um inventário, dar itens, etc.), aciona um evento de servidor a partir de dentro da função.
onInteract = function(gangData, locationId, locationData)
-- trigger your own server event from here
TriggerServerEvent('my_resource:openArmory', gangData.id)
end,RegisterNetEvent('my_resource:openArmory', function(gangId)
local src = source
-- your server-side logic here
exports.ox_inventory:openInventory(src, {
type = 'shop',
id = 'gang_armory_' .. gangId,
})
end)Coloca os handlers de servidor personalizados dentro de custom/server/ para que as atualizações do núcleo não substituam a tua lógica.
requiredPermission corresponde diretamente às flags de permissão de cargo definidas em Config.Gang.DefaultRanks (config/gangs.lua). Quando um membro tenta interagir com um ponto colocado, o núcleo verifica:
gang:hasPermission(identifier, location.requiredPermission)Se devolver false, a interação é bloqueada em silêncio.
Define a flag em cada cargo por omissão que a deva receber:
DefaultRanks = {
{
id = 1,
name = "Leader",
permissions = {
-- ... existing flags ...
access_armory = true,
},
},
{
id = 3,
name = "Member",
permissions = {
access_armory = false,
},
},
},Referencia-a a partir do teu tipo de localização:
armory = {
requiredPermission = 'access_armory',
-- ...
},Restrição de colocação (opcional): para restringir quem pode colocar o ponto (não apenas interagir), o painel de gestão reutiliza a permissão padrão manage_locations para todos os tipos. Não é preciso configuração adicional.
Todos os cargos que devam poder ver ou usar a nova permissão têm de ter a flag definida explicitamente. As flags em falta valem false por omissão.
Os membros também podem editar as permissões dos cargos em tempo de execução a partir do painel da gangue (se tiverem manage_ranks). Qualquer chave de permissão declarada em Config.Gang.DefaultRanks é listada aí automaticamente.
armory = {
label = 'locations.types.armory.label',
default = false,
requiredPermission = 'access_armory',
blip = {
enabled = true,
sprite = 110,
color = 1,
scale = 0.7,
},
marker = {
type = 22,
offset = { x = 0.0, y = 0.0, z = 1.0 },
scale = { x = 0.3, y = 0.3, z = 0.3 },
color = { r = 255, g = 50, b = 50, a = 200 },
bobUpAndDown = true,
faceCamera = true,
rotationOrder = 2,
rotate = false,
},
onInteract = function(gangData, locationId, locationData)
TriggerServerEvent('my_resource:openArmory', gangData.id)
end,
},-- Leader + Co-Leader:
access_armory = true,
-- Member + Recruit:
access_armory = false,RegisterNetEvent('my_resource:openArmory', function(gangId)
local src = source
exports.ox_inventory:openInventory(src, {
type = 'shop',
id = 'gang_armory_' .. gangId,
})
end)Reinicia o recurso. O novo tipo Armory aparece no seletor de colocação de localizações para qualquer cargo com manage_locations, e apenas os membros com access_armory podem interagir com os pontos colocados.