DRS Mining

v2.0.0 drs_mining
Ver na loja

Trabalho de mineração completo, com uma cadeia legal e outra ilegal. As rochas são partilhadas por todos os jogadores e cada pancada tem um minijogo de pontaria. Tem picaretas por nível, uma fundição com britadeira e forno, compradores com preços que variam, uma mina ilegal com laboratório e receptador, níveis com XP e uma classificação. Tudo é validado no servidor. Funciona com Qbox, QBCore e ESX.

#Requisitos

RecursoObrigatório
oxmysqlSim
Qbox, QBCore ou ESXSim (deteção automática)
qb-inventory, ox_inventory ou outroSim
drs_battlepassNão — missões de minerar e fundir

#Instalação

  1. Coloca drs_mining em resources.
  2. Adiciona ao server.cfg, depois do oxmysql, da framework e do inventário:
server.cfg
ensure oxmysql
ensure qb-core
ensure drs_mining
  1. Adiciona os itens (ver abaixo) e copia as imagens de install/images/ para a pasta de imagens do inventário.
  2. A tabela drs_mining (níveis e XP) é criada sozinha no primeiro arranque.

#Itens

Os itens copper, iron, steel, goldbar e diamond já vêm com o QBCore. Os outros (pedra, carvão, minérios, esmeralda, lingote de prata, enxofre, salitre, pólvora e as três picaretas) são novos e têm ícones próprios em install/images/.

QBCore — dentro de qb-core/shared/items.lua:

items_qb-core.lua
-- qb-core/shared/items.lua  (QBCore)  — cola dentro de QBShared.Items / paste inside QBShared.Items
    stone           = { name = 'stone', label = 'Pedra', weight = 500, type = 'item', image = 'stone.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Pedra da pedreira. Tritura-a na fundição.' },
    coal            = { name = 'coal', label = 'Carvão', weight = 400, type = 'item', image = 'coal.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Combustível para o forno.' },
    copper_ore      = { name = 'copper_ore', label = 'Minério de cobre', weight = 600, type = 'item', image = 'copper_ore.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Funde-se em cobre.' },
    iron_ore        = { name = 'iron_ore', label = 'Minério de ferro', weight = 700, type = 'item', image = 'iron_ore.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Funde-se em ferro.' },
    silver_ore      = { name = 'silver_ore', label = 'Minério de prata', weight = 700, type = 'item', image = 'silver_ore.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Funde-se em barras de prata.' },
    gold_ore        = { name = 'gold_ore', label = 'Minério de ouro', weight = 800, type = 'item', image = 'gold_ore.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Funde-se em barras de ouro.' },
    emerald         = { name = 'emerald', label = 'Esmeralda', weight = 100, type = 'item', image = 'emerald.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Uma pedra preciosa rara.' },
    silver_ingot    = { name = 'silver_ingot', label = 'Barra de prata', weight = 1000, type = 'item', image = 'silver_ingot.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Barra de prata pura.' },
    sulfur          = { name = 'sulfur', label = 'Enxofre', weight = 500, type = 'item', image = 'sulfur.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Material cru de uma mina abandonada.' },
    saltpeter       = { name = 'saltpeter', label = 'Salitre', weight = 500, type = 'item', image = 'saltpeter.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Material cru de uma mina abandonada.' },
    gunpowder       = { name = 'gunpowder', label = 'Pólvora', weight = 200, type = 'item', image = 'gunpowder.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Não deixes perto de fogo.' },
    pickaxe         = { name = 'pickaxe', label = 'Picareta', weight = 2500, type = 'item', image = 'pickaxe.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Picareta básica.' },
    steel_pickaxe   = { name = 'steel_pickaxe', label = 'Picareta de aço', weight = 3000, type = 'item', image = 'steel_pickaxe.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'Mais força e um pouco de sorte.' },
    diamond_pickaxe = { name = 'diamond_pickaxe', label = 'Picareta de diamante', weight = 3000, type = 'item', image = 'diamond_pickaxe.png', unique = false, useable = false, shouldClose = true, combinable = nil, description = 'A melhor picareta.' },

ox_inventory / Qbox — dentro de ox_inventory/data/items.lua:

items_ox_inventory.lua
-- ox_inventory/data/items.lua  (Qbox / ox_inventory) — cola dentro da tabela / paste inside the table
    ['stone'] = { label = 'Pedra', weight = 500, stack = true, close = true, description = 'Pedra da pedreira. Tritura-a na fundição.' },
    ['coal'] = { label = 'Carvão', weight = 400, stack = true, close = true, description = 'Combustível para o forno.' },
    ['copper_ore'] = { label = 'Minério de cobre', weight = 600, stack = true, close = true, description = 'Funde-se em cobre.' },
    ['iron_ore'] = { label = 'Minério de ferro', weight = 700, stack = true, close = true, description = 'Funde-se em ferro.' },
    ['silver_ore'] = { label = 'Minério de prata', weight = 700, stack = true, close = true, description = 'Funde-se em barras de prata.' },
    ['gold_ore'] = { label = 'Minério de ouro', weight = 800, stack = true, close = true, description = 'Funde-se em barras de ouro.' },
    ['emerald'] = { label = 'Esmeralda', weight = 100, stack = true, close = true, description = 'Uma pedra preciosa rara.' },
    ['silver_ingot'] = { label = 'Barra de prata', weight = 1000, stack = true, close = true, description = 'Barra de prata pura.' },
    ['sulfur'] = { label = 'Enxofre', weight = 500, stack = true, close = true, description = 'Material cru de uma mina abandonada.' },
    ['saltpeter'] = { label = 'Salitre', weight = 500, stack = true, close = true, description = 'Material cru de uma mina abandonada.' },
    ['gunpowder'] = { label = 'Pólvora', weight = 200, stack = true, close = true, description = 'Não deixes perto de fogo.' },
    ['pickaxe'] = { label = 'Picareta', weight = 2500, stack = false, close = true, description = 'Picareta básica.' },
    ['steel_pickaxe'] = { label = 'Picareta de aço', weight = 3000, stack = false, close = true, description = 'Mais força e um pouco de sorte.' },
    ['diamond_pickaxe'] = { label = 'Picareta de diamante', weight = 3000, stack = false, close = true, description = 'A melhor picareta.' },

ESX — importa na base de dados:

items_esx.sql
-- ESX (sem ox_inventory / without ox_inventory)
INSERT IGNORE INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
    ('stone', 'Pedra', 1, 0, 1),
    ('coal', 'Carvão', 1, 0, 1),
    ('copper_ore', 'Minério de cobre', 1, 0, 1),
    ('iron_ore', 'Minério de ferro', 1, 0, 1),
    ('silver_ore', 'Minério de prata', 1, 0, 1),
    ('gold_ore', 'Minério de ouro', 1, 0, 1),
    ('emerald', 'Esmeralda', 1, 1, 1),
    ('silver_ingot', 'Barra de prata', 1, 0, 1),
    ('sulfur', 'Enxofre', 1, 0, 1),
    ('saltpeter', 'Salitre', 1, 0, 1),
    ('gunpowder', 'Pólvora', 1, 1, 1),
    ('pickaxe', 'Picareta', 2, 0, 1),
    ('steel_pickaxe', 'Picareta de aço', 3, 0, 1),
    ('diamond_pickaxe', 'Picareta de diamante', 3, 0, 1);

Noutros frameworks, se algum item de QBCore faltar, cria-o ou troca o nome no config.lua.

  1. Capataz (na pedreira de Sandy Shores): compra a picareta, vê o teu perfil (nível, XP, estatísticas) e a classificação dos melhores mineiros. Também vende água e comida (Config.ShopItems).
  2. Mina: parte rochas com o minijogo e recebes pedra. As rochas maiores dão mais pedra, mas pedem mais nível.
  3. Fundição — britadeira: cada pedra dá um resultado ao calhas — carvão, cobre, ferro, prata, ouro, esmeralda, diamante ou só pó. Com mais nível sai minério melhor. A tabela de resultados e as percentagens estão à vista, conforme o teu nível.
  4. Fundição — forno: minério + carvão = barras (cobre, ferro, aço, prata, ouro).
  5. Compra de metais (noutro sítio da cidade): vende minério, barras e pedras preciosas. Os preços sobem e descem.

#Cadeia ilegal

  1. Mina abandonada (sem blip, é para ser descoberta): veios de enxofre e salitre, e às vezes pólvora. Cada rocha partida tem policeAlert% de hipóteses de alertar a polícia (Config.PoliceJobs), que recebe uma zona aproximada no mapa (não o ponto exato) durante Config.PoliceBlipTime segundos.
  2. Laboratório clandestino (sem blip): enxofre + salitre + carvão = pólvora.
  3. Receptador (sem blip): compra o material ilegal.

#O minijogo

Em cada pancada aparece uma barra com uma zona boa e uma zona perfeita. Carrega em E no momento certo:

ResultadoDano
PerfeitoO dobro do dano
BomDano normal
FalharNenhum

X pára de minerar. O tamanho das zonas está em Config.Minigame (com enabled = false, todas as pancadas contam como normais).

#Rochas

As rochas partidas ficam partidas para todos os jogadores até voltarem a aparecer (respawn, em segundos).

RochaNívelPancadasDá
Pequena142–3 pedras
Média473–5 pedras
Grande9115–8 pedras
Veio de enxofre (ilegal)581–3 enxofre, 4% pólvora
Veio de salitre (ilegal)581–3 salitre, 4% pólvora

#Picaretas

PicaretaForçaSorteNívelPreço
Picareta1.00%1350
Picareta de aço1.6+0.5%62400
Picareta de diamante2.4+1%149500

A força é o dano por pancada; a sorte ajuda nas pedras raras da britadeira e da mina ilegal.

#Níveis

Cada rocha, cada pedra processada e cada barra dão XP. Até ao nível Config.Levels.max (30). O nível desbloqueia rochas maiores, picaretas melhores, minérios melhores na britadeira e receitas do forno.

#Fundição, forno e laboratório

  • Escolhes a quantidade (ou Máx.) e vês o progresso.
  • Continuam com o menu fechado, mas tens de ficar perto (distance).
  • No fim, o servidor volta a verificar o tempo, a distância e os materiais.

#Compradores

Cada comprador tem os seus preços (Config.Buyers), que mudam ±variation% a cada refresh minutos. As tendências (a subir / a descer) estão à vista.

#Acrescentar rochas e minas

Vai ao sítio no jogo e usa o comando de staff:

text
/minerarponto small

Escreve na consola (F8) a linha pronta a colar em Config.Mines. O tipo pode ser small, medium, large, sulfur ou saltpeter. A altura pode ser aproximada: as rochas são colocadas no chão sozinhas.

#Comandos de staff

ComandoO que faz
/minerarponto [tipo]Escreve na consola a linha para o config
/minerarxp [id] [quantidade]Dá XP a um jogador

Precisam da ACE drs.mining ou de um grupo de Config.StaffGroups.

#Opções principais

OpçãoPor defeitoDescrição
Config.Locale'pt'Idioma: pt ou en
Config.Account'cash'Conta usada no capataz
Config.Levels.max30Nível máximo
Config.Minigame.enabledtrueMinijogo nas pancadas
Config.SwingTime1.6Segundos por pancada (validado no servidor)
Config.Market.variation18Variação dos preços (%)
Config.Market.refresh45Minutos entre mudanças de preço
Config.PoliceJobspolice, sheriffQuem recebe os alertas da mina ilegal
Config.Leaderboard10Lugares na classificação
Config.Webhook''Webhook do Discord

#Configuração completa

config.lua
Config = {}

-- Idioma / Language: 'pt' ou 'en'
Config.Locale = 'pt'

-- Framework: 'auto' deteta Qbox/QBCore/ESX (ou 'qbx' | 'qb' | 'esx')
Config.Framework = 'auto'

-- Imagens dos itens ('auto' = pasta do inventário que estiver a correr) / Item images ('auto' = running inventory)
Config.ImagePath = 'auto'

-- Conta usada na loja do capataz / Account used at the foreman's shop
Config.Account = 'cash'

-- ------------------------------------------------------------------ como funciona / how it works
--  1. Mina normal → pedra                               (picareta + minijogo)
--  2. Fundição: britadeira → minério cru (carvão, cobre, ferro, prata, ouro, pedras raras)
--  3. Fundição: forno → barras (cobre, ferro, aço, prata, ouro)
--  4. Comprador de metais (fora da mina) compra minério, barras e pedras preciosas
--  Mina ilegal → enxofre e salitre (e às vezes pólvora) → laboratório → pólvora → receptador
--  1. Normal mine → stone · 2. Foundry crusher → raw ore · 3. Foundry furnace → bars · 4. Metal buyer
--  Illegal mine → sulfur and saltpeter (sometimes gunpowder) → lab → gunpowder → fence

-- ------------------------------------------------------------------ níveis / levels
Config.Levels = { max = 30, base = 60, growth = 1.22 }

-- ------------------------------------------------------------------ picaretas / pickaxes
-- power: dano por pancada (a pancada perfeita dá o dobro) / damage per hit (a perfect hit doubles it)
-- luck: bónus (%) nas pedras raras da britadeira e da mina ilegal / bonus (%) on rare finds
Config.Pickaxes = {
    { item = 'pickaxe',         power = 1.0, luck = 0.0, level = 1,  price = 350 },
    { item = 'steel_pickaxe',   power = 1.6, luck = 0.5, level = 6,  price = 2400 },
    { item = 'diamond_pickaxe', power = 2.4, luck = 1.0, level = 14, price = 9500 },
}

-- ------------------------------------------------------------------ minijogo / minigame
Config.Minigame = {
    enabled = true,    -- false = todas as pancadas contam como normais / every hit counts as normal
    zone = 0.22,       -- largura da zona boa (0-1) / width of the good zone (0-1)
    perfect = 0.06,    -- largura da zona perfeita / width of the perfect zone
}
Config.SwingTime = 1.6           -- segundos por pancada (validado no servidor) / seconds per swing (server-checked)
Config.MineKey = 38              -- E
Config.MineKeyLabel = 'E'
Config.StopKey = 73              -- X
Config.StopKeyLabel = 'X'

-- ------------------------------------------------------------------ rochas / rocks
-- hp: pancadas normais para partir · respawn: segundos (igual para todos) · drops: chance em %
-- hp: normal hits to break · respawn: seconds (shared by everyone) · drops: chance in %
Config.RockTypes = {
    -- mina normal: só pedra / normal mine: stone only
    small = {
        label = 'Rocha pequena', level = 1, hp = 4, xp = 3, respawn = 60, color = { 168, 162, 158 },
        models = { 'prop_rock_3_b', 'prop_rock_3_d' },
        drops = { { item = 'stone', min = 2, max = 3, chance = 100 } },
    },
    medium = {
        label = 'Rocha média', level = 4, hp = 7, xp = 6, respawn = 90, color = { 148, 163, 184 },
        models = { 'prop_rock_3_f', 'prop_rock_3_d' },
        drops = { { item = 'stone', min = 3, max = 5, chance = 100 } },
    },
    large = {
        label = 'Rocha grande', level = 9, hp = 11, xp = 11, respawn = 140, color = { 125, 211, 252 },
        models = { 'prop_rock_3_b', 'prop_rock_3_f' },
        drops = { { item = 'stone', min = 5, max = 8, chance = 100 } },
    },
    -- mina ilegal / illegal mine
    sulfur = {
        label = 'Veio de enxofre', level = 5, hp = 8, xp = 9, respawn = 150, color = { 250, 204, 21 }, illegal = true,
        models = { 'prop_rock_3_b', 'prop_rock_3_f' },
        drops = { { item = 'sulfur', min = 1, max = 3, chance = 100 }, { item = 'gunpowder', min = 1, max = 1, chance = 4, rare = true } },
    },
    saltpeter = {
        label = 'Veio de salitre', level = 5, hp = 8, xp = 9, respawn = 150, color = { 241, 245, 249 }, illegal = true,
        models = { 'prop_rock_3_d', 'prop_rock_3_f' },
        drops = { { item = 'saltpeter', min = 1, max = 3, chance = 100 }, { item = 'gunpowder', min = 1, max = 1, chance = 4, rare = true } },
    },
}

-- ------------------------------------------------------------------ minas / mines
-- As rochas são colocadas no chão sozinhas; a altura (z) pode ser aproximada.
-- Para apanhar coordenadas / To grab coordinates: /minerarponto [tipo]
Config.Mines = {
    {
        label = 'Pedreira de Sandy Shores',
        blip = { coords = vector3(2950.0, 2790.0, 41.0), sprite = 618, color = 5, scale = 0.85 },
        rocks = {
            { type = 'small',  coords = vector3(2929.6, 2797.9, 41.0) },
            { type = 'small',  coords = vector3(2934.8, 2793.1, 40.7) },
            { type = 'small',  coords = vector3(2940.3, 2797.4, 40.9) },
            { type = 'small',  coords = vector3(2926.2, 2805.2, 42.7) },
            { type = 'small',  coords = vector3(2932.6, 2809.9, 42.5) },
            { type = 'medium', coords = vector3(2939.2, 2806.1, 41.6) },
            { type = 'medium', coords = vector3(2944.1, 2801.5, 40.9) },
            { type = 'medium', coords = vector3(2950.6, 2846.3, 47.5) },
            { type = 'medium', coords = vector3(2956.9, 2849.4, 47.4) },
            { type = 'medium', coords = vector3(2961.8, 2845.2, 46.4) },
            { type = 'large',  coords = vector3(3026.4, 2769.3, 55.9) },
            { type = 'large',  coords = vector3(3029.1, 2762.2, 56.8) },
            { type = 'large',  coords = vector3(3024.3, 2754.4, 56.4) },
            { type = 'large',  coords = vector3(2967.9, 2695.4, 54.6) },
            { type = 'large',  coords = vector3(2960.6, 2699.1, 54.7) },
        },
    },
    {
        label = 'Mina abandonada',
        illegal = true,
        blip = false,                      -- sem blip: é para ser descoberta / no blip: it has to be found
        policeAlert = 8,                   -- % de alertar a polícia por rocha partida / % chance to alert police per rock broken
        rocks = {
            { type = 'sulfur',    coords = vector3(-596.1, 2079.6, 131.4) },
            { type = 'saltpeter', coords = vector3(-591.8, 2074.2, 131.1) },
            { type = 'sulfur',    coords = vector3(-600.7, 2071.9, 131.7) },
            { type = 'saltpeter', coords = vector3(-604.3, 2082.5, 132.0) },
            { type = 'sulfur',    coords = vector3(-588.4, 2084.6, 130.9) },
            { type = 'saltpeter', coords = vector3(-608.9, 2076.1, 132.3) },
        },
    },
}

-- Polícia avisada pela mina ilegal / Police alerted by the illegal mine
Config.PoliceJobs = { 'police', 'sheriff' }
Config.PoliceBlipTime = 90

-- ------------------------------------------------------------------ capataz (loja, perfil, classificação) / foreman
Config.Hub = {
    label = 'Capataz da pedreira',
    coords = vector4(2956.2, 2744.9, 43.5, 280.0),
    model = 's_m_y_construct_01',
    scenario = 'WORLD_HUMAN_CLIPBOARD',
    blip = { sprite = 480, color = 5, scale = 0.8 },
}
Config.ShopItems = {
    { item = 'water_bottle', price = 15 },
    { item = 'sandwich', price = 20 },
}

-- ------------------------------------------------------------------ fundição e laboratório / foundry and lab
-- process: britadeira (1 pedra → 1 sorteio da tabela; nil = só pó, não dá nada)
-- process: crusher (1 stone → 1 roll of the table; item = nil means dust, nothing)
-- recipes: forno / furnace
Config.Stations = {
    foundry = {
        label = 'Fundição',
        coords = vector3(1109.9, -2008.2, 31.0),
        blip = { sprite = 436, color = 17, scale = 0.8 },
        distance = 3.0,
        maxQuantity = 50,
        scenario = 'WORLD_HUMAN_STAND_FIRE',
        process = {
            input = 'stone', time = 2, xp = 1,
            table = {
                { item = nil,          weight = 18, level = 1 },
                { item = 'coal',       weight = 30, level = 1 },
                { item = 'copper_ore', weight = 22, level = 1 },
                { item = 'iron_ore',   weight = 17, level = 3 },
                { item = 'silver_ore', weight = 8,  level = 8 },
                { item = 'gold_ore',   weight = 4,  level = 12 },
                { item = 'emerald',    weight = 0.6, level = 10, rare = true },
                { item = 'diamond',    weight = 0.3, level = 15, rare = true },
            },
        },
        recipes = {
            { id = 'copper',       level = 1,  time = 5,  xp = 4,  input = { { item = 'copper_ore', amount = 3 }, { item = 'coal', amount = 1 } }, output = { item = 'copper', amount = 1 } },
            { id = 'iron',         level = 3,  time = 6,  xp = 6,  input = { { item = 'iron_ore', amount = 3 }, { item = 'coal', amount = 1 } }, output = { item = 'iron', amount = 1 } },
            { id = 'steel',        level = 6,  time = 9,  xp = 9,  input = { { item = 'iron', amount = 2 }, { item = 'coal', amount = 2 } }, output = { item = 'steel', amount = 1 } },
            { id = 'silver_ingot', level = 8,  time = 9,  xp = 10, input = { { item = 'silver_ore', amount = 3 }, { item = 'coal', amount = 2 } }, output = { item = 'silver_ingot', amount = 1 } },
            { id = 'goldbar',      level = 12, time = 12, xp = 15, input = { { item = 'gold_ore', amount = 4 }, { item = 'coal', amount = 2 } }, output = { item = 'goldbar', amount = 1 } },
        },
    },
    lab = {
        label = 'Laboratório clandestino',
        coords = vector3(1391.9, 3605.6, 38.94),
        blip = false,
        distance = 2.5,
        maxQuantity = 25,
        illegal = true,
        scenario = 'PROP_HUMAN_BUM_BIN',
        recipes = {
            { id = 'gunpowder', level = 5, time = 8, xp = 8, input = { { item = 'sulfur', amount = 2 }, { item = 'saltpeter', amount = 3 }, { item = 'coal', amount = 1 } }, output = { item = 'gunpowder', amount = 2 } },
        },
    },
}

-- ------------------------------------------------------------------ compradores / buyers
-- Os preços mudam ± variation % a cada refresh minutos / Prices move ± variation % every refresh minutes
Config.Market = { variation = 18, refresh = 45 }
Config.Buyers = {
    metals = {
        label = 'Compra de metais',
        coords = vector4(-470.3, -1718.5, 18.7, 290.0),
        model = 's_m_m_dockwork_01',
        scenario = 'WORLD_HUMAN_CLIPBOARD',
        blip = { sprite = 605, color = 46, scale = 0.8 },
        account = 'cash',
        prices = {
            coal = 6, copper_ore = 12, iron_ore = 18, silver_ore = 34, gold_ore = 55,
            copper = 30, iron = 44, steel = 70, silver_ingot = 95, goldbar = 180,
            emerald = 450, diamond = 900,
        },
    },
    fence = {
        label = 'Receptador',
        coords = vector4(1240.4, -3167.4, 7.1, 270.0),
        model = 'g_m_y_lost_01',
        scenario = 'WORLD_HUMAN_SMOKING',
        blip = false,
        account = 'cash',
        illegal = true,
        prices = { sulfur = 25, saltpeter = 25, gunpowder = 120 },
    },
}

-- ------------------------------------------------------------------ outros / other
Config.Leaderboard = 10
Config.AdminCommand = 'minerarponto'   -- staff: mostra as coordenadas para o config / prints coordinates for the config
Config.XPCommand = 'minerarxp'         -- staff: /minerarxp [id] [quantidade]
Config.StaffGroups = { 'god', 'admin', 'superadmin' }
Config.Webhook = ''
Config.UseOxNotify = false

#Para programadores

server
exports.drs_mining:AddXP(src, 100)                          -- devolve o novo nível
exports.drs_mining:GetLevel(src)
exports.drs_mining:GetMarketPrice('metals', 'gold_ore')     -- preço atual num comprador

#Segurança

  • O estado das rochas está no servidor e cada pancada é validada: distância, picareta, nível e tempo mínimo entre pancadas. O dano máximo é limitado.
  • Os sorteios da britadeira e dos drops são feitos no servidor.
  • Na fundição e no laboratório, o tempo, a distância e os materiais são verificados outra vez no fim.
  • O dinheiro e os itens são movidos só no servidor, com reembolso se o inventário estiver cheio.

#Resolução de problemas

Não consigo partir a rocha — precisas de uma picareta e do nível da rocha. As rochas grandes pedem nível 9.

Os itens aparecem sem imagem — copia install/images/ para a pasta de imagens do teu inventário.

A britadeira só dá pó — é normal numa parte das pedras (cerca de 26% no nível 1; a percentagem certa para o teu nível está na própria britadeira). Com mais nível e melhor picareta saem minérios melhores.

Não encontro a mina ilegal nem o receptador — não têm blip de propósito. As posições estão em Config.Mines e Config.Buyers.fence.