Today
image Уязвимости PromptProductFinished можно исправить, используя ProcessReceipt. Мой пример обработки UGC-игр, которые позволяют покупать бесплатные UGC за Robux с помощью dev-продукта: (Пожалуйста, используйте только processreceipt, я тогда был не очен
Уязвимости PromptProductFinished можно исправить, используя ProcessReceipt. Мой пример обработки UGC-игр, которые позволяют покупать бесплатные UGC за Robux с помощью dev-продукта:
(Пожалуйста, используйте только processreceipt, я тогда был не очень хорошим программистом, ха-ха)
local DEV_PRODUCT_ID =tonumber(game:GetService("ReplicatedStorage"):WaitForChild("DEVPRODUCTID").Value)
local productIdUGC = game:GetService("ReplicatedStorage"):WaitForChild("UGCID").Value
local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local bought = {}
local function processReceipt(receiptInfo)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
print(player.Name .. " - dev product id", receiptInfo.ProductId)
local player = Players:GetPlayerByUserId(receiptInfo.PlayerId)
if not player then
return Enum.ProductPurchaseDecision.NotProcessedYet
end
if receiptInfo.ProductId == DEV_PRODUCT_ID then
bought[receiptInfo.PlayerId] = DEV_PRODUCT_ID
return Enum.ProductPurchaseDecision.PurchaseGranted
end
return Enum.ProductPurchaseDecision.NotProcessedYet
end
MarketplaceService.ProcessReceipt = processReceipt
local success, result = pcall(function()
MarketplaceService.ProcessReceipt = processReceipt
end)
if not success then
warn("processreceipt:", result)
end
MarketplaceService.PromptProductPurchaseFinished:Connect(function(player, productId, wasPurchased)
if tonumber(productId) == DEV_PRODUCT_ID and wasPurchased == true and bought[player] == DEV_PRODUCT_ID then
pcall(function() MarketplaceService:PromptPurchase(game.Players:GetPlayerByUserId(player), productIdUGC)
end)
bought[player] = nil
end
end)