Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dfe2f1361b | ||
|
|
3826f9f713 | ||
|
|
c2d2303c91 | ||
|
|
b1158ceb3d | ||
|
|
af4048afbe | ||
|
|
fce12020d5 | ||
|
|
7e37332b64 | ||
|
|
52dbf9ff52 | ||
|
|
78b6292367 | ||
|
|
09705e787b | ||
|
|
9c86069a85 | ||
|
|
c857df2360 | ||
|
|
f4fc611f3b |
@@ -350,7 +350,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.getLogger().info("");
|
||||
this.getLogger().info("Loading " + this.getColor() + this.getName());
|
||||
|
||||
if (this.getResourceId() != 0) {
|
||||
if (this.getResourceId() != 0 && !Eco.getHandler().getEcoPlugin().getConfigYml().getBool("no-update-checker")) {
|
||||
new UpdateChecker(this).getVersion(version -> {
|
||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(this.getDescription().getVersion());
|
||||
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
||||
|
||||
@@ -4,6 +4,8 @@ import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* Wrapper class for economy integrations.
|
||||
*/
|
||||
@@ -45,4 +47,14 @@ public interface EconomyIntegration extends Integration {
|
||||
* @return The balance.
|
||||
*/
|
||||
double getBalance(@NotNull OfflinePlayer player);
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
default BigDecimal getExactBalance(@NotNull OfflinePlayer player) {
|
||||
return BigDecimal.valueOf(getBalance(player));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core.integrations.economy;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -96,6 +97,20 @@ public final class EconomyManager {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the balance of a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The balance.
|
||||
*/
|
||||
public static BigDecimal getExactBalance(@NotNull final OfflinePlayer player) {
|
||||
for (EconomyIntegration integration : REGISTERED) {
|
||||
return integration.getExactBalance(player);
|
||||
}
|
||||
|
||||
return BigDecimal.ZERO;
|
||||
}
|
||||
|
||||
private EconomyManager() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
@@ -25,4 +28,27 @@ public interface ShopIntegration extends Integration {
|
||||
// Do nothing unless overridden.
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price of an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The price.
|
||||
*/
|
||||
default double getPrice(@NotNull final ItemStack itemStack) {
|
||||
// Do nothing unless overridden.
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price of an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The price.
|
||||
*/
|
||||
default double getPrice(@NotNull final ItemStack itemStack,
|
||||
@NotNull final Player player) {
|
||||
return getPrice(itemStack);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
@@ -52,6 +55,40 @@ public final class ShopManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price of an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The price.
|
||||
*/
|
||||
public static double getItemPrice(@Nullable final ItemStack itemStack) {
|
||||
return getItemPrice(itemStack, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price of an item.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The price.
|
||||
*/
|
||||
public static double getItemPrice(@Nullable final ItemStack itemStack,
|
||||
@Nullable final Player player) {
|
||||
if (itemStack == null) {
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
for (ShopIntegration shopIntegration : REGISTERED) {
|
||||
if (player == null) {
|
||||
return shopIntegration.getPrice(itemStack);
|
||||
} else {
|
||||
return shopIntegration.getPrice(itemStack, player);
|
||||
}
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
private ShopManager() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -25,13 +25,30 @@ public class Paste {
|
||||
*/
|
||||
private final String contents;
|
||||
|
||||
/**
|
||||
* The host.
|
||||
*/
|
||||
private final String host;
|
||||
|
||||
/**
|
||||
* Create a new paste.
|
||||
*
|
||||
* @param contents The contents.
|
||||
*/
|
||||
public Paste(@NotNull final String contents) {
|
||||
this(contents, "https://paste.willfp.com");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new paste.
|
||||
*
|
||||
* @param contents The contents.
|
||||
* @param host The host.
|
||||
*/
|
||||
public Paste(@NotNull final String contents,
|
||||
@NotNull final String host) {
|
||||
this.contents = contents;
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -47,7 +64,7 @@ public class Paste {
|
||||
byte[] postData = URLEncoder.encode(contents, StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8);
|
||||
int postDataLength = postData.length;
|
||||
|
||||
String requestURL = "https://paste.willfp.com/documents";
|
||||
String requestURL = this.host + "/documents";
|
||||
URL url = new URL(requestURL);
|
||||
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
|
||||
conn.setDoOutput(true);
|
||||
@@ -85,14 +102,26 @@ public class Paste {
|
||||
* @return The paste.
|
||||
*/
|
||||
public static Paste getFromHastebin(@NotNull final String token) {
|
||||
return getFromHastebin(token, "https://paste.willfp.com");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get paste from hastebin.
|
||||
*
|
||||
* @param token The token.
|
||||
* @param host The host.
|
||||
* @return The paste.
|
||||
*/
|
||||
public static Paste getFromHastebin(@NotNull final String token,
|
||||
@NotNull final String host) {
|
||||
try {
|
||||
StringBuilder result = new StringBuilder();
|
||||
URL url = new URL("https://paste.willfp.com/raw/" + token);
|
||||
URL url = new URL(host + "/raw/" + token);
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setRequestMethod("GET");
|
||||
try (var reader = new BufferedReader(
|
||||
new InputStreamReader(conn.getInputStream()))) {
|
||||
for (String line; (line = reader.readLine()) != null;) {
|
||||
for (String line; (line = reader.readLine()) != null; ) {
|
||||
result.append(line);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
package com.willfp.eco.core.integrations.economy
|
||||
|
||||
import org.bukkit.OfflinePlayer
|
||||
import java.math.BigDecimal
|
||||
|
||||
/** @see EconomyManager */
|
||||
var OfflinePlayer.balance: Double
|
||||
@@ -21,3 +22,21 @@ var OfflinePlayer.balance: Double
|
||||
EconomyManager.giveMoney(this, -diff)
|
||||
}
|
||||
}
|
||||
|
||||
/** @see EconomyManager */
|
||||
var OfflinePlayer.exactBalance: BigDecimal
|
||||
get() = EconomyManager.getBalance(this).toBigDecimal()
|
||||
set(value) {
|
||||
if (value <= BigDecimal.ZERO) {
|
||||
EconomyManager.removeMoney(this, this.balance)
|
||||
return
|
||||
}
|
||||
|
||||
val diff = this.exactBalance - value
|
||||
|
||||
if (diff > BigDecimal.ZERO) {
|
||||
EconomyManager.removeMoney(this, diff.toDouble())
|
||||
} else if (diff < BigDecimal.ZERO) {
|
||||
EconomyManager.giveMoney(this, -diff.toDouble())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
@file:JvmName("ShopExtensions")
|
||||
|
||||
package com.willfp.eco.core.integrations.shop
|
||||
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/** @see ShopManager.getItemPrice **/
|
||||
val ItemStack.price: Double
|
||||
get() = ShopManager.getItemPrice(this)
|
||||
|
||||
/** @see ShopManager.getItemPrice **/
|
||||
fun ItemStack.getPrice(player: Player): Double =
|
||||
ShopManager.getItemPrice(this, player)
|
||||
@@ -47,6 +47,7 @@ dependencies {
|
||||
compileOnly 'com.wolfyscript.wolfyutilities:wolfyutilities:3.16.0.0'
|
||||
compileOnly 'com.github.decentsoftware-eu:decentholograms:2.1.2'
|
||||
compileOnly 'com.github.Gypopo:EconomyShopGUI-API:1.1.0'
|
||||
compileOnly 'com.github.N0RSKA:ScytherAPI:55a'
|
||||
|
||||
// MythicMobs
|
||||
compileOnly 'io.lumine:Mythic:5.0.1'
|
||||
|
||||
@@ -101,6 +101,7 @@ import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDa
|
||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder
|
||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsMythicMobs
|
||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen
|
||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsScyther
|
||||
import com.willfp.eco.internal.spigot.integrations.customrecipes.CustomRecipeCustomCrafting
|
||||
import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault
|
||||
import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI
|
||||
@@ -313,6 +314,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() {
|
||||
CraftingRecipeListener.registerValidator(CustomRecipeCustomCrafting())
|
||||
},
|
||||
IntegrationLoader("MythicMobs") { CustomItemsManager.register(CustomItemsMythicMobs(this)) },
|
||||
IntegrationLoader("Scyther") { CustomItemsManager.register(CustomItemsScyther()) },
|
||||
|
||||
// Shop
|
||||
IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) },
|
||||
|
||||
@@ -67,7 +67,6 @@ class MySQLDataHandler(
|
||||
|
||||
table.apply {
|
||||
registerColumn<String>("json_data", TextColumnType())
|
||||
.default("{}")
|
||||
}
|
||||
|
||||
SchemaUtils.createMissingTablesAndColumns(table, withLogs = false)
|
||||
@@ -124,7 +123,7 @@ class MySQLDataHandler(
|
||||
}
|
||||
}
|
||||
|
||||
row[dataColumn]
|
||||
row.getOrNull(dataColumn) ?: "{}"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -27,7 +27,9 @@ class AntigriefDeluxeCombat: AntigriefIntegration {
|
||||
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
|
||||
val api = DeluxeCombatAPI()
|
||||
return when(victim) {
|
||||
is Player -> ((!api.hasProtection(victim) && api.hasPvPEnabled(victim)) || api.isInCombat(victim))
|
||||
is Player -> {
|
||||
if (api.hasProtection(player) || !api.hasPvPEnabled(player)) false
|
||||
else ((!api.hasProtection(victim) && api.hasPvPEnabled(victim)) || api.isInCombat(victim))}
|
||||
else -> true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,55 +15,51 @@ class AntigriefFabledSkyBlock : AntigriefIntegration {
|
||||
}
|
||||
|
||||
override fun canBreakBlock(player: Player, block: Block): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = skyblock.islandManager.getIslandAtLocation(block.location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.destroy")) {
|
||||
return false
|
||||
if (player.hasPermission("fabledskyblock.bypass.destroy")) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "Destroy", island.getRole(player))) {
|
||||
return false
|
||||
if (skyblock.permissionManager.hasPermission(island, "Destroy", island.getRole(player))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
override fun canCreateExplosion(player: Player, location: Location): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = skyblock.islandManager.getIslandAtLocation(location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.explosions")) {
|
||||
return false
|
||||
if (player.hasPermission("fabledskyblock.bypass.explosions")) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "Explosions", island.getRole(player))) {
|
||||
return false
|
||||
if (skyblock.permissionManager.hasPermission(island, "Explosions", island.getRole(player))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
override fun canPlaceBlock(player: Player, block: Block): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = skyblock.islandManager.getIslandAtLocation(block.location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.place")) {
|
||||
return false
|
||||
if (player.hasPermission("fabledskyblock.bypass.place")) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "Place", island.getRole(player))) {
|
||||
return false
|
||||
if (skyblock.permissionManager.hasPermission(island, "Place", island.getRole(player))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = SkyBlock.getInstance().islandManager.getIslandAtLocation(victim.location) ?: return true
|
||||
|
||||
@@ -74,26 +70,25 @@ class AntigriefFabledSkyBlock : AntigriefIntegration {
|
||||
else -> "MobHurting"
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, islandPermission, island.getRole(player))) {
|
||||
return false
|
||||
if (skyblock.permissionManager.hasPermission(island, islandPermission, island.getRole(player))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
||||
override fun canPickupItem(player: Player, location: Location): Boolean {
|
||||
|
||||
val skyblock = SkyBlock.getInstance()
|
||||
val island = SkyBlock.getInstance().islandManager.getIslandAtLocation(location) ?: return true
|
||||
|
||||
if (!player.hasPermission("fabledskyblock.bypass.itempickup")) {
|
||||
return false
|
||||
if (player.hasPermission("fabledskyblock.bypass.itempickup")) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (!skyblock.permissionManager.hasPermission(island, "ItemPickup", island.getRole(player))) {
|
||||
return false
|
||||
if (skyblock.permissionManager.hasPermission(island, "ItemPickup", island.getRole(player))) {
|
||||
return true
|
||||
}
|
||||
|
||||
return true
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.willfp.eco.internal.spigot.integrations.customitems
|
||||
|
||||
import com.willfp.eco.core.integrations.customitems.CustomItemsIntegration
|
||||
import com.willfp.eco.core.items.CustomItem
|
||||
import com.willfp.eco.core.items.Items
|
||||
import com.willfp.eco.core.items.TestableItem
|
||||
import com.willfp.eco.core.items.provider.ItemProvider
|
||||
import com.willfp.eco.util.NamespacedKeyUtils
|
||||
import dev.norska.scyther.Scyther
|
||||
import dev.norska.scyther.api.ScytherAPI
|
||||
import org.bukkit.Material
|
||||
|
||||
class CustomItemsScyther : CustomItemsIntegration {
|
||||
override fun registerProvider() {
|
||||
Items.registerItemProvider(ScytherProvider())
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "Scyther"
|
||||
}
|
||||
|
||||
private class ScytherProvider : ItemProvider("scyther") {
|
||||
override fun provideForKey(key: String): TestableItem? {
|
||||
val material = Material.matchMaterial(key.uppercase()) ?: Material.WOODEN_HOE
|
||||
|
||||
val hoe = ScytherAPI.createHarvesterHoe(
|
||||
Scyther.getInstance(),
|
||||
material,
|
||||
0,
|
||||
null,
|
||||
1,
|
||||
Int.MAX_VALUE,
|
||||
null,
|
||||
null
|
||||
)
|
||||
|
||||
val namespacedKey = NamespacedKeyUtils.create("scyther", key)
|
||||
|
||||
return CustomItem(
|
||||
namespacedKey,
|
||||
{
|
||||
ScytherAPI.isHarvesterItem(it) && it.type == material
|
||||
},
|
||||
hoe
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,16 +2,27 @@ package com.willfp.eco.internal.spigot.integrations.shop
|
||||
|
||||
import com.willfp.eco.core.integrations.shop.ShopIntegration
|
||||
import com.willfp.eco.core.integrations.shop.ShopSellEvent
|
||||
import me.gypopo.economyshopgui.api.EconomyShopGUIHook
|
||||
import me.gypopo.economyshopgui.api.events.PreTransactionEvent
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
class ShopEconomyShopGUI : ShopIntegration {
|
||||
override fun getSellEventAdapter(): Listener {
|
||||
return EconomyShopGUISellEventListeners
|
||||
}
|
||||
|
||||
override fun getPrice(itemStack: ItemStack, player: Player): Double {
|
||||
return EconomyShopGUIHook.getItemSellPrice(player, itemStack)
|
||||
}
|
||||
|
||||
override fun getPrice(itemStack: ItemStack): Double {
|
||||
return EconomyShopGUIHook.getItemSellPrice(itemStack)
|
||||
}
|
||||
|
||||
object EconomyShopGUISellEventListeners : Listener {
|
||||
@EventHandler
|
||||
fun shopEventToEcoEvent(event: PreTransactionEvent) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import net.brcdev.shopgui.provider.item.ItemProvider
|
||||
import net.brcdev.shopgui.shop.ShopManager
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.configuration.ConfigurationSection
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.inventory.ItemStack
|
||||
@@ -22,6 +23,14 @@ class ShopShopGuiPlus : ShopIntegration {
|
||||
return ShopGuiPlusSellEventListeners
|
||||
}
|
||||
|
||||
override fun getPrice(itemStack: ItemStack): Double {
|
||||
return ShopGuiPlusApi.getItemStackPriceSell(itemStack)
|
||||
}
|
||||
|
||||
override fun getPrice(itemStack: ItemStack, player: Player): Double {
|
||||
return ShopGuiPlusApi.getItemStackPriceSell(player, itemStack)
|
||||
}
|
||||
|
||||
class EcoShopGuiPlusProvider : ItemProvider("eco") {
|
||||
override fun isValidItem(itemStack: ItemStack?): Boolean {
|
||||
itemStack ?: return false
|
||||
|
||||
@@ -74,4 +74,9 @@ log-full-extension-errors: false
|
||||
displayed-recipes: true
|
||||
|
||||
# Save health on leave and set it back on join - works around attribute modifiers.
|
||||
health-fixer: false
|
||||
health-fixer: false
|
||||
|
||||
# If eco plugins should not check for updates; only enable this if you know what you're doing
|
||||
# as there can be urgent hotfixes that you are then not notified about. If you're confident
|
||||
# that you can manage updates on your own, turn this on.
|
||||
no-update-checker: false
|
||||
@@ -46,4 +46,5 @@ softdepend:
|
||||
- RPGHorses
|
||||
- EconomyShopGUI
|
||||
- zShop
|
||||
- DeluxeSellwands
|
||||
- DeluxeSellwands
|
||||
- Scyther
|
||||
@@ -1,3 +1,3 @@
|
||||
version = 6.40.0
|
||||
version = 6.41.0
|
||||
plugin-name = eco
|
||||
kotlin.code.style = official
|
||||
Reference in New Issue
Block a user