Compare commits

...

20 Commits

Author SHA1 Message Date
Auxilor
5465a7412f libreforge-updater 2022-12-05 10:51:52 +00:00
Auxilor
4a8ea43b5b Merge remote-tracking branch 'origin/master' 2022-12-04 15:05:48 +00:00
Auxilor
a2d147e54c Updated to 1.64.2 2022-12-04 15:05:42 +00:00
Will FP
2ceb670999 Merge pull request #34
Fix bugs
2022-12-04 15:05:24 +00:00
TomTom
a4cef52d5c Merge branch 'Auxilor:master' into fixes 2022-11-30 18:54:38 +01:00
Auxilor
b653d97794 libreforge-updater 2022-11-30 17:39:35 +00:00
TomTom
f44ca8a7e3 Fix bald 2022-11-29 16:35:29 +01:00
TomTom
56ddfeca39 Add being able to disable pet entities 2022-11-29 16:11:04 +01:00
TomTom
332fd55f0b Fix stuff 2022-11-28 16:04:50 +01:00
Auxilor
452c20f534 libreforge-updater 2022-11-27 21:45:42 +00:00
Auxilor
6002bc0b47 libreforge-updater 2022-11-26 19:21:36 +00:00
Auxilor
120db25a11 libreforge-updater 2022-11-24 14:31:26 +00:00
Auxilor
c4ea85ff7f libreforge-updater 2022-11-23 17:26:26 +00:00
Auxilor
1c98a7257e libreforge-updater 2022-11-21 16:04:13 +00:00
Auxilor
5a810e4dfb libreforge-updater 2022-11-17 08:39:45 +00:00
Auxilor
ddaa9d36b6 libreforge-updater 2022-11-12 17:35:52 +00:00
Auxilor
1f274b57d1 libreforge-updater 2022-11-06 19:53:24 +00:00
Auxilor
1a7a92e6de Reworked level GUI to use ecomponent 2022-11-06 15:34:52 +00:00
Auxilor
e369e99510 Updated to 1.57.0 2022-11-04 13:11:09 +00:00
Auxilor
6fb565f6db Added setActivePet to API 2022-11-04 13:11:02 +00:00
10 changed files with 121 additions and 142 deletions

View File

@@ -43,12 +43,14 @@ allprojects {
shadowJar { shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.ecopets.libreforge') relocate('com.willfp.libreforge', 'com.willfp.ecopets.libreforge')
relocate('com.willfp.ecomponent', 'com.willfp.ecopets.ecomponent')
relocate('org.joml', 'com.willfp.ecopets.libreforge.joml') relocate('org.joml', 'com.willfp.ecopets.libreforge.joml')
} }
dependencies { dependencies {
compileOnly 'com.willfp:eco:6.44.0' compileOnly 'com.willfp:eco:6.44.0'
implementation 'com.willfp:libreforge:3.117.0' implementation 'com.willfp:libreforge:3.125.0'
implementation 'com.willfp:ecomponent:1.0.0'
implementation 'org.joml:joml:1.10.4' implementation 'org.joml:joml:1.10.4'
compileOnly 'org.jetbrains:annotations:23.0.0' compileOnly 'org.jetbrains:annotations:23.0.0'

View File

@@ -7,7 +7,7 @@ dependencies {
compileOnly 'net.kyori:adventure-api:4.10.1' compileOnly 'net.kyori:adventure-api:4.10.1'
compileOnly 'net.essentialsx:EssentialsX:2.19.0' compileOnly 'net.essentialsx:EssentialsX:2.19.0'
compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6' compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
compileOnly 'com.ticxo.modelengine:api:R3.0.0' compileOnly 'com.ticxo.modelengine:api:R3.0.1'
} }
build.dependsOn publishToMavenLocal build.dependsOn publishToMavenLocal

View File

@@ -17,6 +17,10 @@ internal object EcoPetsAPIImpl : EcoPetsAPI {
override fun getActivePet(player: OfflinePlayer): Pet? = player.activePet override fun getActivePet(player: OfflinePlayer): Pet? = player.activePet
override fun setActivePet(player: OfflinePlayer, pet: Pet?) {
player.activePet = pet
}
override fun getPetLevel(player: OfflinePlayer, pet: Pet) = player.getPetLevel(pet) override fun getPetLevel(player: OfflinePlayer, pet: Pet) = player.getPetLevel(pet)
override fun givePetExperience(player: Player, pet: Pet, amount: Double) = override fun givePetExperience(player: Player, pet: Pet, amount: Double) =

View File

@@ -41,6 +41,10 @@ class EcoPetsPlugin : LibReforgePlugin() {
} }
override fun handleReloadAdditional() { override fun handleReloadAdditional() {
if (!this.configYml.getBool("pet-entity.enabled")) {
return
}
this.scheduler.runTimer(1, 1) { this.scheduler.runTimer(1, 1) {
petDisplay.tickAll() petDisplay.tickAll()
} }

View File

@@ -10,7 +10,7 @@ interface EcoPetsAPI {
* Get if a player has a pet. * Get if a player has a pet.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @return If the player has the pet unlocked * @return If the player has the pet unlocked
*/ */
fun hasPet( fun hasPet(
@@ -28,11 +28,22 @@ interface EcoPetsAPI {
player: OfflinePlayer player: OfflinePlayer
): Pet? ): Pet?
/**
* Set a player's active pet.
*
* @param player The player.
* @param pet The pet.
*/
fun setActivePet(
player: OfflinePlayer,
pet: Pet?
)
/** /**
* Get a player's level of a certain pet. * Get a player's level of a certain pet.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @return The level. * @return The level.
*/ */
fun getPetLevel( fun getPetLevel(
@@ -44,7 +55,7 @@ interface EcoPetsAPI {
* Give pet experience to a player. * Give pet experience to a player.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @param amount The amount of experience to give. * @param amount The amount of experience to give.
*/ */
fun givePetExperience( fun givePetExperience(
@@ -56,9 +67,9 @@ interface EcoPetsAPI {
/** /**
* Give pet experience to a player. * Give pet experience to a player.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @param amount The amount of experience to give. * @param amount The amount of experience to give.
* @param applyMultipliers If multipliers should be applied. * @param applyMultipliers If multipliers should be applied.
*/ */
fun givePetExperience( fun givePetExperience(
@@ -69,10 +80,11 @@ interface EcoPetsAPI {
) )
/** /**
* Get progress to next level between 0 and 1, where 0 is none and 1 is complete. * Get progress to next level between 0 and 1, where 0 is none and 1 is
* complete.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @return The progress. * @return The progress.
*/ */
fun getPetProgress( fun getPetProgress(
@@ -84,7 +96,7 @@ interface EcoPetsAPI {
* Get the experience required to advance to the next level. * Get the experience required to advance to the next level.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @return The experience required. * @return The experience required.
*/ */
fun getPetXPRequired( fun getPetXPRequired(
@@ -96,7 +108,7 @@ interface EcoPetsAPI {
* Get experience to the next level. * Get experience to the next level.
* *
* @param player The player. * @param player The player.
* @param pet The pet. * @param pet The pet.
* @return The experience. * @return The experience.
*/ */
fun getPetXP( fun getPetXP(

View File

@@ -53,7 +53,7 @@ class CommandActivate(plugin: EcoPlugin) : Subcommand(plugin, "activate", "ecope
if (args.size == 1) { if (args.size == 1) {
StringUtil.copyPartialMatches( StringUtil.copyPartialMatches(
args[1], args[0],
Pets.values().filter { sender.hasPet(it) }.map { it.id }, Pets.values().filter { sender.hasPet(it) }.map { it.id },
completions completions
) )

View File

@@ -9,7 +9,9 @@ import org.bukkit.entity.ArmorStand
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerChangedWorldEvent
import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.event.player.PlayerQuitEvent
import org.bukkit.event.player.PlayerTeleportEvent
import java.util.UUID import java.util.UUID
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.abs import kotlin.math.abs
@@ -45,17 +47,7 @@ class PetDisplay(
location.y += NumberUtils.fastSin(tick / (2 * PI) * 0.5) * 0.15 location.y += NumberUtils.fastSin(tick / (2 * PI) * 0.5) * 0.15
if (location.world != null) { if (location.world != null) {
try { stand.teleport(location)
stand.teleport(location)
} catch (_: Throwable) {
/*
For anyone reading - I KNOW TO NEVER CATCH THROWABLE
but NMS is really stupid and does this sometimes:
java.lang.Throwable: null
at net.minecraft.world.entity.Entity.teleportTo(Entity.java:3336) ~[paper-1.19.2.jar:git-Paper-186]
so I guess that's what has to be done. Not sure what the actual cause is.
*/
}
} }
if (!pet.entityTexture.contains(":")) { if (!pet.entityTexture.contains(":")) {
@@ -117,10 +109,24 @@ class PetDisplay(
trackedEntities.clear() trackedEntities.clear()
} }
private fun remove(player: Player) {
trackedEntities[player.uniqueId]?.stand?.remove()
trackedEntities.remove(player.uniqueId)
}
@EventHandler @EventHandler
fun onLeave(event: PlayerQuitEvent) { fun onLeave(event: PlayerQuitEvent) {
trackedEntities[event.player.uniqueId]?.stand?.remove() remove(event.player)
trackedEntities.remove(event.player.uniqueId) }
@EventHandler
fun onTeleport(event: PlayerTeleportEvent) {
remove(event.player)
}
@EventHandler
fun onWorldChange(event: PlayerChangedWorldEvent) {
remove(event.player)
} }
private data class PetArmorStand( private data class PetArmorStand(

View File

@@ -3,6 +3,9 @@ package com.willfp.ecopets.pets
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.gui.menu import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuLayer
import com.willfp.eco.core.gui.onLeftClick
import com.willfp.eco.core.gui.page.PageChanger
import com.willfp.eco.core.gui.slot import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.ConfigSlot import com.willfp.eco.core.gui.slot.ConfigSlot
import com.willfp.eco.core.gui.slot.FillerMask import com.willfp.eco.core.gui.slot.FillerMask
@@ -10,63 +13,62 @@ import com.willfp.eco.core.gui.slot.MaskItems
import com.willfp.eco.core.items.Items import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils import com.willfp.eco.util.NumberUtils
import org.bukkit.Material import com.willfp.ecomponent.components.LevelComponent
import com.willfp.ecomponent.components.LevelState
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import kotlin.math.ceil
import kotlin.math.max
import kotlin.math.min
import kotlin.properties.Delegates
class PetLevelGUI( class PetLevelGUI(
plugin: EcoPlugin, plugin: EcoPlugin,
private val pet: Pet private val pet: Pet
) { ) {
private val menu: Menu 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 { init {
val maskPattern = plugin.configYml.getStrings("level-gui.mask.pattern").toTypedArray() val maskPattern = plugin.configYml.getStrings("level-gui.mask.pattern").toTypedArray()
val maskItems = MaskItems.fromItemNames(plugin.configYml.getStrings("level-gui.mask.materials")) val maskItems = MaskItems.fromItemNames(plugin.configYml.getStrings("level-gui.mask.materials"))
val progressionOrder = "123456789abcdefghijklmnopqrstuvwxyz"
val progressionPattern = plugin.configYml.getStrings("level-gui.progression-slots.pattern") val progressionPattern = plugin.configYml.getStrings("level-gui.progression-slots.pattern")
val progressionSlots = mutableMapOf<Int, Pair<Int, Int>>() val component = object : LevelComponent(progressionPattern, pet.maxLevel) {
override fun getLevelItem(player: Player, menu: Menu, level: Int, levelState: LevelState): ItemStack {
val key = levelState.name.lowercase().replace("_", "-")
var x = 0 return ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.$key.item")))
for (row in progressionPattern) { .setDisplayName(
x++ plugin.configYml.getFormattedString("level-gui.progression-slots.$key.name")
var y = 0 .replace("%pet%", pet.name)
for (char in row) { .replace("%level%", level.toString())
y++ .replace("%level_numeral%", NumberUtils.toNumeral(level))
if (char == '0') { )
continue .addLoreLines(
pet.injectPlaceholdersInto(
plugin.configYml.getFormattedStrings("level-gui.progression-slots.$key.lore"),
player,
forceLevel = level
)
)
.setAmount(
if (plugin.configYml.getBool("level-gui.progression-slots.level-as-amount")) level else 1
)
.build()
}
override fun getLevelState(player: Player, level: Int): LevelState {
return when {
level <= player.getPetLevel(pet) -> LevelState.UNLOCKED
level == player.getPetLevel(pet) + 1 -> LevelState.IN_PROGRESS
else -> LevelState.LOCKED
} }
val pos = progressionOrder.indexOf(char)
if (pos == -1) {
continue
}
progressionSlots[pos + 1] = Pair(x, y)
} }
} }
levelsPerPage = progressionSlots.size
pages = ceil(pet.maxLevel.toDouble() / levelsPerPage).toInt()
menu = menu(plugin.configYml.getInt("level-gui.rows")) { menu = menu(plugin.configYml.getInt("level-gui.rows")) {
setTitle(pet.name) title = pet.name
maxPages(component.pages)
setMask( setMask(
FillerMask( FillerMask(
maskItems, maskItems,
@@ -74,58 +76,11 @@ class PetLevelGUI(
) )
) )
for ((level, value) in progressionSlots) { addComponent(1, 1, component)
setSlot(
value.first,
value.second,
slot(ItemStack(Material.BLACK_STAINED_GLASS_PANE)) {
setUpdater { player, menu, _ ->
val page = getPage(menu, player)
val slotLevel = ((page - 1) * levelsPerPage) + level // Instead of the page changer, this will show up when on the first page
addComponent(
fun getItem(section: String) = MenuLayer.LOWER,
ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.$section.item")))
.setDisplayName(
plugin.configYml.getFormattedString("level-gui.progression-slots.$section.name")
.replace("%pet%", pet.name)
.replace("%level%", slotLevel.toString())
.replace("%level_numeral%", NumberUtils.toNumeral(slotLevel))
)
.addLoreLines(
pet.injectPlaceholdersInto(
plugin.configYml.getFormattedStrings("level-gui.progression-slots.$section.lore"),
player,
forceLevel = slotLevel
)
)
.build()
if (slotLevel > pet.maxLevel) {
maskItems.items[0].item
} else {
val item = when {
slotLevel <= player.getPetLevel(pet) -> {
getItem("unlocked")
}
slotLevel == player.getPetLevel(pet) + 1 -> {
getItem("in-progress")
}
else -> {
getItem("locked")
}
}
if (plugin.configYml.getBool("level-gui.progression-slots.level-as-amount")) {
item.amount = slotLevel
}
item
}
}
}
)
}
setSlot(
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.row"), plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.column"), plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.column"),
slot( slot(
@@ -133,39 +88,32 @@ class PetLevelGUI(
.setDisplayName(plugin.configYml.getString("level-gui.progression-slots.prev-page.name")) .setDisplayName(plugin.configYml.getString("level-gui.progression-slots.prev-page.name"))
.build() .build()
) { ) {
onLeftClick { event, _, menu -> onLeftClick { player, _, _, _ -> PetsGUI.open(player) }
val player = event.whoClicked as Player
val page = getPage(menu, player)
val newPage = max(0, page - 1)
if (newPage == 0) {
PetsGUI.open(player)
} else {
menu.setState(player, pageKey, newPage)
}
}
} }
) )
setSlot(
addComponent(
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.column"),
PageChanger(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.prev-page.material")))
.setDisplayName(plugin.configYml.getString("level-gui.progression-slots.prev-page.name"))
.build(),
PageChanger.Direction.BACKWARDS
)
)
addComponent(
plugin.configYml.getInt("level-gui.progression-slots.next-page.location.row"), plugin.configYml.getInt("level-gui.progression-slots.next-page.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.next-page.location.column"), plugin.configYml.getInt("level-gui.progression-slots.next-page.location.column"),
slot( PageChanger(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.next-page.material"))) ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.next-page.material")))
.setDisplayName(plugin.configYml.getString("level-gui.progression-slots.next-page.name")) .setDisplayName(plugin.configYml.getString("level-gui.progression-slots.next-page.name"))
.build() .build(),
) { PageChanger.Direction.FORWARDS
onLeftClick { event, _, menu -> )
val player = event.whoClicked as Player
val page = getPage(menu, player)
val newPage = min(pages, page + 1)
menu.setState(player, pageKey, newPage)
}
}
) )
setSlot( setSlot(
plugin.configYml.getInt("level-gui.progression-slots.close.location.row"), plugin.configYml.getInt("level-gui.progression-slots.close.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.close.location.column"), plugin.configYml.getInt("level-gui.progression-slots.close.location.column"),
@@ -190,5 +138,7 @@ class PetLevelGUI(
} }
} }
fun open(player: Player) = menu.open(player) fun open(player: Player) {
menu.open(player)
}
} }

View File

@@ -217,6 +217,7 @@ level-gui:
custom-slots: [ ] custom-slots: [ ]
pet-entity: pet-entity:
enabled: true # If you disable this, there will be no floating pets
name: "%player%&f's %pet%&f (Lvl. %level%)" name: "%player%&f's %pet%&f (Lvl. %level%)"
level-up: level-up:

View File

@@ -1,4 +1,4 @@
#libreforge-updater #libreforge-updater
#Tue Nov 01 16:24:09 GMT 2022 #Mon Dec 05 10:51:52 GMT 2022
version=1.56.0 version=1.65.0
plugin-name=EcoPets plugin-name=EcoPets