local function attItem(mdl) local attData = simfphys.getAttByModel(mdl) return {'car_att', { name = attData.name, desc = attData.desc, icon = attData.icon, mass = attData.mass, volume = attData.volume, colorable = not attData.noPaint or nil, attmdl = attData.mdl, model = attData.mdl, skin = attData.skin, scale = attData.scale, }} end local function sendItem(item, sentNo, sentYes) return function(ply, amount) local data if isstring(item) then data = {{ item, amount }} elseif istable(item) then data = octolib.array.series(item, amount) end local sent, msg = halloween.sendItems(ply, data) if not sent then ply:Notify('warning', msg or sentNo) else ply:Notify('hint', sentYes) end return sent end end local function icon(name) return 'octoteam/icons-halloween/' .. name .. '.png' end halloween.registerItem('mystery_sweet', { name = 'Загадочная конфета', icon = icon('mystery_sweet'), desc = 'Конфета, обладающая случайным вкусом. Арбуз? Яблоко? А может, рвота или ушная сера? Попробуй и узнаешь!', price = 100, deliver = sendItem('h20_sweets', 'Не удалось отправить загадочные конфеты', 'Загадочные конфеты отправлены по почте и придут через пару минут'), }) halloween.registerItem('guitar', { name = 'Гитара', icon = icon('guitar'), desc = 'Позволяет скрасить свое одиночество или задать атмосферу в компании', price = 300, deliver = sendItem({'weapon', { name = L.guitar, icon = octolib.icons.color('guitar'), model = 'models/custom/guitar/m_d_45.mdl', wepclass = 'guitar', mass = 2, volume = 5, ammoadd = 0, clip1 = 0, clip2 = 0, }}, 'Не удалось отправить гитару', 'Гитара отправлена по почте и придет через пару минут'), }) local masks = { 'cleaver', 'monkey', 'zombie', 'hockey', 'gingerbread', 'top_hat', 'doctor', 'pig', 'bear', 'hoff_widesmile', 'hoff_tears', 'hoff_tinysmile', 'hoff_dude', 'hoff_killme', 'hoff_helpme' } for _, v in ipairs(masks) do local mask = CFG.masks[v] local name = mask.name if mask.desc then name = name .. ' ' .. mask.desc end local item = { name = mask.name, icon = mask.icon, desc = mask.desc, mask = v, } halloween.registerItem('mask_' .. v, { name = name, icon = icon('mask_' .. v), skin = mask.skin, desc = 'Стильно, модно, молодежно. Можно надеть на голову', price = 3000, deliver = sendItem({'h_mask', item}, 'Не удалось отправить маску', 'Маска отправлена по почте и придет через пару минут'), }) halloween.registerCaseItem('mask_' .. v, { name = name, icon = icon('mask_' .. v), maxMass = 0.3, maxVolume = 0.5, give = function(_, cont) cont:AddItem('h_mask', item) end, }) end halloween.registerItem('theme', { name = 'Очки с оранжевыми линзами', icon = icon('theme'), desc = 'Понравилось хэллоуинское настроение? Ты можешь продлить его, захватив с собой эти очки с оранжевыми линзами!\n\n- Хэллоуинская тема. Ее можно будет включить в любой момент в настройках', price = 5000, max = 1, deliver = function(ply) ply:SetDBVar('halloweenTheme', true) ply:SetLocalVar('halloweenTheme', true) ply:ConCommand('octogui_reloadf4') ply:Notify('hint', 'Хэллоуинскую тему можно активировать в разделе "Другое" в настройках') return true end, }) halloween.registerItem('jar', { name = 'Банка с глазами', icon = icon('jar'), desc = 'Старая банка с устрашающими глазами. Будет хорошо смотреться на приборной панели твоего автомобиля!', price = 6000, deliver = function(ply, amount) local data = octolib.array.series(attItem('models/props/spookington/eyejar.mdl'), amount) local sent, msg = halloween.sendItems(ply, data) if not sent then ply:Notify('warning', msg or 'Не удалось отправить банку с глазами') else ply:Notify('hint', 'Банка с глазами отправлена по почте и придет через пару минут') end return sent end, }) halloween.registerItem('spider', { name = 'Паучок', icon = icon('spider'), desc = 'Страшный, волосатый, но отчасти милый хэллоуинский паучок. Представляешь, если он повиснет в салоне твоего автомобиля? Это будет просто безумно круто!', price = 6000, deliver = function(ply, amount) local data = octolib.array.series(attItem('models/props/spookington/spider_toy.mdl'), amount) local sent, msg = halloween.sendItems(ply, data) if not sent then ply:Notify('warning', msg or 'Не удалось отправить паучка') else ply:Notify('hint', 'Паучок отправлен по почте и придет через пару минут') end return sent end, }) halloween.registerItem('sedan', { name = 'Седан', icon = icon('sedan'), desc = 'Подарочный сертификат автосалона на эксклюзивный черный седан!\n\n- Автомобиль будет доставлен в гараж\n- При продаже авто деньги не начислятся', price = 8500, deliverAsync = function(ply, amount, callback) octolib.func.parallel( octolib.array.series(function(res) carDealer.ownVeh(ply:SteamID(), 'halloween_sedan', function(_, plate) res(plate) end) end, amount) ):Then(function(plates) callback(true) if not IsValid(ply) then return end if amount == 1 then ply:Notify('hint', 'Автомобиль с регистрационным номером ' .. plates[1] .. ' доставлен в твой гараж') elseif amount == 2 then ply:Notify('hint', 'Автомобили с регистрационными номерами ' .. plates[1] .. ' и ' .. plates[2] .. ' доставлены в твой гараж') else local last = plates[#plates] table.remove(plates) ply:Notify('hint', 'Автомобили с регистрационными номерами ' .. string.Implode(', ', plates) .. ' и ' .. last .. ' доставлены в твой гараж') end end):Catch(function(err) ErrorNoHalt(err) callback(false) end) end, }) halloween.registerItem('pickup', { name = 'Пикап', icon = icon('pickup'), desc = 'Подарочный сертификат автосалона на эксклюзивный оранжевый пикап!\n\n- Автомобиль будет доставлен в гараж\n- При продаже авто деньги не начислятся', price = 8500, deliverAsync = function(ply, amount, callback) octolib.func.parallel( octolib.array.series(function(res) carDealer.ownVeh(ply:SteamID(), 'halloween_pickup', function(_, plate) res(plate) end) end, amount) ):Then(function(plates) callback(true) if not IsValid(ply) then return end if amount == 1 then ply:Notify('hint', 'Автомобиль с регистрационным номером ' .. plates[1] .. ' доставлен в твой гараж') elseif amount == 2 then ply:Notify('hint', 'Автомобили с регистрационными номерами ' .. plates[1] .. ' и ' .. plates[2] .. ' доставлены в твой гараж') else local last = plates[#plates] table.remove(plates) ply:Notify('hint', 'Автомобили с регистрационными номерами ' .. string.Implode(', ', plates) .. ' и ' .. last .. ' доставлены в твой гараж') end end):Catch(function(err) ErrorNoHalt(err) callback(false) end) end, }) -- CASE ITEMS halloween.registerCaseItem('sweets_low', { name = 'Загадочные конфеты', icon = icon('mystery_sweet'), maxMass = 0.03, maxVolume = 0.03, give = function(ply, cont) local sweets = math.random(3) cont:AddItem('h20_sweets', sweets) ply:Notify('hint', 'Несколько загадочных конфет добавлено тебе в инвентарь') end, }) halloween.registerCaseItem('money_low', { name = 'Потрепанный кошель', icon = icon('money_low'), maxMass = 0.04, maxVolume = 0.04, give = function(ply, cont) local money = math.random(4000) cont:AddItem('money', money) ply:Notify('hint', 'Как неожиданно и приятно... ' .. DarkRP.formatMoney(money) .. ' добавлено тебе в инвентарь') end, }) halloween.registerCaseItem('money_large', { name = 'Мешок с монетками', icon = icon('money_large'), maxMass = 0.25, maxVolume = 0.25, give = function(ply, cont) local money = math.random(4000, 25000) cont:AddItem('money', money) ply:Notify('hint', 'Вот так везение... ' .. DarkRP.formatMoney(money) .. ' добавлено тебе в инвентарь') end, }) halloween.registerCaseItem('sweets_large', { name = 'Горсть конфет', icon = icon('mystery_sweet'), maxMass = 0.13, maxVolume = 0.13, give = function(ply, cont) local sweets = math.random(3, 13) cont:AddItem('h20_sweets', sweets) ply:Notify('hint', sweets .. octolib.string.formatCount(sweets, ' загадочная конфета добавлена', ' загадочных конфеты добавлены', ' загадочных конфет добавлено') .. ' тебе в инвентарь') end, }) halloween.registerCaseItem('candy', { name = 'Испорченный леденец', icon = icon('candy'), maxMass = 0.1, maxVolume = 0.05, give = function(_, cont) cont:AddItem('souvenir', { name = 'Испорченный леденец', icon = octolib.icons.color('food_candy2'), model = 'models/griim/foodpack/candycane.mdl', desc = 'Старый леденец. Присмотревшись к нему можно увидеть паутину. Лучше не пытаться его съесть, а как сувенир - очень даже неплохая вещица!', }) end, }) halloween.registerCaseItem('booze', { name = 'Хэллоуинская настойка', icon = icon('booze'), maxMass = 1.5, maxVolume = 1, give = function(_, cont) cont:AddItem('drug_booze2', { name = 'Хэллоуинская настойка', icon = octolib.icons.color('bottle_wine'), }) end, }) halloween.registerCaseItem('os_dobro', { name = 'Карта клуба почетных жителей "Добродей"', icon = icon('os_dobro'), give = function(ply) ply:osGiveItem('jobs_1m') ply:Notify('hint', 'Ты получил плюшку "Добродей" на месяц! Активировать ее можно в F4 -> Плюшки') end, }) halloween.registerCaseItem('att_pumpkin', { name = 'Тыква-лампа для автомобиля', icon = icon('pumpkin'), maxMass = 1, maxVolume = 3, give = function(_, cont) cont:AddItem(unpack(attItem('models/halloween2015/pumbkin_n_f01.mdl'))) end, }) halloween.registerCaseItem('att_spider', { name = 'Паучок для автомобиля', icon = icon('spider'), maxMass = 0.7, maxVolume = 1, give = function(_, cont) cont:AddItem(unpack(attItem('models/props/spookington/spider_toy.mdl'))) end, }) -- CASES halloween.registerCase('gift', { name = 'Подарок от Джека', icon = icon('gift'), desc = 'Я кладу какой-то предмет в коробочку и отправляю тебе по почте. Что за предмет - узнаешь, когда откроешь ;)', price = 750, items = { {31, 'sweets_low'}, {20, 'booze'}, {20, 'candy'}, {13, 'sweets_large'}, {9, 'money_low'}, {5, 'money_large'}, {2, 'os_dobro'}, {1.5, 'att_pumpkin'}, {1.5, 'att_spider'}, }, }) halloween.registerCase('mask', { name = 'Какая-то маска', icon = icon('case-masks'), desc = 'Теряешься в моем огромном ассортименте масок? Я могу помочь выбрать! Никаких предпочтений по маскам у меня нет, поэтому я честно выберу случайную маску. Никакого мошенничества!', price = 3000, items = octolib.table.mapSequential(masks, function(v) return {1, 'mask_' .. v} end), })