FiveM Yiyecek ve Restoran Sistemi: Mutfakları Scriptleme
FiveM'de oyun içi restoranlar işletin. Şehrinizin yemek sahnesini canlandırmak için üretim tarifleri, kasa kullanıcı arayüzleri, teslimat işleri ve en iyi restoran script'leri.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Restoran Sistemleri Roleplay'i Neden Geliştirir?
Yiyecek ve restoran sistemleri, bir FiveM roleplay sunucusuna ekleyebileceğiniz sosyal açıdan en ilgi çekici özellikler arasındadır. Madencilik veya balıkçılık gibi tek kişilik aktivitelerin aksine restoranlar, oyuncuların birlikte yemek pişirdiği, servis yaptığı ve yemek yediği doğal buluşma noktaları oluşturur. İyi tasarlanmış bir restoran sistemi, sivil oyunculara suça karışmayan anlamlı bir iş verir, karakterlerin belirli konumları düzenli olarak ziyaret etmesi için bir neden sunar ve malzeme alımları yoluyla ekonomiden para çıkışı sağlar. Restoranlar ayrıca çiftçilik veya avcılık scriptleri ile birleştirildiğinde tedarik zincirleri oluşturur; yani bir oyuncu domates yetiştirir, diğeri bunları teslim eder ve üçüncüsü de hamburger haline getirir. Bu birbiriyle bağlantılı oynanış döngüsü, yaşayan bir sunucuyu, oyuncuların sürekli aynı rotayı tekrarladığı bir sunucudan ayıran şeydir. Yiyecek ögelerinin kendisi can, dayanıklılık veya zırh yenilenmesine geçici güçlendirmeler sağlayarak restoranları mesleği veya fraksiyonu ne olursa olsun sunucudaki her oyuncu için önemli hale getirebilir.
Restoran Yapılandırması ve Menü Tasarımı
Restoran konumlarınızı, menülerini ve her yemek için gereken malzemeleri tanımlayarak başlayın. Veri odaklı bir yapılandırma, sunucu sahiplerinin temel mantığı değiştirmeden yeni restoranlar eklemesine olanak tanır. Her restoran: menü seçenekleri, iç mekan prop'ları ve NPC personel üniformaları ile benzersiz bir kimliğe sahip olmalıdır. Yapılandırmanızı, her menü öğesinin gerekli malzemelerini, üretim süresini, satış fiyatını ve tüketiciye sağladığı buff etkilerini listeleyecek şekilde yapılandırın. Bu yaklaşım, gıda ekonominizi dengelemenin kod yeniden yazmak yerine yapılandırma değerlerini ayarlamaya indirgendiği anlamına gelir:
Config.Restaurants = {
['burgershot'] = {
label = 'Burger Shot',
blip = { sprite = 106, color = 1, scale = 0.8 },
zones = {
counter = vector3(-1196.42, -894.04, 13.98),
kitchen = vector3(-1199.71, -897.12, 13.98),
storage = vector3(-1202.84, -899.35, 13.98),
},
menu = {
{
item = 'bleeder_burger',
label = 'Bleeder Burger',
price = 25,
ingredients = {
{ item = 'raw_patty', amount = 2 },
{ item = 'burger_bun', amount = 1 },
{ item = 'lettuce', amount = 1 },
{ item = 'cheese_slice', amount = 2 },
},
craftTime = 8000,
buffs = {
hunger = 45,
thirst = 5,
armor_regen = { amount = 2, duration = 120 }
}
},
{
item = 'heartstopper',
label = 'Heart Stopper',
price = 40,
ingredients = {
{ item = 'raw_patty', amount = 3 },
{ item = 'burger_bun', amount = 1 },
{ item = 'bacon', amount = 4 },
{ item = 'cheese_slice', amount = 3 },
{ item = 'onion_ring', amount = 2 },
},
craftTime = 12000,
buffs = {
hunger = 80,
thirst = -10,
stamina_boost = { amount = 15, duration = 180 }
}
},
},
requiredJob = 'burgershot',
},
}
The zones tablosu restoranı işlevsel alanlara ayırır. Tezgah bölgesi, müşterilerin sipariş verdiği ve yemekleri teslim aldığı yerdir. Mutfak bölgesi, ürünleri pişirmek için kullanan çalışanlarla sınırlandırılmıştır. Depolama bölgesi, malzemelerin stoklandığı ve yönetildiği yerdir. Bu mekansal ayrım, bir aşçının müşterilere doğrudan ocaktan servis yapamayacağı gerçekçi bir iş akışını zorunlu kılarak salon ve mutfak personeli arasında doğal bir ekip çalışması oluşturur.
Yemek Pişirme Mekanikleri ve Üretim Akışı
Yemek pişirme süreci sıkıcı olmadan etkileşimli hissettirmelidir. Bir oyuncu bir öğeyi pişirmeye başladığında, gerekli tüm malzemelerin restoranın depo envanterinde bulunduğunu kontrol edin, bunları düşün ve bir ilerleme çubuğu veya minigame sekansı başlatın. Temel öğeler için basit ilerleme çubukları yeterlidir, ancak özel yemekler için beceri kontrolü (skill-check) minigame'leri eklemek ustalık hissi yaratır ve AFK pişirme suiistimallerini önler. Pişirme animasyonu, oyuncunun ne yaptığını yakındaki gözlemcilere görsel olarak aktarmak için barbekü veya mutfak tezgahı senaryoları gibi uygun GTA native'lerini kullanmalıdır:
function StartCooking(restaurantId, menuIndex)
local restaurant = Config.Restaurants[restaurantId]
local recipe = restaurant.menu[menuIndex]
-- Check ingredients in storage
local hasAll = lib.callback.await('restaurant:checkIngredients', false,
restaurantId, recipe.ingredients)
if not hasAll then
lib.notify({ description = 'Missing ingredients!', type = 'error' })
return
end
-- Lock player into cooking animation
local playerPed = PlayerPedId()
local animDict = 'mini@repair'
lib.requestAnimDict(animDict)
TaskPlayAnim(playerPed, animDict, 'fixing_a_player', 8.0, -8.0,
-1, 1, 0, false, false, false)
-- Cooking progress with skill check
local success = lib.skillCheck(
{'easy', 'easy', 'medium'},
{'w', 'a', 's', 'd'}
)
ClearPedTasks(playerPed)
if success then
TriggerServerEvent('restaurant:finishCooking', restaurantId, menuIndex)
lib.notify({ description = 'Cooked: ' .. recipe.label, type = 'success' })
else
-- Failed cooking wastes some ingredients
TriggerServerEvent('restaurant:failedCooking', restaurantId, menuIndex)
lib.notify({ description = 'Burnt the food! Some ingredients wasted.',
type = 'error' })
end
end
Beceri kontrolü mekaniği, yemek pişirmeye bir risk-ödül unsuru ekler. Başarısız denemeler tüm malzemeleri değil yalnızca bir kısmını harcamalıdır; böylece yeni oyuncular ağır şekilde cezalandırılmazken becerilerini geliştirmeye teşvik edilir. Zorluğu yemeğin değerine göre ölçeklendirebilir, ucuz öğelerin pişirilmesini kolaylaştırabilir ve pahalı özel yemeklerin gerçek bir dikkat gerektirmesini sağlayabilirsiniz. Bu, yeni çalışanların basit öğelerle başlayıp kademeli olarak premium menüye ulaştığı doğal bir ilerleme yaratır.
Malzeme Tedarik Zinciri
Restoranların düzenli bir malzeme akışına ihtiyacı vardır ve oyuncuların bu malzemeleri nasıl elde ettiği, oyun döngüsünün önemli bir bölümünü belirler. Üç yaygın yaklaşım bulunur: toptancı NPC satıcılarından satın alma, oyuncular tarafından işletilen çiftliklerden veya avcılıktan tedarik etme ve hibrit bir model. Toptan yaklaşımın uygulanması daha basittir ve bulunabilirliği garanti eder, ancak oyuncu etkileşiminden yoksundur. Diğer oyunculardan tedarik etmek zengin ekonomik ilişkiler yaratır, ancak tedarikçiler çevrimdışı olduğunda restoranın aksama riskini taşır. Hibrit model en iyi şekilde çalışır: ekmek, sıvı yağ ve baharat gibi temel malzemeler NPC'lerden gelirken taze et, organik sebzeler ve özel soslar gibi birinci sınıf malzemeler oyuncu aktivitelerinden tedarik edilmelidir. Bu, restoranların her zaman temel düzeyde çalışabilmesini sağlarken tüm parçalar birleştiğinde tüm tedarik zincirini ödüllendirir. Malzeme miktarlarını takip eden ve yöneticilerin restoranın banka hesabından düşülecek toptan siparişler vermesine olanak tanıyan restoran başına bir depolama sistemi uygulayın:
RegisterNetEvent('restaurant:orderSupplies', function(restaurantId, order)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
-- Verify player is manager rank
if Player.PlayerData.job.name ~= restaurantId then return end
if Player.PlayerData.job.grade.level < 3 then
TriggerClientEvent('QBCore:Notify', src,
'Only managers can order supplies', 'error')
return
end
-- Calculate total cost
local totalCost = 0
for _, item in ipairs(order) do
local wholesalePrice = Config.WholesalePrices[item.name]
if wholesalePrice then
totalCost = totalCost + (wholesalePrice * item.amount)
end
end
-- Deduct from restaurant bank account
local balance = exports['qb-management']:GetAccount(restaurantId)
if balance < totalCost then
TriggerClientEvent('QBCore:Notify', src,
'Insufficient restaurant funds', 'error')
return
end
exports['qb-management']:RemoveMoney(restaurantId, totalCost)
-- Add items to restaurant storage
for _, item in ipairs(order) do
AddToRestaurantStorage(restaurantId, item.name, item.amount)
end
TriggerClientEvent('QBCore:Notify', src,
string.format('Order placed! $%d deducted', totalCost), 'success')
end)
Müşteri Sipariş ve Hizmet Akışı
Müşteri deneyimi, ister bir NPC kasiyerden ister oyuncu olan bir çalışandan sipariş verilsin, sorunsuz olmalıdır. Bir müşteri tezgah bölgesine yaklaştığında, mevcut öğeleri fiyatları ve aktif güçlendirme (buff) açıklamalarıyla gösteren bir menü arayüzü görüntüleyin. Oyuncuların çalıştığı restoranlarda, sipariş mutfak ekranına yönlendirilmeli ve böylece aşçılar gelen siparişleri gerçek zamanlı olarak görebilmelidir. Verilişinden hazırlanmasına ve teslimatına kadar her siparişi takip eden bir sipariş kuyruğu sistemi uygulayın. Bu, yoğun dönemlerde mutfağın sıkıştığı ve aşçılık rolüne otantik bir baskı katan bir fast-food simülasyonu yaratır. Müşterilere sipariş durumunu basit göstergelerle gösterin: sipariş edildi, pişiriliyor, teslime hazır. Yemek hazır olduğunda müşteriye bildirin ve tezgahtan almasını sağlayın. Premium bir deneyim için, oyuncu garsonların servis hızına göre bahşiş kazanarak yiyecekleri doğrudan masalarda oturan müşterilere teslim etmesine olanak tanıyın.
Yiyecek Güçlendirmeleri ve Tüketim Etkileri
Yiyecek ögeleri, yalnızca açlığı gidermenin ötesinde anlamlı oynanış avantajları sağlamalıdır. Farklı yiyeceklerin, oyuncuları aktivitelerden önce stratejik olarak beslenmeye teşvik eden geçici nitelik değişiklikleri sunduğu bir güçlendirme sistemi uygulayın. Yaya kovalamacasından önce dayanıklılığı artıran bir yemek, bir soygundan önce zırh yenileyen bir yiyecek veya bir dövüşten sonra zamanla can yenileyen bir öğün, yiyecek ögelerini sunucu ekonomisinde gerçekten değerli kılar. Oyuncu başına aktif güçlendirmeleri takip edin ve bunları HUD üzerinde gösterin; böylece oyuncular hangi etkilere sahip olduklarını ve sürelerinin ne zaman dolacağını bilir:
local activeBuffs = {}
function ApplyFoodBuff(buffType, amount, duration)
-- Remove existing buff of same type
if activeBuffs[buffType] then
activeBuffs[buffType].active = false
end
activeBuffs[buffType] = {
amount = amount,
endTime = GetGameTimer() + (duration * 1000),
active = true
}
-- Send buff data to HUD
SendNUIMessage({
action = 'addBuff',
buffType = buffType,
amount = amount,
duration = duration
})
-- Create buff application thread
CreateThread(function()
local buff = activeBuffs[buffType]
while buff.active and GetGameTimer() < buff.endTime do
if buffType == 'armor_regen' then
local current = GetPedArmour(PlayerPedId())
if current < 100 then
SetPedArmour(PlayerPedId(), math.min(100, current + amount))
end
elseif buffType == 'stamina_boost' then
RestorePlayerStamina(PlayerId(), amount * 0.1)
elseif buffType == 'health_regen' then
local current = GetEntityHealth(PlayerPedId())
local max = GetEntityMaxHealth(PlayerPedId())
if current < max then
SetEntityHealth(PlayerPedId(), math.min(max, current + amount))
end
end
Wait(1000)
end
activeBuffs[buffType] = nil
SendNUIMessage({ action = 'removeBuff', buffType = buffType })
end)
end
Yiyecek buff'larını dikkatlice dengeleyin; böylece zorunlu hale gelmeden oynanışı zenginleştirirler. Buff'lar, oyuncuların her aktiviteden önce yemek zorunda hissetmelerine neden olacak kadar güçlü olmadan fark edilir bir avantaj sağlamalıdır. Süreyi iki ila beş dakika arasında makul tutun, böylece buff ekonomisi aktif kalır. Buff istiflemesi suiistimallerini önlemek için aynı yiyeceğin kısa sürede tekrar tekrar tüketilmesi durumunda azalan getiri eklemeyi düşünün.
Çalışan Yönetimi ve Maaş Bordrosu
Bir restoran sistemi, farklı roller ve izinlere sahip düzgün bir hiyerarşiye ihtiyaç duyar. En az üç kademe tanımlayın: çalışan, şef ve müdür. Çalışanlar ürünleri pişirebilir ve müşterilere servis yapabilir. Şefler, çalışanların yaptığı her şeyi yapabilir, ayrıca malzeme deposunu yönetebilir ve siparişleri onaylayabilir. Müdürler ise çalışanları işe alma ve işten çıkarma, fiyatları belirleme ve restoranın banka hesabına erişme dahil olmak üzere tam kontrole sahiptir. Maaş ödemelerini restoranın gelirine bağlayın, böylece çalışanlar temel bir ücretin yanı sıra bizzat pişirdikleri veya servis ettikleri ürünler üzerinden komisyon kazanır. Bu durum, AFK mesai başlatmak yerine aktif katılımı teşvik eder. Meslek deneyimine derinlik katan liderlik tabloları ve performans değerlendirmeleri oluşturmak için pişirilen ürünler, hizmet verilen müşteriler ve elde edilen gelir gibi bireysel çalışan istatistiklerini takip edin.
Performans Optimizasyonu
Restoran sistemleri, dikkatli bir şekilde optimize edilmezse istemci performansını zorlayabilecek birden fazla etkileşim alanı, NPC ped'leri, prop objeleri ve gerçek zamanlı sipariş takibi içerir. Kare başına koordinat hesaplamalarını ortadan kaldırmak için marker tabanlı mesafe kontrolleri yerine target sistemi etkileşimlerini kullanın. Şunu kullanarak restoran iç mekân prop'larını yalnızca oyuncular binanın içindeyken render edin: IsPlayerInScope kontrolleri. Sipariş sırası görünümü için her sipariş değişikliğinde tek tek güncellemeler göndermek yerine NUI mesajlarınızı toplu hale getirin. Sunucu tarafında, restoran depo envanterlerini bellekte önbelleğe alın ve her malzeme değişikliğinden sonra değil, belirli zaman aralıklarıyla veritabanına yazın. Aynı anda birden fazla restoran aktif olduğunda, yazma artışlarını önlemek için veritabanı eşitleme döngülerini kademelendirin. Resource yeniden başlatmaları boyunca biriken sahipsiz entity'leri önlemek için resource durduğunda tüm blip'leri, prop'ları ve NPC entity'lerini temizleyin. Oyuncularınız sizden önce darboğazları bulmadan önce, aynı anda çalışan birden fazla restoran, birlikte çalışan birkaç aşçı ve düzenli bir müşteri siparişi akışı ile sisteminizi yük altında test edin.