Compare commits

...

21 Commits
1.0.0 ... 1.1.0

Author SHA1 Message Date
Auxilor
616e0c012b libreforge-updater 2022-06-18 12:20:08 +01:00
Auxilor
226aaac8c1 Downgraded for updater 2022-06-18 12:18:37 +01:00
Auxilor
34026be77b Added /ecopets reset 2022-06-18 12:10:32 +01:00
Auxilor
8b585af4e2 Fixed /ecopets givexp 2022-06-18 12:06:51 +01:00
Auxilor
4cd7398d76 Improved /ecopets givexp 2022-06-18 11:59:00 +01:00
Auxilor
c84a2a10f6 Revert "Improved pet tick performance"
This reverts commit 6dcfd4ccaa.
2022-06-18 11:54:08 +01:00
Auxilor
6dcfd4ccaa Improved pet tick performance 2022-06-18 11:53:34 +01:00
Auxilor
428df89ed1 Improved PR 2022-06-18 11:44:11 +01:00
Will FP
ebe542ef2b Merge pull request #1
Added givexp command
2022-06-18 11:43:44 +01:00
Auxilor
d3d005845a Improved pages 2022-06-18 11:43:14 +01:00
Sedri05
5d4eedfef6 added msg on invalid player 2022-06-18 12:33:18 +02:00
Sedri05
c362ad0d18 It can now run in console 2022-06-18 12:32:10 +02:00
Sedri05
2d56e8a9d7 Added givexp command 2022-06-18 12:28:33 +02:00
Auxilor
56c7268bb9 Fixed config 2022-06-18 11:20:31 +01:00
Auxilor
447c2c877a Updated config 2022-06-18 11:20:08 +01:00
Auxilor
1c0c9ba259 Added pages to pet GUI 2022-06-18 11:19:36 +01:00
Auxilor
6f5a8b9df2 Updated to 1.1.0 2022-06-18 10:55:02 +01:00
Auxilor
cbbe5b590e Added getActivePet to API 2022-06-18 10:54:54 +01:00
Auxilor
fa3c5b8020 Added polymart resource ID 2022-06-18 10:49:07 +01:00
Auxilor
7a34a2d38c Added skeleton pet 2022-06-18 10:47:54 +01:00
Auxilor
0f14f36b2f Fixed missing placeholder 2022-06-18 00:34:33 +01:00
15 changed files with 445 additions and 28 deletions

View File

@@ -47,7 +47,7 @@ allprojects {
dependencies {
compileOnly 'com.willfp:eco:6.37.1'
implementation 'com.willfp:libreforge:3.63.0'
implementation 'com.willfp:libreforge:3.64.0'
implementation 'org.joml:joml:1.10.4'
compileOnly 'org.jetbrains:annotations:23.0.0'

View File

@@ -2,6 +2,7 @@ package com.willfp.ecopets
import com.willfp.ecopets.api.EcoPetsAPI
import com.willfp.ecopets.pets.Pet
import com.willfp.ecopets.pets.activePet
import com.willfp.ecopets.pets.getPetLevel
import com.willfp.ecopets.pets.getPetProgress
import com.willfp.ecopets.pets.getPetXP
@@ -14,6 +15,8 @@ import org.bukkit.entity.Player
internal object EcoPetsAPIImpl : EcoPetsAPI {
override fun hasPet(player: OfflinePlayer, pet: Pet) = player.hasPet(pet)
override fun getActivePet(player: OfflinePlayer): Pet? = player.activePet
override fun getPetLevel(player: OfflinePlayer, pet: Pet) = player.getPetLevel(pet)
override fun givePetExperience(player: Player, pet: Pet, amount: Double) =

View File

@@ -18,6 +18,16 @@ interface EcoPetsAPI {
pet: Pet
): Boolean
/**
* Get a player's active pet.
*
* @param player The player.
* @return The active pet.
*/
fun getActivePet(
player: OfflinePlayer
): Pet?
/**
* Get a player's level of a certain pet.
*

View File

@@ -9,6 +9,8 @@ class CommandEcopets(plugin: EcoPlugin) : PluginCommand(plugin, "ecopets", "ecop
this.addSubcommand(CommandReload(plugin))
.addSubcommand(CommandGive(plugin))
.addSubcommand(CommandGiveEgg(plugin))
.addSubcommand(CommandGiveXP(plugin))
.addSubcommand(CommandReset(plugin))
}
override fun onExecute(sender: CommandSender, args: List<String>) {

View File

@@ -0,0 +1,89 @@
package com.willfp.ecopets.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import com.willfp.eco.util.savedDisplayName
import com.willfp.eco.util.toNiceString
import com.willfp.ecopets.pets.Pets
import com.willfp.ecopets.pets.givePetExperience
import com.willfp.ecopets.pets.hasPet
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandGiveXP(plugin: EcoPlugin) : Subcommand(plugin, "givexp", "ecopets.command.givexp", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return
}
if (args.size == 1) {
sender.sendMessage(plugin.langYml.getMessage("needs-pet"))
return
}
if (args.size == 2) {
sender.sendMessage(plugin.langYml.getMessage("needs-amount"))
return
}
val playerName = args[0]
val player = Bukkit.getPlayer(playerName)
if (player == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}
val pet = Pets.getByID(args[1])
if (pet == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-pet"))
return
}
if (!player.hasPet(pet)) {
sender.sendMessage(plugin.langYml.getMessage("doesnt-have-pet"))
return
}
val amount = args[2].toDoubleOrNull()
if (amount == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-amount"))
return
}
player.givePetExperience(
pet,
amount
)
sender.sendMessage(
plugin.langYml.getMessage("gave-xp", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%player%", player.savedDisplayName)
.replace("%xp%", amount.toNiceString())
.replace("%pet%", pet.name)
)
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {
if (args.size == 1) {
return Bukkit.getOnlinePlayers().map { it.name }
}
if (args.size == 2) {
return Pets.values().map { it.id }
}
if (args.size == 3) {
return listOf("10", "100", "1000", "10000")
}
return emptyList()
}
}

View File

@@ -0,0 +1,76 @@
package com.willfp.ecopets.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import com.willfp.eco.util.savedDisplayName
import com.willfp.eco.util.toNiceString
import com.willfp.ecopets.pets.Pets
import com.willfp.ecopets.pets.activePet
import com.willfp.ecopets.pets.givePetExperience
import com.willfp.ecopets.pets.hasPet
import com.willfp.ecopets.pets.setPetLevel
import com.willfp.ecopets.pets.setPetXP
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandReset(plugin: EcoPlugin) : Subcommand(plugin, "reset", "ecopets.command.reset", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return
}
if (args.size == 1) {
sender.sendMessage(plugin.langYml.getMessage("needs-pet"))
return
}
val playerName = args[0]
val player = Bukkit.getPlayer(playerName)
if (player == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}
val pet = Pets.getByID(args[1])
if (pet == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-pet"))
return
}
if (!player.hasPet(pet)) {
sender.sendMessage(plugin.langYml.getMessage("doesnt-have-pet"))
return
}
if (player.activePet == pet) {
player.activePet = null
}
player.setPetXP(pet, 0.0)
player.setPetLevel(pet, 0)
sender.sendMessage(
plugin.langYml.getMessage("reset-xp", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%player%", player.savedDisplayName)
.replace("%pet%", pet.name)
)
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {
if (args.size == 1) {
return Bukkit.getOnlinePlayers().map { it.name }
}
if (args.size == 2) {
return Pets.values().map { it.id }
}
return emptyList()
}
}

View File

@@ -116,12 +116,12 @@ class Pet(
.setSkullTexture(config.getString("entity-texture"))
.build()
val levelGUI = PetLevelGUI(plugin, this)
private val levelXpRequirements = listOf(0) + config.getInts("level-xp-requirements")
val maxLevel = levelXpRequirements.size
val levelGUI = PetLevelGUI(plugin, this)
private val baseItem: ItemStack = Items.lookup(config.getString("icon")).item
private val effects: Set<ConfiguredEffect>
@@ -203,6 +203,13 @@ class Pet(
(it.getPetProgress(this) * 100).toNiceString()
}.register()
PlayerPlaceholder(
plugin,
id
) {
it.getPetLevel(this).toString()
}.register()
PlayerPlaceholder(
plugin,
"${id}_current_xp"
@@ -304,7 +311,14 @@ class Pet(
.map {
it.replace("%percentage_progress%", (player.getPetProgress(this) * 100).toNiceString())
.replace("%current_xp%", player.getPetXP(this).toNiceString())
.replace("%required_xp%", this.getExpForLevel(player.getPetLevel(this) + 1).toNiceString())
.replace("%required_xp%", this.getExpForLevel(player.getPetLevel(this) + 1).let { req ->
if (req == Int.MAX_VALUE) {
plugin.langYml.getFormattedString("infinity")
} else {
req.toNiceString()
}
}
)
.replace("%description%", this.description)
.replace("%pet%", this.name)
.replace("%level%", (forceLevel ?: player.getPetLevel(this)).toString())

View File

@@ -9,18 +9,28 @@ import com.willfp.eco.core.gui.slot.MaskItems
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils
import com.willfp.eco.util.toNiceString
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import kotlin.math.ceil
import kotlin.math.max
import kotlin.math.min
import kotlin.properties.Delegates
class PetLevelGUI(
plugin: EcoPlugin,
pet: Pet
private val pet: Pet
) {
private val menu: Menu
private val pageKey = "page"
private var levelsPerPage by Delegates.notNull<Int>()
private var pages by Delegates.notNull<Int>()
private fun getPage(menu: Menu, player: Player): Int {
val page = menu.getState(player, pageKey) ?: 1
return min(pages, max(page, 1))
}
init {
val maskPattern = plugin.configYml.getStrings("level-gui.mask.pattern").toTypedArray()
@@ -51,10 +61,8 @@ class PetLevelGUI(
}
}
val pages = ceil(pet.maxLevel.toDouble() / progressionSlots.size).toInt()
val levelsPerPage = progressionSlots.size
val pageKey = "page"
levelsPerPage = progressionSlots.size
pages = ceil(pet.maxLevel.toDouble() / levelsPerPage).toInt()
menu = menu(plugin.configYml.getInt("level-gui.rows")) {
setTitle(pet.name)
@@ -71,7 +79,7 @@ class PetLevelGUI(
value.second,
slot(ItemStack(Material.BLACK_STAINED_GLASS_PANE)) {
setUpdater { player, menu, _ ->
val page = menu.getState<Int>(player, pageKey) ?: 1
val page = getPage(menu, player)
val slotLevel = ((page - 1) * levelsPerPage) + level
@@ -126,11 +134,14 @@ class PetLevelGUI(
) {
onLeftClick { event, _, menu ->
val player = event.whoClicked as Player
var page = menu.getState(player, pageKey) ?: 1
page--
menu.addState(player, pageKey, page)
if (page == 0) {
PetsGUI.open(event.whoClicked as Player)
val page = getPage(menu, player)
val newPage = max(0, page - 1)
if (newPage == 0) {
PetsGUI.open(player)
} else {
menu.addState(player, pageKey, newPage)
}
}
}
@@ -145,7 +156,11 @@ class PetLevelGUI(
) {
onLeftClick { event, _, menu ->
val player = event.whoClicked as Player
val newPage = max(pages, (menu.getState(player, pageKey) ?: 1) + 1)
val page = getPage(menu, player)
val newPage = min(pages, page + 1)
menu.addState(player, pageKey, newPage)
}
}

View File

@@ -13,10 +13,25 @@ import org.bukkit.Material
import org.bukkit.Sound
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.checkerframework.checker.units.qual.m
import kotlin.math.ceil
import kotlin.math.max
import kotlin.math.min
object PetsGUI {
private lateinit var menu: Menu
private val petAreaSlots = mutableListOf<Pair<Int, Int>>()
private const val pageKey = "page"
private fun getPage(menu: Menu, player: Player): Int {
val pages = ceil(Pets.values()
.filter { player.getPetLevel(it) > 0 }
.size.toDouble() / petAreaSlots.size).toInt()
val page = menu.getState(player, pageKey) ?: 1
return max(min(pages, page + 1), 1)
}
@JvmStatic
@ConfigUpdater
@@ -50,6 +65,19 @@ object PetsGUI {
}
}
val petIconBuilder = { player: Player, menu: Menu, index: Int ->
val page = getPage(menu, player)
val unlockedPets = Pets.values()
.sortedByDescending { player.getPetLevel(it) }
.filter { player.getPetLevel(it) > 0 }
val pagedIndex = ((page - 1) * petAreaSlots.size) + index
val pet = unlockedPets.getOrNull(pagedIndex)
pet?.getIcon(player) ?: ItemStack(Material.AIR)
}
return menu(plugin.configYml.getInt("gui.rows")) {
setTitle(plugin.langYml.getString("menu.title"))
@@ -74,20 +102,23 @@ object PetsGUI {
for ((index, pair) in petAreaSlots.withIndex()) {
val (row, column) = pair
setSlot(row, column, slot(ItemStack(Material.AIR)) {
setUpdater { player, _, _ ->
val unlockedPets = Pets.values().filter { player.getPetLevel(it) > 0 }
val pet = unlockedPets.getOrNull(index)
pet?.getIcon(player) ?: ItemStack(Material.AIR)
setSlot(row, column, slot({ p, m -> petIconBuilder(p, m, index) }) {
setUpdater { p, m, _ ->
petIconBuilder(p, m, index)
}
onLeftClick { event, _, _ ->
val player = event.whoClicked as Player
val page = getPage(menu, player)
val unlockedPets = Pets.values()
.sortedByDescending { player.getPetLevel(it) }
.filter { player.getPetLevel(it) > 0 }
val pet = unlockedPets.getOrNull(index) ?: return@onLeftClick
val pagedIndex = ((page - 1) * petAreaSlots.size) + index
val pet = unlockedPets.getOrNull(pagedIndex) ?: return@onLeftClick
if (player.activePet != pet) {
player.activePet = pet
@@ -103,6 +134,49 @@ object PetsGUI {
})
}
setSlot(
plugin.configYml.getInt("gui.prev-page.location.row"),
plugin.configYml.getInt("gui.prev-page.location.column"),
slot(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.prev-page.item")))
.setDisplayName(plugin.configYml.getString("gui.prev-page.name"))
.build()
) {
onLeftClick { event, _, menu ->
val player = event.whoClicked as Player
val page = getPage(menu, player)
val newPage = max(1, page - 1)
menu.addState(player, pageKey, newPage)
}
}
)
setSlot(
plugin.configYml.getInt("gui.next-page.location.row"),
plugin.configYml.getInt("gui.next-page.location.column"),
slot(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.next-page.item")))
.setDisplayName(plugin.configYml.getString("gui.next-page.name"))
.build()
) {
onLeftClick { event, _, menu ->
val player = event.whoClicked as Player
val pages = ceil(Pets.values()
.filter { player.getPetLevel(it) > 0 }
.size.toDouble() / petAreaSlots.size).toInt()
val page = getPage(menu, player)
val newPage = min(pages, page + 1)
menu.addState(player, pageKey, newPage)
}
}
)
setSlot(plugin.configYml.getInt("gui.close.location.row"),
plugin.configYml.getInt("gui.close.location.column"),
slot(

View File

@@ -25,7 +25,7 @@ gui:
- "100000001"
- "100000001"
- "100000001"
- "101101111"
- "101000111"
pet-area:
top-left:
@@ -86,6 +86,20 @@ gui:
sound: ui_button_click
pitch: 1
prev-page:
item: arrow
name: "&fPrevious Page"
location:
row: 6
column: 4
next-page:
item: arrow
name: "&fNext Page"
location:
row: 6
column: 6
close:
item: barrier
name: "&cClose"
@@ -202,7 +216,7 @@ level-up:
enabled: true
message:
- "&f"
- " &#d977c2You levelled up your %pet%&#d977c2 petW to &eLevel %level%&#d977c2!"
- " &#d977c2You levelled up your %pet%&#d977c2 pet to &eLevel %level%&#d977c2!"
- "&f"
- " &#d977c2&lREWARDS:"
- " %level_up_messages%"

View File

@@ -1,3 +1,3 @@
resource-id: 0
resource-id: 2534
bstats-id: 15502
color: "&#d977c2"

View File

@@ -9,13 +9,20 @@ messages:
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-transmit: "&cYou can't transmit here!"
needs-player: "&cYou must specify a player!"
gave-xp: "&fYou have given &a%xp% &fXP to %player%&f's %pet%&f!"
reset-xp: "&fYou have reset %player%&f's %pet%&f XP!"
needs-pet: "&cYou must specify a pet!"
need-amount: "&cYou must specify a amount!"
invalid-player: "&cInvalid player!"
invalid-pet: "&cInvalid pet!"
already-has-pet: "&cPlayer already has this pet!"
doesnt-have-pet: "&cPlayer doesn't have this pet!"
gave-pet: "&fSuccessfully gave %player%&f the %pet%&f pet!"
gave-pet-egg: "&fSuccessfully gave %player%&f the %pet%&f pet egg!"
cannot-spawn-pet: "&cYou already have this pet unlocked!"
invalid-amount: "&cInvalid amount!"
menu:
title: "Pets"
infinity: "∞"

View File

@@ -119,7 +119,7 @@ pets:
spawn-egg:
enabled: true # If the pet should have a spawn egg
item: blaze_spawn_egg unbreaking:1 hide_enchants
name: "&6Tiger&f Spawn Egg"
name: "&6Tiger&f Pet Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
@@ -127,3 +127,106 @@ pets:
craftable: false
recipe: [ ]
# recipe-permission: ecopets.craft.tiger
- id: skeleton
name: "<gradient:#F2F2F2>Skeleton</gradient:#DBDBDB>"
description: "&8&oLevel up by dealing bow damage"
level-xp-requirements:
- 50
- 125
- 200
- 300
- 500
- 750
- 1000
- 1500
- 2000
- 3500
- 5000
- 7500
- 10000
- 15000
- 20000
- 30000
- 50000
- 75000
- 100000
- 200000
- 300000
- 400000
- 500000
- 600000
- 700000
- 800000
- 900000
- 1000000
- 1100000
- 1200000
- 1300000
- 1400000
- 1500000
- 1600000
- 1700000
- 1800000
- 1900000
- 2000000
- 2100000
- 2200000
- 2300000
- 2400000
- 2500000
- 2600000
- 2750000
- 2900000
- 3100000
- 3400000
- 3700000
xp-gain-methods:
- id: bow_attack
multiplier: 0.5
level-placeholders:
- id: "damage_multiplier"
value: "%level%"
effects-description:
1:
- "&8» &8Gives a &a+%damage_multiplier%%&8 bonus to"
- " &8bow damage"
rewards-description:
1:
- "&8» &8Gives a &a+%damage_multiplier%%&8 bonus to"
- " &8bow damage"
level-up-messages:
1:
- "&8» &8Gives a &a+%damage_multiplier%%&8 bonus to"
- " &8bow damage"
level-commands: [ ]
effects:
- id: damage_multiplier
args:
multiplier: "%level% * 0.01 + 1"
triggers:
- bow_attack
conditions: [ ]
entity-texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWQ0NmViNjQyZGMzYTRkZmJiNWFkNTI5N2VkYWUyOTk2ZWE0Y2ZmZjkyYWMyZWI1NmRmYWU5ZWUxZDU4ZTQwOCJ9fX0="
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWQ0NmViNjQyZGMzYTRkZmJiNWFkNTI5N2VkYWUyOTk2ZWE0Y2ZmZjkyYWMyZWI1NmRmYWU5ZWUxZDU4ZTQwOCJ9fX0=
spawn-egg:
enabled: true # If the pet should have a spawn egg
item: skeleton_spawn_egg unbreaking:1 hide_enchants
name: "<gradient:#F2F2F2>Skeleton</gradient:#DBDBDB>&f Pet Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
- "&8&ounlock the &r<gradient:#F2F2F2>Skeleton</gradient:#DBDBDB>&8&o pet!"
craftable: false
recipe: [ ]

View File

@@ -48,6 +48,8 @@ permissions:
ecopets.command.pets: true
ecopets.command.give: true
ecopets.command.giveegg: true
ecopets.command.givexp: true
ecopets.command.reset: true
ecopets.command.reload:
description: Allows reloading the config
@@ -64,6 +66,12 @@ permissions:
ecopets.command.giveegg:
description: Allows the use of /ecopets giveegg.
default: op
ecopets.command.givexp:
description: Allows the use of /ecopets givexp.
default: op
ecopets.command.reset:
description: Allows the use of /ecopets reset.
default: op
ecopets.xpmultiplier.50percent:
description: Gives the player 50% more skill experience

View File

@@ -1,2 +1,4 @@
version=1.0.0
#libreforge-updater
#Sat Jun 18 12:20:08 BST 2022
version=1.1.0
plugin-name=EcoPets