Denver Studio - Docs

Criação de Casas

Guia completo para adicionar e configurar casas no sistema DS-Homes

Criação de Casas

Este guia explica como adicionar e configurar casas no sistema DS-Homes. O sistema suporta dois tipos de interiores: MOD (Shells) e Nativos do GTA.

Tipos de Interiores

Interiores customizados que você adiciona ao servidor (shells, YMAPs, etc). São objetos que são spawados em uma dimensão separada.

Vantagens:

  • Totalmente customizável
  • Pode usar o mesmo interior em várias casas
  • Fácil reutilização de configurações

Desvantagens:

  • Requer recursos adicionais no servidor
  • Precisa configurar offsets no config/interiors.lua

Interiores que já existem no mapa do GTA (geralmente debaixo do chão).

Vantagens:

  • Melhor performance (não cria objetos)
  • Não precisa adicionar recursos extras
  • Configuração mais simples

Desvantagens:

  • Limitado aos interiores disponíveis no GTA
  • Coordenadas absolutas (menos flexível)

Estrutura de Configuração

As casas são configuradas no arquivo config/homes.lua:

CFG['homes'] = {
  {
  },
}

Configuração de Casa MOD

Exemplo Completo

{
  name = 'Mansão Moderna',
  slogan = "Luxo e Conforto",
  coords = vector3(-232.6, 588.2, 190.54),
  price = 500000,
  isModInterior = true,
  interior = 'shell_michael',
  image = "https://example.com/mansion.png",
  needsIptu = true,
  type = 'house',
  maxResidents = 10,
  garagePrice = 50000
}

Parâmetros Obrigatórios

Parâmetros Opcionais

Configuração de Apartamento

Apartamentos permitem múltiplas unidades no mesmo edifício.

Exemplo Completo

{
  name = 'Edifício Downtown',
  slogan = "Moderno e Central",
  coords = vector3(-773.34, 313.1, 85.7),
  price = 300000,
  isModInterior = true,
  interior = 'shell_apartment1',
  image = "https://example.com/apartment.png",
  needsIptu = true,
  type = 'apartment',
  maxResidents = 5,
  maxApartments = 20,
  garagePrice = 30000
}

Parâmetro Adicional

Configuração de Casa Nativa

Exemplo Completo

{
  name = 'Casa Underground',
  slogan = "Interior Nativo",
  coords = vector3(1381.98, -1544.94, 57.1),
  price = 250000,
  isModInterior = false,
  interiorCoords = vector3(-141.19, -620.91, 168.82),
  exitCoords = vector3(-142.0, -621.01, 168.94),
  chestCoords = vector3(-129.07, -636.27, 168.82),
  spawnHeading = 180.0,
  image = "https://example.com/underground.png",
  needsIptu = true,
  type = 'house',
  maxResidents = 8,
  garagePrice = 40000
}

Parâmetros Específicos

Como Pegar as Coordenadas

Para Interiores Nativos

Encontre o interior nativo

Procure listas de interiores do GTA V online (Franklin's House, Trevor's Trailer, etc.)

Teleporte-se para o interior

Use comandos de admin para teleportar ou procure a entrada natural no mapa

Use comandos in-game

Posicione-se na porta de saída: /getcoords

Posicione-se onde será o baú: /getcoords

Copie as coordenadas no formato vector3(x, y, z)

Para Interiores MOD

Teste o interior

/testinterior nome_do_shell

Pegue os offsets

Posicione-se em pontos importantes (porta, baú, etc)

Use o comando:

/getoffset

O sistema mostra o offset relativo para configurar no config/interiors.lua

Casas Restritas por Permissão

Você pode marcar casas específicas como disponíveis apenas para jogadores com determinada permissão — útil pra casas oficiais (delegacia, paramédico, mafia) que devem ir só pra membros da facção.

Como funciona

  • Adicione requiredPermission = "policia.permissao" na casa.
  • A casa não aparece na lista pra quem não tem a permissão (some do filtro de propriedades, do mapa e do prompt de entrada).
  • Pra quem tem a permissão, a casa aparece com preço $0 (compra gratuita).
  • Não interfere em IPTU, aluguel, financiamento ou roubo — esses sistemas continuam funcionando normalmente.

Exemplo

{
  name = 'Casa Policia 01',
  type = 'house',
  price = 500000,
  requiredPermission = 'policia.permissao',
  needsIptu = false,
  coords = vec3(...),
  interior = 'shell_v16low',
  isModInterior = true,
  image = 'https://...',
},

O price configurado é ignorado quando requiredPermission está presente — a casa fica sempre $0 pra quem tem permissão. Mantenha um valor mockado só por consistência.

Combinando com robbable = false

Casas oficiais geralmente não devem ser roubáveis. Combine:

{
  name = 'Delegacia Centro',
  requiredPermission = 'policia.permissao',
  robbable = false,
  ...
}

Nome da permissão

O formato segue o padrão do seu framework (vRP). Exemplos:

PermissãoQuem tem
policia.permissaoPolícia
medico.permissaoParamédico
mafia.permissaoMembros da máfia X
admin.permissaoAdministradores

A verificação é feita pelo Adapter:hasPermission — se já funciona em outros sistemas (como roubo), funciona aqui.

Dicas e Boas Práticas

Nomes Únicos: Certifique-se de que cada propriedade tenha um nome único. O sistema usa o nome como identificador.

Imagens: Use URLs de CDN para melhor performance. Evite hospedar imagens localmente.

Preços: Considere o balanceamento econômico do servidor ao definir preços. IPTU é calculado como porcentagem do preço da casa (padrão: 15%).

Apartamentos: Ao usar type = 'apartment', o sistema gerencia automaticamente os números dos apartamentos. Não use o mesmo nome de edifício em múltiplas configurações.

Checklist de Configuração

Antes de adicionar uma nova casa, verifique:

  • Nome único e descritivo
  • Coordenadas da entrada testadas
  • Preço balanceado com economia do servidor
  • Tipo correto (house ou apartment)
  • Se for MOD: interior configurado em interiors.lua
  • Se for nativo: todas as coordenadas absolutas definidas
  • Imagem(ns) acessível(is) via URL
  • Testado in-game antes de liberar para jogadores

Exemplos Completos

{
  name = 'Villa Del Sol',
  slogan = "Luxo à beira-mar",
  coords = vector3(-1290.0, 455.0, 97.0),
  price = 1500000,
  isModInterior = true,
  interior = 'shell_trevor',
  images = {
    "https://example.com/villa1.png",
    "https://example.com/villa2.png",
    "https://example.com/villa3.png"
  },
  description = "Vila de luxo com vista panorâmica do oceano, piscina infinita e acabamento premium.",
  needsIptu = true,
  type = 'house',
  maxResidents = 15,
  garagePrice = 100000
}
{
  name = 'Bunker Secreto',
  slogan = "Privacidade total",
  coords = vector3(2050.0, 2950.0, 47.0),
  price = 800000,
  isModInterior = false,
  interiorCoords = vector3(1259.0, -2564.0, 42.0),
  exitCoords = vector3(1260.5, -2566.0, 42.8),
  chestCoords = vector3(1255.0, -2560.0, 42.8),
  spawnHeading = 90.0,
  image = "https://example.com/bunker.png",
  needsIptu = false,
  type = 'house',
  maxResidents = 5,
  garagePrice = 60000
}