Roblox पर RPG और सर्वाइवल गेम्स के लिए इन्वेंटरी मैनेजमेंट सबसे महत्वपूर्ण हिस्सा है। खराब डिज़ाइन से आइटम क्लोनिंग और लैग होता है।
सर्वर वैलिडेशन, सुव्यवस्थित डेटा स्ट्रक्चर और सत्र-लॉक DataStore लागू करके सुरक्षित और तेज़ इन्वेंटरी सिस्टम बनाया जा सकता है।
1. इन्वेंटरी मॉडल: फिक्स्ड स्लॉट बनाम ग्रिड बनाम वज़न सीमा
अपने गेमप्ले के लिए सही मॉडल चुनना:
- फिक्स्ड स्लॉट: क्लासिक हॉटबार मॉडल जिसमें तय संख्या में स्लॉट होते हैं।
- स्थानिक ग्रिड (Tetris): विभिन्न आकार वाले आइटम्स के लिए 2D ग्रिड सिस्टम।
- वज़न सीमा (Encumbrance): कुल वज़न अधिक होने पर कैरेक्टर की गति धीमी होना।
2. सर्वर नियंत्रण और ऑप्टिमिस्टिक UI
बिना किसी सुरक्षा खतरे के तेज़ इंटरैक्शन:
- ऑप्टिमिस्टिक UI: ड्रैग करते ही आइकन तुरंत हिलता है, सर्वर के जवाब का इंतज़ार नहीं करता।
- सर्वर सत्यापन: सर्वर नियम और सीमाएं जांचने के बाद बदलाव को सुरक्षित करता है।
- रोलबैक: अगर क्रिया गलत पाई जाती है, तो आइटम तुरंत पुरानी जगह लौट आता है।
3. डेटा संरचना और स्टैक प्रबंधन
Luau में स्थिर और गतिशील डेटा को अलग रखना:
- बेस डेटा बनाम इंस्टेंस: नाम और वज़न ReplicatedStorage में, यूनीक UUID प्लेयर डेटा में।
- स्टैक मर्जिंग: एक ही प्रकार के आइटम को सही मात्रा में जोड़ना।
- स्टोरेज बचत: खाली स्लॉट हटाकर DataStore साइज़ को 4MB सीमा में रखना।
-- सर्वर इन्वेंटरी मैनेजर
local InventoryManager = {}
InventoryManager.__index = InventoryManager
local ItemDatabase = require(game.ReplicatedStorage.ItemDatabase)
function InventoryManager.new(player, maxSlots, maxWeight)
local self = setmetatable({}, InventoryManager)
self.Player = player
self.MaxSlots = maxSlots or 30
self.MaxWeight = maxWeight or 100
self.Slots = table.create(self.MaxSlots, false)
self.CurrentWeight = 0
self.IsLocked = false
return self
end
function InventoryManager:AddItem(itemId, amount)
if self.IsLocked then return false, "INVENTORY_LOCKED" end
local itemData = ItemDatabase[itemId]
if not itemData then return false, "INVALID_ITEM" end
local addedWeight = itemData.Weight * amount
if self.CurrentWeight + addedWeight > self.MaxWeight then
return false, "OVER_ENCUMBERED"
end
for slotIndex = 1, self.MaxSlots do
local slot = self.Slots[slotIndex]
if slot and slot.Id == itemId and slot.Count < itemData.MaxStack then
local space = itemData.MaxStack - slot.Count
local toAdd = math.min(space, amount)
slot.Count = slot.Count + toAdd
amount = amount - toAdd
self.CurrentWeight = self.CurrentWeight + (itemData.Weight * toAdd)
if amount <= 0 then return true end
end
end
for slotIndex = 1, self.MaxSlots do
if not self.Slots[slotIndex] then
self.Slots[slotIndex] = {
UUID = game:GetService("HttpService"):GenerateGUID(false),
Id = itemId,
Count = amount,
Durability = itemData.MaxDurability
}
self.CurrentWeight = self.CurrentWeight + (itemData.Weight * amount)
return true
end
end
return false, "INVENTORY_FULL"
end
return InventoryManager
4. डुप्लीकेशन सुरक्षा और सत्र लॉक
ट्रेड और डिस्कनेक्ट ग्लिच से सुरक्षा:
- MemoryStore लॉक: आइटम ट्रांसफर के दौरान डुप्लीकेशन रोकने के लिए अस्थायी लॉक।
- एटॉमिक ट्रेड: दोनों खिलाड़ियों के बीच एक ही समय पर निष्पक्ष अदला-बदली।
- रिक्वेस्ट लिमिट: पैकेट स्पैम रोकने के लिए 100ms का कूलडाउन।
5. मोबाइल टच और ड्रैग-एंड-ड्रॉप UX
स्मार्टफोन और टैबलेट पर आसान नियंत्रण:
- कम से कम 44px टच साइज: मोबाइल पर सही टच के लिए UIScale का उपयोग।
- लॉन्ग-प्रेस मेनू: टच स्क्रीन पर राइट-क्लिक की जगह गोलाकार मेनू।
- हैप्टिक फीडबैक: आइटम इस्तेमाल या ड्रॉप करने पर हल्का वाइब्रेशन।
Frequently Asked Questions
इन्वेंटरी लॉजिक सर्वर पर क्यों होना चाहिए?
क्लाइंट साइड पर लॉजिक रखने से हैकर्स नकली आइटम बना सकते हैं या डुप्लीकेट कर सकते हैं।
ऑप्टिमिस्टिक UI लैग कैसे दूर करता है?
आइकन तुरंत स्क्रीन पर हिलता है और सर्वर के मना करने पर ही वापस लौटता है।
सेशन लॉकिंग क्या है?
यह एक समय में केवल एक सर्वर को डेटा बदलने की अनुमति देता है, जिससे क्लोनिंग नहीं हो पाती।
मोबाइल पर ड्रैग स्मूथ कैसे बनाएं?
टच के दौरान केवल एक अस्थायी आइकन हिलाएं और उंगली हटाने पर स्लॉट की जांच करें।