Compare commits
120 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36c77d81eb | ||
|
|
b6cd56ad15 | ||
|
|
1a524aea94 | ||
|
|
2ebab99a06 | ||
|
|
46663f7edb | ||
|
|
4fad66cd90 | ||
|
|
a9fafeec00 | ||
|
|
0d8308d6cd | ||
|
|
13772002e8 | ||
|
|
c9b84889e7 | ||
|
|
1513578266 | ||
|
|
89d6f2f867 | ||
|
|
8e6d98c997 | ||
|
|
5bc2cb31a4 | ||
|
|
041575a103 | ||
|
|
c88dac56b7 | ||
|
|
00da717f6d | ||
|
|
cc557378cc | ||
|
|
b5c49c79b8 | ||
|
|
28018430e7 | ||
|
|
7b6c8d68a8 | ||
|
|
ad3cb3a620 | ||
|
|
511a7e4830 | ||
|
|
5aeeafc041 | ||
|
|
9a51fb8358 | ||
|
|
eeefb9f40e | ||
|
|
aa1ce34cbc | ||
|
|
47772c3ff7 | ||
|
|
dfcac5d527 | ||
|
|
40f88f0b59 | ||
|
|
105355d967 | ||
|
|
3cddff22b8 | ||
|
|
f8e930d29e | ||
|
|
9dbe088e66 | ||
|
|
6361c0e8e9 | ||
|
|
1135672241 | ||
|
|
80891e4a81 | ||
|
|
3e0be3a629 | ||
|
|
17819de2ea | ||
|
|
209cdd6b0d | ||
|
|
fbf6b2edd9 | ||
|
|
8b9e8589a0 | ||
|
|
525cc019ea | ||
|
|
04f2d15783 | ||
|
|
f988b591a4 | ||
|
|
9ebfb124c8 | ||
|
|
b9ab263f67 | ||
|
|
bb5f68283b | ||
|
|
9bbf1cfe36 | ||
|
|
19bb5f608c | ||
|
|
a1c70d2081 | ||
|
|
979ddf0ff0 | ||
|
|
232a63c00d | ||
|
|
e65cf9be2c | ||
|
|
fbf56037d4 | ||
|
|
aa0c4ee7fa | ||
|
|
5f3375bf87 | ||
|
|
11dc6d0e67 | ||
|
|
9cccbd10ba | ||
|
|
1f0ad48480 | ||
|
|
93322dcfa5 | ||
|
|
e3b630fcb7 | ||
|
|
8690b75f4c | ||
|
|
6de792f308 | ||
|
|
e59037635e | ||
|
|
b9d50e261d | ||
|
|
15173c8369 | ||
|
|
4ee0645a4e | ||
|
|
96bd53c089 | ||
|
|
e658bf3fa8 | ||
|
|
988836b5b9 | ||
|
|
5688f41b8b | ||
|
|
4eaa6ab75c | ||
|
|
b29363cdf6 | ||
|
|
c8648a92f5 | ||
|
|
0a59b6a208 | ||
|
|
4e18a0ab78 | ||
|
|
d49405f839 | ||
|
|
e10566da66 | ||
|
|
0c64cd98e0 | ||
|
|
231af30c61 | ||
|
|
9b5cc1fd9c | ||
|
|
7628c0bbfd | ||
|
|
0beedc6b07 | ||
|
|
f3c69f1c15 | ||
|
|
a148f667e5 | ||
|
|
b2370b4b6e | ||
|
|
525bd5264a | ||
|
|
54c27a0379 | ||
|
|
989dda0a4f | ||
|
|
1f2bb3341e | ||
|
|
65221bdddf | ||
|
|
b386f2df1b | ||
|
|
969329486d | ||
|
|
aab2e8237c | ||
|
|
30457c29a1 | ||
|
|
9ad480ecf0 | ||
|
|
b0d3256d1b | ||
|
|
4ff9d82cc1 | ||
|
|
f9178e248b | ||
|
|
cc8a799438 | ||
|
|
90b81f56df | ||
|
|
1240c14c14 | ||
|
|
ed46900f2f | ||
|
|
dade3d7fbb | ||
|
|
df141875d3 | ||
|
|
50b07de5d1 | ||
|
|
e2a033c24f | ||
|
|
3fa574105f | ||
|
|
a64386f980 | ||
|
|
4c5a0f9887 | ||
|
|
cbd43f5757 | ||
|
|
01f1425557 | ||
|
|
25e8cc0837 | ||
|
|
7ff3eeef06 | ||
|
|
58faf6de23 | ||
|
|
7f42cbe32e | ||
|
|
ae12ab17fe | ||
|
|
9949ed4f5f | ||
|
|
e3f81a51e8 |
15
.github/workflows/checkstyle.yml
vendored
Normal file
15
.github/workflows/checkstyle.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
name: Check PR Codestyle
|
||||
on: [ pull_request ]
|
||||
|
||||
jobs:
|
||||
checkstyle:
|
||||
name: Checkstyle
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: dbelyaev/action-checkstyle@v0.5.1
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
reporter: github-pr-review
|
||||
level: warning
|
||||
checkstyle_config: ../../config/checkstyle/checkstyle.xml
|
||||
2
.github/workflows/java-ci.yml
vendored
2
.github/workflows/java-ci.yml
vendored
@@ -1,6 +1,6 @@
|
||||
name: Java CI
|
||||
|
||||
on: [push]
|
||||
on: [ push, pull_request ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
42
.github/workflows/test-publish.yml
vendored
Normal file
42
.github/workflows/test-publish.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Publish API (Dev)
|
||||
|
||||
on: [ push, pull_request ]
|
||||
|
||||
jobs:
|
||||
publish-release:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout latest code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set outputs
|
||||
id: vars
|
||||
run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
distribution: 'temurin'
|
||||
java-version: 17
|
||||
|
||||
- name: Setup build cache
|
||||
uses: actions/cache@v2.1.6
|
||||
with:
|
||||
path: ~/.gradle/caches
|
||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-gradle-
|
||||
|
||||
|
||||
- name: Publish artifact
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# The GITHUB_REF tag comes in the format 'refs/tags/xxx'.
|
||||
# So if we split on '/' and take the 3rd value, we can get the release name.
|
||||
run: |
|
||||
NEW_VERSION=$(echo "${GITHUB_REF}" | cut -d "/" -f3)
|
||||
echo "New version: ${{ steps.vars.outputs.sha_short }}"
|
||||
echo "Github username: ${GITHUB_ACTOR}"
|
||||
./gradlew -Pversion=dev-${{ steps.vars.outputs.sha_short }} publish
|
||||
@@ -1,24 +1,38 @@
|
||||
# How to contribute to eco
|
||||
|
||||
## Codestyle
|
||||
|
||||
1. The eco checkstyle is in /config/checkstyle.xml
|
||||
|
||||
- The pull request must not have any checkstyle issues.
|
||||
- Every method and field must have a javadoc attached.
|
||||
|
||||
2. Use JetBrains annotations
|
||||
|
||||
- Every parameter should be annotated with @NotNull or @Nullable
|
||||
- Use @NotNull over lombok @NonNull
|
||||
|
||||
3. Imports
|
||||
|
||||
- No group (*) imports.
|
||||
- No static imports.
|
||||
|
||||
4. Kotlin
|
||||
|
||||
- Kotlin should be the only language used in the backend, java should be the only language used in the frontend.
|
||||
- Kotlin API extensions should only be for creating extension functions and extra niceties that aren't possible in java.
|
||||
Do not write API components in kotlin.
|
||||
- Kotlin code should never be called directly from the frontend Java API. Kotlin API extensions should always rely on
|
||||
java, not the other way round.
|
||||
|
||||
## Dependency Injection
|
||||
|
||||
- eco uses Dependency Injection
|
||||
- Any calls to Eco#getHandler#getEcoPlugin are code smells and should never be used unless **absolutely necessary**.
|
||||
- NamespacedKeys, FixedMetadataValues, Runnables, and Schedules should be managed using AbstractEcoPlugin through DI.
|
||||
- Any DI class should extend PluginDependent where possible. If the class extends another, then you **must** store the plugin instance in a private final variable called **plugin** with a private or protected getter.
|
||||
- Any DI class should extend PluginDependent where possible. If the class extends another, then you **must** store the
|
||||
plugin instance in a private final variable called **plugin** with a private or protected getter.
|
||||
|
||||
## Other
|
||||
|
||||
- All drops **must** be sent through a DropQueue - calls to World#dropItem will get your PR rejected.
|
||||
- eco is built with java 17.
|
||||
@@ -29,7 +29,7 @@ and many more.
|
||||
|
||||
# For server owners
|
||||
- Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/)
|
||||
- Supports 1.16.5+
|
||||
- Supports 1.17+
|
||||
|
||||
## Downloads
|
||||
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10")
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id("java-library")
|
||||
id("com.github.johnrengelman.shadow") version "7.1.0"
|
||||
id("com.github.johnrengelman.shadow") version "7.1.2"
|
||||
id("maven-publish")
|
||||
id("java")
|
||||
kotlin("jvm") version "1.6.10"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@@ -10,7 +21,6 @@ dependencies {
|
||||
implementation(project(":eco-core:core-plugin"))
|
||||
implementation(project(":eco-core:core-proxy"))
|
||||
implementation(project(":eco-core:core-backend"))
|
||||
implementation(project(":eco-core:core-nms:v1_16_R3"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_17_R1", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf"))
|
||||
}
|
||||
@@ -20,6 +30,7 @@ allprojects {
|
||||
apply(plugin = "java-library")
|
||||
apply(plugin = "maven-publish")
|
||||
apply(plugin = "com.github.johnrengelman.shadow")
|
||||
apply(plugin = "kotlin")
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
@@ -73,10 +84,11 @@ allprojects {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(kotlin("stdlib", version = "1.6.10"))
|
||||
compileOnly("org.jetbrains:annotations:23.0.0")
|
||||
|
||||
// Test
|
||||
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
|
||||
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2")
|
||||
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
|
||||
|
||||
// Adventure
|
||||
@@ -104,6 +116,14 @@ allprojects {
|
||||
}
|
||||
|
||||
tasks {
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
targetCompatibility = "17"
|
||||
sourceCompatibility = "17"
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
relocate("org.bstats", "com.willfp.eco.shaded.bstats")
|
||||
relocate("net.kyori.adventure.text.minimessage", "com.willfp.eco.shaded.minimessage")
|
||||
|
||||
@@ -32,10 +32,6 @@
|
||||
-->
|
||||
|
||||
<module name="Checker">
|
||||
<module name="SuppressionFilter">
|
||||
<property name="file" value="config/checkstyle/suppression.xml"/>
|
||||
</module>
|
||||
|
||||
<!--
|
||||
If you set the basedir property below, then all reported file
|
||||
names will be relative to the specified directory. See
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!DOCTYPE suppressions PUBLIC
|
||||
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
|
||||
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
|
||||
|
||||
<suppressions>
|
||||
<!-- Internals don't need javadoc. -->
|
||||
<suppress files="[\\/]internal[\\/]" checks="MissingJavadocMethod"/>
|
||||
<suppress files="[\\/]internal[\\/]" checks="JavadocVariable"/>
|
||||
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="MissingJavadocMethod"/>
|
||||
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="JavadocVariable"/>
|
||||
<suppress files="[\\/]eco[\\/]proxy[\\/]" checks="MissingJavadocMethod"/>
|
||||
<suppress files="[\\/]eco[\\/]proxy[\\/]" checks="JavadocVariable"/>
|
||||
|
||||
<!-- Modified version of library -->
|
||||
<suppress files="ArmorEquipEvent.java" checks="JavadocVariable"/>
|
||||
<suppress files="ArmorEquipEvent.java" checks="MissingJavadocMethod"/>
|
||||
<suppress files="ArmorEquipEvent.java" checks="JavadocStyle"/>
|
||||
<suppress files="ArmorListener.java" checks="JavadocVariable"/>
|
||||
<suppress files="ArmorListener.java" checks="MissingJavadocMethod"/>
|
||||
<suppress files="ArmorType.java" checks="JavadocVariable"/>
|
||||
<suppress files="ArmorType.java" checks="MissingJavadocMethod"/>
|
||||
</suppressions>
|
||||
@@ -1,10 +1,3 @@
|
||||
plugins {
|
||||
id 'com.github.johnrengelman.shadow'
|
||||
}
|
||||
|
||||
group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
// Adventure
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
@@ -17,10 +10,8 @@ dependencies {
|
||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
||||
}
|
||||
|
||||
java {
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
build.dependsOn publishToMavenLocal
|
||||
|
||||
|
||||
@@ -152,10 +152,14 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
private final ProxyFactory proxyFactory;
|
||||
|
||||
/**
|
||||
* Create a new plugin without a specified color, proxy support, polymart, or bStats.
|
||||
* Create a new plugin.
|
||||
* <p>
|
||||
* Will read from eco.yml (like plugin.yml) to fetch values that would otherwise be passed
|
||||
* into the constructor. If no eco.yml is present, the plugin will load without extension
|
||||
* support, without proxy support, with no update-checker or bStats, and with the color white.
|
||||
*/
|
||||
protected EcoPlugin() {
|
||||
this("&f");
|
||||
this((PluginProps) null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -236,6 +240,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
@NotNull final String proxyPackage,
|
||||
@NotNull final String color,
|
||||
final boolean supportingExtensions) {
|
||||
this(
|
||||
PluginProps.createSimple(
|
||||
resourceId,
|
||||
bStatsId,
|
||||
proxyPackage,
|
||||
color,
|
||||
supportingExtensions
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin.
|
||||
*
|
||||
* @param pluginProps The props. If left null, it will read from eco.yml.
|
||||
*/
|
||||
protected EcoPlugin(@Nullable final PluginProps pluginProps) {
|
||||
/*
|
||||
The handler must be initialized before any plugin's constructors
|
||||
are called, as the constructors call Eco#getHandler().
|
||||
@@ -253,15 +274,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
a standalone handler class, but then there would be an interface
|
||||
left in the API that doesn't really help anything.
|
||||
|
||||
The other alternative would be do use reflection to get a 'createHandler'
|
||||
method that only exists in EcoSpigotPlugin - but that feels really dirty
|
||||
The other alternative would be to use reflection to get a 'createHandler'
|
||||
method that only exists in EcoSpigotPlugin - but that feels filthy,
|
||||
and I'd rather only use reflection where necessary.
|
||||
*/
|
||||
|
||||
if (Eco.getHandler() == null && this instanceof Handler) {
|
||||
/*
|
||||
This code is only ever called by EcoSpigotPlugin (EcoHandler)
|
||||
as it's the first plugin to load and it is a handler.
|
||||
as it's the first plugin to load, and it is a handler.
|
||||
|
||||
Any other plugins will never call this code as the handler
|
||||
will have already been initialized.
|
||||
@@ -272,11 +293,16 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
|
||||
assert Eco.getHandler() != null;
|
||||
|
||||
this.resourceId = resourceId;
|
||||
this.bStatsId = bStatsId;
|
||||
this.proxyPackage = proxyPackage;
|
||||
this.color = color;
|
||||
this.supportingExtensions = supportingExtensions;
|
||||
PluginProps generatedProps = Eco.getHandler().getProps(pluginProps, this.getClass());
|
||||
generatedProps.validate();
|
||||
PluginProps props = this.mutateProps(generatedProps);
|
||||
props.validate();
|
||||
|
||||
this.resourceId = props.getResourceId();
|
||||
this.bStatsId = props.getBStatsId();
|
||||
this.proxyPackage = props.getProxyPackage();
|
||||
this.color = props.getColor();
|
||||
this.supportingExtensions = props.isSupportingExtensions();
|
||||
|
||||
this.scheduler = Eco.getHandler().createScheduler(this);
|
||||
this.eventManager = Eco.getHandler().createEventManager(this);
|
||||
@@ -296,8 +322,8 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
/*
|
||||
The minimum eco version check was moved here because it's very common
|
||||
to add a lot of code in the constructor of plugins; meaning that the plugin
|
||||
can throw errors without it being obvious to the user that the reason is
|
||||
because they have an outdated version of eco installed.
|
||||
can throw errors without it being obvious to the user that the reason is that
|
||||
they have an outdated version of eco installed.
|
||||
*/
|
||||
|
||||
DefaultArtifactVersion runningVersion = new DefaultArtifactVersion(Eco.getHandler().getEcoPlugin().getDescription().getVersion());
|
||||
@@ -534,6 +560,21 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Mutate the plugin props.
|
||||
* <p>
|
||||
* Useful for eco-based plugin libraries to enforce certain properties, such as
|
||||
* forcing extensions to be enabled.
|
||||
* <p>
|
||||
* Props are validated both before and after calling this method.
|
||||
*
|
||||
* @param props The props.
|
||||
* @return The mutated props.
|
||||
*/
|
||||
protected PluginProps mutateProps(@NotNull final PluginProps props) {
|
||||
return props;
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific integrations to be tested and loaded.
|
||||
*
|
||||
@@ -635,7 +676,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return The proxy.
|
||||
*/
|
||||
public final <T> T getProxy(@NotNull final Class<T> proxyClass) {
|
||||
Validate.notNull(proxyFactory, "Plugin does not support proxy!");
|
||||
Validate.notNull(proxyFactory, "Plugin does not support proxies!");
|
||||
|
||||
return proxyFactory.getProxy(proxyClass);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ import com.willfp.eco.core.gui.GUIFactory;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration;
|
||||
import com.willfp.eco.core.proxy.Cleaner;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.requirement.RequirementFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.Location;
|
||||
@@ -33,6 +32,7 @@ import java.util.logging.Logger;
|
||||
* @see Eco#getHandler()
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@SuppressWarnings("removal")
|
||||
public interface Handler {
|
||||
/**
|
||||
* Create a scheduler.
|
||||
@@ -210,7 +210,8 @@ public interface Handler {
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
RequirementFactory getRequirementFactory();
|
||||
@Deprecated(forRemoval = true)
|
||||
com.willfp.eco.core.requirement.RequirementFactory getRequirementFactory();
|
||||
|
||||
/**
|
||||
* Get Adventure audiences.
|
||||
@@ -259,4 +260,15 @@ public interface Handler {
|
||||
@NotNull
|
||||
NamespacedKey createNamespacedKey(@NotNull String namespace,
|
||||
@NotNull String key);
|
||||
|
||||
/**
|
||||
* Return or get props for a plugin.
|
||||
*
|
||||
* @param existing The existing constructor props.
|
||||
* @param plugin The plugin.
|
||||
* @return The props.
|
||||
*/
|
||||
@NotNull
|
||||
PluginProps getProps(@Nullable PluginProps existing,
|
||||
@NotNull Class<? extends EcoPlugin> plugin);
|
||||
}
|
||||
|
||||
275
eco-api/src/main/java/com/willfp/eco/core/PluginProps.java
Normal file
275
eco-api/src/main/java/com/willfp/eco/core/PluginProps.java
Normal file
@@ -0,0 +1,275 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Plugin props are the arguments related to the plugin that are required on start-up.
|
||||
* <p>
|
||||
* This class is complex in how it works intentionally. This is done so that fields can be
|
||||
* added to the props without breaking API backwards compatibility. Thus, there is no public
|
||||
* constructor and no way to instantiate props without creating a parser.
|
||||
*/
|
||||
public final class PluginProps {
|
||||
/**
|
||||
* All registered parsers.
|
||||
*/
|
||||
private static final Map<Class<?>, PropsParser<?>> REGISTERED_PARSERS = new HashMap<>();
|
||||
|
||||
/**
|
||||
* The polymart resource ID.
|
||||
*/
|
||||
@Nullable
|
||||
private Integer resourceId;
|
||||
|
||||
/**
|
||||
* The bStats ID.
|
||||
*/
|
||||
@Nullable
|
||||
private Integer bStatsId;
|
||||
|
||||
/**
|
||||
* The proxy package.
|
||||
*/
|
||||
@Nullable
|
||||
private String proxyPackage;
|
||||
|
||||
/**
|
||||
* The color.
|
||||
*/
|
||||
@Nullable
|
||||
private String color;
|
||||
|
||||
/**
|
||||
* If extensions are supported.
|
||||
*/
|
||||
@Nullable
|
||||
private Boolean supportingExtensions;
|
||||
|
||||
/**
|
||||
* Create new blank props.
|
||||
*/
|
||||
private PluginProps() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource ID.
|
||||
*
|
||||
* @return The resource ID.
|
||||
*/
|
||||
public int getResourceId() {
|
||||
assert resourceId != null;
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set resource ID.
|
||||
*
|
||||
* @param resourceId The resource ID.
|
||||
*/
|
||||
public void setResourceId(final int resourceId) {
|
||||
this.resourceId = resourceId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bStats ID.
|
||||
*
|
||||
* @return The bStats ID.
|
||||
*/
|
||||
public int getBStatsId() {
|
||||
assert bStatsId != null;
|
||||
return bStatsId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set bStats ID.
|
||||
*
|
||||
* @param bStatsId The bStats ID.
|
||||
*/
|
||||
public void setBStatsId(final int bStatsId) {
|
||||
this.bStatsId = bStatsId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the proxy package.
|
||||
*
|
||||
* @return The package.
|
||||
*/
|
||||
@NotNull
|
||||
public String getProxyPackage() {
|
||||
assert proxyPackage != null;
|
||||
return proxyPackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the proxy package.
|
||||
*
|
||||
* @param proxyPackage The proxy package.
|
||||
*/
|
||||
public void setProxyPackage(@NotNull final String proxyPackage) {
|
||||
this.proxyPackage = proxyPackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get color.
|
||||
*
|
||||
* @return The color.
|
||||
*/
|
||||
@NotNull
|
||||
public String getColor() {
|
||||
assert color != null;
|
||||
return color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the color.
|
||||
*
|
||||
* @param color The color.
|
||||
*/
|
||||
public void setColor(@NotNull final String color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if extensions are supported.
|
||||
*
|
||||
* @return If supported.
|
||||
*/
|
||||
public boolean isSupportingExtensions() {
|
||||
assert supportingExtensions != null;
|
||||
return supportingExtensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if extensions are supported.
|
||||
*
|
||||
* @param supportingExtensions If supported.
|
||||
*/
|
||||
public void setSupportingExtensions(final boolean supportingExtensions) {
|
||||
this.supportingExtensions = supportingExtensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that all required props have been set.
|
||||
*/
|
||||
public void validate() {
|
||||
if (
|
||||
supportingExtensions == null
|
||||
|| proxyPackage == null
|
||||
|| color == null
|
||||
|| bStatsId == null
|
||||
|| resourceId == null
|
||||
) {
|
||||
throw new IllegalStateException("Missing required props!");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse props from source.
|
||||
*
|
||||
* @param source The source.
|
||||
* @param sourceClass The source class.
|
||||
* @param <T> The source type.
|
||||
* @return The props.
|
||||
*/
|
||||
public static <T> PluginProps parse(@NotNull final T source,
|
||||
@NotNull final Class<? extends T> sourceClass) {
|
||||
for (Map.Entry<Class<?>, PropsParser<?>> entry : REGISTERED_PARSERS.entrySet()) {
|
||||
Class<?> clazz = entry.getKey();
|
||||
|
||||
if (clazz.equals(sourceClass)) {
|
||||
@SuppressWarnings("unchecked")
|
||||
PropsParser<T> parser = (PropsParser<T>) entry.getValue();
|
||||
return parser.parseFrom(source);
|
||||
}
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException("No parser exists for class " + sourceClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a parser for a type.
|
||||
*
|
||||
* @param clazz The class.
|
||||
* @param parser The parser.
|
||||
* @param <T> The source type.
|
||||
*/
|
||||
public static <T> void registerParser(@NotNull final Class<T> clazz,
|
||||
@NotNull final PropsParser<T> parser) {
|
||||
REGISTERED_PARSERS.put(clazz, parser);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if there is a registered parser for a class.
|
||||
*
|
||||
* @param clazz The class.
|
||||
* @return If there is a parser registered.
|
||||
*/
|
||||
public static boolean hasParserFor(@NotNull final Class<?> clazz) {
|
||||
for (Class<?> test : REGISTERED_PARSERS.keySet()) {
|
||||
if (test.equals(clazz)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new props from known values.
|
||||
*
|
||||
* Marked as internal as this method will break whenever the properties themselves
|
||||
* are updated (e.g. if a new property is added) - so to prevent any potential
|
||||
* backwards-compatibility bugs, this method cannot be invoked outside eco itself.
|
||||
*
|
||||
* @param resourceId The ID of the plugin on polymart.
|
||||
* @param bStatsId The ID of the plugin on bStats.
|
||||
* @param proxyPackage The package where proxies can be found.
|
||||
* @param color The primary color of the plugin.
|
||||
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
||||
* @return The props.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
static PluginProps createSimple(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
@NotNull final String color,
|
||||
final boolean supportsExtensions) {
|
||||
PluginProps props = new PluginProps();
|
||||
props.setResourceId(resourceId);
|
||||
props.setBStatsId(bStatsId);
|
||||
props.setProxyPackage(proxyPackage);
|
||||
props.setColor(color);
|
||||
props.setSupportingExtensions(supportsExtensions);
|
||||
return props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse arguments into props for a plugin.
|
||||
*
|
||||
* @param <T> The type of source.
|
||||
*/
|
||||
public interface PropsParser<T> {
|
||||
/**
|
||||
* Parse props from a given source.
|
||||
*
|
||||
* @param source The source.
|
||||
* @return The props.
|
||||
*/
|
||||
PluginProps parseFrom(@NotNull T source);
|
||||
|
||||
/**
|
||||
* Get a new, blank props instance.
|
||||
*
|
||||
* @return Blank props.
|
||||
*/
|
||||
default PluginProps getBlankProps() {
|
||||
return new PluginProps();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,10 @@ public class Prerequisite {
|
||||
|
||||
/**
|
||||
* Requires the server to be running 1.17.
|
||||
*
|
||||
* @deprecated eco no longer supports versions before 1.17.
|
||||
*/
|
||||
@Deprecated(since = "6.25.2")
|
||||
public static final Prerequisite HAS_1_17 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("17") || HAS_1_18.isMet(),
|
||||
"Requires server to be running 1.17+"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.command;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -66,6 +67,13 @@ public interface CommandBase {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
EcoPlugin getPlugin();
|
||||
|
||||
/**
|
||||
* Get the handler.
|
||||
*
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.willfp.eco.core.command.impl;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.PluginDependent;
|
||||
import com.willfp.eco.core.command.CommandBase;
|
||||
import com.willfp.eco.core.command.CommandHandler;
|
||||
import com.willfp.eco.core.command.TabCompleteHandler;
|
||||
@@ -25,7 +24,12 @@ import java.util.stream.Collectors;
|
||||
* layer, hence why it's a package-private class.
|
||||
*/
|
||||
@SuppressWarnings({"DeprecatedIsStillUsed"})
|
||||
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
|
||||
abstract class HandledCommand implements CommandBase {
|
||||
/**
|
||||
* The plugin.
|
||||
*/
|
||||
private final EcoPlugin plugin;
|
||||
|
||||
/**
|
||||
* The name of the command.
|
||||
*/
|
||||
@@ -78,7 +82,7 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
||||
@NotNull final String name,
|
||||
@NotNull final String permission,
|
||||
final boolean playersOnly) {
|
||||
super(plugin);
|
||||
this.plugin = plugin;
|
||||
this.name = name;
|
||||
this.permission = permission;
|
||||
this.playersOnly = playersOnly;
|
||||
@@ -98,6 +102,16 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Override
|
||||
public EcoPlugin getPlugin() {
|
||||
return this.plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the command.
|
||||
*
|
||||
@@ -124,6 +138,11 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isPlayersOnly() && !(sender instanceof Player)) {
|
||||
sender.sendMessage(this.getPlugin().getLangYml().getMessage("not-player"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.getHandler() != null) {
|
||||
this.getHandler().onExecute(sender, Arrays.asList(args));
|
||||
} else {
|
||||
@@ -193,11 +212,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
|
||||
public static boolean canExecute(@NotNull final CommandSender sender,
|
||||
@NotNull final CommandBase command,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
if (command.isPlayersOnly() && !(sender instanceof Player)) {
|
||||
sender.sendMessage(plugin.getLangYml().getMessage("not-player"));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!sender.hasPermission(command.getPermission()) && sender instanceof Player) {
|
||||
sender.sendMessage(plugin.getLangYml().getNoPermission());
|
||||
return false;
|
||||
|
||||
@@ -5,7 +5,10 @@ import com.willfp.eco.core.config.interfaces.Config;
|
||||
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -21,6 +24,15 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
||||
super(Eco.getHandler().getConfigFactory().createConfig(config));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param stream The InputStream.
|
||||
*/
|
||||
public TransientConfig(@Nullable final InputStream stream) {
|
||||
super(stream != null ? Eco.getHandler().getConfigFactory().createConfig(YamlConfiguration.loadConfiguration(
|
||||
new InputStreamReader(stream)
|
||||
)) : new TransientConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new empty transient config.
|
||||
*
|
||||
|
||||
@@ -235,7 +235,7 @@ public interface Config extends Cloneable {
|
||||
*/
|
||||
@NotNull
|
||||
default String getString(@NotNull String path) {
|
||||
return getString(path, false);
|
||||
return getString(path, false, StringUtils.FormatOption.WITHOUT_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
package com.willfp.eco.core.data.keys;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* API to register persistent data keys.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
public interface KeyRegistry {
|
||||
/**
|
||||
* Register a persistent data key to be stored.
|
||||
@@ -21,4 +27,37 @@ public interface KeyRegistry {
|
||||
* @return The keys.
|
||||
*/
|
||||
Set<PersistentDataKey<?>> getRegisteredKeys();
|
||||
|
||||
/**
|
||||
* Mark key as category.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param category The category.
|
||||
*/
|
||||
void markKeyAs(@NotNull PersistentDataKey<?> key,
|
||||
@NotNull KeyRegistry.KeyCategory category);
|
||||
|
||||
/**
|
||||
* Get persistent data key from namespaced key.
|
||||
*
|
||||
* @param namespacedKey The key.
|
||||
* @return The key, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
PersistentDataKey<?> getKeyFrom(@NotNull NamespacedKey namespacedKey);
|
||||
|
||||
/**
|
||||
* Locations for key categorization.
|
||||
*/
|
||||
enum KeyCategory {
|
||||
/**
|
||||
* Player keys.
|
||||
*/
|
||||
PLAYER,
|
||||
|
||||
/**
|
||||
* Server keys.
|
||||
*/
|
||||
SERVER
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,9 @@ package com.willfp.eco.core.data.keys;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@@ -11,7 +13,7 @@ import java.util.Set;
|
||||
*
|
||||
* @param <T> The type of the data.
|
||||
*/
|
||||
public class PersistentDataKey<T> {
|
||||
public final class PersistentDataKey<T> {
|
||||
/**
|
||||
* The key of the persistent data value.
|
||||
*/
|
||||
@@ -80,6 +82,32 @@ public class PersistentDataKey<T> {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Categorize key as a server key, will register new column to MySQL
|
||||
* database immediately rather than waiting for auto-categorization.
|
||||
* <p>
|
||||
* This will improve performance.
|
||||
*
|
||||
* @return The key.
|
||||
*/
|
||||
public PersistentDataKey<T> server() {
|
||||
Eco.getHandler().getKeyRegistry().markKeyAs(this, KeyRegistry.KeyCategory.SERVER);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Categorize key as a player key, will register new column to MySQL
|
||||
* database immediately rather than waiting for auto-categorization.
|
||||
* <p>
|
||||
* This will improve performance.
|
||||
*
|
||||
* @return The key.
|
||||
*/
|
||||
public PersistentDataKey<T> player() {
|
||||
Eco.getHandler().getKeyRegistry().markKeyAs(this, KeyRegistry.KeyCategory.PLAYER);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all persistent data keys.
|
||||
*
|
||||
@@ -88,4 +116,20 @@ public class PersistentDataKey<T> {
|
||||
public static Set<PersistentDataKey<?>> values() {
|
||||
return Eco.getHandler().getKeyRegistry().getRegisteredKeys();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable final Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof PersistentDataKey that)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.getKey(), that.getKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.getKey());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,8 +22,30 @@ public interface FastItemStack {
|
||||
*
|
||||
* @param checkStored If stored NBT should also be checked.
|
||||
* @return A map of all enchantments.
|
||||
* @deprecated Poorly named method. Use getEnchants instead.
|
||||
*/
|
||||
Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored);
|
||||
@Deprecated(since = "6.24.0")
|
||||
default Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored) {
|
||||
return getEnchants(checkStored);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all enchantments on an item.
|
||||
* Does not account for stored enchants.
|
||||
*
|
||||
* @return A map of all enchantments.
|
||||
*/
|
||||
default Map<Enchantment, Integer> getEnchants() {
|
||||
return getEnchants(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all enchantments on an item.
|
||||
*
|
||||
* @param checkStored If stored enchantments should be accounted for.
|
||||
* @return A map of all enchantments.
|
||||
*/
|
||||
Map<Enchantment, Integer> getEnchants(boolean checkStored);
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment on an item.
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.items.builder.ItemStackBuilder;
|
||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
|
||||
import com.willfp.eco.util.ListUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
@@ -38,7 +40,7 @@ public class FillerMask {
|
||||
*/
|
||||
public FillerMask(@NotNull final Material material,
|
||||
@NotNull final String... pattern) {
|
||||
this(new MaskMaterials(material), pattern);
|
||||
this(new MaskItems(new MaterialTestableItem(material)), pattern);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -46,17 +48,33 @@ public class FillerMask {
|
||||
*
|
||||
* @param materials The mask materials.
|
||||
* @param pattern The pattern.
|
||||
* @deprecated Use {@link MaskItems} instead.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0")
|
||||
public FillerMask(@NotNull final MaskMaterials materials,
|
||||
@NotNull final String... pattern) {
|
||||
if (Arrays.stream(materials.materials()).anyMatch(material -> material == Material.AIR)) {
|
||||
throw new IllegalArgumentException("Materials cannot be air!");
|
||||
this(
|
||||
materials.toMaskItems(),
|
||||
pattern
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new filler mask.
|
||||
*
|
||||
* @param items The mask items.
|
||||
* @param pattern The pattern.
|
||||
*/
|
||||
public FillerMask(@NotNull final MaskItems items,
|
||||
@NotNull final String... pattern) {
|
||||
if (Arrays.stream(items.items()).anyMatch(item -> item instanceof EmptyTestableItem)) {
|
||||
throw new IllegalArgumentException("Items cannot be empty!");
|
||||
}
|
||||
|
||||
mask = ListUtils.create2DList(6, 9);
|
||||
|
||||
for (int i = 0; i < materials.materials().length; i++) {
|
||||
ItemStack itemStack = new ItemStackBuilder(materials.materials()[i])
|
||||
for (int i = 0; i < items.items().length; i++) {
|
||||
ItemStack itemStack = new ItemStackBuilder(items.items()[i])
|
||||
.setDisplayName("&r")
|
||||
.build();
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.items.Items;
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||
import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
|
||||
import org.bukkit.Material;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Mask materials store a set of items which can be accessed by
|
||||
* a filler mask.
|
||||
*
|
||||
* @param items The items.
|
||||
*/
|
||||
public record MaskItems(@NotNull TestableItem... items) {
|
||||
/**
|
||||
* Create MaskItems from a list of item names.
|
||||
*
|
||||
* @param names The names.
|
||||
* @return The mask items.
|
||||
*/
|
||||
public static MaskItems fromItemNames(@NotNull final Iterable<String> names) {
|
||||
List<TestableItem> items = new ArrayList<>();
|
||||
|
||||
for (String name : names) {
|
||||
TestableItem item = Items.lookup(name);
|
||||
|
||||
if (item instanceof EmptyTestableItem) {
|
||||
continue;
|
||||
}
|
||||
|
||||
items.add(item);
|
||||
}
|
||||
|
||||
if (items.isEmpty()) {
|
||||
return new MaskItems(new MaterialTestableItem(Material.BLACK_STAINED_GLASS_PANE));
|
||||
}
|
||||
|
||||
return new MaskItems(items.toArray(new TestableItem[0]));
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.items.Items;
|
||||
import org.bukkit.Material;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -8,7 +9,16 @@ import org.jetbrains.annotations.NotNull;
|
||||
* a filler mask.
|
||||
*
|
||||
* @param materials The materials.
|
||||
* @deprecated Use {@link MaskItems} instead.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0")
|
||||
public record MaskMaterials(@NotNull Material... materials) {
|
||||
|
||||
/**
|
||||
* Convert MaskMaterials to MaskItems.
|
||||
*
|
||||
* @return The MaskItems.
|
||||
*/
|
||||
public MaskItems toMaskItems() {
|
||||
return new MaskItems(Items.fromMaterials(this.materials()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.willfp.eco.core.gui.slot;
|
||||
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotModifier;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotUpdater;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -106,8 +107,23 @@ public interface SlotBuilder {
|
||||
*
|
||||
* @param modifier The modifier.
|
||||
* @return The builder.
|
||||
* @deprecated Use {@link SlotBuilder#setUpdater(SlotUpdater)} instead.
|
||||
*/
|
||||
SlotBuilder setModifier(@NotNull SlotModifier modifier);
|
||||
@Deprecated
|
||||
default SlotBuilder setModifier(@NotNull SlotModifier modifier) {
|
||||
return setUpdater((player, menu, previous) -> {
|
||||
modifier.modify(player, menu, previous);
|
||||
return previous;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the ItemStack updater.
|
||||
*
|
||||
* @param updater The updater.
|
||||
* @return The builder.
|
||||
*/
|
||||
SlotBuilder setUpdater(@NotNull SlotUpdater updater);
|
||||
|
||||
/**
|
||||
* Set slot to be a captive slot.
|
||||
|
||||
@@ -7,8 +7,11 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on slot modify.
|
||||
*
|
||||
* @deprecated Use {@link SlotUpdater} instead.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
@Deprecated
|
||||
public interface SlotModifier {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.willfp.eco.core.gui.slot.functional;
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface to run on slot update.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface SlotUpdater {
|
||||
/**
|
||||
* Performs this operation on the given arguments.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param menu The menu.
|
||||
* @param previous The previous ItemStack.
|
||||
* @return The new ItemStack.
|
||||
*/
|
||||
ItemStack update(@NotNull Player player,
|
||||
@NotNull Menu menu,
|
||||
@NotNull ItemStack previous);
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@@ -344,6 +345,35 @@ public final class Items {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an array of materials to an array of testable items.
|
||||
*
|
||||
* @param materials The materials.
|
||||
* @return An array of functionally identical testable items.
|
||||
*/
|
||||
@NotNull
|
||||
public static TestableItem[] fromMaterials(@NotNull final Material... materials) {
|
||||
return Arrays.stream(materials)
|
||||
.map(MaterialTestableItem::new)
|
||||
.toArray(MaterialTestableItem[]::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a collection of materials into a collection of testable items.
|
||||
*
|
||||
* @param materials The materials.
|
||||
* @return A collection of functionally identical testable items.
|
||||
*/
|
||||
@NotNull
|
||||
public static Collection<TestableItem> fromMaterials(@NotNull final Iterable<Material> materials) {
|
||||
List<TestableItem> items = new ArrayList<>();
|
||||
for (Material material : materials) {
|
||||
items.add(new MaterialTestableItem(material));
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
private Items() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -5,12 +5,25 @@ import org.jetbrains.annotations.NotNull;
|
||||
/**
|
||||
* Generic error with proxy loading.
|
||||
*/
|
||||
public class ProxyError extends RuntimeException {
|
||||
public class ProxyError extends Error {
|
||||
/**
|
||||
* Thrown if there is an error getting a proxy.
|
||||
*
|
||||
* @param message The message to send.
|
||||
* @param cause The cause.
|
||||
*/
|
||||
public ProxyError(@NotNull final String message,
|
||||
@NotNull final Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Thrown if there is an error getting a proxy.
|
||||
*
|
||||
* @param message The message to send.
|
||||
* @deprecated Proxy Errors should include a cause.
|
||||
*/
|
||||
@Deprecated
|
||||
public ProxyError(@NotNull final String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.willfp.eco.core.proxy.exceptions;
|
||||
|
||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||
|
||||
/**
|
||||
* Server running an unsupported version.
|
||||
*/
|
||||
public class UnsupportedVersionError extends Error {
|
||||
/**
|
||||
* Thrown if the server is running an unsupported version.
|
||||
*/
|
||||
public UnsupportedVersionError() {
|
||||
super("You're running an unsupported server version: " + ProxyConstants.NMS_VERSION);
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,30 @@
|
||||
package com.willfp.eco.core.proxy.exceptions;
|
||||
|
||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Error if the server is running an unsupported version.
|
||||
*
|
||||
* @deprecated Poorly named, exception when it's actually an error, contains doubly nested errors.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
public class UnsupportedVersionException extends ProxyError {
|
||||
/**
|
||||
* Thrown if the server is running an unsupported NMS version.
|
||||
*
|
||||
* @param message The message to send.
|
||||
* @deprecated Use the default constructor.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0")
|
||||
public UnsupportedVersionException(@NotNull final String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Thrown if the server is running an unsupported NMS version.
|
||||
*/
|
||||
public UnsupportedVersionException() {
|
||||
super("You're running an unsupported server version: " + ProxyConstants.NMS_VERSION, new IllegalStateException());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ import java.util.List;
|
||||
/**
|
||||
* Utility class to manage and register crafting recipes.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public final class Recipes {
|
||||
/**
|
||||
* Registry of all recipes.
|
||||
|
||||
@@ -294,7 +294,7 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
*/
|
||||
public boolean isAir() {
|
||||
for (TestableItem recipePart : this.recipeParts) {
|
||||
if (recipePart!= null && !(recipePart instanceof EmptyTestableItem)) {
|
||||
if (recipePart != null && !(recipePart instanceof EmptyTestableItem)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,11 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* A requirement is a defined goal that a player must meet.
|
||||
*
|
||||
* @deprecated No typing, weak definitions, and not an API component. Shouldn't be in eco.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
public abstract class Requirement {
|
||||
/**
|
||||
* Create a new requirement.
|
||||
|
||||
@@ -6,9 +6,13 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface for internal requirement factory implementations.
|
||||
*
|
||||
* @deprecated See {@link Requirement}.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
@Eco.HandlerComponent
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
@SuppressWarnings({"removal", "DeprecatedIsStillUsed"})
|
||||
public interface RequirementFactory {
|
||||
/**
|
||||
* Create a requirement.
|
||||
|
||||
@@ -5,7 +5,11 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Contains methods and fields pertaining to requirements.
|
||||
*
|
||||
* @deprecated See {@link Requirement}.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
@SuppressWarnings("removal")
|
||||
public final class Requirements {
|
||||
/**
|
||||
* Requires a player to have a permission.
|
||||
|
||||
@@ -26,11 +26,26 @@ public final class DurabilityUtils {
|
||||
* @param item The item to damage.
|
||||
* @param damage The amount of damage to deal.
|
||||
* @param slot The slot in the inventory of the item.
|
||||
* @deprecated The slot is not required.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0")
|
||||
public static void damageItem(@NotNull final Player player,
|
||||
@NotNull final ItemStack item,
|
||||
final int damage,
|
||||
final int slot) {
|
||||
damageItem(player, item, damage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Damage an item in a player's inventory.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param item The item to damage.
|
||||
* @param damage The amount of damage to deal.
|
||||
*/
|
||||
public static void damageItem(@NotNull final Player player,
|
||||
@NotNull final ItemStack item,
|
||||
final int damage) {
|
||||
if (item.getItemMeta() == null) {
|
||||
return;
|
||||
}
|
||||
@@ -61,7 +76,7 @@ public final class DurabilityUtils {
|
||||
item.setItemMeta((ItemMeta) meta);
|
||||
PlayerItemBreakEvent event = new PlayerItemBreakEvent(player, item);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
player.getInventory().clear(slot);
|
||||
item.setType(Material.AIR);
|
||||
player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, SoundCategory.BLOCKS, 1, 1);
|
||||
} else {
|
||||
item.setItemMeta((ItemMeta) meta);
|
||||
@@ -69,6 +84,44 @@ public final class DurabilityUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Damage an item.
|
||||
*
|
||||
* @param item The item to damage.
|
||||
* @param damage The amount of damage to deal.
|
||||
*/
|
||||
public static void damageItem(@NotNull final ItemStack item,
|
||||
final int damage) {
|
||||
if (item.getItemMeta() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.getItemMeta().isUnbreakable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(item.getItemMeta() instanceof Damageable)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Special edge case
|
||||
if (item.getType() == Material.CARVED_PUMPKIN || item.getType() == Material.PLAYER_HEAD) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Damageable meta = (Damageable) item.getItemMeta();
|
||||
meta.setDamage(meta.getDamage() + damage);
|
||||
|
||||
if (meta.getDamage() >= item.getType().getMaxDurability()) {
|
||||
meta.setDamage(item.getType().getMaxDurability());
|
||||
item.setItemMeta((ItemMeta) meta);
|
||||
item.setType(Material.AIR);
|
||||
} else {
|
||||
item.setItemMeta((ItemMeta) meta);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Damage an item in a player's inventory without breaking it.
|
||||
*
|
||||
|
||||
@@ -3,6 +3,9 @@ package com.willfp.eco.util;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Utilities / API methods for {@link NamespacedKey}s.
|
||||
@@ -45,8 +48,25 @@ public final class NamespacedKeyUtils {
|
||||
*/
|
||||
@NotNull
|
||||
public static NamespacedKey fromString(@NotNull final String string) {
|
||||
return Objects.requireNonNull(NamespacedKeyUtils.fromStringOrNull(string));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a NamespacedKey from a string.
|
||||
* <p>
|
||||
* Preferred over {@link NamespacedKey#fromString(String)} for performance reasons.
|
||||
*
|
||||
* @param string The string.
|
||||
* @return The key, or null if not a key.
|
||||
*/
|
||||
@Nullable
|
||||
public static NamespacedKey fromStringOrNull(@NotNull final String string) {
|
||||
int index = string.indexOf(":");
|
||||
|
||||
if (index < 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return NamespacedKeyUtils.create(
|
||||
string.substring(0, index),
|
||||
string.substring(index + 1)
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.willfp.eco.core.Prerequisite;
|
||||
import com.willfp.eco.core.data.PlayerProfile;
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey;
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKeyType;
|
||||
import com.willfp.eco.core.integrations.anticheat.AnticheatManager;
|
||||
import net.kyori.adventure.audience.Audience;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
@@ -12,6 +13,8 @@ import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Utilities / API methods for players.
|
||||
*/
|
||||
@@ -107,6 +110,38 @@ public final class PlayerUtils {
|
||||
profile.write(PLAYER_NAME_KEY, player.getDisplayName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Run something with the player exempted.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param action The action.
|
||||
*/
|
||||
public static void runExempted(@NotNull final Player player,
|
||||
@NotNull final Consumer<Player> action) {
|
||||
try {
|
||||
AnticheatManager.exemptPlayer(player);
|
||||
action.accept(player);
|
||||
} finally {
|
||||
AnticheatManager.unexemptPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run something with the player exempted.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param action The action.
|
||||
*/
|
||||
public static void runExempted(@NotNull final Player player,
|
||||
@NotNull final Runnable action) {
|
||||
try {
|
||||
AnticheatManager.exemptPlayer(player);
|
||||
action.run();
|
||||
} finally {
|
||||
AnticheatManager.unexemptPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
private PlayerUtils() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.willfp.eco.util;
|
||||
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import com.willfp.eco.core.Prerequisite;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
@@ -69,8 +68,10 @@ public final class TeamUtils {
|
||||
*
|
||||
* @param material The material to find the team from.
|
||||
* @return The team.
|
||||
* @deprecated Stupid method.
|
||||
*/
|
||||
@NotNull
|
||||
@Deprecated(since = "6.24.0")
|
||||
public static Team getMaterialColorTeam(@NotNull final Material material) {
|
||||
return fromChatColor(MATERIAL_COLORS.getOrDefault(material, ChatColor.WHITE));
|
||||
}
|
||||
@@ -89,17 +90,15 @@ public final class TeamUtils {
|
||||
MATERIAL_COLORS.put(Material.EMERALD_ORE, ChatColor.GREEN);
|
||||
MATERIAL_COLORS.put(Material.ANCIENT_DEBRIS, ChatColor.DARK_RED);
|
||||
|
||||
if (Prerequisite.HAS_1_17.isMet()) {
|
||||
MATERIAL_COLORS.put(Material.COPPER_ORE, ChatColor.GOLD);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_COPPER_ORE, ChatColor.GOLD);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_COAL_ORE, ChatColor.BLACK);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_IRON_ORE, ChatColor.GRAY);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_GOLD_ORE, ChatColor.YELLOW);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_LAPIS_ORE, ChatColor.BLUE);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_REDSTONE_ORE, ChatColor.RED);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_DIAMOND_ORE, ChatColor.AQUA);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_EMERALD_ORE, ChatColor.GREEN);
|
||||
}
|
||||
MATERIAL_COLORS.put(Material.COPPER_ORE, ChatColor.GOLD);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_COPPER_ORE, ChatColor.GOLD);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_COAL_ORE, ChatColor.BLACK);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_IRON_ORE, ChatColor.GRAY);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_GOLD_ORE, ChatColor.YELLOW);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_LAPIS_ORE, ChatColor.BLUE);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_REDSTONE_ORE, ChatColor.RED);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_DIAMOND_ORE, ChatColor.AQUA);
|
||||
MATERIAL_COLORS.put(Material.DEEPSLATE_EMERALD_ORE, ChatColor.GREEN);
|
||||
}
|
||||
|
||||
private TeamUtils() {
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
@file:JvmName("CommandHelperExtensions")
|
||||
|
||||
package com.willfp.eco.core.commands
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.command.CommandBase
|
||||
import com.willfp.eco.core.command.impl.PluginCommand
|
||||
import com.willfp.eco.core.command.impl.Subcommand
|
||||
import org.bukkit.command.CommandSender
|
||||
|
||||
/**
|
||||
* Helper class for creating commands with builders.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param name The command name.
|
||||
* @param permission The permission.
|
||||
* @param playersOnly If only players should run the command.
|
||||
* @param executor The command executor.
|
||||
* @param tabCompleter The tab completer.
|
||||
*/
|
||||
class BuiltPluginCommand internal constructor(
|
||||
plugin: EcoPlugin,
|
||||
name: String,
|
||||
permission: String,
|
||||
playersOnly: Boolean = false,
|
||||
var executor: (CommandSender, List<String>) -> Unit,
|
||||
var tabCompleter: (CommandSender, List<String>) -> List<String>,
|
||||
) : PluginCommand(plugin, name, permission, playersOnly) {
|
||||
override fun onExecute(sender: CommandSender, args: List<String>) =
|
||||
executor(sender, args)
|
||||
|
||||
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> =
|
||||
tabCompleter(sender, args)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Helper class for creating commands with builders.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param name The command name.
|
||||
* @param permission The permission.
|
||||
* @param playersOnly If only players should run the command.
|
||||
* @param executor The command executor.
|
||||
* @param tabCompleter The tab completer.
|
||||
*/
|
||||
class BuiltSubcommand internal constructor(
|
||||
plugin: EcoPlugin,
|
||||
name: String,
|
||||
permission: String,
|
||||
playersOnly: Boolean = false,
|
||||
var executor: (CommandSender, List<String>) -> Unit,
|
||||
var tabCompleter: (CommandSender, List<String>) -> List<String>,
|
||||
) : Subcommand(plugin, name, permission, playersOnly) {
|
||||
internal constructor(
|
||||
parent: CommandBase,
|
||||
name: String,
|
||||
executor: (CommandSender, List<String>) -> Unit,
|
||||
tabCompleter: (CommandSender, List<String>) -> List<String>,
|
||||
) : this(parent.plugin, name, parent.permission, parent.isPlayersOnly, executor, tabCompleter)
|
||||
|
||||
override fun onExecute(sender: CommandSender, args: List<String>) =
|
||||
executor(sender, args)
|
||||
|
||||
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> =
|
||||
tabCompleter(sender, args)
|
||||
}
|
||||
|
||||
/**
|
||||
* Kotlin builder for commands.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param name The command name.
|
||||
* @param permission The permission.
|
||||
* @param playersOnly If only players should execute the command.
|
||||
* @param init The builder.
|
||||
*/
|
||||
fun command(
|
||||
plugin: EcoPlugin,
|
||||
name: String,
|
||||
permission: String,
|
||||
playersOnly: Boolean = false,
|
||||
init: BuiltPluginCommand.() -> Unit
|
||||
): PluginCommand {
|
||||
val command = BuiltPluginCommand(
|
||||
plugin,
|
||||
name,
|
||||
permission,
|
||||
playersOnly,
|
||||
{ _, _ -> },
|
||||
{ _, _ -> emptyList() }
|
||||
)
|
||||
init(command)
|
||||
return command
|
||||
}
|
||||
|
||||
/**
|
||||
* Kotlin builder for commands.
|
||||
*
|
||||
* @param name The command name.
|
||||
* @param permission The permission.
|
||||
* @param playersOnly If only players should execute the command.
|
||||
* @param init The builder.
|
||||
*/
|
||||
fun CommandBase.addSubcommand(
|
||||
name: String,
|
||||
permission: String,
|
||||
playersOnly: Boolean = false,
|
||||
init: BuiltSubcommand.() -> Unit
|
||||
): Subcommand {
|
||||
val command = BuiltSubcommand(
|
||||
this.plugin,
|
||||
name,
|
||||
permission,
|
||||
playersOnly,
|
||||
{ _, _ -> },
|
||||
{ _, _ -> emptyList() }
|
||||
)
|
||||
init(command)
|
||||
return command
|
||||
}
|
||||
|
||||
/**
|
||||
* Kotlin builder for commands.
|
||||
* Inherits plugin, permission, players only.
|
||||
*
|
||||
* @param name The command name.
|
||||
* @param init The builder.
|
||||
*/
|
||||
fun CommandBase.addSubcommand(
|
||||
name: String,
|
||||
init: BuiltSubcommand.() -> Unit
|
||||
): Subcommand {
|
||||
val command = BuiltSubcommand(
|
||||
this,
|
||||
name,
|
||||
{ _, _ -> },
|
||||
{ _, _ -> emptyList() }
|
||||
)
|
||||
init(command)
|
||||
return command
|
||||
}
|
||||
18
eco-api/src/main/kotlin/com/willfp/eco/core/data/Profiles.kt
Normal file
18
eco-api/src/main/kotlin/com/willfp/eco/core/data/Profiles.kt
Normal file
@@ -0,0 +1,18 @@
|
||||
@file:JvmName("ProfileExtensions")
|
||||
|
||||
package com.willfp.eco.core.data
|
||||
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.Server
|
||||
|
||||
/**
|
||||
* @see PlayerProfile.load
|
||||
*/
|
||||
val OfflinePlayer.profile: PlayerProfile
|
||||
get() = PlayerProfile.load(this)
|
||||
|
||||
/**
|
||||
* @see ServerProfile.load
|
||||
*/
|
||||
val Server.profile: ServerProfile
|
||||
get() = ServerProfile.load()
|
||||
@@ -0,0 +1,11 @@
|
||||
@file:JvmName("FastItemStackExtensions")
|
||||
|
||||
package com.willfp.eco.core.fast
|
||||
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see FastItemStack.wrap
|
||||
*/
|
||||
fun ItemStack.fast(): FastItemStack =
|
||||
FastItemStack.wrap(this)
|
||||
105
eco-api/src/main/kotlin/com/willfp/eco/core/gui/GUIHelpers.kt
Normal file
105
eco-api/src/main/kotlin/com/willfp/eco/core/gui/GUIHelpers.kt
Normal file
@@ -0,0 +1,105 @@
|
||||
@file:JvmName("GUIHelperExtensions")
|
||||
|
||||
package com.willfp.eco.core.gui
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu
|
||||
import com.willfp.eco.core.gui.menu.MenuBuilder
|
||||
import com.willfp.eco.core.gui.slot.Slot
|
||||
import com.willfp.eco.core.gui.slot.SlotBuilder
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.inventory.InventoryClickEvent
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onLeftClick
|
||||
*/
|
||||
fun SlotBuilder.onLeftClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onLeftClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onRightClick
|
||||
*/
|
||||
fun SlotBuilder.onRightClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onRightClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onShiftLeftClick
|
||||
*/
|
||||
fun SlotBuilder.onShiftLeftClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onShiftLeftClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onShiftRightClick
|
||||
*/
|
||||
fun SlotBuilder.onShiftRightClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onShiftRightClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.onShiftRightClick
|
||||
*/
|
||||
fun SlotBuilder.onMiddleClick(action: (InventoryClickEvent, Slot, Menu) -> Unit): SlotBuilder =
|
||||
this.onMiddleClick { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.setModifier
|
||||
* @deprecated Use SlotUpdater instead.
|
||||
*/
|
||||
@Deprecated("Use SlotUpdater instead")
|
||||
@Suppress("DEPRECATION")
|
||||
fun SlotBuilder.setModifier(action: (Player, Menu, ItemStack) -> Unit): SlotBuilder =
|
||||
this.setUpdater { a, b, c -> c.apply { action(a, b, c) } }
|
||||
|
||||
/**
|
||||
* @see SlotBuilder.setUpdater
|
||||
*/
|
||||
fun SlotBuilder.setUpdater(action: (Player, Menu, ItemStack) -> ItemStack): SlotBuilder =
|
||||
this.setUpdater { a, b, c -> action(a, b, c) }
|
||||
|
||||
/**
|
||||
* Kotlin builder for slots.
|
||||
*/
|
||||
fun slot(
|
||||
item: ItemStack,
|
||||
init: SlotBuilder.() -> Unit
|
||||
): Slot {
|
||||
val builder = Slot.builder(item)
|
||||
init(builder)
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
/**
|
||||
* Kotlin builder for slots.
|
||||
*/
|
||||
fun slot(
|
||||
provider: (Player, Menu) -> ItemStack,
|
||||
init: SlotBuilder.() -> Unit
|
||||
): Slot {
|
||||
val builder = Slot.builder { a, b -> provider(a, b) }
|
||||
init(builder)
|
||||
return builder.build()
|
||||
}
|
||||
|
||||
/**
|
||||
* @see MenuBuilder.onClose
|
||||
*/
|
||||
fun MenuBuilder.onClose(action: (InventoryCloseEvent, Menu) -> Unit): MenuBuilder =
|
||||
this.onClose { a, b -> action(a, b) }
|
||||
|
||||
/**
|
||||
* @see MenuBuilder.modify
|
||||
*/
|
||||
fun MenuBuilder.modify(modifier: (MenuBuilder) -> Unit): MenuBuilder =
|
||||
this.modfiy { modifier(it) }
|
||||
|
||||
/**
|
||||
* Kotlin builder for menus.
|
||||
*/
|
||||
fun menu(
|
||||
rows: Int,
|
||||
init: MenuBuilder.() -> Unit
|
||||
): Menu {
|
||||
val builder = Menu.builder(rows)
|
||||
init(builder)
|
||||
return builder.build()
|
||||
}
|
||||
12
eco-api/src/main/kotlin/com/willfp/eco/util/ArrowUtils.kt
Normal file
12
eco-api/src/main/kotlin/com/willfp/eco/util/ArrowUtils.kt
Normal file
@@ -0,0 +1,12 @@
|
||||
@file:JvmName("ArrowUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.entity.Arrow
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see ArrowUtils.getBow
|
||||
*/
|
||||
val Arrow.bow: ItemStack?
|
||||
get() = ArrowUtils.getBow(this)
|
||||
11
eco-api/src/main/kotlin/com/willfp/eco/util/BlockUtils.kt
Normal file
11
eco-api/src/main/kotlin/com/willfp/eco/util/BlockUtils.kt
Normal file
@@ -0,0 +1,11 @@
|
||||
@file:JvmName("BlockUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.block.Block
|
||||
|
||||
/**
|
||||
* @see ArrowUtils.getBow
|
||||
*/
|
||||
val Block.isPlayerPlaced: Boolean
|
||||
get() = BlockUtils.isPlayerPlaced(this)
|
||||
@@ -0,0 +1,18 @@
|
||||
@file:JvmName("DurabilityUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
/**
|
||||
* @see DurabilityUtils.damageItem
|
||||
*/
|
||||
fun ItemStack.damage(damage: Int) =
|
||||
DurabilityUtils.damageItem(this, damage)
|
||||
|
||||
/**
|
||||
* @see DurabilityUtils.damageItem
|
||||
*/
|
||||
fun ItemStack.damage(damage: Int, player: Player) =
|
||||
DurabilityUtils.damageItem(player, this, damage)
|
||||
21
eco-api/src/main/kotlin/com/willfp/eco/util/ListUtils.kt
Normal file
21
eco-api/src/main/kotlin/com/willfp/eco/util/ListUtils.kt
Normal file
@@ -0,0 +1,21 @@
|
||||
@file:JvmName("ListUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
/**
|
||||
* @see ListUtils.listToFrequencyMap
|
||||
*/
|
||||
fun <T> List<T>.toFrequencyMap(): Map<T, Int> =
|
||||
ListUtils.listToFrequencyMap(this)
|
||||
|
||||
/**
|
||||
* @see ListUtils.containsIgnoreCase
|
||||
*/
|
||||
fun Iterable<String>.containsIgnoreCase(element: String): Boolean =
|
||||
ListUtils.containsIgnoreCase(this, element)
|
||||
|
||||
/**
|
||||
* @see ListUtils.create2DList
|
||||
*/
|
||||
fun <T> create2DList(rows: Int, columns: Int): MutableList<MutableList<T>> =
|
||||
ListUtils.create2DList(rows, columns)
|
||||
@@ -0,0 +1,29 @@
|
||||
@file:JvmName("NamespacedKeyUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
|
||||
/**
|
||||
* @see NamespacedKeyUtils.fromString
|
||||
*/
|
||||
fun namespacedKeyOf(string: String) =
|
||||
NamespacedKeyUtils.fromString(string)
|
||||
|
||||
/**
|
||||
* @see NamespacedKeyUtils.fromString
|
||||
*/
|
||||
fun safeNamespacedKeyOf(string: String) =
|
||||
NamespacedKeyUtils.fromStringOrNull(string)
|
||||
|
||||
/**
|
||||
* @see NamespacedKeyUtils.create
|
||||
*/
|
||||
fun namespacedKeyOf(namespace: String, key: String) =
|
||||
NamespacedKeyUtils.create(namespace, key)
|
||||
|
||||
/**
|
||||
* @see EcoPlugin.namespacedKeyFactory
|
||||
*/
|
||||
fun namespacedKeyOf(plugin: EcoPlugin, key: String) =
|
||||
plugin.namespacedKeyFactory.create(key)
|
||||
@@ -0,0 +1,9 @@
|
||||
@file:JvmName("NumberUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
/**
|
||||
* @see NumberUtils.toNumeral
|
||||
*/
|
||||
fun Number.toNumeral(): String =
|
||||
NumberUtils.toNumeral(this.toInt())
|
||||
32
eco-api/src/main/kotlin/com/willfp/eco/util/PlayerUtils.kt
Normal file
32
eco-api/src/main/kotlin/com/willfp/eco/util/PlayerUtils.kt
Normal file
@@ -0,0 +1,32 @@
|
||||
@file:JvmName("PlayerUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import net.kyori.adventure.audience.Audience
|
||||
import org.bukkit.OfflinePlayer
|
||||
import org.bukkit.command.CommandSender
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.getSavedDisplayName
|
||||
*/
|
||||
val OfflinePlayer.savedDisplayName: String
|
||||
get() = PlayerUtils.getSavedDisplayName(this)
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.getAudience
|
||||
*/
|
||||
fun Player.asAudience(): Audience =
|
||||
PlayerUtils.getAudience(this)
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.getAudience
|
||||
*/
|
||||
fun CommandSender.asAudience(): Audience =
|
||||
PlayerUtils.getAudience(this)
|
||||
|
||||
/**
|
||||
* @see PlayerUtils.runExempted
|
||||
*/
|
||||
fun Player.runExempted(action: () -> Unit) =
|
||||
PlayerUtils.runExempted(this, action)
|
||||
11
eco-api/src/main/kotlin/com/willfp/eco/util/PotionUtils.kt
Normal file
11
eco-api/src/main/kotlin/com/willfp/eco/util/PotionUtils.kt
Normal file
@@ -0,0 +1,11 @@
|
||||
@file:JvmName("PotionUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.potion.PotionData
|
||||
|
||||
/**
|
||||
* @see PotionData.duration
|
||||
*/
|
||||
val PotionData.duration: Int
|
||||
get() = PotionUtils.getDuration(this)
|
||||
11
eco-api/src/main/kotlin/com/willfp/eco/util/ServerUtils.kt
Normal file
11
eco-api/src/main/kotlin/com/willfp/eco/util/ServerUtils.kt
Normal file
@@ -0,0 +1,11 @@
|
||||
@file:JvmName("ServerUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.Server
|
||||
|
||||
/**
|
||||
* @see ServerUtils.getTps
|
||||
*/
|
||||
val Server.tps: Double
|
||||
get() = ServerUtils.getTps()
|
||||
17
eco-api/src/main/kotlin/com/willfp/eco/util/SkullUtils.kt
Normal file
17
eco-api/src/main/kotlin/com/willfp/eco/util/SkullUtils.kt
Normal file
@@ -0,0 +1,17 @@
|
||||
@file:JvmName("SkullUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.inventory.meta.SkullMeta
|
||||
|
||||
/**
|
||||
* @see SkullUtils.getSkullTexture
|
||||
* @see SkullUtils.setSkullTexture
|
||||
*/
|
||||
var SkullMeta.texture: String?
|
||||
get() = SkullUtils.getSkullTexture(this)
|
||||
set(value) {
|
||||
if (value != null) {
|
||||
SkullUtils.setSkullTexture(this, value)
|
||||
}
|
||||
}
|
||||
42
eco-api/src/main/kotlin/com/willfp/eco/util/StringUtils.kt
Normal file
42
eco-api/src/main/kotlin/com/willfp/eco/util/StringUtils.kt
Normal file
@@ -0,0 +1,42 @@
|
||||
@file:JvmName("StringUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import net.kyori.adventure.text.Component
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
/**
|
||||
* @see StringUtils.toComponent
|
||||
*/
|
||||
fun String.toComponent(): Component =
|
||||
StringUtils.toComponent(this)
|
||||
|
||||
/**
|
||||
* @see StringUtils.toLegacy
|
||||
*/
|
||||
fun Component.toLegacy(): String =
|
||||
StringUtils.toLegacy(this)
|
||||
|
||||
/**
|
||||
* @see StringUtils.format
|
||||
*/
|
||||
fun String.formatEco(
|
||||
player: Player? = null,
|
||||
formatPlaceholders: Boolean = false
|
||||
) = StringUtils.format(
|
||||
this,
|
||||
player,
|
||||
if (formatPlaceholders) StringUtils.FormatOption.WITH_PLACEHOLDERS else StringUtils.FormatOption.WITHOUT_PLACEHOLDERS
|
||||
)
|
||||
|
||||
/**
|
||||
* @see StringUtils.formatList
|
||||
*/
|
||||
fun List<String>.formatEco(
|
||||
player: Player? = null,
|
||||
formatPlaceholders: Boolean = false
|
||||
): List<String> = StringUtils.formatList(
|
||||
this,
|
||||
player,
|
||||
if (formatPlaceholders) StringUtils.FormatOption.WITH_PLACEHOLDERS else StringUtils.FormatOption.WITHOUT_PLACEHOLDERS
|
||||
)
|
||||
17
eco-api/src/main/kotlin/com/willfp/eco/util/VectorUtils.kt
Normal file
17
eco-api/src/main/kotlin/com/willfp/eco/util/VectorUtils.kt
Normal file
@@ -0,0 +1,17 @@
|
||||
@file:JvmName("VectorUtilsExtensions")
|
||||
|
||||
package com.willfp.eco.util
|
||||
|
||||
import org.bukkit.util.Vector
|
||||
|
||||
/**
|
||||
* @see VectorUtils.isFinite
|
||||
*/
|
||||
val Vector.isFinite: Boolean
|
||||
get() = VectorUtils.isFinite(this)
|
||||
|
||||
/**
|
||||
* @see VectorUtils.simplifyVector
|
||||
*/
|
||||
fun Vector.simplify(): Vector =
|
||||
VectorUtils.simplifyVector(this)
|
||||
@@ -1,29 +1,8 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
|
||||
}
|
||||
}
|
||||
|
||||
group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
subprojects {
|
||||
apply plugin: "kotlin"
|
||||
|
||||
dependencies {
|
||||
compileOnly project(":eco-api")
|
||||
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.6.0'
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions {
|
||||
jvmTarget = "17"
|
||||
}
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.willfp.eco.internal
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.PluginProps
|
||||
import com.willfp.eco.core.config.TransientConfig
|
||||
import com.willfp.eco.core.config.interfaces.Config
|
||||
|
||||
object EcoPropsParser : PluginProps.PropsParser<Config> {
|
||||
override fun parseFrom(config: Config): PluginProps {
|
||||
val resourceId = config.getIntOrNull("resource-id") ?: 0
|
||||
val bStatsId = config.getIntOrNull("bstats-id") ?: 0
|
||||
val proxyPackage = config.getStringOrNull("proxy-package") ?: ""
|
||||
val color = config.getStringOrNull("color") ?: "&f"
|
||||
val supportsExtensions = config.getBoolOrNull("supports-extensions") ?: false
|
||||
|
||||
return blankProps.apply {
|
||||
this.resourceId = resourceId
|
||||
this.bStatsId = bStatsId
|
||||
this.proxyPackage = proxyPackage
|
||||
this.color = color
|
||||
this.isSupportingExtensions = supportsExtensions
|
||||
}
|
||||
}
|
||||
|
||||
fun parseForPlugin(plugin: Class<out EcoPlugin>): PluginProps {
|
||||
if (!PluginProps.hasParserFor(Config::class.java)) {
|
||||
PluginProps.registerParser(Config::class.java, this)
|
||||
}
|
||||
|
||||
return PluginProps.parse(
|
||||
TransientConfig(plugin.getResourceAsStream("/eco.yml")),
|
||||
Config::class.java
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.io.StringReader
|
||||
|
||||
class EcoConfigFactory : ConfigFactory {
|
||||
object EcoConfigFactory : ConfigFactory {
|
||||
override fun createConfig(config: YamlConfiguration): Config {
|
||||
return EcoYamlConfigSection(config)
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.core.display.DisplayHandler
|
||||
import com.willfp.eco.core.display.DisplayModule
|
||||
import com.willfp.eco.core.display.DisplayPriority
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import com.willfp.eco.core.fast.fast
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
@@ -60,7 +60,7 @@ class EcoDisplayHandler(plugin: EcoPlugin) : DisplayHandler {
|
||||
Display.unfinalize(itemStack)
|
||||
}
|
||||
|
||||
val fast = FastItemStack.wrap(itemStack)
|
||||
val fast = itemStack.fast()
|
||||
val lore = fast.lore
|
||||
|
||||
if (lore.isNotEmpty() && lore.removeIf { line: String ->
|
||||
|
||||
@@ -10,7 +10,6 @@ import org.bukkit.Material
|
||||
import org.bukkit.entity.EntityType
|
||||
import org.bukkit.entity.ExperienceOrb
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.player.PlayerExpChangeEvent
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.util.Vector
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.entities
|
||||
|
||||
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||
import org.bukkit.entity.Animals
|
||||
import org.bukkit.entity.Ageable
|
||||
|
||||
class EntityArgParserAdult : EntityArgParser {
|
||||
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||
@@ -20,14 +20,14 @@ class EntityArgParserAdult : EntityArgParser {
|
||||
|
||||
return EntityArgParseResult(
|
||||
{
|
||||
if (it !is Animals) {
|
||||
if (it !is Ageable) {
|
||||
return@EntityArgParseResult false
|
||||
}
|
||||
|
||||
it.isAdult
|
||||
},
|
||||
{
|
||||
(it as? Animals)?.setAdult()
|
||||
(it as? Ageable)?.setAdult()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package com.willfp.eco.internal.entities
|
||||
|
||||
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||
import org.bukkit.entity.Animals
|
||||
import org.bukkit.entity.Ageable
|
||||
|
||||
class EntityArgParserBaby : EntityArgParser {
|
||||
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||
@@ -20,14 +20,14 @@ class EntityArgParserBaby : EntityArgParser {
|
||||
|
||||
return EntityArgParseResult(
|
||||
{
|
||||
if (it !is Animals) {
|
||||
if (it !is Ageable) {
|
||||
return@EntityArgParseResult false
|
||||
}
|
||||
|
||||
!it.isAdult
|
||||
},
|
||||
{
|
||||
(it as? Animals)?.setBaby()
|
||||
(it as? Ageable)?.setBaby()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.willfp.eco.internal.entities
|
||||
|
||||
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||
import com.willfp.eco.core.items.Items
|
||||
import com.willfp.eco.core.items.TestableItem
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.inventory.EquipmentSlot
|
||||
|
||||
class EntityArgParserEquipment : EntityArgParser {
|
||||
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||
val equipment = mutableMapOf<EquipmentSlot, TestableItem>()
|
||||
|
||||
for (arg in args) {
|
||||
val argSplit = arg.split(":")
|
||||
for (slot in EquipmentSlot.values()) {
|
||||
if (!argSplit[0].equals(slot.name, ignoreCase = true)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (argSplit.size < 2) {
|
||||
continue
|
||||
}
|
||||
|
||||
equipment[slot] = Items.lookup(argSplit[1])
|
||||
}
|
||||
}
|
||||
|
||||
if (equipment.isEmpty()) {
|
||||
return null
|
||||
}
|
||||
|
||||
return EntityArgParseResult(
|
||||
{
|
||||
if (it !is LivingEntity) {
|
||||
return@EntityArgParseResult false
|
||||
}
|
||||
|
||||
val entityEquipment = it.equipment ?: return@EntityArgParseResult false
|
||||
|
||||
for ((slot, item) in equipment) {
|
||||
if (!item.matches(entityEquipment.getItem(slot))) {
|
||||
return@EntityArgParseResult false
|
||||
}
|
||||
}
|
||||
|
||||
return@EntityArgParseResult true
|
||||
},
|
||||
{
|
||||
if (it !is LivingEntity) {
|
||||
return@EntityArgParseResult
|
||||
}
|
||||
|
||||
val entityEquipment = it.equipment ?: return@EntityArgParseResult
|
||||
|
||||
for ((slot, item) in equipment) {
|
||||
entityEquipment.setItem(slot, item.item, false)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,6 @@ package com.willfp.eco.internal.entities
|
||||
|
||||
import com.willfp.eco.core.entities.args.EntityArgParseResult
|
||||
import com.willfp.eco.core.entities.args.EntityArgParser
|
||||
import org.bukkit.entity.Animals
|
||||
|
||||
class EntityArgParserSilent : EntityArgParser {
|
||||
override fun parseArguments(args: Array<out String>): EntityArgParseResult? {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.willfp.eco.internal.extensions
|
||||
|
||||
import com.google.common.collect.ImmutableSet
|
||||
import com.willfp.eco.core.Eco
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.config.TransientConfig
|
||||
import com.willfp.eco.core.extensions.Extension
|
||||
@@ -32,6 +33,9 @@ class EcoExtensionLoader(
|
||||
|
||||
runCatching { loadExtension(extensionJar) }.onFailure {
|
||||
this.plugin.logger.warning(extensionJar.name + " caused an error!")
|
||||
if (Eco.getHandler().ecoPlugin.configYml.getBool("log-full-extension-errors")) {
|
||||
it.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ class EcoCaptiveSlot(
|
||||
allowMovingItem,
|
||||
allowMovingItem,
|
||||
allowMovingItem,
|
||||
{ _, _, _ -> }
|
||||
{ _, _, prev -> prev }
|
||||
) {
|
||||
override fun isCaptive(): Boolean {
|
||||
return true
|
||||
|
||||
@@ -9,5 +9,5 @@ class EcoFillerSlot(itemStack: ItemStack) : EcoSlot(
|
||||
{ _, _, _ -> },
|
||||
{ _, _, _ -> },
|
||||
{ _, _, _ -> },
|
||||
{ _, _, _ -> }
|
||||
{ _, _, prev -> prev }
|
||||
)
|
||||
@@ -3,8 +3,8 @@ package com.willfp.eco.internal.gui.slot
|
||||
import com.willfp.eco.core.gui.menu.Menu
|
||||
import com.willfp.eco.core.gui.slot.Slot
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotModifier
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotUpdater
|
||||
import com.willfp.eco.internal.gui.menu.MenuHandler
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.inventory.ClickType
|
||||
@@ -18,7 +18,7 @@ open class EcoSlot(
|
||||
private val onShiftLeftClick: SlotHandler,
|
||||
private val onShiftRightClick: SlotHandler,
|
||||
private val onMiddleClick: SlotHandler,
|
||||
private val modifier: SlotModifier
|
||||
private val updater: SlotUpdater
|
||||
) : Slot {
|
||||
|
||||
fun handleInventoryClick(
|
||||
@@ -38,8 +38,7 @@ open class EcoSlot(
|
||||
override fun getItemStack(player: Player): ItemStack {
|
||||
val menu = MenuHandler.getMenu(player.openInventory.topInventory)!!
|
||||
val prev = provider.provide(player, menu)
|
||||
modifier.modify(player, menu, prev)
|
||||
return prev
|
||||
return updater.update(player, menu, prev)
|
||||
}
|
||||
|
||||
fun getItemStack(
|
||||
@@ -47,8 +46,7 @@ open class EcoSlot(
|
||||
menu: Menu
|
||||
): ItemStack {
|
||||
val prev = provider.provide(player, menu)
|
||||
modifier.modify(player, menu, prev)
|
||||
return prev
|
||||
return updater.update(player, menu, prev)
|
||||
}
|
||||
|
||||
override fun isCaptive(): Boolean {
|
||||
|
||||
@@ -3,12 +3,12 @@ package com.willfp.eco.internal.gui.slot
|
||||
import com.willfp.eco.core.gui.slot.Slot
|
||||
import com.willfp.eco.core.gui.slot.SlotBuilder
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotModifier
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotUpdater
|
||||
|
||||
class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
|
||||
private var captive = false
|
||||
private var modifier: SlotModifier = SlotModifier{ player, menu, _ -> provider.provide(player, menu)}
|
||||
private var updater: SlotUpdater = SlotUpdater { player, menu, _ -> provider.provide(player, menu) }
|
||||
|
||||
private var onLeftClick =
|
||||
SlotHandler { _, _, _ -> run { } }
|
||||
@@ -51,8 +51,8 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setModifier(modifier: SlotModifier): SlotBuilder {
|
||||
this.modifier = modifier
|
||||
override fun setUpdater(updater: SlotUpdater): SlotBuilder {
|
||||
this.updater = updater
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
|
||||
return if (captive) {
|
||||
EcoCaptiveSlot(provider)
|
||||
} else {
|
||||
EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick, modifier)
|
||||
EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick, updater)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.willfp.eco.internal.items
|
||||
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import com.willfp.eco.core.fast.fast
|
||||
import com.willfp.eco.core.items.args.LookupArgParser
|
||||
import com.willfp.eco.util.NamespacedKeyUtils
|
||||
import org.bukkit.enchantments.Enchantment
|
||||
@@ -41,7 +41,7 @@ class ArgParserEnchantment : LookupArgParser {
|
||||
}
|
||||
|
||||
return Predicate {
|
||||
val onItem = FastItemStack.wrap(it).getEnchantmentsOnItem(true)
|
||||
val onItem = it.fast().getEnchants(true)
|
||||
|
||||
for ((enchant, level) in enchants) {
|
||||
if ((onItem[enchant] ?: 0) < level) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.proxy.ProxyConstants
|
||||
import com.willfp.eco.core.proxy.ProxyFactory
|
||||
import com.willfp.eco.core.proxy.exceptions.ProxyError
|
||||
import com.willfp.eco.core.proxy.exceptions.UnsupportedVersionException
|
||||
import com.willfp.eco.core.proxy.exceptions.UnsupportedVersionError
|
||||
import java.net.URLClassLoader
|
||||
import java.util.IdentityHashMap
|
||||
|
||||
@@ -34,21 +34,26 @@ class EcoProxyFactory(
|
||||
return proxy
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
throwError(e)
|
||||
throw proxyErrorFrom(e)
|
||||
}
|
||||
|
||||
throwError(IllegalArgumentException())
|
||||
|
||||
throw RuntimeException("Something went wrong.")
|
||||
throw proxyErrorFrom(IllegalArgumentException("Class doesn't seem to be a proxy."))
|
||||
}
|
||||
|
||||
private fun throwError(e: Exception?) {
|
||||
e?.printStackTrace()
|
||||
private fun proxyErrorFrom(e: Exception): Throwable {
|
||||
plugin.logger.severe("Fatal error with proxies! This plugin can't load.")
|
||||
|
||||
if (!SUPPORTED_VERSIONS.contains(ProxyConstants.NMS_VERSION)) {
|
||||
throw UnsupportedVersionException("You're running an unsupported server version: " + ProxyConstants.NMS_VERSION)
|
||||
return if (!SUPPORTED_VERSIONS.contains(ProxyConstants.NMS_VERSION)) {
|
||||
ProxyError(
|
||||
"Could not initialize proxy.",
|
||||
UnsupportedVersionError()
|
||||
)
|
||||
} else {
|
||||
throw ProxyError("Error with proxies - here's a stacktrace. Only god can help you now.")
|
||||
ProxyError(
|
||||
"Could not initialize proxy. If you're seeing this error message"
|
||||
+ ", something has gone badly wrong. This almost definitely isn't user error, blame the developer.",
|
||||
e
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +77,6 @@ class EcoProxyFactory(
|
||||
|
||||
companion object {
|
||||
val SUPPORTED_VERSIONS = listOf(
|
||||
"v1_16_R3",
|
||||
"v1_17_R1",
|
||||
"v1_18_R1"
|
||||
)
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
@file:Suppress("DEPRECATION")
|
||||
|
||||
package com.willfp.eco.internal.requirement
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import com.willfp.eco.core.requirement.RequirementFactory
|
||||
import com.willfp.eco.internal.requirement.requirements.RequirementHasPermission
|
||||
import com.willfp.eco.internal.requirement.requirements.RequirementPlaceholderEquals
|
||||
import com.willfp.eco.internal.requirement.requirements.RequirementPlaceholderGreaterThan
|
||||
import com.willfp.eco.internal.requirement.requirements.RequirementPlaceholderLessThan
|
||||
import com.willfp.eco.internal.requirement.requirements.RequirementTrue
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class EcoRequirementFactory: RequirementFactory {
|
||||
@Deprecated(
|
||||
"Requirement system is marked as for-removal from eco",
|
||||
level = DeprecationLevel.WARNING
|
||||
)
|
||||
class EcoRequirementFactory : RequirementFactory {
|
||||
override fun create(name: String): Requirement {
|
||||
return when (name.lowercase()) {
|
||||
"has-permission" -> RequirementHasPermission()
|
||||
@@ -18,4 +21,93 @@ class EcoRequirementFactory: RequirementFactory {
|
||||
else -> RequirementTrue()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated(
|
||||
"Requirement system is marked as for-removal from eco",
|
||||
level = DeprecationLevel.WARNING
|
||||
)
|
||||
class RequirementHasPermission : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
|
||||
val permission = args[0]
|
||||
return player.hasPermission(permission)
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated(
|
||||
"Requirement system is marked as for-removal from eco",
|
||||
level = DeprecationLevel.WARNING
|
||||
)
|
||||
class RequirementPlaceholderEquals : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1]
|
||||
return PlaceholderManager.translatePlaceholders(placeholder, player).equals(equals, ignoreCase = true)
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated(
|
||||
"Requirement system is marked as for-removal from eco",
|
||||
level = DeprecationLevel.WARNING
|
||||
)
|
||||
@SuppressWarnings("DEPRECATION")
|
||||
class RequirementPlaceholderGreaterThan : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1].toDoubleOrNull() ?: return false
|
||||
return (PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0) >= equals
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated(
|
||||
"Requirement system is marked as for-removal from eco",
|
||||
level = DeprecationLevel.WARNING
|
||||
)
|
||||
class RequirementPlaceholderLessThan : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1].toDoubleOrNull() ?: return false
|
||||
return (PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0) < equals
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated(
|
||||
"Requirement system is marked as for-removal from eco",
|
||||
level = DeprecationLevel.WARNING
|
||||
)
|
||||
class RequirementTrue : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementHasPermission : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
|
||||
val permission = args[0]
|
||||
return player.hasPermission(permission)
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementPlaceholderEquals : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1]
|
||||
return PlaceholderManager.translatePlaceholders(placeholder, player).equals(equals, ignoreCase = true)
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementPlaceholderGreaterThan : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1].toDoubleOrNull() ?: return false
|
||||
return (PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0) >= equals
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementPlaceholderLessThan : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1].toDoubleOrNull() ?: return false
|
||||
return (PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0) < equals
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementTrue : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.spigotmc:spigot:1.16.5-R0.1-SNAPSHOT'
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy
|
||||
import net.minecraft.server.v1_16_R3.MinecraftKey
|
||||
import net.minecraft.server.v1_16_R3.PacketPlayOutAutoRecipe
|
||||
|
||||
class AutoCraft : AutoCraftProxy {
|
||||
override fun modifyPacket(packet: Any) {
|
||||
val recipePacket = packet as PacketPlayOutAutoRecipe
|
||||
val fKey = recipePacket.javaClass.getDeclaredField("b")
|
||||
fKey.isAccessible = true
|
||||
val key = fKey[recipePacket] as MinecraftKey
|
||||
fKey[recipePacket] = MinecraftKey(key.namespace, key.key + "_displayed")
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
import com.willfp.eco.internal.spigot.proxy.BlockBreakProxy
|
||||
import net.minecraft.server.v1_16_R3.BlockPosition
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class BlockBreak : BlockBreakProxy {
|
||||
override fun breakBlock(
|
||||
player: Player,
|
||||
block: Block
|
||||
) {
|
||||
if (player !is CraftPlayer) {
|
||||
return
|
||||
}
|
||||
player.handle.playerInteractManager.breakBlock(BlockPosition(block.x, block.y, block.z))
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy
|
||||
import net.kyori.adventure.nbt.api.BinaryTagHolder
|
||||
import net.kyori.adventure.text.BuildableComponent
|
||||
import net.kyori.adventure.text.Component
|
||||
import net.kyori.adventure.text.TranslatableComponent
|
||||
import net.kyori.adventure.text.event.HoverEvent
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer
|
||||
import net.minecraft.server.v1_16_R3.IChatBaseComponent
|
||||
import net.minecraft.server.v1_16_R3.MojangsonParser
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
class ChatComponent : ChatComponentProxy {
|
||||
private val gsonComponentSerializer = GsonComponentSerializer.gson()
|
||||
|
||||
override fun modifyComponent(obj: Any, player: Player): Any {
|
||||
if (obj !is IChatBaseComponent) {
|
||||
return obj
|
||||
}
|
||||
|
||||
val component = gsonComponentSerializer.deserialize(
|
||||
IChatBaseComponent.ChatSerializer.a(
|
||||
obj
|
||||
)
|
||||
).asComponent() as BuildableComponent<*, *>
|
||||
|
||||
val newComponent = modifyBaseComponent(component, player)
|
||||
|
||||
return IChatBaseComponent.ChatSerializer.a(
|
||||
gsonComponentSerializer.serialize(newComponent.asComponent())
|
||||
) ?: obj
|
||||
}
|
||||
|
||||
private fun modifyBaseComponent(baseComponent: Component, player: Player): Component {
|
||||
var component = baseComponent
|
||||
|
||||
if (component is TranslatableComponent) {
|
||||
val args = mutableListOf<Component>()
|
||||
for (arg in component.args()) {
|
||||
args.add(modifyBaseComponent(arg, player))
|
||||
}
|
||||
component = component.args(args)
|
||||
}
|
||||
|
||||
val children = mutableListOf<Component>()
|
||||
for (child in component.children()) {
|
||||
children.add(modifyBaseComponent(child, player))
|
||||
}
|
||||
component = component.children(children)
|
||||
|
||||
val hoverEvent: HoverEvent<Any> = component.style().hoverEvent() as HoverEvent<Any>? ?: return component
|
||||
|
||||
val showItem = hoverEvent.value()
|
||||
|
||||
if (showItem !is HoverEvent.ShowItem) {
|
||||
return component
|
||||
}
|
||||
|
||||
val newShowItem = showItem.nbt(
|
||||
BinaryTagHolder.of(
|
||||
CraftItemStack.asNMSCopy(
|
||||
Display.display(
|
||||
CraftItemStack.asBukkitCopy(
|
||||
CraftItemStack.asNMSCopy(
|
||||
org.bukkit.inventory.ItemStack(
|
||||
Material.matchMaterial(
|
||||
showItem.item()
|
||||
.toString()
|
||||
) ?: return component,
|
||||
showItem.count()
|
||||
)
|
||||
).apply {
|
||||
this.tag = MojangsonParser.parse(
|
||||
showItem.nbt()?.string() ?: return component
|
||||
) ?: return component
|
||||
}
|
||||
),
|
||||
player
|
||||
)
|
||||
).orCreateTag.toString()
|
||||
)
|
||||
)
|
||||
|
||||
val newHover = hoverEvent.value(newShowItem)
|
||||
val style = component.style().hoverEvent(newHover)
|
||||
return component.style(style)
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
|
||||
import com.willfp.eco.internal.spigot.proxy.DummyEntityProxy
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.craftbukkit.v1_16_R3.CraftWorld
|
||||
import org.bukkit.entity.Entity
|
||||
import org.bukkit.entity.EntityType
|
||||
|
||||
class DummyEntity : DummyEntityProxy {
|
||||
override fun createDummyEntity(location: Location): Entity {
|
||||
val world = location.world as CraftWorld
|
||||
@Suppress("UsePropertyAccessSyntax")
|
||||
return world.createEntity(location, EntityType.ZOMBIE.entityClass).getBukkitEntity()
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
||||
import com.willfp.eco.internal.spigot.proxy.v1_16_R3.fast.NMSFastItemStack
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
class FastItemStackFactory : FastItemStackFactoryProxy {
|
||||
override fun create(itemStack: ItemStack): FastItemStack {
|
||||
return NMSFastItemStack(itemStack)
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
|
||||
import com.mojang.authlib.GameProfile
|
||||
import com.mojang.authlib.properties.Property
|
||||
import com.willfp.eco.internal.spigot.proxy.SkullProxy
|
||||
import org.bukkit.inventory.meta.SkullMeta
|
||||
import java.lang.reflect.Field
|
||||
import java.lang.reflect.Method
|
||||
import java.util.UUID
|
||||
|
||||
class Skull : SkullProxy {
|
||||
private lateinit var setProfile: Method
|
||||
private lateinit var profile: Field
|
||||
|
||||
override fun setSkullTexture(
|
||||
meta: SkullMeta,
|
||||
base64: String
|
||||
) {
|
||||
if (!this::setProfile.isInitialized) {
|
||||
setProfile = meta.javaClass.getDeclaredMethod("setProfile", GameProfile::class.java)
|
||||
setProfile.isAccessible = true
|
||||
}
|
||||
val uuid = UUID(
|
||||
base64.substring(base64.length - 20).hashCode().toLong(),
|
||||
base64.substring(base64.length - 10).hashCode().toLong()
|
||||
)
|
||||
val profile = GameProfile(uuid, "eco")
|
||||
profile.properties.put("textures", Property("textures", base64))
|
||||
setProfile.invoke(meta, profile)
|
||||
}
|
||||
|
||||
override fun getSkullTexture(
|
||||
meta: SkullMeta
|
||||
): String? {
|
||||
if (!this::profile.isInitialized) {
|
||||
profile = meta.javaClass.getDeclaredField("profile")
|
||||
profile.isAccessible = true
|
||||
}
|
||||
val profile = profile[meta] as GameProfile? ?: return null
|
||||
val properties = profile.properties ?: return null
|
||||
val prop = properties["textures"] ?: return null
|
||||
return prop.toMutableList().firstOrNull()?.name
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
|
||||
import com.willfp.eco.internal.spigot.proxy.TPSProxy
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.craftbukkit.v1_16_R3.CraftServer
|
||||
|
||||
class TPS : TPSProxy {
|
||||
override fun getTPS(): Double {
|
||||
return (Bukkit.getServer() as CraftServer).handle.server.recentTps[0]
|
||||
}
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3
|
||||
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftMerchantRecipe
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.MerchantRecipe
|
||||
import java.lang.reflect.Field
|
||||
|
||||
class VillagerTrade : VillagerTradeProxy {
|
||||
private var handle: Field
|
||||
|
||||
override fun displayTrade(
|
||||
recipe: MerchantRecipe,
|
||||
player: Player
|
||||
): MerchantRecipe {
|
||||
val oldRecipe = recipe as CraftMerchantRecipe
|
||||
val newRecipe = CraftMerchantRecipe(
|
||||
Display.display(recipe.getResult().clone(), player),
|
||||
recipe.getUses(),
|
||||
recipe.getMaxUses(),
|
||||
recipe.hasExperienceReward(),
|
||||
recipe.getVillagerExperience(),
|
||||
recipe.getPriceMultiplier()
|
||||
)
|
||||
for (ingredient in recipe.getIngredients()) {
|
||||
newRecipe.addIngredient(Display.display(ingredient.clone(), player))
|
||||
}
|
||||
getHandle(newRecipe).specialPrice = getHandle(oldRecipe).specialPrice
|
||||
return newRecipe
|
||||
}
|
||||
|
||||
private fun getHandle(recipe: CraftMerchantRecipe): net.minecraft.server.v1_16_R3.MerchantRecipe {
|
||||
return handle[recipe] as net.minecraft.server.v1_16_R3.MerchantRecipe
|
||||
}
|
||||
|
||||
init {
|
||||
handle = CraftMerchantRecipe::class.java.getDeclaredField("handle")
|
||||
handle.isAccessible = true
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3.fast
|
||||
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.lang.reflect.Field
|
||||
|
||||
private val field: Field = CraftItemStack::class.java.getDeclaredField("handle").apply {
|
||||
isAccessible = true
|
||||
}
|
||||
|
||||
fun ItemStack.getNMSStack(): net.minecraft.server.v1_16_R3.ItemStack {
|
||||
return if (this !is CraftItemStack) {
|
||||
CraftItemStack.asNMSCopy(this)
|
||||
} else {
|
||||
field[this] as net.minecraft.server.v1_16_R3.ItemStack? ?: CraftItemStack.asNMSCopy(this)
|
||||
}
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
package com.willfp.eco.internal.spigot.proxy.v1_16_R3.fast
|
||||
|
||||
import com.willfp.eco.internal.fast.EcoFastItemStack
|
||||
import com.willfp.eco.util.NamespacedKeyUtils
|
||||
import com.willfp.eco.util.StringUtils
|
||||
import net.minecraft.server.v1_16_R3.Item
|
||||
import net.minecraft.server.v1_16_R3.ItemEnchantedBook
|
||||
import net.minecraft.server.v1_16_R3.ItemStack
|
||||
import net.minecraft.server.v1_16_R3.Items
|
||||
import net.minecraft.server.v1_16_R3.NBTTagCompound
|
||||
import net.minecraft.server.v1_16_R3.NBTTagList
|
||||
import net.minecraft.server.v1_16_R3.NBTTagString
|
||||
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
|
||||
import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers
|
||||
import org.bukkit.enchantments.Enchantment
|
||||
import org.bukkit.inventory.ItemFlag
|
||||
import kotlin.experimental.and
|
||||
|
||||
class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemStack<ItemStack>(
|
||||
itemStack.getNMSStack(), itemStack
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
override fun getEnchantmentsOnItem(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
val enchantmentNBT = if (checkStored && handle.item === Items.ENCHANTED_BOOK) ItemEnchantedBook.d(
|
||||
handle
|
||||
) else handle.enchantments
|
||||
val foundEnchantments: MutableMap<Enchantment, Int> = HashMap()
|
||||
for (base in enchantmentNBT) {
|
||||
val compound = base as NBTTagCompound
|
||||
val key = compound.getString("id")
|
||||
val level: Int = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||
val found = Enchantment.getByKey(NamespacedKeyUtils.fromString(key))
|
||||
if (found != null) {
|
||||
foundEnchantments[found] = level
|
||||
}
|
||||
}
|
||||
return foundEnchantments
|
||||
}
|
||||
|
||||
override fun getLevelOnItem(
|
||||
enchantment: Enchantment,
|
||||
checkStored: Boolean
|
||||
): Int {
|
||||
val enchantmentNBT = if (checkStored && handle.item === Items.ENCHANTED_BOOK) ItemEnchantedBook.d(
|
||||
handle
|
||||
) else handle.enchantments
|
||||
for (base in enchantmentNBT) {
|
||||
val compound = base as NBTTagCompound
|
||||
val key = compound.getString("id")
|
||||
if (key != enchantment.key.toString()) {
|
||||
continue
|
||||
}
|
||||
return ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
override fun setLore(lore: List<String>?) {
|
||||
loreCache = null
|
||||
val jsonLore: MutableList<String> = ArrayList()
|
||||
if (lore != null) {
|
||||
for (s in lore) {
|
||||
jsonLore.add(StringUtils.legacyToJson(s))
|
||||
}
|
||||
}
|
||||
val displayTag = handle.a("display")
|
||||
if (!displayTag.hasKey("Lore")) {
|
||||
displayTag["Lore"] = NBTTagList()
|
||||
}
|
||||
val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING)
|
||||
loreTag.clear()
|
||||
for (s in jsonLore) {
|
||||
loreTag.add(NBTTagString.a(s))
|
||||
}
|
||||
apply()
|
||||
}
|
||||
|
||||
override fun getLore(): List<String> {
|
||||
if (loreCache != null) {
|
||||
return loreCache as List<String>
|
||||
}
|
||||
val lore: MutableList<String> = ArrayList()
|
||||
for (s in getLoreJSON()) {
|
||||
lore.add(StringUtils.jsonToLegacy(s))
|
||||
}
|
||||
loreCache = lore
|
||||
return lore
|
||||
}
|
||||
|
||||
private fun getLoreJSON(): List<String> {
|
||||
val displayTag = handle.b("display") ?: return emptyList()
|
||||
return if (displayTag.hasKey("Lore")) {
|
||||
val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING)
|
||||
val lore: MutableList<String> = ArrayList(loreTag.size)
|
||||
for (i in loreTag.indices) {
|
||||
lore.add(loreTag.getString(i))
|
||||
}
|
||||
lore
|
||||
} else {
|
||||
emptyList()
|
||||
}
|
||||
}
|
||||
|
||||
override fun addItemFlags(vararg hideFlags: ItemFlag) {
|
||||
for (flag in hideFlags) {
|
||||
this.flagBits = this.flagBits or getBitModifier(flag)
|
||||
}
|
||||
|
||||
apply()
|
||||
}
|
||||
|
||||
override fun removeItemFlags(vararg hideFlags: ItemFlag) {
|
||||
for (flag in hideFlags) {
|
||||
this.flagBits = this.flagBits and getBitModifier(flag)
|
||||
}
|
||||
|
||||
apply()
|
||||
}
|
||||
|
||||
override fun getItemFlags(): MutableSet<ItemFlag> {
|
||||
val flags = mutableSetOf<ItemFlag>()
|
||||
|
||||
var flagArr: Array<ItemFlag>
|
||||
val size = ItemFlag.values().also { flagArr = it }.size
|
||||
|
||||
for (i in 0 until size) {
|
||||
val flag = flagArr[i]
|
||||
if (this.hasItemFlag(flag)) {
|
||||
flags.add(flag)
|
||||
}
|
||||
}
|
||||
|
||||
return flags
|
||||
}
|
||||
|
||||
override fun hasItemFlag(flag: ItemFlag): Boolean {
|
||||
val bitModifier = getBitModifier(flag)
|
||||
return this.flagBits and bitModifier == bitModifier
|
||||
}
|
||||
|
||||
private var flagBits: Int
|
||||
get() =
|
||||
if (handle.hasTag() && handle.tag!!.hasKeyOfType(
|
||||
"HideFlags",
|
||||
99
|
||||
)
|
||||
) handle.tag!!.getInt("HideFlags") else 0
|
||||
set(value) =
|
||||
handle.orCreateTag.setInt("HideFlags", value)
|
||||
|
||||
override fun getRepairCost(): Int {
|
||||
return handle.repairCost
|
||||
}
|
||||
|
||||
override fun setRepairCost(cost: Int) {
|
||||
handle.repairCost = cost
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is NMSFastItemStack) {
|
||||
return false
|
||||
}
|
||||
|
||||
return other.hashCode() == this.hashCode()
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return handle.tag?.hashCode() ?: (0b00010101 * 31 + Item.getId(handle.item))
|
||||
}
|
||||
|
||||
private fun apply() {
|
||||
if (bukkit !is CraftItemStack) {
|
||||
bukkit.itemMeta = CraftItemStack.asCraftMirror(handle).itemMeta
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev") version "1.3.3"
|
||||
id("io.papermc.paperweight.userdev") version "1.3.4"
|
||||
}
|
||||
|
||||
group = "com.willfp"
|
||||
|
||||
@@ -21,7 +21,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
|
||||
override fun getEnchantmentsOnItem(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
override fun getEnchants(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
val enchantmentNBT =
|
||||
if (checkStored && handle.item === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
||||
handle
|
||||
@@ -31,7 +31,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
val compound = base as CompoundTag
|
||||
val key = compound.getString("id")
|
||||
val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||
val found = Enchantment.getByKey(NamespacedKeyUtils.fromString(key))
|
||||
val found = Enchantment.getByKey(NamespacedKeyUtils.fromStringOrNull(key))
|
||||
if (found != null) {
|
||||
foundEnchantments[found] = level
|
||||
}
|
||||
@@ -176,6 +176,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
@Suppress("KotlinDeprecation")
|
||||
return handle.tag?.hashCode() ?: (0b00010101 * 31 + Item.getId(handle.item))
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
plugins {
|
||||
id("io.papermc.paperweight.userdev") version "1.3.3"
|
||||
id("io.papermc.paperweight.userdev") version "1.3.4"
|
||||
}
|
||||
|
||||
group = "com.willfp"
|
||||
|
||||
@@ -22,7 +22,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
) {
|
||||
private var loreCache: List<String>? = null
|
||||
|
||||
override fun getEnchantmentsOnItem(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
override fun getEnchants(checkStored: Boolean): Map<Enchantment, Int> {
|
||||
val enchantmentNBT =
|
||||
if (checkStored && handle.getItem() === Items.ENCHANTED_BOOK) EnchantedBookItem.getEnchantments(
|
||||
handle
|
||||
@@ -32,7 +32,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
|
||||
val compound = base as CompoundTag
|
||||
val key = compound.getString("id")
|
||||
val level = ('\uffff'.code.toShort() and compound.getShort("lvl")).toInt()
|
||||
val found = Enchantment.getByKey(NamespacedKeyUtils.fromString(key))
|
||||
val found = Enchantment.getByKey(NamespacedKeyUtils.fromStringOrNull(key))
|
||||
if (found != null) {
|
||||
foundEnchantments[found] = level
|
||||
}
|
||||
|
||||
@@ -30,9 +30,9 @@ dependencies {
|
||||
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
|
||||
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
|
||||
compileOnly 'com.arcaniax:HeadDatabase-API:1.3.0'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-core:0.36.2'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-dao:0.36.2'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-core:0.37.3'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-dao:0.37.3'
|
||||
compileOnly 'org.jetbrains.exposed:exposed-jdbc:0.37.3'
|
||||
compileOnly 'mysql:mysql-connector-java:8.0.25'
|
||||
compileOnly 'com.zaxxer:HikariCP:5.0.0'
|
||||
compileOnly 'com.gmail.filoghost.holographicdisplays:holographicdisplays-api:2.4.0'
|
||||
|
||||
@@ -2,9 +2,11 @@ package com.willfp.eco.internal.spigot
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.Handler
|
||||
import com.willfp.eco.core.PluginProps
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration
|
||||
import com.willfp.eco.internal.EcoCleaner
|
||||
import com.willfp.eco.internal.EcoPropsParser
|
||||
import com.willfp.eco.internal.Plugins
|
||||
import com.willfp.eco.internal.config.EcoConfigFactory
|
||||
import com.willfp.eco.internal.config.updating.EcoConfigHandler
|
||||
@@ -21,12 +23,10 @@ import com.willfp.eco.internal.gui.EcoGUIFactory
|
||||
import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI
|
||||
import com.willfp.eco.internal.logging.EcoLogger
|
||||
import com.willfp.eco.internal.proxy.EcoProxyFactory
|
||||
import com.willfp.eco.internal.requirement.EcoRequirementFactory
|
||||
import com.willfp.eco.internal.scheduling.EcoScheduler
|
||||
import com.willfp.eco.internal.spigot.data.DataYml
|
||||
import com.willfp.eco.internal.spigot.data.EcoKeyRegistry
|
||||
import com.willfp.eco.internal.spigot.data.EcoProfileHandler
|
||||
import com.willfp.eco.internal.spigot.data.storage.MySQLDataHandler
|
||||
import com.willfp.eco.internal.spigot.data.storage.YamlDataHandler
|
||||
import com.willfp.eco.internal.spigot.integrations.bstats.MetricHandler
|
||||
import com.willfp.eco.internal.spigot.proxy.DummyEntityProxy
|
||||
import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy
|
||||
@@ -39,14 +39,15 @@ import java.util.logging.Logger
|
||||
|
||||
@Suppress("UNUSED")
|
||||
class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
override val dataYml = DataYml(this)
|
||||
|
||||
private val cleaner = EcoCleaner()
|
||||
private val requirementFactory = EcoRequirementFactory()
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
private val requirementFactory = com.willfp.eco.internal.requirement.EcoRequirementFactory()
|
||||
private var adventure: BukkitAudiences? = null
|
||||
private val keyRegistry = EcoKeyRegistry(this)
|
||||
private val playerProfileHandler = EcoProfileHandler(
|
||||
if (this.configYml.getBool("mysql.enabled"))
|
||||
MySQLDataHandler(this) else YamlDataHandler(this)
|
||||
)
|
||||
private val keyRegistry = EcoKeyRegistry()
|
||||
private val playerProfileHandler = EcoProfileHandler(this.configYml.getBool("mysql.enabled"), this)
|
||||
|
||||
@Suppress("RedundantNullableReturnType")
|
||||
private val keyFactory: InternalNamespacedKeyFactory? =
|
||||
@@ -94,7 +95,7 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
}
|
||||
|
||||
override fun getConfigFactory(): EcoConfigFactory {
|
||||
return EcoConfigFactory()
|
||||
return EcoConfigFactory
|
||||
}
|
||||
|
||||
override fun getDropQueueFactory(): EcoDropQueueFactory {
|
||||
@@ -133,7 +134,8 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
MetricHandler.createMetrics(plugin)
|
||||
}
|
||||
|
||||
override fun getRequirementFactory(): EcoRequirementFactory {
|
||||
@Suppress("DEPRECATION")
|
||||
override fun getRequirementFactory(): com.willfp.eco.internal.requirement.EcoRequirementFactory {
|
||||
return requirementFactory
|
||||
}
|
||||
|
||||
@@ -161,4 +163,8 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
@Suppress("DEPRECATION")
|
||||
return keyFactory?.create(namespace, key) ?: NamespacedKey(namespace, key)
|
||||
}
|
||||
|
||||
override fun getProps(existing: PluginProps?, plugin: Class<out EcoPlugin>): PluginProps {
|
||||
return existing ?: EcoPropsParser.parseForPlugin(plugin)
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ import com.willfp.eco.internal.entities.EntityArgParserAttackDamage
|
||||
import com.willfp.eco.internal.entities.EntityArgParserAttackSpeed
|
||||
import com.willfp.eco.internal.entities.EntityArgParserBaby
|
||||
import com.willfp.eco.internal.entities.EntityArgParserCharged
|
||||
import com.willfp.eco.internal.entities.EntityArgParserEquipment
|
||||
import com.willfp.eco.internal.entities.EntityArgParserExplosionRadius
|
||||
import com.willfp.eco.internal.entities.EntityArgParserFlySpeed
|
||||
import com.willfp.eco.internal.entities.EntityArgParserFollowRange
|
||||
@@ -46,6 +47,8 @@ import com.willfp.eco.internal.items.ArgParserTexture
|
||||
import com.willfp.eco.internal.items.ArgParserUnbreakable
|
||||
import com.willfp.eco.internal.spigot.arrows.ArrowDataListener
|
||||
import com.willfp.eco.internal.spigot.data.DataListener
|
||||
import com.willfp.eco.internal.spigot.data.DataYml
|
||||
import com.willfp.eco.internal.spigot.data.EcoProfileHandler
|
||||
import com.willfp.eco.internal.spigot.data.PlayerBlockListener
|
||||
import com.willfp.eco.internal.spigot.data.storage.ProfileSaver
|
||||
import com.willfp.eco.internal.spigot.display.PacketAutoRecipe
|
||||
@@ -120,12 +123,9 @@ import org.bukkit.Material
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.inventory.ItemStack
|
||||
|
||||
abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
773,
|
||||
10043,
|
||||
"com.willfp.eco.internal.spigot.proxy",
|
||||
"&a"
|
||||
) {
|
||||
abstract class EcoSpigotPlugin : EcoPlugin() {
|
||||
abstract val dataYml: DataYml
|
||||
|
||||
init {
|
||||
Items.registerArgParser(ArgParserEnchantment())
|
||||
Items.registerArgParser(ArgParserColor())
|
||||
@@ -153,6 +153,7 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
Entities.registerArgParser(EntityArgParserCharged())
|
||||
Entities.registerArgParser(EntityArgParserExplosionRadius())
|
||||
Entities.registerArgParser(EntityArgParserSilent())
|
||||
Entities.registerArgParser(EntityArgParserEquipment())
|
||||
|
||||
ShapedRecipeListener.registerListener(ComplexInComplex())
|
||||
ShapedRecipeListener.registerListener(ComplexInEco())
|
||||
@@ -186,10 +187,11 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
(Eco.getHandler() as EcoHandler).setAdventure(BukkitAudiences.create(this))
|
||||
}
|
||||
|
||||
this.logger.info("Ignore messages about deprecated events!")
|
||||
|
||||
// Init FIS
|
||||
this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap()
|
||||
|
||||
// Preload categorized persistent data keys
|
||||
(Eco.getHandler().profileHandler as EcoProfileHandler).initialize()
|
||||
}
|
||||
|
||||
override fun handleDisable() {
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.willfp.eco.internal.spigot.data
|
||||
|
||||
import com.willfp.eco.core.config.BaseConfig
|
||||
import com.willfp.eco.core.config.ConfigType
|
||||
import com.willfp.eco.internal.spigot.EcoSpigotPlugin
|
||||
|
||||
class DataYml(
|
||||
plugin: EcoSpigotPlugin
|
||||
) : BaseConfig(
|
||||
"data",
|
||||
plugin,
|
||||
false,
|
||||
ConfigType.YAML
|
||||
)
|
||||
@@ -4,13 +4,11 @@ import com.willfp.eco.core.Eco
|
||||
import com.willfp.eco.core.data.keys.KeyRegistry
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKeyType
|
||||
import com.willfp.eco.internal.spigot.EcoSpigotPlugin
|
||||
import org.bukkit.NamespacedKey
|
||||
|
||||
class EcoKeyRegistry(
|
||||
private val plugin: EcoSpigotPlugin
|
||||
) : KeyRegistry {
|
||||
class EcoKeyRegistry : KeyRegistry {
|
||||
private val registry = mutableMapOf<NamespacedKey, PersistentDataKey<*>>()
|
||||
private val categories = mutableMapOf<NamespacedKey, KeyRegistry.KeyCategory>()
|
||||
|
||||
override fun registerKey(key: PersistentDataKey<*>) {
|
||||
if (this.registry.containsKey(key.key)) {
|
||||
@@ -20,8 +18,6 @@ class EcoKeyRegistry(
|
||||
validateKey(key)
|
||||
|
||||
this.registry[key.key] = key
|
||||
|
||||
(Eco.getHandler().profileHandler as EcoProfileHandler).updateKeys()
|
||||
}
|
||||
|
||||
override fun getRegisteredKeys(): MutableSet<PersistentDataKey<*>> {
|
||||
@@ -46,4 +42,13 @@ class EcoKeyRegistry(
|
||||
else -> throw NullPointerException("Null value found!")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun markKeyAs(key: PersistentDataKey<*>, category: KeyRegistry.KeyCategory) {
|
||||
categories[key.key] = category
|
||||
(Eco.getHandler().profileHandler as EcoProfileHandler).handler.categorize(key, category) // ew
|
||||
}
|
||||
|
||||
override fun getKeyFrom(namespacedKey: NamespacedKey): PersistentDataKey<*>? {
|
||||
return registry[namespacedKey]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package com.willfp.eco.internal.spigot.data
|
||||
|
||||
import com.willfp.eco.core.data.PlayerProfile
|
||||
import com.willfp.eco.core.data.Profile
|
||||
import com.willfp.eco.core.data.ServerProfile
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.internal.spigot.data.storage.DataHandler
|
||||
import java.util.UUID
|
||||
@@ -10,7 +12,7 @@ abstract class EcoProfile(
|
||||
val data: MutableMap<PersistentDataKey<*>, Any>,
|
||||
val uuid: UUID,
|
||||
private val handler: DataHandler
|
||||
) : PlayerProfile {
|
||||
) : Profile {
|
||||
override fun <T : Any> write(key: PersistentDataKey<T>, value: T) {
|
||||
this.data[key] = value
|
||||
|
||||
@@ -50,7 +52,7 @@ class EcoPlayerProfile(
|
||||
data: MutableMap<PersistentDataKey<*>, Any>,
|
||||
uuid: UUID,
|
||||
handler: DataHandler
|
||||
) : EcoProfile(data, uuid, handler) {
|
||||
) : EcoProfile(data, uuid, handler), PlayerProfile {
|
||||
override fun toString(): String {
|
||||
return "EcoPlayerProfile{uuid=$uuid}"
|
||||
}
|
||||
@@ -59,8 +61,8 @@ class EcoPlayerProfile(
|
||||
class EcoServerProfile(
|
||||
data: MutableMap<PersistentDataKey<*>, Any>,
|
||||
handler: DataHandler
|
||||
) : EcoProfile(data, serverProfileUUID, handler) {
|
||||
) : EcoProfile(data, serverProfileUUID, handler), ServerProfile {
|
||||
override fun toString(): String {
|
||||
return "EcoServerProfile"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,17 +5,23 @@ import com.willfp.eco.core.data.Profile
|
||||
import com.willfp.eco.core.data.ProfileHandler
|
||||
import com.willfp.eco.core.data.ServerProfile
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.internal.spigot.EcoSpigotPlugin
|
||||
import com.willfp.eco.internal.spigot.data.storage.DataHandler
|
||||
import com.willfp.eco.internal.spigot.data.storage.MySQLDataHandler
|
||||
import com.willfp.eco.internal.spigot.data.storage.YamlDataHandler
|
||||
import java.util.UUID
|
||||
|
||||
val serverProfileUUID = UUID(0, 0)
|
||||
|
||||
class EcoProfileHandler(
|
||||
private val handler: DataHandler
|
||||
useSql: Boolean,
|
||||
plugin: EcoSpigotPlugin
|
||||
) : ProfileHandler {
|
||||
private val loaded = mutableMapOf<UUID, Profile>()
|
||||
val handler: DataHandler = if (useSql) MySQLDataHandler(plugin, this) else
|
||||
YamlDataHandler(plugin, this)
|
||||
|
||||
private fun loadGenericProfile(uuid: UUID): Profile {
|
||||
fun loadGenericProfile(uuid: UUID): Profile {
|
||||
val found = loaded[uuid]
|
||||
if (found != null) {
|
||||
return found
|
||||
@@ -39,7 +45,7 @@ class EcoProfileHandler(
|
||||
}
|
||||
|
||||
override fun saveKeysFor(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
|
||||
val profile = PlayerProfile.load(uuid)
|
||||
val profile = loadGenericProfile(uuid)
|
||||
|
||||
for (key in keys) {
|
||||
handler.write(uuid, key.key, profile.read(key))
|
||||
@@ -58,7 +64,7 @@ class EcoProfileHandler(
|
||||
handler.save()
|
||||
}
|
||||
|
||||
fun updateKeys() {
|
||||
handler.updateKeys()
|
||||
fun initialize() {
|
||||
handler.initialize()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.willfp.eco.internal.spigot.data
|
||||
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKey
|
||||
import com.willfp.eco.core.data.keys.PersistentDataKeyType
|
||||
import com.willfp.eco.util.NamespacedKeyUtils
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
object KeyHelpers {
|
||||
fun deserializeFromString(serialized: String): PersistentDataKey<*>? {
|
||||
val split = serialized.split(";").toTypedArray()
|
||||
|
||||
if (split.size < 2) {
|
||||
return null
|
||||
}
|
||||
|
||||
val key = NamespacedKeyUtils.fromStringOrNull(split[0]) ?: return null
|
||||
val type = PersistentDataKeyType.valueOf(split[1]) ?: return null
|
||||
return when (type) {
|
||||
PersistentDataKeyType.STRING -> PersistentDataKey(
|
||||
key,
|
||||
type as PersistentDataKeyType<String>,
|
||||
if (split.size >= 3) split.toList().subList(2, split.size).joinToString("") else ""
|
||||
)
|
||||
PersistentDataKeyType.INT -> PersistentDataKey(
|
||||
key,
|
||||
type as PersistentDataKeyType<Int>,
|
||||
split[2].toInt()
|
||||
)
|
||||
PersistentDataKeyType.DOUBLE -> PersistentDataKey(
|
||||
key,
|
||||
type as PersistentDataKeyType<Double>,
|
||||
split[2].toDouble()
|
||||
)
|
||||
PersistentDataKeyType.BOOLEAN -> PersistentDataKey(
|
||||
key,
|
||||
type as PersistentDataKeyType<Boolean>,
|
||||
java.lang.Boolean.parseBoolean(split[2])
|
||||
)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
fun serializeToString(key: PersistentDataKey<*>): String {
|
||||
return "${key.key};${key.type.name()};${key.defaultValue}"
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user