Short answer:
YouTube: Roblox - Dungeon Quest How To Duplicate Items (2020) (PATCHED)
The duplication exploit was patched by the developer himself, since DataStore2 does not offer session locking - he wouldn’t have to bother with such bugs with a module like ProfileService and now Dungeon Quest’s economy is under a permanent impact.
Data loss is not the enemy here, item duplication is:
Ninja Legends item duplication
Bubblegum simulator item duplication
Murder Mystery 2 item duplication
…And basically every game that had trading ever.
Except my game The Mad Murderer 2 which never had reports of item duplication because I am using session locking.
Long answer:
ProfileService is both simple to use and a professional-grade DataStore implementation - it means this module is just as useful as DataStore2 for the little developer, but when your game grows large and you go for huge features like trading, gifting, hopping between universe places, you’ll be pulling your hair out trying to manage the stability of such complex systems and preventing players from destroying your economy.
A few ProfileService vs DataStore2 points (Most relevant, descending):
- DataStore2 does not session-lock internally. Your first trading system made with DataStore2 is 99% guaranteed to have duplication loopholes unless you understand session locking (and are willing to script this nightmare yourself).
- DataStore2 is (massively) overrated and kind of built around false claims (claims that are not relevant in 2020) of DataStoreService being completely unreliable. First off, for what my name is worth, just know that I personally do not support such claims at all and thus see manual versioning as a waste of your game’s processing resources. ProfileService will, theoretically, only lose data when literally everyone else in the Roblox community will be losing data alongside with you. When DataStore2 developers talk about data loss, they refer to this problem specifically when DataStoreService returned nil instead of your saved data - Roblox would not afford making mistakes like that in the future and I don’t believe this will be a reoccurring problem which DataStore2 swears to defend you from. DataStore2 will not efficiently protect you from any other type of data loss such as caused by developer error (and neither will ProfileService).
- To an experienced developer, ProfileService is SO MUCH MORE easier to use, because it does not overwhelm you with tons of getter and setter methods.
- ProfileService has analytics endpoints and DataStore2 does not - this is crucial for big commercial projects!!!
- If you’re familiar with DataStore2 API,
DataStore2.Combine()
was not something that should’ve existed at all - it just adds a technical obscurity layer to the primary function of DataStore2. - DataStore2 API nomenclature is a bit of a mess - almost everyone keeps getting confused between DataStore2 API objects and Roblox API objects since the creator picked the same names.
- DataStore2 is bound to the
Player
instance. There’s no way to load offline player data or create savable data profiles that belong to a non-player entity while using the DataStore2 API. - DataStore2 source code might be harder to read and understand than ProfileService for a beginner.
If you’re part of the herd then at least try to learn a little about what exactly we’re all praising