Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How to buy money In-game with Dev Products?

Asked by 9 years ago

I've Tried things and i changes a lot but its still not working, i just buy the products but don't get the money.

If i buy in-game 100 FrostyCoins/cash i will pay but i don't get the 100 Frostycoins/cash

What does i wrong?

The first 2 Scripts are from Roblox Wiki (I change somthings)

I tried all ready things.. But it not working and am search all some months for this. (Yes, My english is bad)

The Local Script is:

local buyButton = game.Workspace.Part1.SurfaceGui.a
local productId = 21118799

-- when player clicks on buy brick prompt him/her to buy a product
buyButton.MouseButton1Click:connect(function()
    game:GetService("MarketplaceService"):PromptProductPurchase(game.Players.LocalPlayer, productId)
end)

The script in workspace is:

local MarketplaceService = Game:GetService("MarketplaceService")
local ds = game:GetService("DataStoreService"):GetDataStore("PurchaseHistory")
local productId = 21118799

-- define function that will be called when purchase finished
MarketplaceService.ProcessReceipt = function(receiptInfo) 

    -- find the player based on the PlayerId in receiptInfo
    for i, player in ipairs(game.Players:GetChildren()) do
        if player.userId == receiptInfo.PlayerId then


            -- check which product was purchased
            if receiptInfo.ProductId == productId then

                -- handle purchase
                player.leaderstats.FrostyCoins.Value = player.leaderstats.FrostyCoins.Value + 100
            end
        end
    end 

    -- record the transaction in a Data Store
    local playerProductKey = "player_" .. receiptInfo.PlayerId .. "_purchase_" .. receiptInfo.PurchaseId
    ds:IncrementAsync(playerProductKey, 1)  

    -- tell ROBLOX that we have successfully handled the transaction
    return Enum.ProductPurchaseDecision.PurchaseGranted     
end

The Leaderboard script is:

print("LinkedLeaderboard script version 5.00 loaded")

stands = {}
CTF_mode = false -- I think there is something wrong with the capture the flag mode, VERY UGLY HACK is down near where it is leave false unless you can fix it.


function onHumanoidDied(humanoid, player)
    local stats = player:findFirstChild("leaderstats")
    if stats ~= nil then
        local deaths = stats:findFirstChild("WO's")
        deaths.Value = deaths.Value + 1

        -- do short dance to try and find the killer

        local killer = getKillerOfHumanoidIfStillInGame(humanoid)

        handleKillCount(humanoid, player)
    end
end

function onPlayerRespawn(property, player)
    -- need to connect to new humanoid

    if property == "Character" and player.Character ~= nil then
        local humanoid = player.Character.Humanoid
            local p = player
            local h = humanoid
            humanoid.Died:connect(function() onHumanoidDied(h, p) end )
    end
end

function getKillerOfHumanoidIfStillInGame(humanoid)
    -- returns the player object that killed this humanoid
    -- returns nil if the killer is no longer in the game

    -- check for kill tag on humanoid - may be more than one - todo: deal with this
    local tag = humanoid:findFirstChild("creator")

    -- find player with name on tag
    if tag ~= nil then

        local killer = tag.Value
        if killer.Parent ~= nil then -- killer still in game
            return killer
        end
    end

    return nil
end

function handleKillCount(humanoid, player)
    local killer = getKillerOfHumanoidIfStillInGame(humanoid)
    if killer ~= nil then
        local stats = killer:findFirstChild("leaderstats")
        if stats ~= nil then
            local kills = stats:findFirstChild("KOs")
            local cash = stats:findFirstChild("FrostyCoins")
            if killer ~= player then
                kills.Value = kills.Value + 1
                cash.Value = cash.Value + 1 -- change amount of money per kill here

            else
                kills.Value = kills.Value - 1

            end
        end
    end
end


-----------------------------------------------



function findAllFlagStands(root)
    local c = root:children()
    for i=1,#c do
        if (c[i].className == "Model" or c[i].className == "Part") then
            findAllFlagStands(c[i])
        end
        if (c[i].className == "FlagStand") then
            table.insert(stands, c[i])
        end
    end
end

function hookUpListeners()
    for i=1,#stands do
        stands[i].FlagCaptured:connect(onCaptureScored)
    end
end

function onPlayerEntered(newPlayer)

    if CTF_mode == true then

        local stats = Instance.new("IntValue")
        stats.Name = "leaderstats"

        local captures = Instance.new("IntValue")
        captures.Name = "Captures"
        captures.Value = 0


        captures.Parent = stats

        -- VERY UGLY HACK
        -- Will this leak threads?
        -- Is the problem even what I think it is (player arrived before character)?
        while true do
            if newPlayer.Character ~= nil then break end
            wait(5)
        end

        stats.Parent = newPlayer

    else

        local stats = Instance.new("IntValue")
        stats.Name = "leaderstats"

        local kills = Instance.new("IntValue")
        kills.Name = "KOs"
        kills.Value = 0

        local cash = Instance.new("IntValue")
        cash.Name = "FrostyCoins"
        cash.Value = 0 -- starting cash here =D

        local deaths = Instance.new("IntValue")
        deaths.Name = "WO's"
        deaths.Value = 0

        kills.Parent = stats
        deaths.Parent = stats
        cash.Parent = stats

        -- VERY UGLY HACK
        -- Will this leak threads?
        -- Is the problem even what I think it is (player arrived before character)?
        while true do
            if newPlayer.Character ~= nil then break end
            wait(5)
        end

        local humanoid = newPlayer.Character.Humanoid

        humanoid.Died:connect(function() onHumanoidDied(humanoid, newPlayer) end )

        -- start to listen for new humanoid
        newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end )


        stats.Parent = newPlayer

    end

end


function onCaptureScored(player)

        local ls = player:findFirstChild("leaderstats")
        if ls == nil then return end
        local caps = ls:findFirstChild("Captures")
        if caps == nil then return end
        caps.Value = caps.Value + 1

end


findAllFlagStands(game.Workspace)
hookUpListeners()
if (#stands > 0) then CTF_mode = true end
game.Players.ChildAdded:connect(onPlayerEntered)

1 answer

Log in to vote
0
Answered by 9 years ago

I think the problem is in the first script. Not sure if this will help but try and move the SurfaceGui to the StarterGui.

Put a LocalScript in the SurfaceGui and put the following code into it:

local sgui = script.Parent
local buyButton = sgui.a
local productId = 21118799
local player = game.Players.LocalPlayer

sgui.Adornee = game.Workspace.Part1

-- when player clicks on buy brick prompt him/her to buy a product
buyButton.MouseButton1Click:connect(function()
    game:GetService("MarketplaceService"):PromptProductPurchase(player, productId)
end)
0
I will try. minetrackmania 186 — 9y
Ad

Answer this question