Part 7 - Consumable Items

By Richard Davey on 12th March 2019   @photonstorm

In our mock-RPG game we let the player buy an item called the Demon Horn. When used in-game it will summon a leviathan grade demon lord to fight on our side. Once used, the item is gone and cannot be used again, so we want to remove it from our list of purchases.

This is known as 'consuming' an item.

Card

When the game started we retrieved the list of purchases using the getPurchases call. Our game saw that the player had the Demon Horn item available. At some point during the game, the player decides to use it. To stop the item appearing on the purchases list again in the future we need to tell Facebook to 'consume' it.

To do this you make a call to the consumePurchase method in the plugin, where purchaseToken is the value returned in the list of purchases, and consumepurchase and consumepurchasefail are the two events that will handle the response:

this.facebook.on('consumepurchase', (purchase) => {

    console.log('consume success', purchase);

}, this);

this.facebook.on('consumepurchasefail', (error) => { 

    console.log('consume fail', error);

}, this);

// Prior to Phaser 3.17 the method was called consumePurchases
this.facebook.consumePurchase(purchaseToken);

The Purchase Token can be obtained from the purchases list, as it's a property of the Purchase object this list contains:

this.facebook.on('getpurchases', (purchases) => {

    for (const item of purchases)
    {
        console.log(item.purchaseToken);
    }

}, this);

this.facebook.getPurchases();

Once the consumePurchase call is made and your success handler is invoked, that's it, there is no turning back. The item is now gone and will no longer appear on the purchases list.

For this reason you need to be careful about when you consume items and which items you consume. This is another reason why it is worth storing the results of the purchases in the player data and not relying on just the purchases list.

It's entirely possible that you want to automatically consume an item as soon as it has been bought. For example, buying a stack of gold is something that you only want the benefits of to happen once. In this case, you would issue the purchase as usual and in the success handler you'd then consume it immediately. Just be 100% sure that you've saved the result of the purchase before consuming it, as there's no going back if you make a mistake.