add checks in order to make sure negative coins don't occur

add configurable price
use persistent data containers to keep track of items
This commit is contained in:
taah
2022-06-18 01:19:24 -07:00
parent c4743c97cb
commit fb09c7a906
7 changed files with 97 additions and 7 deletions

View File

@ -1,18 +1,67 @@
package dev.plex.shop.item
import dev.plex.cache.DataUtils
import dev.plex.listener.PlexListener
import dev.plex.player.PlexPlayer
import dev.plex.util.PlexLog
import dev.plex.util.minimessage.SafeMiniMessage
import org.bukkit.Material
import org.bukkit.NamespacedKey
import org.bukkit.event.EventHandler
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.inventory.EquipmentSlot
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.ItemMeta
import org.bukkit.persistence.PersistentDataContainer
import java.util.concurrent.CompletableFuture
abstract class AbstractItem(val item: ItemStack, private val cost: Double)
abstract class AbstractItem(val item: ItemStack, val cost: Double, val itemTag: NamespacedKey) : PlexListener()
{
fun purchase(player: PlexPlayer)
{
if (player.coins < this.cost) {
player.player?.sendMessage(SafeMiniMessage.mmDeserialize("<red>You need ${this.cost - player.coins} more coins to purchase this!"))
return
}
if (player.player?.inventory!!.filter { it?.type != Material.AIR }.size == 53)
{
player.player?.sendMessage(SafeMiniMessage.mmDeserialize("<red>Your inventory is currently full!"))
return
}
player.coins.minus(this.cost);
player.player?.inventory?.addItem(this.item);
CompletableFuture.runAsync {
DataUtils.update(player);
}
}
abstract fun interact(event: PlayerInteractEvent)
@EventHandler
fun onInteract(event: PlayerInteractEvent)
{
if (event.hand != EquipmentSlot.HAND)
{
return
}
if (event.item == null)
{
return
}
if (!event.item!!.hasItemMeta())
{
return
}
val meta: ItemMeta = event.item!!.itemMeta
val dataContainer: PersistentDataContainer = meta.persistentDataContainer
if (!dataContainer.has(itemTag))
{
return
}
interact(event)
}
}

View File

@ -1,8 +1,20 @@
package dev.plex.shop.item.impl
import dev.plex.Plex
import dev.plex.shop.item.AbstractItem
import org.bukkit.NamespacedKey
import org.bukkit.entity.Fireball
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.inventory.ItemStack
class FireballItem(item: ItemStack, cost: Double) : AbstractItem(item, cost)
class FireballItem(item: ItemStack, cost: Double) : AbstractItem(item, cost, ITEM_TAG)
{
companion object {
val ITEM_TAG: NamespacedKey = NamespacedKey(Plex.get(), "fireball_item")
}
override fun interact(event: PlayerInteractEvent)
{
event.player.launchProjectile(Fireball::class.java)
}
}