Compare commits

...

13 Commits

Author SHA1 Message Date
Will FP
f01e18950c Merge pull request #365 from Exanthiax/develop 2024-07-24 10:44:03 +01:00
Exanthiax
d4a6bf105b Update ParticleFactoryRGB.kt 2024-07-24 01:55:20 +01:00
Auxilor
a9a961ff2b Added FancyHolograms integration 2024-07-20 12:49:07 +01:00
Auxilor
25d572c0db Added AutocrafterPatch 2024-07-20 09:59:58 +01:00
Auxilor
8a4243e434 Fixed XP price 2024-07-19 20:01:20 +01:00
Auxilor
6c40670f5e Updated to 6.72.0 2024-07-19 19:46:26 +01:00
Auxilor
6e94f3cee8 Added support for multiple display modules per plugin 2024-07-19 19:46:26 +01:00
Auxilor
4968d3ff22 Updated to 6.71.6 2024-07-14 16:04:21 +01:00
Auxilor
eecd80be1c Fixed display name 2024-07-14 16:04:14 +01:00
Auxilor
52c1b52f6d Fixed tab completion bug 2024-07-12 18:18:40 +01:00
Auxilor
f321296227 Updated to 6.71.5 2024-07-12 18:08:35 +01:00
Auxilor
ddd12db420 Fixed ExtendedPersistentDataContainerFactory 2024-07-12 18:07:53 +01:00
Auxilor
bd09791b5b Improved command tab-completion 2024-07-08 18:49:29 +01:00
17 changed files with 195 additions and 24 deletions

View File

@@ -97,6 +97,9 @@ allprojects {
// HuskPlugins // HuskPlugins
maven("https://repo.william278.net/releases") maven("https://repo.william278.net/releases")
// FancyHolograms
maven("https://repo.fancyplugins.de/releases")
} }
dependencies { dependencies {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core; package com.willfp.eco.core;
import com.google.common.collect.ImmutableList;
import com.willfp.eco.core.command.impl.PluginCommand; import com.willfp.eco.core.command.impl.PluginCommand;
import com.willfp.eco.core.config.base.ConfigYml; import com.willfp.eco.core.config.base.ConfigYml;
import com.willfp.eco.core.config.base.LangYml; import com.willfp.eco.core.config.base.LangYml;
@@ -36,6 +37,8 @@ import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -120,9 +123,17 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
/** /**
* The display module for the plugin. * The display module for the plugin.
*
* @deprecated Plugins can now have multiple display modules.
*/ */
@Deprecated(since = "6.72.0")
private DisplayModule displayModule; private DisplayModule displayModule;
/**
* The display modules for the plugin.
*/
private List<DisplayModule> displayModules = new ArrayList<>();
/** /**
* The logger for the plugin. * The logger for the plugin.
*/ */
@@ -555,10 +566,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
* Default code to be executed after the server is up. * Default code to be executed after the server is up.
*/ */
public final void afterLoad() { public final void afterLoad() {
this.displayModule = createDisplayModule(); DisplayModule module = createDisplayModule();
if (module != null) {
Display.registerDisplayModule(module);
this.displayModules.add(module);
}
if (this.getDisplayModule() != null) { for (DisplayModule displayModule : this.loadDisplayModules()) {
Display.registerDisplayModule(this.getDisplayModule()); Display.registerDisplayModule(displayModule);
this.displayModules.add(displayModule);
} }
if (Prerequisite.HAS_PROTOCOLLIB.isMet()) { if (Prerequisite.HAS_PROTOCOLLIB.isMet()) {
@@ -899,14 +915,25 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
* Create the display module for the plugin. * Create the display module for the plugin.
* *
* @return The display module, or null. * @return The display module, or null.
* @deprecated Use {@link #loadDisplayModules()} instead.
*/ */
@Nullable @Nullable
@Deprecated(since = "6.72.0")
protected DisplayModule createDisplayModule() { protected DisplayModule createDisplayModule() {
Validate.isTrue(this.getDisplayModule() == null, "Display module exists!"); Validate.isTrue(this.getDisplayModule() == null, "Display module exists!");
return null; return null;
} }
/**
* Load display modules.
*
* @return The display modules.
*/
protected List<DisplayModule> loadDisplayModules() {
return new ArrayList<>();
}
/** /**
* Get the minimum version of eco to use the plugin. * Get the minimum version of eco to use the plugin.
* *
@@ -1156,12 +1183,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Regist
* Get the plugin's display module. * Get the plugin's display module.
* *
* @return The display module. * @return The display module.
* @deprecated Use {@link #getDisplayModules()} instead.
*/ */
@Nullable @Nullable
@Deprecated(since = "6.72.0", forRemoval = true)
public DisplayModule getDisplayModule() { public DisplayModule getDisplayModule() {
return this.displayModule; return this.displayModule;
} }
/**
* Get the plugin's display modules.
*
* @return The display modules.
*/
public List<DisplayModule> getDisplayModules() {
return ImmutableList.copyOf(this.displayModules);
}
/** /**
* Get if the plugin is outdated. * Get if the plugin is outdated.
* *

View File

@@ -211,12 +211,22 @@ public final class Display {
new ArrayList<>() new ArrayList<>()
); );
modules.removeIf(it -> it.getPluginName().equalsIgnoreCase(module.getPluginName()));
modules.add(module); modules.add(module);
REGISTERED_MODULES.put(module.getWeight(), modules); REGISTERED_MODULES.put(module.getWeight(), modules);
} }
/**
* Unregister a display module.
*
* @param module The module.
*/
public static void unregisterDisplayModule(@NotNull final DisplayModule module) {
for (List<DisplayModule> modules : REGISTERED_MODULES.values()) {
modules.remove(module);
}
}
private Display() { private Display() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
} }

View File

@@ -0,0 +1,19 @@
@file:Suppress("UnstableApiUsage")
package com.willfp.eco.internal.compat.modern.recipes
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.internal.recipes.AutocrafterPatch
import org.bukkit.event.EventHandler
import org.bukkit.event.block.CrafterCraftEvent
class AutocrafterPatchImpl: AutocrafterPatch {
@EventHandler
fun preventEcoRecipes(event: CrafterCraftEvent) {
if (!EcoPlugin.getPluginNames().contains(event.recipe.key.namespace)) {
return
}
event.isCancelled = true
}
}

View File

@@ -126,14 +126,19 @@ abstract class HandledCommand(
* @return The tab completion results. * @return The tab completion results.
*/ */
private fun CommandBase.handleTabComplete(sender: CommandSender, args: List<String>): List<String> { private fun CommandBase.handleTabComplete(sender: CommandSender, args: List<String>): List<String> {
if (!sender.hasPermission(permission)) return emptyList() if (!sender.hasPermission(permission)) {
return emptyList()
}
if (args.size == 1) { if (args.size == 1) {
val completions = subcommands.filter { sender.hasPermission(it.permission) }.map { it.name } val completions = mutableListOf<String>()
val list = mutableListOf<String>() StringUtil.copyPartialMatches(
args[0],
subcommands.filter { sender.hasPermission(it.permission) }.map { it.name },
completions
)
StringUtil.copyPartialMatches(args[0], completions, list)
if (completions.isNotEmpty()) { if (completions.isNotEmpty()) {
return completions return completions
} }
@@ -156,9 +161,11 @@ abstract class HandledCommand(
} }
val completions = tabComplete(sender, args).toMutableList() val completions = tabComplete(sender, args).toMutableList()
if (sender is Player) { if (sender is Player) {
completions.addAll(tabComplete(sender, args)) completions.addAll(tabComplete(sender, args))
} }
return completions.sorted() return completions.sorted()
} }
} }

View File

@@ -12,7 +12,7 @@ object ParticleFactoryRGB : ParticleFactory {
if (Prerequisite.HAS_1_20_5.isMet) { if (Prerequisite.HAS_1_20_5.isMet) {
Particle.valueOf("DUST") Particle.valueOf("DUST")
} else { } else {
Particle.valueOf("REDSTONE_DUST") Particle.valueOf("REDSTONE")
} }
}.getOrNull() }.getOrNull()

View File

@@ -8,6 +8,11 @@ import org.bukkit.entity.Player
import java.util.UUID import java.util.UUID
import kotlin.math.roundToInt import kotlin.math.roundToInt
private fun getXPNeededForLevel(level: Int): Int {
// XP Formula from NMS Player
return if (level >= 30) 112 + (level - 30) * 9 else (if (level >= 15) 37 + (level - 15) * 5 else 7 + level * 2)
}
object PriceFactoryXP : PriceFactory { object PriceFactoryXP : PriceFactory {
override fun getNames() = listOf( override fun getNames() = listOf(
"xp", "xp",
@@ -25,15 +30,37 @@ object PriceFactoryXP : PriceFactory {
) : Price { ) : Price {
private val multipliers = mutableMapOf<UUID, Double>() private val multipliers = mutableMapOf<UUID, Double>()
override fun canAfford(player: Player, multiplier: Double): Boolean = override fun canAfford(player: Player, multiplier: Double): Boolean {
player.totalExperience >= getValue(player, multiplier) var totalExperience = 0
for (level in 0 until player.level) {
totalExperience += getXPNeededForLevel(level)
}
totalExperience += (player.exp * getXPNeededForLevel(player.level)).toInt()
return totalExperience >= getValue(player, multiplier).roundToInt()
}
override fun pay(player: Player, multiplier: Double) { override fun pay(player: Player, multiplier: Double) {
player.totalExperience -= getValue(player, multiplier).roundToInt() takeXP(player, getValue(player, multiplier).roundToInt())
}
private fun takeXP(player: Player, amount: Int) {
val currentLevel = player.level
val currentExp = player.exp * getXPNeededForLevel(currentLevel)
if (currentExp >= amount) {
player.exp = (currentExp - amount) / getXPNeededForLevel(currentLevel)
} else {
// Handle recursive level down
player.exp = 1f
player.level = (currentLevel - 1).coerceAtLeast(0)
takeXP(player, (amount - currentExp).toInt())
}
} }
override fun giveTo(player: Player, multiplier: Double) { override fun giveTo(player: Player, multiplier: Double) {
player.totalExperience += getValue(player, multiplier).roundToInt() player.giveExp(getValue(player, multiplier).roundToInt())
} }
override fun getValue(player: Player, multiplier: Double): Double { override fun getValue(player: Player, multiplier: Double): Double {

View File

@@ -0,0 +1,7 @@
package com.willfp.eco.internal.recipes
import com.willfp.eco.internal.compat.ModernCompatibilityProxy
import org.bukkit.event.Listener
@ModernCompatibilityProxy("recipes.AutocrafterPatchImpl")
interface AutocrafterPatch: Listener

View File

@@ -43,15 +43,13 @@ class DisplayName : DisplayNameProxy {
val nmsComponent = displayName.toNMS() val nmsComponent = displayName.toNMS()
val nmsEntity = entity.handle val nmsEntity = entity.handle
nmsEntity.isCustomNameVisible
val entityData = SynchedEntityData.Builder(nmsEntity).build()
entityData.set(displayNameAccessor, Optional.of(nmsComponent), true)
entityData.set(customNameVisibleAccessor, visible, true)
val packet = ClientboundSetEntityDataPacket( val packet = ClientboundSetEntityDataPacket(
nmsEntity.id, nmsEntity.id,
entityData.packDirty() ?: throw IllegalStateException("No packed entity data") listOf(
SynchedEntityData.DataValue.create(displayNameAccessor, Optional.of(nmsComponent)),
SynchedEntityData.DataValue.create(customNameVisibleAccessor, visible)
)
) )
player.sendPacket(Packet(packet)) player.sendPacket(Packet(packet))

View File

@@ -10,6 +10,7 @@ import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataContainer import org.bukkit.persistence.PersistentDataContainer
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
import java.lang.reflect.Field
class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy { class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFactoryProxy {
private val registry: CraftPersistentDataTypeRegistry private val registry: CraftPersistentDataTypeRegistry
@@ -21,7 +22,15 @@ class ExtendedPersistentDataContainerFactory : ExtendedPersistentDataContainerFa
*/ */
val item = CraftItemStack.asCraftCopy(ItemStack(Material.STONE)) val item = CraftItemStack.asCraftCopy(ItemStack(Material.STONE))
val pdc = item.itemMeta!!.persistentDataContainer val pdc = item.itemMeta!!.persistentDataContainer
this.registry = CraftPersistentDataContainer::class.java.getDeclaredField("registry")
// Cross-version compatibility:
val registryField: Field = try {
CraftPersistentDataContainer::class.java.getDeclaredField("registry")
} catch (e: NoSuchFieldException) {
CraftPersistentDataContainer::class.java.superclass.getDeclaredField("registry")
}
this.registry = registryField
.apply { isAccessible = true }.get(pdc) as CraftPersistentDataTypeRegistry .apply { isAccessible = true }.get(pdc) as CraftPersistentDataTypeRegistry
} }

View File

@@ -66,6 +66,7 @@ dependencies {
compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.0.1") compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.0.1")
compileOnly("net.william278:husktowns:2.6.1") compileOnly("net.william278:husktowns:2.6.1")
compileOnly("com.github.jojodmo:ItemBridge:b0054538c1") compileOnly("com.github.jojodmo:ItemBridge:b0054538c1")
compileOnly("de.oliver:FancyHolograms:2.3.0")
compileOnly(fileTree("../../lib") { compileOnly(fileTree("../../lib") {
include("*.jar") include("*.jar")

View File

@@ -58,6 +58,7 @@ import com.willfp.eco.internal.particle.ParticleFactoryRGB
import com.willfp.eco.internal.price.PriceFactoryEconomy import com.willfp.eco.internal.price.PriceFactoryEconomy
import com.willfp.eco.internal.price.PriceFactoryXP import com.willfp.eco.internal.price.PriceFactoryXP
import com.willfp.eco.internal.price.PriceFactoryXPLevels import com.willfp.eco.internal.price.PriceFactoryXPLevels
import com.willfp.eco.internal.recipes.AutocrafterPatch
import com.willfp.eco.internal.spigot.arrows.ArrowDataListener import com.willfp.eco.internal.spigot.arrows.ArrowDataListener
import com.willfp.eco.internal.spigot.data.DataListener import com.willfp.eco.internal.spigot.data.DataListener
import com.willfp.eco.internal.spigot.data.DataYml import com.willfp.eco.internal.spigot.data.DataYml
@@ -114,6 +115,7 @@ import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault
import com.willfp.eco.internal.spigot.integrations.entitylookup.EntityLookupModelEngine import com.willfp.eco.internal.spigot.integrations.entitylookup.EntityLookupModelEngine
import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI
import com.willfp.eco.internal.spigot.integrations.hologram.HologramDecentHolograms import com.willfp.eco.internal.spigot.integrations.hologram.HologramDecentHolograms
import com.willfp.eco.internal.spigot.integrations.hologram.HologramFancyHolograms
import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicDisplays import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicDisplays
import com.willfp.eco.internal.spigot.integrations.mcmmo.McmmoIntegrationImpl import com.willfp.eco.internal.spigot.integrations.mcmmo.McmmoIntegrationImpl
import com.willfp.eco.internal.spigot.integrations.multiverseinventories.MultiverseInventoriesIntegration import com.willfp.eco.internal.spigot.integrations.multiverseinventories.MultiverseInventoriesIntegration
@@ -369,6 +371,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
IntegrationLoader("CMI") { HologramManager.register(HologramCMI()) }, IntegrationLoader("CMI") { HologramManager.register(HologramCMI()) },
IntegrationLoader("DecentHolograms") { HologramManager.register(HologramDecentHolograms()) }, IntegrationLoader("DecentHolograms") { HologramManager.register(HologramDecentHolograms()) },
//IntegrationLoader("GHolo") { HologramManager.register(HologramGHolo()) }, //IntegrationLoader("GHolo") { HologramManager.register(HologramGHolo()) },
IntegrationLoader("FancyHolograms") { HologramManager.register(HologramFancyHolograms()) },
// AFK // AFK
IntegrationLoader("Essentials") { AFKManager.register(AFKIntegrationEssentials()) }, IntegrationLoader("Essentials") { AFKManager.register(AFKIntegrationEssentials()) },
@@ -433,6 +436,10 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
listeners.add(NaturalExpGainListenersSpigot()) listeners.add(NaturalExpGainListenersSpigot())
} }
ifModern {
listeners += loadProxy<AutocrafterPatch>()
}
return listeners return listeners
} }

View File

@@ -0,0 +1,45 @@
package com.willfp.eco.internal.spigot.integrations.hologram
import com.willfp.eco.core.integrations.hologram.Hologram
import com.willfp.eco.core.integrations.hologram.HologramIntegration
import de.oliver.fancyholograms.api.FancyHologramsPlugin
import de.oliver.fancyholograms.api.data.TextHologramData
import org.bukkit.Location
import java.util.UUID
import kotlin.jvm.optionals.getOrNull
class HologramFancyHolograms : HologramIntegration {
private val manager = FancyHologramsPlugin.get().hologramManager
override fun createHologram(location: Location, contents: List<String>): Hologram {
val id = UUID.randomUUID().toString()
val data = TextHologramData(id, location)
data.text = contents
data.isPersistent = false
val holo = manager.create(data)
FancyHologramsPlugin.get().hologramManager.addHologram(holo)
return HologramImplFancyHolograms(id)
}
override fun getPluginName(): String {
return "FancyHolograms"
}
inner class HologramImplFancyHolograms(
private val id: String,
) : Hologram {
override fun remove() {
val hologram = manager.getHologram(id).getOrNull() ?: return
manager.removeHologram(hologram)
}
override fun setContents(contents: List<String>) {
val hologram = manager.getHologram(id).getOrNull() ?: return
val data = hologram.data as? TextHologramData ?: return
data.text = contents
}
}
}

View File

@@ -1,10 +1,8 @@
package com.willfp.eco.internal.spigot.recipes package com.willfp.eco.internal.spigot.recipes
import com.willfp.eco.core.Eco
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.recipe.Recipes import com.willfp.eco.core.recipe.Recipes
import org.bukkit.Keyed import org.bukkit.Keyed
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.inventory.CraftItemEvent import org.bukkit.event.inventory.CraftItemEvent
@@ -17,6 +15,7 @@ class CraftingRecipeListener(val plugin: EcoPlugin) : Listener {
if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) { if (!EcoPlugin.getPluginNames().contains(event.recipe.namespace)) {
return return
} }
if (event.recipe.key.contains("_displayed")) { if (event.recipe.key.contains("_displayed")) {
event.isCancelled = true event.isCancelled = true
} }

View File

@@ -59,4 +59,4 @@ class WrappedCraftItemEvent(
event.result = Event.Result.DENY event.result = Event.Result.DENY
event.isCancelled = true event.isCancelled = true
} }
} }

View File

@@ -61,3 +61,4 @@ softdepend:
- PlayerPoints - PlayerPoints
- Denizen - Denizen
- RoyaleEconomy - RoyaleEconomy
- FancyHolograms

View File

@@ -1,2 +1,2 @@
version = 6.71.4 version = 6.72.0
kotlin.incremental.useClasspathSnapshot=false kotlin.incremental.useClasspathSnapshot=false