Compare commits
50 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
732aaa3bf1 | ||
|
|
a38387be33 | ||
|
|
582f9b08f3 | ||
|
|
638367cbb2 | ||
|
|
ec35e7d779 | ||
|
|
1cc2a585d6 | ||
|
|
aa553b96d6 | ||
|
|
feb7ecee48 | ||
|
|
c0be6a12ff | ||
|
|
1dc6b651a0 | ||
|
|
3c26c02642 | ||
|
|
343508f099 | ||
|
|
76dc4948bc | ||
|
|
8fa209a981 | ||
|
|
b3a0634ad0 | ||
|
|
97d7acc0a9 | ||
|
|
ebac75b0ee | ||
|
|
02d0fa85b5 | ||
|
|
168915868c | ||
|
|
d62d598fd6 | ||
|
|
06561c5387 | ||
|
|
c9805e91b4 | ||
|
|
e3be95ca4d | ||
|
|
2e6463aed9 | ||
|
|
2501574eeb | ||
|
|
3c237fd856 | ||
|
|
7b3fd1d0c2 | ||
|
|
e599add6de | ||
|
|
1bda970f6b | ||
|
|
eb1f694905 | ||
|
|
efd3403eda | ||
|
|
08b563d528 | ||
|
|
c3f88bf7b0 | ||
|
|
eb6d76e0c6 | ||
|
|
f2d0e8c368 | ||
|
|
5e7b9573a1 | ||
|
|
7d457ea496 | ||
|
|
806bf9a43f | ||
|
|
316f134b71 | ||
|
|
0d363b9fb6 | ||
|
|
2890083eaa | ||
|
|
694646431b | ||
|
|
86d5e9d09e | ||
|
|
8635e5f7a5 | ||
|
|
aa718649eb | ||
|
|
1dc0fa449b | ||
|
|
19e3061a13 | ||
|
|
ecafbd76de | ||
|
|
3728f2fc7a | ||
|
|
c0547a7c34 |
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: Auxilor Community Discord
|
||||||
|
url: https://discord.gg/ZcwpSsE/
|
||||||
|
about: Join the Auxilor discord to get help from support staff and the general community!
|
||||||
|
- name: The most common issues people have
|
||||||
|
url: https://github.com/Auxilor/eco/issues/78
|
||||||
|
about: Check the list of known common issues to see if your issue has already been solved
|
||||||
31
.github/ISSUE_TEMPLATE/report-a-bug.md
vendored
Normal file
31
.github/ISSUE_TEMPLATE/report-a-bug.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
name: Report a Bug
|
||||||
|
about: Report an issue with the plugin
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Server Information (please complete the following information):**
|
||||||
|
- Version: (output of `/ver` command)
|
||||||
|
- Version of plugin and eco (`/ver eco`, `/ver <plugin>`)
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
20
.github/ISSUE_TEMPLATE/request-a-feature.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/request-a-feature.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Request a Feature
|
||||||
|
about: Suggest an idea for this plugin
|
||||||
|
title: ''
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
@@ -64,6 +64,9 @@ allprojects {
|
|||||||
|
|
||||||
// MythicMobs
|
// MythicMobs
|
||||||
maven("https://mvn.lumine.io/repository/maven-public/")
|
maven("https://mvn.lumine.io/repository/maven-public/")
|
||||||
|
|
||||||
|
// Crunch
|
||||||
|
maven("https://redempt.dev")
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -91,12 +94,14 @@ allprojects {
|
|||||||
exclude(group = "org.spongepowered", module = "configurate-hocon")
|
exclude(group = "org.spongepowered", module = "configurate-hocon")
|
||||||
exclude(group = "com.darkblade12", module = "particleeffect")
|
exclude(group = "com.darkblade12", module = "particleeffect")
|
||||||
exclude(group = "com.github.cryptomorin", module = "XSeries")
|
exclude(group = "com.github.cryptomorin", module = "XSeries")
|
||||||
|
exclude(group = "org.apache.commons", module = "commons-lang3")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
shadowJar {
|
shadowJar {
|
||||||
relocate("org.bstats", "com.willfp.eco.shaded.bstats")
|
relocate("org.bstats", "com.willfp.eco.shaded.bstats")
|
||||||
relocate("net.kyori.adventure.text.minimessage", "com.willfp.eco.shaded.minimessage")
|
relocate("net.kyori.adventure.text.minimessage", "com.willfp.eco.shaded.minimessage")
|
||||||
|
relocate("redempt.crunch", "com.willfp.eco.shaded.crunch")
|
||||||
}
|
}
|
||||||
|
|
||||||
compileJava {
|
compileJava {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ dependencies {
|
|||||||
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
|
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
|
||||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
|
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
|
||||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
compileOnly 'com.google.code.gson:gson:2.8.8'
|
||||||
|
compileOnly 'org.apache.commons:commons-lang3:3.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
||||||
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
||||||
this.outdated = true;
|
this.outdated = true;
|
||||||
this.getLogger().warning("&c " + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
this.getLogger().warning("&c" + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||||
this.getLogger().warning("&cThe newest version is &f" + version);
|
this.getLogger().warning("&cThe newest version is &f" + version);
|
||||||
this.getLogger().warning("&cDownload the new version!");
|
this.getLogger().warning("&cDownload the new version!");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import com.willfp.eco.core.requirement.RequirementFactory;
|
|||||||
import com.willfp.eco.core.scheduling.Scheduler;
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
@@ -243,4 +244,19 @@ public interface Handler {
|
|||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
Entity createDummyEntity(@NotNull Location location);
|
Entity createDummyEntity(@NotNull Location location);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a {@link NamespacedKey} quickly
|
||||||
|
* <p>
|
||||||
|
* Bypasses the constructor, allowing for the creation of invalid keys,
|
||||||
|
* therefore this is considered unsafe and should only be called after
|
||||||
|
* the key has been confirmed to be valid.
|
||||||
|
*
|
||||||
|
* @param namespace The namespace.
|
||||||
|
* @param key The key.
|
||||||
|
* @return The key.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
NamespacedKey createNamespacedKey(@NotNull String namespace,
|
||||||
|
@NotNull String key);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package com.willfp.eco.core.config.interfaces;
|
|||||||
|
|
||||||
import com.willfp.eco.core.config.ConfigType;
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.TransientConfig;
|
import com.willfp.eco.core.config.TransientConfig;
|
||||||
|
import com.willfp.eco.util.NumberUtils;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -108,6 +110,29 @@ public interface Config extends Cloneable {
|
|||||||
return Objects.requireNonNullElse(getIntOrNull(path), def);
|
return Objects.requireNonNullElse(getIntOrNull(path), def);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a decimal value via a mathematical expression.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @return The computed value, or 0 if not found or invalid.
|
||||||
|
*/
|
||||||
|
default int getIntFromExpression(@NotNull String path) {
|
||||||
|
return getIntFromExpression(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a decimal value via a mathematical expression.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param player The player to evaluate placeholders with respect to.
|
||||||
|
* @return The computed value, or 0 if not found or invalid.
|
||||||
|
*/
|
||||||
|
default int getIntFromExpression(@NotNull String path,
|
||||||
|
@Nullable Player player) {
|
||||||
|
return Double.valueOf(getDoubleFromExpression(path, player)).intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get an integer from config.
|
* Get an integer from config.
|
||||||
*
|
*
|
||||||
@@ -519,6 +544,28 @@ public interface Config extends Cloneable {
|
|||||||
return Objects.requireNonNullElse(getDoubleOrNull(path), 0.0);
|
return Objects.requireNonNullElse(getDoubleOrNull(path), 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a decimal value via a mathematical expression.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @return The computed value, or 0 if not found or invalid.
|
||||||
|
*/
|
||||||
|
default double getDoubleFromExpression(@NotNull String path) {
|
||||||
|
return getDoubleFromExpression(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a decimal value via a mathematical expression.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param player The player to evaluate placeholders with respect to.
|
||||||
|
* @return The computed value, or 0 if not found or invalid.
|
||||||
|
*/
|
||||||
|
default double getDoubleFromExpression(@NotNull String path,
|
||||||
|
@Nullable Player player) {
|
||||||
|
return NumberUtils.evaluateExpression(this.getString(path), player);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a decimal from config.
|
* Get a decimal from config.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class PersistentDataKey<T> {
|
|||||||
/**
|
/**
|
||||||
* The persistent data key type.
|
* The persistent data key type.
|
||||||
*/
|
*/
|
||||||
private final PersistentDataKeyType type;
|
private final PersistentDataKeyType<T> type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new Persistent Data Key.
|
* Create a new Persistent Data Key.
|
||||||
@@ -35,7 +35,7 @@ public class PersistentDataKey<T> {
|
|||||||
* @param defaultValue The default value.
|
* @param defaultValue The default value.
|
||||||
*/
|
*/
|
||||||
public PersistentDataKey(@NotNull final NamespacedKey key,
|
public PersistentDataKey(@NotNull final NamespacedKey key,
|
||||||
@NotNull final PersistentDataKeyType type,
|
@NotNull final PersistentDataKeyType<T> type,
|
||||||
@NotNull final T defaultValue) {
|
@NotNull final T defaultValue) {
|
||||||
this.key = key;
|
this.key = key;
|
||||||
this.defaultValue = defaultValue;
|
this.defaultValue = defaultValue;
|
||||||
@@ -53,15 +53,6 @@ public class PersistentDataKey<T> {
|
|||||||
+ '}';
|
+ '}';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all persistent data keys.
|
|
||||||
*
|
|
||||||
* @return The keys.
|
|
||||||
*/
|
|
||||||
public static Set<PersistentDataKey<?>> values() {
|
|
||||||
return Eco.getHandler().getKeyRegistry().getRegisteredKeys();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the key.
|
* Get the key.
|
||||||
*
|
*
|
||||||
@@ -85,7 +76,16 @@ public class PersistentDataKey<T> {
|
|||||||
*
|
*
|
||||||
* @return The key type.
|
* @return The key type.
|
||||||
*/
|
*/
|
||||||
public PersistentDataKeyType getType() {
|
public PersistentDataKeyType<T> getType() {
|
||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all persistent data keys.
|
||||||
|
*
|
||||||
|
* @return The keys.
|
||||||
|
*/
|
||||||
|
public static Set<PersistentDataKey<?>> values() {
|
||||||
|
return Eco.getHandler().getKeyRegistry().getRegisteredKeys();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,108 @@
|
|||||||
package com.willfp.eco.core.data.keys;
|
package com.willfp.eco.core.data.keys;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All storable data key types.
|
* All storable data key types.
|
||||||
|
*
|
||||||
|
* @param <T> The type.
|
||||||
*/
|
*/
|
||||||
public enum PersistentDataKeyType {
|
public final class PersistentDataKeyType<T> {
|
||||||
|
/**
|
||||||
|
* The registered key types.
|
||||||
|
*/
|
||||||
|
private static final List<PersistentDataKeyType<?>> VALUES = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String.
|
* String.
|
||||||
*/
|
*/
|
||||||
STRING,
|
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>(String.class, "STRING");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boolean.
|
* Boolean.
|
||||||
*/
|
*/
|
||||||
BOOLEAN,
|
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>(Boolean.class, "BOOLEAN");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Integer.
|
* Int.
|
||||||
*/
|
*/
|
||||||
INT,
|
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>(Integer.class, "INT");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Double.
|
* Double.
|
||||||
*/
|
*/
|
||||||
DOUBLE
|
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>(Double.class, "DOUBLE");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The class of the type.
|
||||||
|
*/
|
||||||
|
private final Class<T> typeClass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the key type.
|
||||||
|
*/
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the class of the type.
|
||||||
|
*
|
||||||
|
* @return The class.
|
||||||
|
*/
|
||||||
|
public Class<T> getTypeClass() {
|
||||||
|
return typeClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the key type.
|
||||||
|
*
|
||||||
|
* @return The name.
|
||||||
|
*/
|
||||||
|
public String name() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new PersistentDataKeyType.
|
||||||
|
*
|
||||||
|
* @param typeClass The type class.
|
||||||
|
* @param name The name.
|
||||||
|
*/
|
||||||
|
private PersistentDataKeyType(@NotNull final Class<T> typeClass,
|
||||||
|
@NotNull final String name) {
|
||||||
|
VALUES.add(this);
|
||||||
|
|
||||||
|
this.typeClass = typeClass;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all registered {@link PersistentDataKeyType}s.
|
||||||
|
*
|
||||||
|
* @return The registered types.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static PersistentDataKeyType<?>[] values() {
|
||||||
|
return VALUES.toArray(new PersistentDataKeyType[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a key type from a name.
|
||||||
|
*
|
||||||
|
* @param name The name.
|
||||||
|
* @return The type, or null if not found.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static PersistentDataKeyType<?> valueOf(@NotNull final String name) {
|
||||||
|
for (PersistentDataKeyType<?> type : VALUES) {
|
||||||
|
if (type.name.equalsIgnoreCase(name)) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.willfp.eco.core.entities;
|
package com.willfp.eco.core.entities;
|
||||||
|
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package com.willfp.eco.core.entities.impl;
|
|||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.entities.TestableEntity;
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.willfp.eco.core.entities.impl;
|
package com.willfp.eco.core.entities.impl;
|
||||||
|
|
||||||
import com.willfp.eco.core.entities.TestableEntity;
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.willfp.eco.core.entities.impl;
|
package com.willfp.eco.core.entities.impl;
|
||||||
|
|
||||||
import com.willfp.eco.core.entities.TestableEntity;
|
import com.willfp.eco.core.entities.TestableEntity;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.integrations.placeholder;
|
package com.willfp.eco.core.integrations.placeholder;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -28,12 +29,20 @@ public class PlaceholderEntry {
|
|||||||
*/
|
*/
|
||||||
private final boolean requiresPlayer;
|
private final boolean requiresPlayer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The plugin for the placeholder.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private final EcoPlugin plugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a placeholder entry that doesn't require a player.
|
* Create a placeholder entry that doesn't require a player.
|
||||||
*
|
*
|
||||||
* @param identifier The identifier of the placeholder.
|
* @param identifier The identifier of the placeholder.
|
||||||
* @param function A lambda to get the result of the placeholder given a player.
|
* @param function A lambda to get the result of the placeholder given a player.
|
||||||
|
* @deprecated Specify a plugin.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public PlaceholderEntry(@NotNull final String identifier,
|
public PlaceholderEntry(@NotNull final String identifier,
|
||||||
@NotNull final Function<Player, String> function) {
|
@NotNull final Function<Player, String> function) {
|
||||||
this(identifier, function, false);
|
this(identifier, function, false);
|
||||||
@@ -45,10 +54,41 @@ public class PlaceholderEntry {
|
|||||||
* @param identifier The identifier of the placeholder.
|
* @param identifier The identifier of the placeholder.
|
||||||
* @param function A lambda to get the result of the placeholder.
|
* @param function A lambda to get the result of the placeholder.
|
||||||
* @param requiresPlayer If the placeholder requires a player.
|
* @param requiresPlayer If the placeholder requires a player.
|
||||||
|
* @deprecated Specify a plugin.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public PlaceholderEntry(@NotNull final String identifier,
|
public PlaceholderEntry(@NotNull final String identifier,
|
||||||
@NotNull final Function<Player, String> function,
|
@NotNull final Function<Player, String> function,
|
||||||
final boolean requiresPlayer) {
|
final boolean requiresPlayer) {
|
||||||
|
this(null, identifier, function, requiresPlayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a placeholder entry that doesn't require a player.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin for the placeholder.
|
||||||
|
* @param identifier The identifier of the placeholder.
|
||||||
|
* @param function A lambda to get the result of the placeholder given a player.
|
||||||
|
*/
|
||||||
|
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
||||||
|
@NotNull final String identifier,
|
||||||
|
@NotNull final Function<Player, String> function) {
|
||||||
|
this(plugin, identifier, function, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a placeholder entry that may require a player.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin for the placeholder.
|
||||||
|
* @param identifier The identifier of the placeholder.
|
||||||
|
* @param function A lambda to get the result of the placeholder.
|
||||||
|
* @param requiresPlayer If the placeholder requires a player.
|
||||||
|
*/
|
||||||
|
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
||||||
|
@NotNull final String identifier,
|
||||||
|
@NotNull final Function<Player, String> function,
|
||||||
|
final boolean requiresPlayer) {
|
||||||
|
this.plugin = plugin;
|
||||||
this.identifier = identifier;
|
this.identifier = identifier;
|
||||||
this.function = function;
|
this.function = function;
|
||||||
this.requiresPlayer = requiresPlayer;
|
this.requiresPlayer = requiresPlayer;
|
||||||
@@ -85,6 +125,16 @@ public class PlaceholderEntry {
|
|||||||
return identifier;
|
return identifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin.
|
||||||
|
*
|
||||||
|
* @return The plugin.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public EcoPlugin getPlugin() {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register the placeholder.
|
* Register the placeholder.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ import org.bukkit.entity.Player;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper class for placeholder integrations.
|
* Wrapper class for placeholder integrations.
|
||||||
*/
|
*/
|
||||||
@@ -24,4 +27,14 @@ public interface PlaceholderIntegration extends Integration {
|
|||||||
*/
|
*/
|
||||||
String translate(@NotNull String text,
|
String translate(@NotNull String text,
|
||||||
@Nullable Player player);
|
@Nullable Player player);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find all placeholders in a given text.
|
||||||
|
*
|
||||||
|
* @param text The text.
|
||||||
|
* @return The placeholders.
|
||||||
|
*/
|
||||||
|
default List<String> findPlaceholdersIn(@NotNull String text) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
package com.willfp.eco.core.integrations.placeholder;
|
package com.willfp.eco.core.integrations.placeholder;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -16,7 +20,7 @@ public final class PlaceholderManager {
|
|||||||
/**
|
/**
|
||||||
* All registered placeholders.
|
* All registered placeholders.
|
||||||
*/
|
*/
|
||||||
private static final Map<String, PlaceholderEntry> REGISTERED_PLACEHOLDERS = new HashMap<>();
|
private static final Map<EcoPlugin, Map<String, PlaceholderEntry>> REGISTERED_PLACEHOLDERS = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All registered placeholder integrations.
|
* All registered placeholder integrations.
|
||||||
@@ -39,8 +43,11 @@ public final class PlaceholderManager {
|
|||||||
* @param expansion The {@link PlaceholderEntry} to register.
|
* @param expansion The {@link PlaceholderEntry} to register.
|
||||||
*/
|
*/
|
||||||
public static void registerPlaceholder(@NotNull final PlaceholderEntry expansion) {
|
public static void registerPlaceholder(@NotNull final PlaceholderEntry expansion) {
|
||||||
REGISTERED_PLACEHOLDERS.remove(expansion.getIdentifier());
|
EcoPlugin plugin = expansion.getPlugin() == null ? Eco.getHandler().getEcoPlugin() : expansion.getPlugin();
|
||||||
REGISTERED_PLACEHOLDERS.put(expansion.getIdentifier(), expansion);
|
Map<String, PlaceholderEntry> pluginPlaceholders = REGISTERED_PLACEHOLDERS
|
||||||
|
.getOrDefault(plugin, new HashMap<>());
|
||||||
|
pluginPlaceholders.put(expansion.getIdentifier(), expansion);
|
||||||
|
REGISTERED_PLACEHOLDERS.put(plugin, pluginPlaceholders);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,10 +56,36 @@ public final class PlaceholderManager {
|
|||||||
* @param player The player to get the result from.
|
* @param player The player to get the result from.
|
||||||
* @param identifier The placeholder identifier.
|
* @param identifier The placeholder identifier.
|
||||||
* @return The value of the placeholder.
|
* @return The value of the placeholder.
|
||||||
|
* @deprecated Specify a plugin to get the result from.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static String getResult(@Nullable final Player player,
|
public static String getResult(@Nullable final Player player,
|
||||||
@NotNull final String identifier) {
|
@NotNull final String identifier) {
|
||||||
PlaceholderEntry entry = REGISTERED_PLACEHOLDERS.get(identifier.toLowerCase());
|
return getResult(player, identifier, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the result of a placeholder with respect to a player.
|
||||||
|
*
|
||||||
|
* @param player The player to get the result from.
|
||||||
|
* @param identifier The placeholder identifier.
|
||||||
|
* @param plugin The plugin for the placeholder.
|
||||||
|
* @return The value of the placeholder.
|
||||||
|
*/
|
||||||
|
public static String getResult(@Nullable final Player player,
|
||||||
|
@NotNull final String identifier,
|
||||||
|
@Nullable final EcoPlugin plugin) {
|
||||||
|
EcoPlugin owner = plugin == null ? Eco.getHandler().getEcoPlugin() : plugin;
|
||||||
|
PlaceholderEntry entry = REGISTERED_PLACEHOLDERS.getOrDefault(owner, new HashMap<>()).get(identifier.toLowerCase());
|
||||||
|
|
||||||
|
if (entry == null && plugin != null) {
|
||||||
|
PlaceholderEntry alternate = REGISTERED_PLACEHOLDERS.getOrDefault(Eco.getHandler().getEcoPlugin(), new HashMap<>())
|
||||||
|
.get(identifier.toLowerCase());
|
||||||
|
if (alternate != null) {
|
||||||
|
entry = alternate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@@ -80,6 +113,21 @@ public final class PlaceholderManager {
|
|||||||
return processed;
|
return processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find all placeholders in a given text.
|
||||||
|
*
|
||||||
|
* @param text The text.
|
||||||
|
* @return The placeholders.
|
||||||
|
*/
|
||||||
|
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
||||||
|
List<String> found = new ArrayList<>();
|
||||||
|
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||||
|
found.addAll(integration.findPlaceholdersIn(text));
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
private PlaceholderManager() {
|
private PlaceholderManager() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.items;
|
package com.willfp.eco.core.items;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.fast.FastItemStack;
|
||||||
import com.willfp.eco.core.items.args.LookupArgParser;
|
import com.willfp.eco.core.items.args.LookupArgParser;
|
||||||
import com.willfp.eco.core.items.provider.ItemProvider;
|
import com.willfp.eco.core.items.provider.ItemProvider;
|
||||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||||
@@ -13,6 +14,7 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@@ -34,6 +36,11 @@ public final class Items {
|
|||||||
*/
|
*/
|
||||||
private static final Map<NamespacedKey, TestableItem> REGISTRY = new ConcurrentHashMap<>();
|
private static final Map<NamespacedKey, TestableItem> REGISTRY = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cached custom item lookups, using {@link FastItemStack#hashCode()}.
|
||||||
|
*/
|
||||||
|
private static final Map<Integer, TestableItem> CACHE = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All item providers.
|
* All item providers.
|
||||||
*/
|
*/
|
||||||
@@ -276,12 +283,7 @@ public final class Items {
|
|||||||
* @return If is recipe.
|
* @return If is recipe.
|
||||||
*/
|
*/
|
||||||
public static boolean isCustomItem(@NotNull final ItemStack itemStack) {
|
public static boolean isCustomItem(@NotNull final ItemStack itemStack) {
|
||||||
for (TestableItem item : REGISTRY.values()) {
|
return getCustomItem(itemStack) != null;
|
||||||
if (item.matches(itemStack)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -292,12 +294,30 @@ public final class Items {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public static CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
|
public static CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
|
||||||
|
int hash = FastItemStack.wrap(itemStack).hashCode();
|
||||||
|
TestableItem cached = CACHE.get(hash);
|
||||||
|
if (cached != null) {
|
||||||
|
return getOrWrap(cached);
|
||||||
|
} else {
|
||||||
|
CACHE.remove(hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestableItem match = null;
|
||||||
|
|
||||||
for (TestableItem item : REGISTRY.values()) {
|
for (TestableItem item : REGISTRY.values()) {
|
||||||
if (item.matches(itemStack)) {
|
if (item.matches(itemStack)) {
|
||||||
return getOrWrap(item);
|
match = item;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
|
if (match == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
CACHE.put(hash, match);
|
||||||
|
|
||||||
|
return getOrWrap(match);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -331,6 +351,14 @@ public final class Items {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the lookup cache.
|
||||||
|
*/
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public static void clearCache() {
|
||||||
|
CACHE.clear();
|
||||||
|
}
|
||||||
|
|
||||||
private Items() {
|
private Items() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse leather armor colors.
|
|
||||||
*
|
|
||||||
* @deprecated Moved to internals.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
|
||||||
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.2")
|
|
||||||
public class ColorArgParser implements LookupArgParser {
|
|
||||||
/**
|
|
||||||
* Instantiate arg parser.
|
|
||||||
*/
|
|
||||||
public ColorArgParser() {
|
|
||||||
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
|
||||||
@NotNull final ItemMeta meta) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + ColorArgParser.class.getName() + "), this will throw an error in the next release!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse custom model data.
|
|
||||||
*
|
|
||||||
* @deprecated Moved to internals.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
|
||||||
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.2")
|
|
||||||
public class CustomModelDataArgParser implements LookupArgParser {
|
|
||||||
/**
|
|
||||||
* Instantiate arg parser.
|
|
||||||
*/
|
|
||||||
public CustomModelDataArgParser() {
|
|
||||||
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
|
||||||
@NotNull final ItemMeta meta) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + CustomModelDataArgParser.class.getName() + "), this will throw an error in the next release!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses enchantment arguments.
|
|
||||||
*
|
|
||||||
* @deprecated Moved to internals.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
|
||||||
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.2")
|
|
||||||
public class EnchantmentArgParser implements LookupArgParser {
|
|
||||||
/**
|
|
||||||
* Instantiate arg parser.
|
|
||||||
*/
|
|
||||||
public EnchantmentArgParser() {
|
|
||||||
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
|
||||||
@NotNull final ItemMeta meta) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + EnchantmentArgParser.class.getName() + "), this will throw an error in the next release!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
package com.willfp.eco.core.items.args;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse skull textures.
|
|
||||||
*
|
|
||||||
* @deprecated Moved to internals.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.16.0", forRemoval = true)
|
|
||||||
@ApiStatus.ScheduledForRemoval(inVersion = "6.18.2")
|
|
||||||
public class TextureArgParser implements LookupArgParser {
|
|
||||||
/**
|
|
||||||
* Instantiate arg parser.
|
|
||||||
*/
|
|
||||||
public TextureArgParser() {
|
|
||||||
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
|
||||||
@NotNull final ItemMeta meta) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
|
||||||
Bukkit.getLogger().severe("Referencing a class marked for removal! (" + TextureArgParser.class.getName() + "), this will throw an error in the next release!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,6 +6,7 @@ import com.willfp.eco.core.EcoPlugin;
|
|||||||
import com.willfp.eco.core.items.Items;
|
import com.willfp.eco.core.items.Items;
|
||||||
import com.willfp.eco.core.recipe.recipes.CraftingRecipe;
|
import com.willfp.eco.core.recipe.recipes.CraftingRecipe;
|
||||||
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
|
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -58,7 +59,10 @@ public final class Recipes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (key.getKey().contains("_displayed")) {
|
if (key.getKey().contains("_displayed")) {
|
||||||
NamespacedKey otherKey = new NamespacedKey(key.getNamespace(), key.getKey().replace("_displayed", ""));
|
NamespacedKey otherKey = NamespacedKeyUtils.create(
|
||||||
|
key.getNamespace(),
|
||||||
|
key.getKey().replace("_displayed", "")
|
||||||
|
);
|
||||||
|
|
||||||
return RECIPES.get(otherKey);
|
return RECIPES.get(otherKey);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
package com.willfp.eco.util;
|
package com.willfp.eco.util;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities / API methods for {@link NamespacedKey}s.
|
* Utilities / API methods for {@link NamespacedKey}s.
|
||||||
*/
|
*/
|
||||||
@@ -17,7 +16,7 @@ public final class NamespacedKeyUtils {
|
|||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public static NamespacedKey createEcoKey(@NotNull final String string) {
|
public static NamespacedKey createEcoKey(@NotNull final String string) {
|
||||||
return Objects.requireNonNull(NamespacedKey.fromString("eco:" + string));
|
return NamespacedKeyUtils.create("eco", string);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,7 +29,28 @@ public final class NamespacedKeyUtils {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static NamespacedKey create(@NotNull final String namespace,
|
public static NamespacedKey create(@NotNull final String namespace,
|
||||||
@NotNull final String key) {
|
@NotNull final String key) {
|
||||||
return Objects.requireNonNull(NamespacedKey.fromString(namespace + ":" + key));
|
return Eco.getHandler().createNamespacedKey(
|
||||||
|
namespace,
|
||||||
|
key
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a NamespacedKey from a string.
|
||||||
|
* <p>
|
||||||
|
* Preferred over {@link NamespacedKey#fromString(String)} for performance reasons.
|
||||||
|
*
|
||||||
|
* @param string The string.
|
||||||
|
* @return The key.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static NamespacedKey fromString(@NotNull final String string) {
|
||||||
|
int index = string.indexOf(":");
|
||||||
|
|
||||||
|
return NamespacedKeyUtils.create(
|
||||||
|
string.substring(0, index),
|
||||||
|
string.substring(index + 1)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private NamespacedKeyUtils() {
|
private NamespacedKeyUtils() {
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
package com.willfp.eco.util;
|
package com.willfp.eco.util;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
import java.util.function.BiFunction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities / API methods for numbers.
|
* Utilities / API methods for numbers.
|
||||||
@@ -16,6 +21,11 @@ public final class NumberUtils {
|
|||||||
*/
|
*/
|
||||||
private static final double[] SIN_LOOKUP = new double[65536];
|
private static final double[] SIN_LOOKUP = new double[65536];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crunch handler.
|
||||||
|
*/
|
||||||
|
private static BiFunction<String, Player, Double> crunch = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set of roman numerals to look up.
|
* Set of roman numerals to look up.
|
||||||
*/
|
*/
|
||||||
@@ -83,7 +93,9 @@ public final class NumberUtils {
|
|||||||
* @param toChange The value to test.
|
* @param toChange The value to test.
|
||||||
* @param limit The maximum.
|
* @param limit The maximum.
|
||||||
* @return The new value.
|
* @return The new value.
|
||||||
|
* @deprecated Pointless method.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.19.0")
|
||||||
public static int equalIfOver(final int toChange,
|
public static int equalIfOver(final int toChange,
|
||||||
final int limit) {
|
final int limit) {
|
||||||
return Math.min(toChange, limit);
|
return Math.min(toChange, limit);
|
||||||
@@ -95,7 +107,9 @@ public final class NumberUtils {
|
|||||||
* @param toChange The value to test.
|
* @param toChange The value to test.
|
||||||
* @param limit The maximum.
|
* @param limit The maximum.
|
||||||
* @return The new value.
|
* @return The new value.
|
||||||
|
* @deprecated Pointless method.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.19.0")
|
||||||
public static double equalIfOver(final double toChange,
|
public static double equalIfOver(final double toChange,
|
||||||
final double limit) {
|
final double limit) {
|
||||||
return Math.min(toChange, limit);
|
return Math.min(toChange, limit);
|
||||||
@@ -218,6 +232,39 @@ public final class NumberUtils {
|
|||||||
return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted;
|
return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate an expression.
|
||||||
|
*
|
||||||
|
* @param expression The expression.
|
||||||
|
* @return The value of the expression, or zero if invalid.
|
||||||
|
*/
|
||||||
|
public static double evaluateExpression(@NotNull final String expression) {
|
||||||
|
return evaluateExpression(expression, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluate an expression with respect to a player (for placeholders).
|
||||||
|
*
|
||||||
|
* @param expression The expression.
|
||||||
|
* @param player The player.
|
||||||
|
* @return The value of the expression, or zero if invalid.
|
||||||
|
*/
|
||||||
|
public static double evaluateExpression(@NotNull final String expression,
|
||||||
|
@Nullable final Player player) {
|
||||||
|
return crunch.apply(expression, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init crunch handler.
|
||||||
|
*
|
||||||
|
* @param handler The handler.
|
||||||
|
*/
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public static void initCrunch(@NotNull final BiFunction<String, Player, Double> handler) {
|
||||||
|
Validate.isTrue(crunch == null, "Already initialized!");
|
||||||
|
crunch = handler;
|
||||||
|
}
|
||||||
|
|
||||||
private NumberUtils() {
|
private NumberUtils() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,4 +8,5 @@ dependencies {
|
|||||||
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||||
compileOnly 'com.google.guava:guava:31.0.1-jre'
|
compileOnly 'com.google.guava:guava:31.0.1-jre'
|
||||||
|
compileOnly 'org.objenesis:objenesis:3.2'
|
||||||
}
|
}
|
||||||
@@ -24,11 +24,7 @@ open class EcoLoadableJSONConfig(
|
|||||||
private val name: String = "$configName.json"
|
private val name: String = "$configName.json"
|
||||||
|
|
||||||
fun reloadFromFile() {
|
fun reloadFromFile() {
|
||||||
try {
|
runCatching { init(configFile) }.onFailure { it.printStackTrace() }
|
||||||
init(configFile)
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final override fun createFile() {
|
final override fun createFile() {
|
||||||
@@ -94,11 +90,7 @@ open class EcoLoadableJSONConfig(
|
|||||||
createFile()
|
createFile()
|
||||||
}
|
}
|
||||||
configFile = File(directory, name)
|
configFile = File(directory, name)
|
||||||
try {
|
init(configFile)
|
||||||
init(configFile)
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
plugin.configHandler.addConfig(this)
|
plugin.configHandler.addConfig(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
package com.willfp.eco.internal.config.json
|
package com.willfp.eco.internal.config.json
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginLike
|
import com.willfp.eco.core.PluginLike
|
||||||
import org.bukkit.configuration.InvalidConfigurationException
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.IOException
|
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
|
|
||||||
@@ -21,48 +19,36 @@ open class EcoUpdatableJSONConfig(
|
|||||||
|
|
||||||
fun update() {
|
fun update() {
|
||||||
super.clearCache()
|
super.clearCache()
|
||||||
try {
|
this.init(configFile)
|
||||||
this.init(configFile)
|
val newConfig = configInJar ?: return
|
||||||
val newConfig = configInJar
|
if (newConfig.getKeys(true) == this.getKeys(true)) {
|
||||||
if (newConfig.getKeys(true) == this.getKeys(true)) {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
newConfig.getKeys(true).forEach { key: String ->
|
|
||||||
if (!this.getKeys(true).contains(key)) {
|
|
||||||
if (updateBlacklist.stream().noneMatch { s: String -> key.contains(s) }) {
|
|
||||||
this.set(key, newConfig[key])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (removeUnused) {
|
|
||||||
this.getKeys(true).forEach { s ->
|
|
||||||
if (!newConfig.getKeys(true).contains(s)) {
|
|
||||||
if (updateBlacklist.stream().noneMatch(s::contains)) {
|
|
||||||
this.set(s, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.save()
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
} catch (e: InvalidConfigurationException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
}
|
||||||
|
newConfig.getKeys(true).forEach { key: String ->
|
||||||
|
if (!this.getKeys(true).contains(key)) {
|
||||||
|
if (updateBlacklist.stream().noneMatch { s: String -> key.contains(s) }) {
|
||||||
|
this.set(key, newConfig[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (removeUnused) {
|
||||||
|
this.getKeys(true).forEach { s ->
|
||||||
|
if (!newConfig.getKeys(true).contains(s)) {
|
||||||
|
if (updateBlacklist.stream().noneMatch(s::contains)) {
|
||||||
|
this.set(s, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.save()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val configInJar: YamlConfiguration
|
private val configInJar: YamlConfiguration?
|
||||||
get() {
|
get() {
|
||||||
val newIn = this.source.getResourceAsStream(resourcePath) ?: throw NullPointerException("$name is null?")
|
val newIn = this.source.getResourceAsStream(resourcePath) ?: return null
|
||||||
val reader = BufferedReader(InputStreamReader(newIn, StandardCharsets.UTF_8))
|
val reader = BufferedReader(InputStreamReader(newIn, StandardCharsets.UTF_8))
|
||||||
val newConfig = YamlConfiguration()
|
val newConfig = YamlConfiguration()
|
||||||
try {
|
newConfig.load(reader)
|
||||||
newConfig.load(reader)
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
} catch (e: InvalidConfigurationException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
return newConfig
|
return newConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,15 +24,15 @@ class EcoConfigHandler(
|
|||||||
|
|
||||||
override fun callUpdate() {
|
override fun callUpdate() {
|
||||||
for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) {
|
for (method in reflections.getMethodsAnnotatedWith(ConfigUpdater::class.java)) {
|
||||||
try {
|
kotlin.runCatching {
|
||||||
when (method.parameterCount) {
|
when (method.parameterCount) {
|
||||||
0 -> method.invoke(null)
|
0 -> method.invoke(null)
|
||||||
1 -> method.invoke(null, this.plugin)
|
1 -> method.invoke(null, this.plugin)
|
||||||
else -> throw InvalidUpdateMethodException("Update method must have 0 parameters or a plugin parameter.")
|
else -> throw InvalidUpdateMethodException("Update method must have 0 parameters or a plugin parameter.")
|
||||||
}
|
}
|
||||||
} catch (e: ReflectiveOperationException) {
|
}.onFailure {
|
||||||
e.printStackTrace()
|
it.printStackTrace()
|
||||||
throw InvalidUpdateMethodException("Update method generated an exception")
|
plugin.logger.severe("Update method ${method.toGenericString()} generated an exception")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ package com.willfp.eco.internal.config.yaml
|
|||||||
import com.willfp.eco.core.PluginLike
|
import com.willfp.eco.core.PluginLike
|
||||||
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||||
import com.willfp.eco.core.config.interfaces.WrappedYamlConfiguration
|
import com.willfp.eco.core.config.interfaces.WrappedYamlConfiguration
|
||||||
import org.bukkit.configuration.InvalidConfigurationException
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
@@ -23,13 +22,7 @@ open class EcoLoadableYamlConfig(
|
|||||||
private val name: String = "$configName.yml"
|
private val name: String = "$configName.yml"
|
||||||
|
|
||||||
fun reloadFromFile() {
|
fun reloadFromFile() {
|
||||||
try {
|
handle.load(getConfigFile())
|
||||||
handle.load(getConfigFile())
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
} catch (e: InvalidConfigurationException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final override fun createFile() {
|
final override fun createFile() {
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
package com.willfp.eco.internal.config.yaml
|
package com.willfp.eco.internal.config.yaml
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginLike
|
import com.willfp.eco.core.PluginLike
|
||||||
import org.bukkit.configuration.InvalidConfigurationException
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
import java.io.BufferedReader
|
import java.io.BufferedReader
|
||||||
import java.io.IOException
|
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
import java.nio.charset.StandardCharsets
|
import java.nio.charset.StandardCharsets
|
||||||
|
|
||||||
@@ -21,48 +19,36 @@ class EcoUpdatableYamlConfig(
|
|||||||
|
|
||||||
fun update() {
|
fun update() {
|
||||||
super.clearCache()
|
super.clearCache()
|
||||||
try {
|
this.handle.load(configFile)
|
||||||
this.handle.load(configFile)
|
val newConfig = configInJar ?: return
|
||||||
val newConfig = configInJar
|
if (newConfig.getKeys(true) == this.handle.getKeys(true)) {
|
||||||
if (newConfig.getKeys(true) == this.handle.getKeys(true)) {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
newConfig.getKeys(true).forEach { key ->
|
|
||||||
if (!this.handle.getKeys(true).contains(key)) {
|
|
||||||
if (updateBlacklist.stream().noneMatch { key.contains(it) }) {
|
|
||||||
this.handle.set(key, newConfig[key])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (removeUnused) {
|
|
||||||
this.handle.getKeys(true).forEach { s ->
|
|
||||||
if (!newConfig.getKeys(true).contains(s)) {
|
|
||||||
if (updateBlacklist.stream().noneMatch(s::contains)) {
|
|
||||||
this.handle.set(s, null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.handle.save(configFile)
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
} catch (e: InvalidConfigurationException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
}
|
||||||
|
newConfig.getKeys(true).forEach { key ->
|
||||||
|
if (!this.handle.getKeys(true).contains(key)) {
|
||||||
|
if (updateBlacklist.stream().noneMatch { key.contains(it) }) {
|
||||||
|
this.handle.set(key, newConfig[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (removeUnused) {
|
||||||
|
this.handle.getKeys(true).forEach { s ->
|
||||||
|
if (!newConfig.getKeys(true).contains(s)) {
|
||||||
|
if (updateBlacklist.stream().noneMatch(s::contains)) {
|
||||||
|
this.handle.set(s, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.handle.save(configFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val configInJar: YamlConfiguration
|
private val configInJar: YamlConfiguration?
|
||||||
get() {
|
get() {
|
||||||
val newIn = source.getResourceAsStream(resourcePath) ?: throw NullPointerException("$name is null?")
|
val newIn = source.getResourceAsStream(resourcePath) ?: return null
|
||||||
val reader = BufferedReader(InputStreamReader(newIn, StandardCharsets.UTF_8))
|
val reader = BufferedReader(InputStreamReader(newIn, StandardCharsets.UTF_8))
|
||||||
val newConfig = YamlConfiguration()
|
val newConfig = YamlConfiguration()
|
||||||
try {
|
newConfig.load(reader)
|
||||||
newConfig.load(reader)
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
} catch (e: InvalidConfigurationException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
return newConfig
|
return newConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,12 +73,10 @@ open class EcoDropQueue(val player: Player) : InternalDropQueue {
|
|||||||
world.dropItem(location, drop!!).velocity = Vector()
|
world.dropItem(location, drop!!).velocity = Vector()
|
||||||
}
|
}
|
||||||
if (xp > 0) {
|
if (xp > 0) {
|
||||||
val event = PlayerExpChangeEvent(player, xp)
|
|
||||||
Bukkit.getPluginManager().callEvent(event)
|
|
||||||
val orb =
|
val orb =
|
||||||
world.spawnEntity(player.location.add(0.0, 0.2, 0.0), EntityType.EXPERIENCE_ORB) as ExperienceOrb
|
world.spawnEntity(player.location.add(0.0, 0.2, 0.0), EntityType.EXPERIENCE_ORB) as ExperienceOrb
|
||||||
orb.velocity = Vector(0, 0, 0)
|
orb.velocity = Vector(0, 0, 0)
|
||||||
orb.experience = event.amount
|
orb.experience = xp
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (drop in items) {
|
for (drop in items) {
|
||||||
@@ -94,4 +92,4 @@ open class EcoDropQueue(val player: Player) : InternalDropQueue {
|
|||||||
init {
|
init {
|
||||||
location = player.location
|
location = player.location
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import com.willfp.eco.core.extensions.MalformedExtensionException
|
|||||||
import org.bukkit.configuration.file.YamlConfiguration
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
import java.net.MalformedURLException
|
|
||||||
import java.net.URL
|
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
class EcoExtensionLoader(
|
class EcoExtensionLoader(
|
||||||
@@ -32,9 +30,7 @@ class EcoExtensionLoader(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
runCatching { loadExtension(extensionJar) }.onFailure {
|
||||||
loadExtension(extensionJar)
|
|
||||||
} catch (e: MalformedExtensionException) {
|
|
||||||
this.plugin.logger.warning(extensionJar.name + " caused an error!")
|
this.plugin.logger.warning(extensionJar.name + " caused an error!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,13 +38,7 @@ class EcoExtensionLoader(
|
|||||||
|
|
||||||
@Throws(MalformedExtensionException::class)
|
@Throws(MalformedExtensionException::class)
|
||||||
private fun loadExtension(extensionJar: File) {
|
private fun loadExtension(extensionJar: File) {
|
||||||
lateinit var url: URL
|
val url = extensionJar.toURI().toURL()
|
||||||
|
|
||||||
try {
|
|
||||||
url = extensionJar.toURI().toURL()
|
|
||||||
} catch (e: MalformedURLException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
val classLoader = URLClassLoader(arrayOf(url), this.plugin::class.java.classLoader)
|
val classLoader = URLClassLoader(arrayOf(url), this.plugin::class.java.classLoader)
|
||||||
val ymlIn = classLoader.getResourceAsStream("extension.yml")
|
val ymlIn = classLoader.getResourceAsStream("extension.yml")
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ package com.willfp.eco.internal.factory
|
|||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin
|
import com.willfp.eco.core.EcoPlugin
|
||||||
import com.willfp.eco.core.factory.NamespacedKeyFactory
|
import com.willfp.eco.core.factory.NamespacedKeyFactory
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils
|
||||||
import org.bukkit.NamespacedKey
|
import org.bukkit.NamespacedKey
|
||||||
|
|
||||||
class EcoNamespacedKeyFactory(private val plugin: EcoPlugin) : NamespacedKeyFactory {
|
class EcoNamespacedKeyFactory(private val plugin: EcoPlugin) : NamespacedKeyFactory {
|
||||||
override fun create(key: String): NamespacedKey {
|
override fun create(key: String): NamespacedKey {
|
||||||
return NamespacedKey(plugin, key)
|
return NamespacedKeyUtils.create(plugin.name, key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.willfp.eco.internal.fast
|
||||||
|
|
||||||
|
import org.bukkit.NamespacedKey
|
||||||
|
import org.objenesis.ObjenesisStd
|
||||||
|
|
||||||
|
interface InternalNamespacedKeyFactory {
|
||||||
|
fun create(namespace: String, key: String): NamespacedKey
|
||||||
|
}
|
||||||
|
|
||||||
|
class FastInternalNamespacedKeyFactory : InternalNamespacedKeyFactory {
|
||||||
|
private val creator = ObjenesisStd().getInstantiatorOf(NamespacedKey::class.java)
|
||||||
|
private val namespaceField = NamespacedKey::class.java.getDeclaredField("namespace")
|
||||||
|
.apply { isAccessible = true }
|
||||||
|
private val keyField = NamespacedKey::class.java.getDeclaredField("key")
|
||||||
|
.apply { isAccessible = true }
|
||||||
|
|
||||||
|
|
||||||
|
override fun create(namespace: String, key: String): NamespacedKey {
|
||||||
|
val namespacedKey = creator.newInstance()
|
||||||
|
keyField.set(namespacedKey, key.lowercase())
|
||||||
|
namespaceField.set(namespacedKey, namespace.lowercase())
|
||||||
|
return namespacedKey
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SafeInternalNamespacedKeyFactory : InternalNamespacedKeyFactory {
|
||||||
|
override fun create(namespace: String, key: String): NamespacedKey {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
return NamespacedKey(namespace, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@ class PlaceholderIntegrationPAPI(private val plugin: EcoPlugin) : PlaceholderExp
|
|||||||
player: Player?,
|
player: Player?,
|
||||||
identifier: String
|
identifier: String
|
||||||
): String {
|
): String {
|
||||||
return PlaceholderManager.getResult(player, identifier)
|
return PlaceholderManager.getResult(player, identifier, plugin)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun registerIntegration() {
|
override fun registerIntegration() {
|
||||||
@@ -49,4 +49,14 @@ class PlaceholderIntegrationPAPI(private val plugin: EcoPlugin) : PlaceholderExp
|
|||||||
): String {
|
): String {
|
||||||
return PlaceholderAPI.setPlaceholders(player, text)
|
return PlaceholderAPI.setPlaceholders(player, text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun findPlaceholdersIn(text: String): MutableList<String> {
|
||||||
|
val placeholders = mutableListOf<String>()
|
||||||
|
val matcher = PlaceholderAPI.getPlaceholderPattern().matcher(text)
|
||||||
|
while (matcher.find()) {
|
||||||
|
placeholders.add(matcher.group())
|
||||||
|
}
|
||||||
|
|
||||||
|
return placeholders
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.items
|
|||||||
|
|
||||||
import com.willfp.eco.core.fast.FastItemStack
|
import com.willfp.eco.core.fast.FastItemStack
|
||||||
import com.willfp.eco.core.items.args.LookupArgParser
|
import com.willfp.eco.core.items.args.LookupArgParser
|
||||||
import org.bukkit.NamespacedKey
|
import com.willfp.eco.util.NamespacedKeyUtils
|
||||||
import org.bukkit.enchantments.Enchantment
|
import org.bukkit.enchantments.Enchantment
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta
|
import org.bukkit.inventory.meta.EnchantmentStorageMeta
|
||||||
@@ -20,7 +20,7 @@ class ArgParserEnchantment : LookupArgParser {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
val enchant = Enchantment.getByKey(NamespacedKey.minecraft(argSplit[0].lowercase()))
|
val enchant = Enchantment.getByKey(NamespacedKeyUtils.create("minecraft", argSplit[0]))
|
||||||
val level = argSplit[1].toIntOrNull()
|
val level = argSplit[1].toIntOrNull()
|
||||||
|
|
||||||
if (enchant != null && level != null) {
|
if (enchant != null && level != null) {
|
||||||
|
|||||||
@@ -11,12 +11,7 @@ class ArgParserFlag : LookupArgParser {
|
|||||||
val flags = mutableSetOf<ItemFlag>()
|
val flags = mutableSetOf<ItemFlag>()
|
||||||
|
|
||||||
for (arg in args) {
|
for (arg in args) {
|
||||||
val flag = try {
|
val flag = kotlin.runCatching { ItemFlag.valueOf(arg.uppercase()) }.getOrNull() ?: continue
|
||||||
ItemFlag.valueOf(arg.uppercase())
|
|
||||||
} catch (e: Exception) {
|
|
||||||
null
|
|
||||||
} ?: continue
|
|
||||||
|
|
||||||
flags.add(flag)
|
flags.add(flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||||
|
|
||||||
import com.willfp.eco.core.display.Display
|
import com.willfp.eco.core.display.Display
|
||||||
import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy
|
import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy
|
||||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMerchantRecipe
|
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMerchantRecipe
|
||||||
@@ -30,21 +31,11 @@ class VillagerTrade : VillagerTradeProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getHandle(recipe: CraftMerchantRecipe): net.minecraft.server.v1_16_R3.MerchantRecipe {
|
private fun getHandle(recipe: CraftMerchantRecipe): net.minecraft.server.v1_16_R3.MerchantRecipe {
|
||||||
try {
|
return handle[recipe] as net.minecraft.server.v1_16_R3.MerchantRecipe
|
||||||
return handle[recipe] as net.minecraft.server.v1_16_R3.MerchantRecipe
|
|
||||||
} catch (e: IllegalAccessException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
throw IllegalArgumentException("Not CMR")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
try {
|
handle = CraftMerchantRecipe::class.java.getDeclaredField("handle")
|
||||||
handle = CraftMerchantRecipe::class.java.getDeclaredField("handle")
|
handle.isAccessible = true
|
||||||
handle.isAccessible = true
|
|
||||||
} catch (e: NoSuchFieldException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
throw RuntimeException("Error!")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3.fast
|
package com.willfp.eco.internal.spigot.proxy.v1_16_R3.fast
|
||||||
|
|
||||||
import com.willfp.eco.internal.fast.EcoFastItemStack
|
import com.willfp.eco.internal.fast.EcoFastItemStack
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils
|
||||||
import com.willfp.eco.util.StringUtils
|
import com.willfp.eco.util.StringUtils
|
||||||
import net.minecraft.server.v1_16_R3.Item
|
import net.minecraft.server.v1_16_R3.Item
|
||||||
import net.minecraft.server.v1_16_R3.ItemEnchantedBook
|
import net.minecraft.server.v1_16_R3.ItemEnchantedBook
|
||||||
@@ -11,7 +12,6 @@ import net.minecraft.server.v1_16_R3.NBTTagList
|
|||||||
import net.minecraft.server.v1_16_R3.NBTTagString
|
import net.minecraft.server.v1_16_R3.NBTTagString
|
||||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||||
import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers
|
import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers
|
||||||
import org.bukkit.craftbukkit.v1_16_R3.util.CraftNamespacedKey
|
|
||||||
import org.bukkit.enchantments.Enchantment
|
import org.bukkit.enchantments.Enchantment
|
||||||
import org.bukkit.inventory.ItemFlag
|
import org.bukkit.inventory.ItemFlag
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
@@ -29,7 +29,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
|||||||
val compound = base as NBTTagCompound
|
val compound = base as NBTTagCompound
|
||||||
val key = compound.getString("id")
|
val key = compound.getString("id")
|
||||||
val level: Int = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
val level: Int = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||||
val found = Enchantment.getByKey(CraftNamespacedKey.fromStringOrNull(key))
|
val found = Enchantment.getByKey(NamespacedKeyUtils.fromString(key))
|
||||||
if (found != null) {
|
if (found != null) {
|
||||||
foundEnchantments[found] = level
|
foundEnchantments[found] = level
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.eco.internal.spigot.proxy.v1_17_R1.fast
|
package com.willfp.eco.internal.spigot.proxy.v1_17_R1.fast
|
||||||
|
|
||||||
import com.willfp.eco.internal.fast.EcoFastItemStack
|
import com.willfp.eco.internal.fast.EcoFastItemStack
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils
|
||||||
import com.willfp.eco.util.StringUtils
|
import com.willfp.eco.util.StringUtils
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.nbt.ListTag
|
import net.minecraft.nbt.ListTag
|
||||||
@@ -11,7 +12,6 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import net.minecraft.world.item.Items
|
import net.minecraft.world.item.Items
|
||||||
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack
|
import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack
|
||||||
import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers
|
import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers
|
||||||
import org.bukkit.craftbukkit.v1_17_R1.util.CraftNamespacedKey
|
|
||||||
import org.bukkit.enchantments.Enchantment
|
import org.bukkit.enchantments.Enchantment
|
||||||
import org.bukkit.inventory.ItemFlag
|
import org.bukkit.inventory.ItemFlag
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
@@ -31,7 +31,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
|||||||
val compound = base as CompoundTag
|
val compound = base as CompoundTag
|
||||||
val key = compound.getString("id")
|
val key = compound.getString("id")
|
||||||
val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||||
val found = Enchantment.getByKey(CraftNamespacedKey.fromStringOrNull(key))
|
val found = Enchantment.getByKey(NamespacedKeyUtils.fromString(key))
|
||||||
if (found != null) {
|
if (found != null) {
|
||||||
foundEnchantments[found] = level
|
foundEnchantments[found] = level
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.eco.internal.spigot.proxy.v1_18_R1.fast
|
package com.willfp.eco.internal.spigot.proxy.v1_18_R1.fast
|
||||||
|
|
||||||
import com.willfp.eco.internal.fast.EcoFastItemStack
|
import com.willfp.eco.internal.fast.EcoFastItemStack
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils
|
||||||
import com.willfp.eco.util.StringUtils
|
import com.willfp.eco.util.StringUtils
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.nbt.ListTag
|
import net.minecraft.nbt.ListTag
|
||||||
@@ -11,7 +12,6 @@ import net.minecraft.world.item.ItemStack
|
|||||||
import net.minecraft.world.item.Items
|
import net.minecraft.world.item.Items
|
||||||
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack
|
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack
|
||||||
import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers
|
import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers
|
||||||
import org.bukkit.craftbukkit.v1_18_R1.util.CraftNamespacedKey
|
|
||||||
import org.bukkit.enchantments.Enchantment
|
import org.bukkit.enchantments.Enchantment
|
||||||
import org.bukkit.inventory.ItemFlag
|
import org.bukkit.inventory.ItemFlag
|
||||||
import kotlin.experimental.and
|
import kotlin.experimental.and
|
||||||
@@ -24,15 +24,15 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
|||||||
|
|
||||||
override fun getEnchantmentsOnItem(checkStored: Boolean): Map<Enchantment, Int> {
|
override fun getEnchantmentsOnItem(checkStored: Boolean): Map<Enchantment, Int> {
|
||||||
val enchantmentNBT =
|
val enchantmentNBT =
|
||||||
if (checkStored && handle.item === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
||||||
handle
|
handle
|
||||||
) else handle.enchantmentTags
|
) else handle.getEnchantmentTags()
|
||||||
val foundEnchantments: MutableMap<Enchantment, Int> = HashMap()
|
val foundEnchantments: MutableMap<Enchantment, Int> = HashMap()
|
||||||
for (base in enchantmentNBT) {
|
for (base in enchantmentNBT) {
|
||||||
val compound = base as CompoundTag
|
val compound = base as CompoundTag
|
||||||
val key = compound.getString("id")
|
val key = compound.getString("id")
|
||||||
val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||||
val found = Enchantment.getByKey(CraftNamespacedKey.fromStringOrNull(key))
|
val found = Enchantment.getByKey(NamespacedKeyUtils.fromString(key))
|
||||||
if (found != null) {
|
if (found != null) {
|
||||||
foundEnchantments[found] = level
|
foundEnchantments[found] = level
|
||||||
}
|
}
|
||||||
@@ -45,9 +45,9 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
|||||||
checkStored: Boolean
|
checkStored: Boolean
|
||||||
): Int {
|
): Int {
|
||||||
val enchantmentNBT =
|
val enchantmentNBT =
|
||||||
if (checkStored && handle.item === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
||||||
handle
|
handle
|
||||||
) else handle.enchantmentTags
|
) else handle.getEnchantmentTags()
|
||||||
for (base in enchantmentNBT) {
|
for (base in enchantmentNBT) {
|
||||||
val compound = base as CompoundTag
|
val compound = base as CompoundTag
|
||||||
val key = compound.getString("id")
|
val key = compound.getString("id")
|
||||||
@@ -152,16 +152,16 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
|||||||
|
|
||||||
private var flagBits: Int
|
private var flagBits: Int
|
||||||
get() =
|
get() =
|
||||||
if (handle.hasTag() && handle.tag!!.contains(
|
if (handle.hasTag() && handle.getTag()!!.contains(
|
||||||
"HideFlags",
|
"HideFlags",
|
||||||
99
|
99
|
||||||
)
|
)
|
||||||
) handle.tag!!.getInt("HideFlags") else 0
|
) handle.getTag()!!.getInt("HideFlags") else 0
|
||||||
set(value) =
|
set(value) =
|
||||||
handle.orCreateTag.putInt("HideFlags", value)
|
handle.getOrCreateTag().putInt("HideFlags", value)
|
||||||
|
|
||||||
override fun getRepairCost(): Int {
|
override fun getRepairCost(): Int {
|
||||||
return handle.baseRepairCost
|
return handle.getBaseRepairCost()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setRepairCost(cost: Int) {
|
override fun setRepairCost(cost: Int) {
|
||||||
@@ -177,7 +177,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
return handle.tag?.hashCode() ?: (0b00010101 * 31 + Item.getId(handle.getItem()))
|
return handle.getTag()?.hashCode() ?: (0b00010101 * 31 + Item.getId(handle.getItem()))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun apply() {
|
private fun apply() {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ dependencies {
|
|||||||
implementation('net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT') {
|
implementation('net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT') {
|
||||||
exclude group: 'net.kyori', module: 'adventure-api'
|
exclude group: 'net.kyori', module: 'adventure-api'
|
||||||
}
|
}
|
||||||
|
implementation 'com.github.Redempt:Crunch:1.0'
|
||||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||||
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
|
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
|
||||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
compileOnly 'com.google.code.gson:gson:2.8.8'
|
||||||
@@ -25,6 +26,7 @@ dependencies {
|
|||||||
compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.202'
|
compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.202'
|
||||||
compileOnly 'me.clip:placeholderapi:2.10.10'
|
compileOnly 'me.clip:placeholderapi:2.10.10'
|
||||||
compileOnly 'com.github.oraxen:oraxen:bd81ace154'
|
compileOnly 'com.github.oraxen:oraxen:bd81ace154'
|
||||||
|
compileOnly 'com.github.Ssomar-Developement:ExecutableItems:master-SNAPSHOT'
|
||||||
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
|
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
|
||||||
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
|
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
|
||||||
compileOnly 'com.arcaniax:HeadDatabase-API:1.3.0'
|
compileOnly 'com.arcaniax:HeadDatabase-API:1.3.0'
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ import com.willfp.eco.internal.extensions.EcoExtensionLoader
|
|||||||
import com.willfp.eco.internal.factory.EcoMetadataValueFactory
|
import com.willfp.eco.internal.factory.EcoMetadataValueFactory
|
||||||
import com.willfp.eco.internal.factory.EcoNamespacedKeyFactory
|
import com.willfp.eco.internal.factory.EcoNamespacedKeyFactory
|
||||||
import com.willfp.eco.internal.factory.EcoRunnableFactory
|
import com.willfp.eco.internal.factory.EcoRunnableFactory
|
||||||
|
import com.willfp.eco.internal.fast.FastInternalNamespacedKeyFactory
|
||||||
|
import com.willfp.eco.internal.fast.InternalNamespacedKeyFactory
|
||||||
|
import com.willfp.eco.internal.fast.SafeInternalNamespacedKeyFactory
|
||||||
import com.willfp.eco.internal.gui.EcoGUIFactory
|
import com.willfp.eco.internal.gui.EcoGUIFactory
|
||||||
import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI
|
import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI
|
||||||
import com.willfp.eco.internal.logging.EcoLogger
|
import com.willfp.eco.internal.logging.EcoLogger
|
||||||
@@ -29,6 +32,7 @@ import com.willfp.eco.internal.spigot.proxy.DummyEntityProxy
|
|||||||
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
||||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences
|
import net.kyori.adventure.platform.bukkit.BukkitAudiences
|
||||||
import org.bukkit.Location
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.NamespacedKey
|
||||||
import org.bukkit.entity.Entity
|
import org.bukkit.entity.Entity
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import java.util.logging.Logger
|
import java.util.logging.Logger
|
||||||
@@ -43,6 +47,9 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
|||||||
if (this.configYml.getBool("mysql.enabled"))
|
if (this.configYml.getBool("mysql.enabled"))
|
||||||
MySQLDataHandler(this) else YamlDataHandler(this)
|
MySQLDataHandler(this) else YamlDataHandler(this)
|
||||||
)
|
)
|
||||||
|
private val keyFactory: InternalNamespacedKeyFactory? =
|
||||||
|
if (this.configYml.getBool("use-safer-namespacedkey-creation"))
|
||||||
|
SafeInternalNamespacedKeyFactory() else FastInternalNamespacedKeyFactory()
|
||||||
|
|
||||||
override fun createScheduler(plugin: EcoPlugin): EcoScheduler {
|
override fun createScheduler(plugin: EcoPlugin): EcoScheduler {
|
||||||
return EcoScheduler(plugin)
|
return EcoScheduler(plugin)
|
||||||
@@ -147,4 +154,9 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
|||||||
override fun createDummyEntity(location: Location): Entity {
|
override fun createDummyEntity(location: Location): Entity {
|
||||||
return getProxy(DummyEntityProxy::class.java).createDummyEntity(location)
|
return getProxy(DummyEntityProxy::class.java).createDummyEntity(location)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun createNamespacedKey(namespace: String, key: String): NamespacedKey {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
return keyFactory?.create(namespace, key) ?: NamespacedKey(namespace, key)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -84,6 +84,8 @@ import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefSuperiorSk
|
|||||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefTowny
|
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefTowny
|
||||||
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefWorldGuard
|
import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefWorldGuard
|
||||||
import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs
|
import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs
|
||||||
|
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsCustomCrafting
|
||||||
|
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsExecutableItems
|
||||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDatabase
|
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDatabase
|
||||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder
|
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder
|
||||||
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen
|
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen
|
||||||
@@ -94,12 +96,14 @@ import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicD
|
|||||||
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
|
||||||
import com.willfp.eco.internal.spigot.integrations.shop.ShopShopGuiPlus
|
import com.willfp.eco.internal.spigot.integrations.shop.ShopShopGuiPlus
|
||||||
|
import com.willfp.eco.internal.spigot.math.evaluateExpression
|
||||||
import com.willfp.eco.internal.spigot.proxy.BlockBreakProxy
|
import com.willfp.eco.internal.spigot.proxy.BlockBreakProxy
|
||||||
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
||||||
import com.willfp.eco.internal.spigot.proxy.SkullProxy
|
import com.willfp.eco.internal.spigot.proxy.SkullProxy
|
||||||
import com.willfp.eco.internal.spigot.proxy.TPSProxy
|
import com.willfp.eco.internal.spigot.proxy.TPSProxy
|
||||||
import com.willfp.eco.internal.spigot.recipes.ShapedRecipeListener
|
import com.willfp.eco.internal.spigot.recipes.ShapedRecipeListener
|
||||||
import com.willfp.eco.util.BlockUtils
|
import com.willfp.eco.util.BlockUtils
|
||||||
|
import com.willfp.eco.util.NumberUtils
|
||||||
import com.willfp.eco.util.ServerUtils
|
import com.willfp.eco.util.ServerUtils
|
||||||
import com.willfp.eco.util.SkullUtils
|
import com.willfp.eco.util.SkullUtils
|
||||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences
|
import net.kyori.adventure.platform.bukkit.BukkitAudiences
|
||||||
@@ -154,6 +158,8 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
|||||||
val tpsProxy = getProxy(TPSProxy::class.java)
|
val tpsProxy = getProxy(TPSProxy::class.java)
|
||||||
ServerUtils.initialize { tpsProxy.getTPS() }
|
ServerUtils.initialize { tpsProxy.getTPS() }
|
||||||
|
|
||||||
|
NumberUtils.initCrunch { exp, player -> evaluateExpression(exp, player) }
|
||||||
|
|
||||||
postInit()
|
postInit()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,6 +192,11 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
|||||||
CollatedRunnable(this)
|
CollatedRunnable(this)
|
||||||
DropManager.update(this)
|
DropManager.update(this)
|
||||||
ProfileSaver(this)
|
ProfileSaver(this)
|
||||||
|
this.scheduler.runTimer(
|
||||||
|
{ Items.clearCache() },
|
||||||
|
this.configYml.getInt("item-cache-ttl").toLong(),
|
||||||
|
this.configYml.getInt("item-cache-ttl").toLong()
|
||||||
|
)
|
||||||
this.scheduler.runTimer(
|
this.scheduler.runTimer(
|
||||||
{ clearFrames() },
|
{ clearFrames() },
|
||||||
this.configYml.getInt("display-frame-ttl").toLong(),
|
this.configYml.getInt("display-frame-ttl").toLong(),
|
||||||
@@ -234,12 +245,14 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
|||||||
IntegrationLoader("Alice") { AnticheatManager.register(this, AnticheatAlice()) },
|
IntegrationLoader("Alice") { AnticheatManager.register(this, AnticheatAlice()) },
|
||||||
|
|
||||||
// Custom Entities
|
// Custom Entities
|
||||||
IntegrationLoader("MythicMobs") { CustomEntitiesManager.register(CustomEntitiesMythicMobs())},
|
IntegrationLoader("MythicMobs") { CustomEntitiesManager.register(CustomEntitiesMythicMobs()) },
|
||||||
|
|
||||||
// Custom Items
|
// Custom Items
|
||||||
IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) },
|
IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) },
|
||||||
IntegrationLoader("ItemsAdder") { CustomItemsManager.register(CustomItemsItemsAdder()) },
|
IntegrationLoader("ItemsAdder") { CustomItemsManager.register(CustomItemsItemsAdder()) },
|
||||||
IntegrationLoader("HeadDatabase") { CustomItemsManager.register(CustomItemsHeadDatabase(this)) },
|
IntegrationLoader("HeadDatabase") { CustomItemsManager.register(CustomItemsHeadDatabase(this)) },
|
||||||
|
IntegrationLoader("ExecutableItems") { CustomItemsManager.register(CustomItemsExecutableItems()) },
|
||||||
|
IntegrationLoader("CustomCrafting") { CustomItemsManager.register(CustomItemsCustomCrafting()) },
|
||||||
|
|
||||||
// Shop
|
// Shop
|
||||||
IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) },
|
IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) },
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class MySQLDataHandler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get Exposed to shut the hell up
|
// Get Exposed to shut the hell up
|
||||||
try {
|
runCatching {
|
||||||
exposedLogger::class.java.getDeclaredField("logger").apply { isAccessible = true }
|
exposedLogger::class.java.getDeclaredField("logger").apply { isAccessible = true }
|
||||||
.apply {
|
.apply {
|
||||||
get(exposedLogger).apply {
|
get(exposedLogger).apply {
|
||||||
@@ -63,8 +63,6 @@ class MySQLDataHandler(
|
|||||||
.invoke(this, Level.OFF)
|
.invoke(this, Level.OFF)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
|
||||||
Eco.getHandler().ecoPlugin.logger.warning("Failed to silence Exposed logger! You might get some console spam")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import com.willfp.eco.core.AbstractPacketAdapter
|
|||||||
import com.willfp.eco.core.EcoPlugin
|
import com.willfp.eco.core.EcoPlugin
|
||||||
import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy
|
import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import java.lang.reflect.InvocationTargetException
|
|
||||||
|
|
||||||
class PacketAutoRecipe(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.AUTO_RECIPE, false) {
|
class PacketAutoRecipe(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.AUTO_RECIPE, false) {
|
||||||
override fun onSend(
|
override fun onSend(
|
||||||
@@ -27,10 +26,6 @@ class PacketAutoRecipe(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packet
|
|||||||
getPlugin().getProxy(AutoCraftProxy::class.java).modifyPacket(packet.handle)
|
getPlugin().getProxy(AutoCraftProxy::class.java).modifyPacket(packet.handle)
|
||||||
val newAutoRecipe = PacketContainer(PacketType.Play.Server.AUTO_RECIPE)
|
val newAutoRecipe = PacketContainer(PacketType.Play.Server.AUTO_RECIPE)
|
||||||
newAutoRecipe.minecraftKeys.write(0, packet.minecraftKeys.read(0))
|
newAutoRecipe.minecraftKeys.write(0, packet.minecraftKeys.read(0))
|
||||||
try {
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, newAutoRecipe)
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, newAutoRecipe)
|
|
||||||
} catch (e: InvocationTargetException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@ import com.comphenix.protocol.events.PacketContainer
|
|||||||
import com.comphenix.protocol.events.PacketEvent
|
import com.comphenix.protocol.events.PacketEvent
|
||||||
import com.google.common.util.concurrent.ThreadFactoryBuilder
|
import com.google.common.util.concurrent.ThreadFactoryBuilder
|
||||||
import com.willfp.eco.core.AbstractPacketAdapter
|
import com.willfp.eco.core.AbstractPacketAdapter
|
||||||
|
import com.willfp.eco.core.Eco
|
||||||
import com.willfp.eco.core.EcoPlugin
|
import com.willfp.eco.core.EcoPlugin
|
||||||
import com.willfp.eco.core.display.Display
|
import com.willfp.eco.core.display.Display
|
||||||
import com.willfp.eco.core.fast.FastItemStack
|
import com.willfp.eco.core.fast.FastItemStack
|
||||||
@@ -47,34 +48,35 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
|
|||||||
handleRateLimit(player)
|
handleRateLimit(player)
|
||||||
|
|
||||||
if (usingAsync(player)) {
|
if (usingAsync(player)) {
|
||||||
val newPacket = packet.shallowClone()
|
val newPacket = packet.deepClone()
|
||||||
|
|
||||||
fun modifyAndSend(itemStacks: MutableList<ItemStack>, windowId: Int, player: Player) {
|
|
||||||
modifyWindowItems(itemStacks, windowId, player)
|
|
||||||
|
|
||||||
newPacket.itemListModifier.write(0, itemStacks)
|
|
||||||
|
|
||||||
ignorePacketList.add(player.name)
|
|
||||||
|
|
||||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, newPacket)
|
|
||||||
}
|
|
||||||
|
|
||||||
executor.execute {
|
executor.execute {
|
||||||
try {
|
runCatchingWithLogs { modifyAndSend(newPacket, itemStacks, windowId, player) }
|
||||||
modifyAndSend(itemStacks, windowId, player)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
if (this.getPlugin().configYml.getBool("async-display.log-errors")) {
|
|
||||||
this.getPlugin().logger.warning("Error happened in async processing! Disable async display (/plugins/eco/config.yml)" +
|
|
||||||
"if this is a frequent issue. (Remember to disable ratelimit and emergency too)")
|
|
||||||
}
|
|
||||||
|
|
||||||
this.getPlugin().scheduler.run {
|
|
||||||
modifyAndSend(itemStacks, windowId, player)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
packet.itemListModifier.write(0, modifyWindowItems(itemStacks, windowId, player))
|
modifyPacket(packet, itemStacks, windowId, player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun modifyPacket(
|
||||||
|
packet: PacketContainer,
|
||||||
|
itemStacks: MutableList<ItemStack>,
|
||||||
|
windowId: Int,
|
||||||
|
player: Player
|
||||||
|
) {
|
||||||
|
packet.itemListModifier.write(0, modifyWindowItems(itemStacks, windowId, player))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun modifyAndSend(
|
||||||
|
packet: PacketContainer,
|
||||||
|
itemStacks: MutableList<ItemStack>,
|
||||||
|
windowId: Int,
|
||||||
|
player: Player
|
||||||
|
) {
|
||||||
|
modifyPacket(packet, itemStacks, windowId, player)
|
||||||
|
ignorePacketList.add(player.name)
|
||||||
|
this.getPlugin().scheduler.run {
|
||||||
|
runCatchingWithLogs { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,4 +163,15 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
|
|||||||
|
|
||||||
return itemStacks
|
return itemStacks
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private inline fun <T> runCatchingWithLogs(toRun: () -> T): Result<T> {
|
||||||
|
return runCatching { toRun() }.onFailure {
|
||||||
|
if (Eco.getHandler().ecoPlugin.configYml.getBool("async-display.log-errors")) {
|
||||||
|
Eco.getHandler().ecoPlugin.logger.warning(
|
||||||
|
"Error happened in async processing! Disable async display (/plugins/eco/config.yml)" +
|
||||||
|
"if this is a frequent issue. (Remember to disable ratelimit and emergency too)"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ package com.willfp.eco.internal.spigot.integrations.customentities
|
|||||||
|
|
||||||
import com.willfp.eco.core.entities.CustomEntity
|
import com.willfp.eco.core.entities.CustomEntity
|
||||||
import com.willfp.eco.core.integrations.customentities.CustomEntitiesWrapper
|
import com.willfp.eco.core.integrations.customentities.CustomEntitiesWrapper
|
||||||
import com.willfp.eco.util.NamespacedKeyUtils
|
|
||||||
import io.lumine.xikage.mythicmobs.MythicMobs
|
import io.lumine.xikage.mythicmobs.MythicMobs
|
||||||
|
import org.bukkit.NamespacedKey
|
||||||
|
|
||||||
class CustomEntitiesMythicMobs : CustomEntitiesWrapper {
|
class CustomEntitiesMythicMobs : CustomEntitiesWrapper {
|
||||||
override fun registerAllEntities() {
|
override fun registerAllEntities() {
|
||||||
@@ -11,7 +11,8 @@ class CustomEntitiesMythicMobs : CustomEntitiesWrapper {
|
|||||||
val api = MythicMobs.inst().apiHelper
|
val api = MythicMobs.inst().apiHelper
|
||||||
|
|
||||||
for (id in mobManager.mobNames) {
|
for (id in mobManager.mobNames) {
|
||||||
val key = NamespacedKeyUtils.create("mythicmobs", id.lowercase())
|
val key = NamespacedKey.fromString("mythicmobs:${id.lowercase()}")
|
||||||
|
key ?: continue
|
||||||
CustomEntity(
|
CustomEntity(
|
||||||
key,
|
key,
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.integrations.customitems
|
||||||
|
|
||||||
|
import com.willfp.eco.core.integrations.customitems.CustomItemsWrapper
|
||||||
|
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 me.wolfyscript.utilities.util.NamespacedKey
|
||||||
|
import me.wolfyscript.utilities.util.Registry
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import java.util.function.Predicate
|
||||||
|
class CustomItemsCustomCrafting: CustomItemsWrapper {
|
||||||
|
override fun registerAllItems() {
|
||||||
|
Items.registerItemProvider(CustomCraftingProvider())
|
||||||
|
}
|
||||||
|
override fun getPluginName(): String {
|
||||||
|
return "CustomCrafting"
|
||||||
|
}
|
||||||
|
private class CustomCraftingProvider : ItemProvider("customcrafting") {
|
||||||
|
override fun provideForKey(key: String): TestableItem? {
|
||||||
|
val nKey = key.replace("customcrafting:", "", ignoreCase = true)
|
||||||
|
val itemKey = NamespacedKey("customcrafting", nKey)
|
||||||
|
val item = Registry.CUSTOM_ITEMS.get(itemKey) ?: return null
|
||||||
|
val namespacedKey = NamespacedKeyUtils.create("customcrafting", key)
|
||||||
|
val stack = item.create(1)
|
||||||
|
return CustomItem(
|
||||||
|
namespacedKey,
|
||||||
|
Predicate { test: ItemStack ->
|
||||||
|
val customStack = me.wolfyscript.utilities.api.inventory.custom_items.CustomItem.getByItemStack(test) ?: return@Predicate false
|
||||||
|
val iKey = customStack.namespacedKey ?: return@Predicate false
|
||||||
|
iKey.equals(key)
|
||||||
|
},
|
||||||
|
stack
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.integrations.customitems
|
||||||
|
|
||||||
|
import com.ssomar.score.api.ExecutableItemsAPI
|
||||||
|
import com.willfp.eco.core.integrations.customitems.CustomItemsWrapper
|
||||||
|
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 org.bukkit.inventory.ItemStack
|
||||||
|
import java.util.function.Predicate
|
||||||
|
class CustomItemsExecutableItems: CustomItemsWrapper {
|
||||||
|
override fun registerAllItems() {
|
||||||
|
Items.registerItemProvider(ExecutableItemsProvider())
|
||||||
|
}
|
||||||
|
override fun getPluginName(): String {
|
||||||
|
return "ExecutableItems"
|
||||||
|
}
|
||||||
|
private class ExecutableItemsProvider : ItemProvider("executableitems") {
|
||||||
|
override fun provideForKey(key: String): TestableItem? {
|
||||||
|
val item = ExecutableItemsAPI.getExecutableItem(key) ?: return null
|
||||||
|
val namespacedKey = NamespacedKeyUtils.create("executableitems", key)
|
||||||
|
return CustomItem(
|
||||||
|
namespacedKey,
|
||||||
|
Predicate { test: ItemStack ->
|
||||||
|
val customStack = ExecutableItemsAPI.getExecutableItemConfig(test) ?: return@Predicate false
|
||||||
|
customStack.id.equals(key, ignoreCase = true)
|
||||||
|
},
|
||||||
|
item
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.eco.internal.spigot.math
|
||||||
|
|
||||||
|
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import redempt.crunch.CompiledExpression
|
||||||
|
import redempt.crunch.Crunch
|
||||||
|
import redempt.crunch.data.FastNumberParsing
|
||||||
|
import redempt.crunch.functional.EvaluationEnvironment
|
||||||
|
|
||||||
|
private val cache = mutableMapOf<String, CompiledExpression>()
|
||||||
|
private val goToZero = Crunch.compileExpression("0")
|
||||||
|
|
||||||
|
fun evaluateExpression(expression: String, player: Player?): Double {
|
||||||
|
val placeholderValues = PlaceholderManager.findPlaceholdersIn(expression)
|
||||||
|
.map { PlaceholderManager.translatePlaceholders(expression, player) }
|
||||||
|
.map { runCatching { FastNumberParsing.parseDouble(it) }.getOrDefault(0.0) }
|
||||||
|
.toDoubleArray()
|
||||||
|
|
||||||
|
val compiled = generateExpression(expression)
|
||||||
|
return runCatching { compiled.evaluate(*placeholderValues) }.getOrDefault(0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateExpression(expression: String): CompiledExpression {
|
||||||
|
val cached = cache[expression]
|
||||||
|
|
||||||
|
if (cached != null) {
|
||||||
|
return cached
|
||||||
|
}
|
||||||
|
|
||||||
|
val placeholders = PlaceholderManager.findPlaceholdersIn(expression)
|
||||||
|
|
||||||
|
val env = EvaluationEnvironment()
|
||||||
|
env.setVariableNames(*placeholders.toTypedArray())
|
||||||
|
|
||||||
|
val compiled = runCatching { Crunch.compileExpression(expression, env) }.getOrDefault(goToZero)
|
||||||
|
cache[expression] = compiled
|
||||||
|
return compiled
|
||||||
|
}
|
||||||
@@ -41,6 +41,18 @@ use-display-frame: true
|
|||||||
# that display frames will be cleared / deleted.
|
# that display frames will be cleared / deleted.
|
||||||
display-frame-ttl: 17
|
display-frame-ttl: 17
|
||||||
|
|
||||||
|
# Time to live for storing hashes against custom item keys. Increasing this value
|
||||||
|
# can benefit performance under load (e.g. from ShopGUI+ sells) but can increase
|
||||||
|
# memory use.
|
||||||
|
item-cache-ttl: 6000
|
||||||
|
|
||||||
|
# The default bukkit NamespacedKey creation can cause decent amounts of lag under
|
||||||
|
# load due to the use of regex validation in the constructor. eco has its own system
|
||||||
|
# to create NamespacedKeys, however it can be unsafe as it skips most validation checks.
|
||||||
|
# If you encounter any bugs with this, then enable this option - however it will come
|
||||||
|
# at a performance penalty.
|
||||||
|
use-safer-namespacedkey-creation: false
|
||||||
|
|
||||||
# Window items packets have the option to be run asynchronously. This may cause
|
# Window items packets have the option to be run asynchronously. This may cause
|
||||||
# some bugs and is considered experimental, however it has been tested without
|
# some bugs and is considered experimental, however it has been tested without
|
||||||
# any apparent issues. Enable this if performance is absolutely crucial or if you
|
# any apparent issues. Enable this if performance is absolutely crucial or if you
|
||||||
@@ -64,14 +76,14 @@ async-display:
|
|||||||
# If emergency async should be used.
|
# If emergency async should be used.
|
||||||
enabled: true
|
enabled: true
|
||||||
# Below this TPS value, emergency async display will be used.
|
# Below this TPS value, emergency async display will be used.
|
||||||
cutoff: 18
|
cutoff: 17
|
||||||
|
|
||||||
# If players with a large amount of display packets should have their processing
|
# If players with a large amount of display packets should have their processing
|
||||||
# done asynchronously. This will help if a player is trying to crash the server
|
# done asynchronously. This will help if a player is trying to crash the server
|
||||||
# by overloading the display system.
|
# by overloading the display system.
|
||||||
ratelimit:
|
ratelimit:
|
||||||
# If rate limit async display should be used.
|
# If rate limit async display should be used.
|
||||||
enabled: true
|
enabled: false
|
||||||
# The amount of window items packets per timeframe needed to enable async display
|
# The amount of window items packets per timeframe needed to enable async display
|
||||||
# for a specified player.
|
# for a specified player.
|
||||||
cutoff: 4
|
cutoff: 4
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ softdepend:
|
|||||||
- CrashClaim
|
- CrashClaim
|
||||||
- DecentHolograms
|
- DecentHolograms
|
||||||
- MythicMobs
|
- MythicMobs
|
||||||
|
- CustomCrafting
|
||||||
|
- ExecutableItems
|
||||||
libraries:
|
libraries:
|
||||||
- 'org.reflections:reflections:0.9.12'
|
- 'org.reflections:reflections:0.9.12'
|
||||||
- 'org.apache.maven:maven-artifact:3.0.3'
|
- 'org.apache.maven:maven-artifact:3.0.3'
|
||||||
@@ -53,4 +55,6 @@ libraries:
|
|||||||
- 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
|
- 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
|
||||||
- 'mysql:mysql-connector-java:8.0.25'
|
- 'mysql:mysql-connector-java:8.0.25'
|
||||||
- 'com.google.guava:guava:31.0.1-jre'
|
- 'com.google.guava:guava:31.0.1-jre'
|
||||||
- 'com.zaxxer:HikariCP:5.0.0'
|
- 'com.zaxxer:HikariCP:5.0.0'
|
||||||
|
- 'org.apache.commons:commons-lang3:3.0'
|
||||||
|
- 'org.objenesis:objenesis:3.2'
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
version = 6.18.2
|
version = 6.21.0
|
||||||
plugin-name = eco
|
plugin-name = eco
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
BIN
lib/SCore-1.6.0.9.jar
Normal file
BIN
lib/SCore-1.6.0.9.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user