mirror of
https://github.com/songoda/SongodaCore.git
synced 2024-11-30 14:03:23 +01:00
Merge branch 'development'
This commit is contained in:
commit
aa3455d6ba
17
.github/workflows/maven.yml
vendored
17
.github/workflows/maven.yml
vendored
@ -14,22 +14,21 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
# Checkout project files
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
# Setup Java
|
# Setup Java
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v2
|
||||||
with:
|
with:
|
||||||
java-version: 17
|
java-version: 17
|
||||||
distribution: adopt
|
distribution: adopt
|
||||||
|
cache: maven
|
||||||
|
|
||||||
# Checkout project files
|
# Build Spigot 1.18.2 (remapped)
|
||||||
- uses: actions/checkout@v2
|
- uses: SpraxDev/Action-SpigotMC@v4
|
||||||
|
|
||||||
# Caches
|
|
||||||
- name: 'Cache: Maven'
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
versions: 1.18.2
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
remapped: true
|
||||||
restore-keys: ${{ runner.os }}-maven-
|
|
||||||
|
|
||||||
# Build project
|
# Build project
|
||||||
- name: Build with Maven
|
- name: Build with Maven
|
||||||
|
28
.github/workflows/sonarcloud.yml
vendored
28
.github/workflows/sonarcloud.yml
vendored
@ -13,33 +13,35 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
steps:
|
steps:
|
||||||
# Setup Java
|
|
||||||
- uses: actions/setup-java@v2
|
|
||||||
if: ${{ env.SONAR_TOKEN != null }}
|
|
||||||
with:
|
|
||||||
java-version: 17
|
|
||||||
distribution: adopt
|
|
||||||
|
|
||||||
# Checkout project files
|
# Checkout project files
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
if: ${{ env.SONAR_TOKEN != null }}
|
if: ${{ env.SONAR_TOKEN != null }}
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
|
||||||
|
|
||||||
# Caches
|
# Setup Java
|
||||||
- name: 'Cache: Maven'
|
- uses: actions/setup-java@v2
|
||||||
uses: actions/cache@v2
|
|
||||||
if: ${{ env.SONAR_TOKEN != null }}
|
if: ${{ env.SONAR_TOKEN != null }}
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
java-version: 17
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
distribution: adopt
|
||||||
restore-keys: ${{ runner.os }}-maven-
|
cache: maven
|
||||||
|
|
||||||
|
# Cache
|
||||||
- name: 'Cache: SonarCloud'
|
- name: 'Cache: SonarCloud'
|
||||||
|
if: ${{ env.SONAR_TOKEN != null }}
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v2
|
||||||
with:
|
with:
|
||||||
path: ~/.sonar/cache
|
path: ~/.sonar/cache
|
||||||
key: ${{ runner.os }}-sonar
|
key: ${{ runner.os }}-sonar
|
||||||
|
|
||||||
|
# Build Spigot 1.18.2 (remapped)
|
||||||
|
- uses: SpraxDev/Action-SpigotMC@v4
|
||||||
|
if: ${{ env.SONAR_TOKEN != null }}
|
||||||
|
with:
|
||||||
|
versions: 1.18.2
|
||||||
|
remapped: true
|
||||||
|
|
||||||
- name: Analyze project
|
- name: Analyze project
|
||||||
if: ${{ env.SONAR_TOKEN != null }}
|
if: ${{ env.SONAR_TOKEN != null }}
|
||||||
run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=songoda_SongodaCore
|
run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=songoda_SongodaCore
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -32,6 +32,9 @@ public enum CompatibleMaterial {
|
|||||||
DARK_OAK_DOOR_ITEM(431),
|
DARK_OAK_DOOR_ITEM(431),
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* 1.18 */
|
||||||
|
MUSIC_DISC_OTHERSIDE(),
|
||||||
|
|
||||||
/* 1.17 */
|
/* 1.17 */
|
||||||
AMETHYST_BLOCK(),
|
AMETHYST_BLOCK(),
|
||||||
AMETHYST_CLUSTER(),
|
AMETHYST_CLUSTER(),
|
||||||
@ -1274,7 +1277,7 @@ public enum CompatibleMaterial {
|
|||||||
YELLOW_WOOL("WOOL", (byte) 4),
|
YELLOW_WOOL("WOOL", (byte) 4),
|
||||||
ZOMBIE_HEAD("SKULL_ITEM", (byte) 2),
|
ZOMBIE_HEAD("SKULL_ITEM", (byte) 2),
|
||||||
ZOMBIE_HORSE_SPAWN_EGG("MONSTER_EGG", (byte) 29),
|
ZOMBIE_HORSE_SPAWN_EGG("MONSTER_EGG", (byte) 29),
|
||||||
ZOMBIE_PIGMAN_SPAWN_EGG("MONSTER_EGG", (byte) 57),
|
ZOMBIE_PIGMAN_SPAWN_EGG("MONSTER_EGG", (byte) 57), // FIXME: The name changed in newer versions (nether update maybe?)
|
||||||
ZOMBIE_SPAWN_EGG("MONSTER_EGG", (byte) 54),
|
ZOMBIE_SPAWN_EGG("MONSTER_EGG", (byte) 54),
|
||||||
ZOMBIE_VILLAGER_SPAWN_EGG("MONSTER_EGG", (byte) 27),
|
ZOMBIE_VILLAGER_SPAWN_EGG("MONSTER_EGG", (byte) 27),
|
||||||
ZOMBIE_WALL_HEAD("SKULL", (byte) 2),
|
ZOMBIE_WALL_HEAD("SKULL", (byte) 2),
|
||||||
|
@ -6,21 +6,21 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
public enum MethodMapping {
|
public enum MethodMapping {
|
||||||
MC_ITEM_STACK__GET_TAG("getTag", "getTag", "s"),
|
MC_ITEM_STACK__GET_TAG("getTag", "getTag", "s", "t"),
|
||||||
MC_ITEM_STACK__SET_TAG("setTag", "setTag", "c", ClassMapping.NBT_TAG_COMPOUND.getClazz()),
|
MC_ITEM_STACK__SET_TAG("setTag", "setTag", "c", "c", ClassMapping.NBT_TAG_COMPOUND.getClazz()),
|
||||||
|
|
||||||
MC_NBT_TAG_COMPOUND__SET("set", "set", "a", String.class, ClassMapping.NBT_BASE.getClazz()),
|
MC_NBT_TAG_COMPOUND__SET("set", "set", "a", "a", String.class, ClassMapping.NBT_BASE.getClazz()),
|
||||||
MC_NBT_TAG_COMPOUND__SET_SHORT("setShort", "setShort", "a", String.class, short.class),
|
MC_NBT_TAG_COMPOUND__SET_SHORT("setShort", "setShort", "a", "a", String.class, short.class),
|
||||||
MC_NBT_TAG_COMPOUND__SET_STRING("setString", "setString", "a", String.class, String.class),
|
MC_NBT_TAG_COMPOUND__SET_STRING("setString", "setString", "a", "a", String.class, String.class),
|
||||||
MC_NBT_TAG_COMPOUND__REMOVE("remove", "remove", "r", String.class),
|
MC_NBT_TAG_COMPOUND__REMOVE("remove", "remove", "r", "r", String.class),
|
||||||
|
|
||||||
MC_NBT_TAG_LIST__ADD("add", "a", "add", "a", ClassMapping.NBT_BASE.getClazz()),
|
MC_NBT_TAG_LIST__ADD("add", "a", "add", "a", "add", ClassMapping.NBT_BASE.getClazz()),
|
||||||
|
|
||||||
MC_CHUNK__GET_WORLD("getWorld", "D"),
|
MC_CHUNK__GET_WORLD("getWorld", "getWorld", "D"),
|
||||||
|
|
||||||
CB_GENERIC__GET_HANDLE("getHandle"),
|
CB_GENERIC__GET_HANDLE("getHandle"),
|
||||||
|
|
||||||
CB_BLOCK__GET_NMS("getNMSBlock", "getNMS"),
|
CB_BLOCK__GET_NMS("getNMSBlock", "getNMS", "getNMS"),
|
||||||
CB_BLOCK__GET_POSITION("getPosition"),
|
CB_BLOCK__GET_POSITION("getPosition"),
|
||||||
|
|
||||||
CB_BLOCK_DATA__GET_STATE("getState"),
|
CB_BLOCK_DATA__GET_STATE("getState"),
|
||||||
@ -30,67 +30,72 @@ public enum MethodMapping {
|
|||||||
|
|
||||||
CRAFT_MAGIC_NUMBERS__GET_BLOCK__MATERIAL("getBlock", Material.class),
|
CRAFT_MAGIC_NUMBERS__GET_BLOCK__MATERIAL("getBlock", Material.class),
|
||||||
|
|
||||||
I_BLOCK_DATA__GET_BLOCK("getBlock", "b"),
|
I_BLOCK_DATA__GET_BLOCK("getBlock", "b", "b"),
|
||||||
|
|
||||||
BLOCK__GET_BLOCK_DATA("getBlockData", "n"),
|
BLOCK__GET_BLOCK_DATA("getBlockData", "n", "n"),
|
||||||
|
|
||||||
CHUNK__SET_BLOCK_STATE("setType", "setBlockState", ClassMapping.BLOCK_POSITION.getClazz(), ClassMapping.I_BLOCK_DATA.getClazz(), boolean.class, boolean.class),
|
CHUNK__SET_BLOCK_STATE("setType", "setBlockState", "a", ClassMapping.BLOCK_POSITION.getClazz(), ClassMapping.I_BLOCK_DATA.getClazz(), boolean.class, boolean.class),
|
||||||
|
|
||||||
ITEM_STACK__SAVE("save", "b", ClassMapping.NBT_TAG_COMPOUND.getClazz()),
|
ITEM_STACK__SAVE("save", "b", "b", ClassMapping.NBT_TAG_COMPOUND.getClazz()),
|
||||||
ITEM_STACK__GET_ITEM("getItem", "c"),
|
ITEM_STACK__GET_ITEM("getItem", "c", "c"),
|
||||||
ITEM_STACK__GET_MAX_STACK_SIZE("getMaxStackSize", "l"),
|
ITEM_STACK__GET_MAX_STACK_SIZE("getMaxStackSize", "l", "e"),
|
||||||
|
|
||||||
WORLD__UPDATE_ADJACENT_COMPARATORS("updateAdjacentComparators", "c", ClassMapping.BLOCK_POSITION.getClazz(), ClassMapping.BLOCK.getClazz()),
|
WORLD__UPDATE_ADJACENT_COMPARATORS("updateAdjacentComparators", "c", "c", ClassMapping.BLOCK_POSITION.getClazz(), ClassMapping.BLOCK.getClazz()),
|
||||||
WORLD__GET_CHUNK_AT("getChunkAt", "d", int.class, int.class),
|
WORLD__GET_CHUNK_AT("getChunkAt", "d", "a", int.class, int.class),
|
||||||
|
|
||||||
WORLD_BOARDER__SET_CENTER("setCenter", "setCenter", "setCenter", "c", double.class, double.class),
|
WORLD_BOARDER__SET_CENTER("setCenter", "setCenter", "setCenter", "c", "c", double.class, double.class),
|
||||||
WORLD_BOARDER__SET_SIZE("setSize", "setSize", "setSize", "a", double.class),
|
WORLD_BOARDER__SET_SIZE("setSize", "setSize", "setSize", "a", "a", double.class),
|
||||||
WORLD_BOARDER__SET_WARNING_TIME("setWarningTime", "setWarningTime", "setWarningTime", "b", int.class),
|
WORLD_BOARDER__SET_WARNING_TIME("setWarningTime", "setWarningTime", "setWarningTime", "b", "b", int.class),
|
||||||
WORLD_BOARDER__SET_WARNING_DISTANCE("setWarningDistance", "setWarningDistance", "setWarningDistance", "c", int.class),
|
WORLD_BOARDER__SET_WARNING_DISTANCE("setWarningDistance", "setWarningDistance", "setWarningDistance", "c", "c", int.class),
|
||||||
WORLD_BOARDER__TRANSITION_SIZE_BETWEEN("transitionSizeBetween", "transitionSizeBetween", "transitionSizeBetween", "a", double.class, double.class, long.class),
|
WORLD_BOARDER__TRANSITION_SIZE_BETWEEN("transitionSizeBetween", "transitionSizeBetween", "transitionSizeBetween", "a", "a", double.class, double.class, long.class),
|
||||||
|
|
||||||
MOJANGSON_PARSER__PARSE("parse", "a", String.class);
|
MOJANGSON_PARSER__PARSE("parse", "a", "a", String.class);
|
||||||
|
|
||||||
private final String saneFallback;
|
private final String saneFallback;
|
||||||
private final String _1_14;
|
private final String _1_14;
|
||||||
private final String _1_17;
|
private final String _1_17;
|
||||||
private final String _1_18;
|
private final String _1_18;
|
||||||
private final Class<?>[] paramaters;
|
private final String _1_18_2;
|
||||||
|
private final Class<?>[] parameters;
|
||||||
|
|
||||||
MethodMapping(String saneFallback, String _1_14, String _1_17, String _1_18, Class<?>... paramaters) {
|
MethodMapping(String saneFallback, String _1_14, String _1_17, String _1_18, String _1_18_2, Class<?>... parameters) {
|
||||||
this.saneFallback = saneFallback;
|
this.saneFallback = saneFallback;
|
||||||
|
|
||||||
this._1_14 = _1_14;
|
this._1_14 = _1_14;
|
||||||
this._1_17 = _1_17;
|
this._1_17 = _1_17;
|
||||||
this._1_18 = _1_18;
|
this._1_18 = _1_18;
|
||||||
this.paramaters = paramaters;
|
this._1_18_2 = _1_18_2;
|
||||||
|
this.parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodMapping(String saneFallback, String _1_17, String _1_18, Class<?>... paramaters) {
|
MethodMapping(String saneFallback, String _1_17, String _1_18, String _1_18_2, Class<?>... parameters) {
|
||||||
this.saneFallback = saneFallback;
|
this.saneFallback = saneFallback;
|
||||||
|
|
||||||
this._1_14 = null;
|
this._1_14 = null;
|
||||||
this._1_17 = _1_17;
|
this._1_17 = _1_17;
|
||||||
this._1_18 = _1_18;
|
this._1_18 = _1_18;
|
||||||
this.paramaters = paramaters;
|
this._1_18_2 = _1_18_2;
|
||||||
|
this.parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodMapping(String saneFallback, String _1_18, Class<?>... paramaters) {
|
MethodMapping(String saneFallback, String _1_18, String _1_18_2, Class<?>... parameters) {
|
||||||
this.saneFallback = saneFallback;
|
this.saneFallback = saneFallback;
|
||||||
|
|
||||||
this._1_14 = null;
|
this._1_14 = null;
|
||||||
this._1_17 = null;
|
this._1_17 = null;
|
||||||
this._1_18 = _1_18;
|
this._1_18 = _1_18;
|
||||||
this.paramaters = paramaters;
|
this._1_18_2 = _1_18_2;
|
||||||
|
this.parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
MethodMapping(String saneFallback, Class<?>... paramaters) {
|
MethodMapping(String saneFallback, Class<?>... parameters) {
|
||||||
this.saneFallback = saneFallback;
|
this.saneFallback = saneFallback;
|
||||||
|
|
||||||
this._1_14 = null;
|
this._1_14 = null;
|
||||||
this._1_17 = null;
|
this._1_17 = null;
|
||||||
this._1_18 = null;
|
this._1_18 = null;
|
||||||
this.paramaters = paramaters;
|
this._1_18_2 = null;
|
||||||
|
this.parameters = parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Method getMethod(Class<?> clazz) {
|
public Method getMethod(Class<?> clazz) {
|
||||||
@ -109,17 +114,21 @@ public enum MethodMapping {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case V1_18:
|
||||||
|
if (_1_18_2 != null) {
|
||||||
|
methodName = _1_18_2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Method method = clazz.getMethod(methodName, paramaters);
|
Method method = clazz.getMethod(methodName, parameters);
|
||||||
method.setAccessible(true);
|
method.setAccessible(true);
|
||||||
|
|
||||||
return method;
|
return method;
|
||||||
} catch (NullPointerException | NoSuchMethodException ex) {
|
} catch (NullPointerException | NoSuchMethodException ex) {
|
||||||
if (saneFallback != null && !saneFallback.equals(methodName)) {
|
if (saneFallback != null && !saneFallback.equals(methodName)) {
|
||||||
try {
|
try {
|
||||||
Method method = clazz.getMethod(saneFallback, paramaters);
|
Method method = clazz.getMethod(saneFallback, parameters);
|
||||||
method.setAccessible(true);
|
method.setAccessible(true);
|
||||||
|
|
||||||
return method;
|
return method;
|
||||||
|
22
Core/pom.xml
22
Core/pom.xml
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@ -69,6 +69,7 @@
|
|||||||
<includes>
|
<includes>
|
||||||
<include>com.songoda:*</include>
|
<include>com.songoda:*</include>
|
||||||
<include>com.zaxxer:HikariCP</include>
|
<include>com.zaxxer:HikariCP</include>
|
||||||
|
<include>de.tr7zw:item-nbt-api</include>
|
||||||
</includes>
|
</includes>
|
||||||
</artifactSet>
|
</artifactSet>
|
||||||
|
|
||||||
@ -77,6 +78,11 @@
|
|||||||
<pattern>com.zaxxer</pattern>
|
<pattern>com.zaxxer</pattern>
|
||||||
<shadedPattern>com.songoda.core.third_party.com.zaxxer</shadedPattern>
|
<shadedPattern>com.songoda.core.third_party.com.zaxxer</shadedPattern>
|
||||||
</relocation>
|
</relocation>
|
||||||
|
|
||||||
|
<relocation>
|
||||||
|
<pattern>de.tr7zw.changeme.nbtapi</pattern>
|
||||||
|
<shadedPattern>com.songoda.core.third_party.de.tr7zw.nbtapi</shadedPattern>
|
||||||
|
</relocation>
|
||||||
</relocations>
|
</relocations>
|
||||||
|
|
||||||
<filters>
|
<filters>
|
||||||
@ -85,6 +91,7 @@
|
|||||||
|
|
||||||
<includes>
|
<includes>
|
||||||
<include>com/</include>
|
<include>com/</include>
|
||||||
|
<include>de/tr7zw/</include>
|
||||||
<include>META-INF/MANIFEST.MF</include>
|
<include>META-INF/MANIFEST.MF</include>
|
||||||
<include>META-INF/maven/com.songoda/SongodaCore/</include>
|
<include>META-INF/maven/com.songoda/SongodaCore/</include>
|
||||||
</includes>
|
</includes>
|
||||||
@ -112,6 +119,13 @@
|
|||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>de.tr7zw</groupId>
|
||||||
|
<artifactId>item-nbt-api</artifactId>
|
||||||
|
<version>2.9.2</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- Need to include all NMS modules here -->
|
<!-- Need to include all NMS modules here -->
|
||||||
<!-- Note when adding a new module: include the class in NmsManager -->
|
<!-- Note when adding a new module: include the class in NmsManager -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -223,6 +237,12 @@
|
|||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.groupId}</groupId>
|
||||||
|
<artifactId>SongodaCore-NMS-v1_18_R2</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
<!-- End NMS -->
|
<!-- End NMS -->
|
||||||
|
|
||||||
<!-- Start Plugin Hooks -->
|
<!-- Start Plugin Hooks -->
|
||||||
|
@ -53,7 +53,7 @@ public class SongodaCore {
|
|||||||
/**
|
/**
|
||||||
* @since coreRevision 6
|
* @since coreRevision 6
|
||||||
*/
|
*/
|
||||||
private final static String coreVersion = "2.6.11";
|
private final static String coreVersion = "2.6.12";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is specific to the website api
|
* This is specific to the website api
|
||||||
|
@ -4,6 +4,7 @@ import com.songoda.core.configuration.Config;
|
|||||||
import com.songoda.core.database.DataManagerAbstract;
|
import com.songoda.core.database.DataManagerAbstract;
|
||||||
import com.songoda.core.locale.Locale;
|
import com.songoda.core.locale.Locale;
|
||||||
import com.songoda.core.utils.Metrics;
|
import com.songoda.core.utils.Metrics;
|
||||||
|
import de.tr7zw.changeme.nbtapi.utils.MinecraftVersion;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.command.ConsoleCommandSender;
|
import org.bukkit.command.ConsoleCommandSender;
|
||||||
@ -26,6 +27,12 @@ public abstract class SongodaPlugin extends JavaPlugin {
|
|||||||
protected ConsoleCommandSender console = Bukkit.getConsoleSender();
|
protected ConsoleCommandSender console = Bukkit.getConsoleSender();
|
||||||
private boolean emergencyStop = false;
|
private boolean emergencyStop = false;
|
||||||
|
|
||||||
|
static {
|
||||||
|
/* NBT-API */
|
||||||
|
MinecraftVersion.getLogger().setLevel(Level.WARNING);
|
||||||
|
MinecraftVersion.disableUpdateCheck();
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void onPluginLoad();
|
public abstract void onPluginLoad();
|
||||||
|
|
||||||
public abstract void onPluginEnable();
|
public abstract void onPluginEnable();
|
||||||
@ -218,7 +225,7 @@ public abstract class SongodaPlugin extends JavaPlugin {
|
|||||||
*
|
*
|
||||||
* @param th The error(s) that occurred
|
* @param th The error(s) that occurred
|
||||||
*/
|
*/
|
||||||
protected void criticalErrorOnPluginStartup(Throwable... th) {
|
protected void criticalErrorOnPluginStartup(Throwable th) {
|
||||||
Bukkit.getLogger().log(Level.SEVERE,
|
Bukkit.getLogger().log(Level.SEVERE,
|
||||||
String.format(
|
String.format(
|
||||||
"Unexpected error while loading %s v%s c%s: Disabling plugin!",
|
"Unexpected error while loading %s v%s c%s: Disabling plugin!",
|
||||||
|
@ -131,10 +131,17 @@ public class ConfigEditorGui extends SimplePagedGui {
|
|||||||
paged.setItem(4, configItem(CompatibleMaterial.FILLED_MAP, settingKey, node, settingKey, "Choose an item to change this value to"));
|
paged.setItem(4, configItem(CompatibleMaterial.FILLED_MAP, settingKey, node, settingKey, "Choose an item to change this value to"));
|
||||||
int i = 9;
|
int i = 9;
|
||||||
for (CompatibleMaterial mat : CompatibleMaterial.getAllValidItemMaterials()) {
|
for (CompatibleMaterial mat : CompatibleMaterial.getAllValidItemMaterials()) {
|
||||||
paged.setButton(i++, GuiUtils.createButtonItem(mat, mat.name()), ClickType.LEFT, (matEvent) -> {
|
try {
|
||||||
|
ItemStack buttonItem = GuiUtils.createButtonItem(mat, mat.name());
|
||||||
|
if (!buttonItem.getType().isItem()) continue;
|
||||||
|
|
||||||
|
paged.setButton(i++, buttonItem, ClickType.LEFT, (matEvent) -> {
|
||||||
setMaterial(event.slot, settingKey, matEvent.clickedItem);
|
setMaterial(event.slot, settingKey, matEvent.clickedItem);
|
||||||
matEvent.player.closeInventory();
|
matEvent.player.closeInventory();
|
||||||
});
|
});
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
// FIXME: CompatibleMaterial is not working properly for 'ZOMBIE_PIGMAN_SPAWN_EGG'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
event.manager.showGUI(event.player, paged);
|
event.manager.showGUI(event.player, paged);
|
||||||
});
|
});
|
||||||
|
@ -121,6 +121,12 @@ public class NmsManager {
|
|||||||
nbt = new com.songoda.core.nms.v1_18_R1.nbt.NBTCoreImpl();
|
nbt = new com.songoda.core.nms.v1_18_R1.nbt.NBTCoreImpl();
|
||||||
world = new com.songoda.core.nms.v1_18_R1.world.WorldCoreImpl();
|
world = new com.songoda.core.nms.v1_18_R1.world.WorldCoreImpl();
|
||||||
break;
|
break;
|
||||||
|
case "v1_18_R2":
|
||||||
|
player = new com.songoda.core.nms.v1_18_R2.entity.NMSPlayerImpl();
|
||||||
|
anvil = new com.songoda.core.nms.v1_18_R2.anvil.AnvilCore();
|
||||||
|
nbt = new com.songoda.core.nms.v1_18_R2.nbt.NBTCoreImpl();
|
||||||
|
world = new com.songoda.core.nms.v1_18_R2.world.WorldCoreImpl();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion);
|
Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion);
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -4,8 +4,16 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public interface NBTCore {
|
public interface NBTCore {
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link de.tr7zw.nbtapi.NBTItem} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
NBTItem of(ItemStack item);
|
NBTItem of(ItemStack item);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link de.tr7zw.nbtapi.NBTItem} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
NBTItem newItem();
|
NBTItem newItem();
|
||||||
|
|
||||||
NBTEntity of(Entity entity);
|
NBTEntity of(Entity entity);
|
||||||
|
@ -2,6 +2,10 @@ package com.songoda.core.nms.nbt;
|
|||||||
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Use {@link de.tr7zw.nbtapi.NBTItem} instead.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
public interface NBTItem extends NBTCompound {
|
public interface NBTItem extends NBTCompound {
|
||||||
ItemStack finish();
|
ItemStack finish();
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
105
NMS/NMS-v1_18_R2/pom.xml
Normal file
105
NMS/NMS-v1_18_R2/pom.xml
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
|
||||||
|
<release>${java.release}</release>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>net.md-5</groupId>
|
||||||
|
<artifactId>specialsource-maven-plugin</artifactId>
|
||||||
|
<version>1.2.4</version>
|
||||||
|
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>remap-obf</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>remap</goal>
|
||||||
|
</goals>
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
<srgIn>org.spigotmc:minecraft-server:${nms.ver}:txt:maps-mojang</srgIn>
|
||||||
|
<reverse>true</reverse>
|
||||||
|
<remappedDependencies>org.spigotmc:spigot:${nms.ver}:jar:remapped-mojang</remappedDependencies>
|
||||||
|
<remappedArtifactAttached>true</remappedArtifactAttached>
|
||||||
|
<remappedClassifierName>remapped-obf</remappedClassifierName>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
|
||||||
|
<execution>
|
||||||
|
<id>remap-spigot</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>remap</goal>
|
||||||
|
</goals>
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
<inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
|
||||||
|
<srgIn>org.spigotmc:minecraft-server:${nms.ver}:csrg:maps-spigot</srgIn>
|
||||||
|
<remappedDependencies>org.spigotmc:spigot:${nms.ver}:jar:remapped-obf</remappedDependencies>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.songoda</groupId>
|
||||||
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
|
<version>2.6.12</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<java.release>17</java.release>
|
||||||
|
|
||||||
|
<nms.ver>1.18.2-R0.1-SNAPSHOT</nms.ver>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<artifactId>SongodaCore-NMS-v1_18_R2</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot-api</artifactId>
|
||||||
|
<version>${nms.ver}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spigotmc</groupId>
|
||||||
|
<artifactId>spigot</artifactId>
|
||||||
|
<version>${nms.ver}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
<classifier>remapped-mojang</classifier>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.groupId}</groupId>
|
||||||
|
<artifactId>SongodaCore-NMS-API</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.groupId}</groupId>
|
||||||
|
<artifactId>SongodaCore-Compatibility</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.anvil;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.anvil.CustomAnvil;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
|
||||||
|
public class AnvilCore implements com.songoda.core.nms.anvil.AnvilCore {
|
||||||
|
@Override
|
||||||
|
public CustomAnvil createAnvil(Player player) {
|
||||||
|
ServerPlayer p = ((CraftPlayer) player).getHandle();
|
||||||
|
return new AnvilView(p.nextContainerCounter(), p, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
|
||||||
|
ServerPlayer p = ((CraftPlayer) player).getHandle();
|
||||||
|
return new AnvilView(p.nextContainerCounter(), p, holder);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.anvil;
|
||||||
|
|
||||||
|
import net.minecraft.world.Container;
|
||||||
|
import net.minecraft.world.inventory.AnvilMenu;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryAnvil;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
|
||||||
|
public class AnvilInventoryCustom extends CraftInventoryAnvil {
|
||||||
|
final InventoryHolder holder;
|
||||||
|
|
||||||
|
public AnvilInventoryCustom(InventoryHolder holder, Location location, Container inventory, Container resultInventory, AnvilMenu container) {
|
||||||
|
super(location, inventory, resultInventory, container);
|
||||||
|
|
||||||
|
this.holder = holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InventoryHolder getHolder() {
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,214 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.anvil;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.anvil.CustomAnvil;
|
||||||
|
import com.songoda.core.nms.anvil.methods.AnvilTextChange;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.network.chat.TranslatableComponent;
|
||||||
|
import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.world.Container;
|
||||||
|
import net.minecraft.world.entity.player.Player;
|
||||||
|
import net.minecraft.world.inventory.AbstractContainerMenu;
|
||||||
|
import net.minecraft.world.inventory.AnvilMenu;
|
||||||
|
import net.minecraft.world.inventory.ContainerLevelAccess;
|
||||||
|
import net.minecraft.world.inventory.ItemCombinerMenu;
|
||||||
|
import net.minecraft.world.inventory.MenuType;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
public class AnvilView extends AnvilMenu implements CustomAnvil {
|
||||||
|
private final ServerPlayer entity;
|
||||||
|
private final Inventory inventory;
|
||||||
|
private String customTitle = "Repairing";
|
||||||
|
private int cost = -1;
|
||||||
|
private boolean canUse = true;
|
||||||
|
private AnvilTextChange textChange;
|
||||||
|
|
||||||
|
// used for setting custom inventory
|
||||||
|
static Field mc_ContainerAnvil_repairInventory; // subcontainer with only the result
|
||||||
|
static Field mc_ContainerAnvil_resultInventory; // full inventory
|
||||||
|
static Field mc_ContainerAnvil_bukkitEntity;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
mc_ContainerAnvil_repairInventory = ItemCombinerMenu.class.getDeclaredField("p");
|
||||||
|
mc_ContainerAnvil_repairInventory.setAccessible(true);
|
||||||
|
|
||||||
|
mc_ContainerAnvil_resultInventory = ItemCombinerMenu.class.getDeclaredField("o");
|
||||||
|
mc_ContainerAnvil_resultInventory.setAccessible(true);
|
||||||
|
|
||||||
|
mc_ContainerAnvil_bukkitEntity = AnvilMenu.class.getDeclaredField("bukkitEntity");
|
||||||
|
mc_ContainerAnvil_bukkitEntity.setAccessible(true);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1.14 also introduced a title field, also private, which can only be set once and can't be checked
|
||||||
|
static Field mc_Container_title;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
mc_Container_title = AbstractContainerMenu.class.getDeclaredField("title");
|
||||||
|
mc_Container_title.setAccessible(true);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AnvilView(int id, ServerPlayer entity, InventoryHolder holder) {
|
||||||
|
super(entity.nextContainerCounter(), entity.getInventory(), ContainerLevelAccess.create(entity.level, new BlockPos(0, 0, 0)));
|
||||||
|
|
||||||
|
this.setTitle(new TranslatableComponent(customTitle != null ? customTitle : ""));
|
||||||
|
this.checkReachable = false;
|
||||||
|
this.entity = entity;
|
||||||
|
|
||||||
|
if (holder != null) {
|
||||||
|
this.inventory = getBukkitView(entity, holder).getTopInventory();
|
||||||
|
} else {
|
||||||
|
this.inventory = getBukkitView().getTopInventory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CraftInventoryView getBukkitView(Player player, InventoryHolder holder) {
|
||||||
|
try {
|
||||||
|
AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
|
||||||
|
new Location(entity.level.getWorld(), 0, 0, 0),
|
||||||
|
(Container) mc_ContainerAnvil_repairInventory.get(this),
|
||||||
|
(Container) mc_ContainerAnvil_resultInventory.get(this), this);
|
||||||
|
CraftInventoryView view = new CraftInventoryView(player.getBukkitEntity(), craftInventory, this);
|
||||||
|
mc_ContainerAnvil_bukkitEntity.set(this, view);
|
||||||
|
|
||||||
|
return view;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return getBukkitView();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stillValid(Player entityHuman) {
|
||||||
|
return canUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void broadcastFullState() {
|
||||||
|
super.broadcastFullState();
|
||||||
|
|
||||||
|
if (cost >= 0) {
|
||||||
|
this.setLevelCost(cost);
|
||||||
|
}
|
||||||
|
|
||||||
|
textChange.onChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update() {
|
||||||
|
broadcastFullState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRenameText() {
|
||||||
|
return this.itemName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRenameText(String text) {
|
||||||
|
this.setItemName(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setOnChange(AnvilTextChange handler) {
|
||||||
|
textChange = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCustomTitle() {
|
||||||
|
return customTitle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCustomTitle(String title) {
|
||||||
|
this.customTitle = title;
|
||||||
|
|
||||||
|
try {
|
||||||
|
mc_Container_title.set(this, new TranslatableComponent(customTitle != null ? customTitle : ""));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLevelCost(int cost) {
|
||||||
|
this.cost = cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getLevelCost() {
|
||||||
|
if (cost >= 0) {
|
||||||
|
return cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.getLevelCost();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCanUse(boolean bool) {
|
||||||
|
this.canUse = bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getLeftInput() {
|
||||||
|
return inventory.getItem(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getRightInput() {
|
||||||
|
return inventory.getItem(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getOutput() {
|
||||||
|
return inventory.getItem(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLeftInput(ItemStack item) {
|
||||||
|
inventory.setItem(0, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRightInput(ItemStack item) {
|
||||||
|
inventory.setItem(1, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setOutput(ItemStack item) {
|
||||||
|
inventory.setItem(2, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Inventory getInventory() {
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void open() {
|
||||||
|
// Send the packet
|
||||||
|
entity.connection.send(new ClientboundOpenScreenPacket(super.containerId, MenuType.ANVIL, new TranslatableComponent(customTitle != null ? customTitle : "")));
|
||||||
|
|
||||||
|
// Set their active container to this anvil
|
||||||
|
entity.containerMenu = this;
|
||||||
|
|
||||||
|
// Add the slot listener
|
||||||
|
entity.initMenu(entity.containerMenu);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.entity;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.entity.NMSPlayer;
|
||||||
|
import net.minecraft.network.protocol.Packet;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class NMSPlayerImpl implements NMSPlayer {
|
||||||
|
@Override
|
||||||
|
public void sendPacket(Player p, Object packet) {
|
||||||
|
((CraftPlayer) p).getHandle().connection.send((Packet<?>) packet);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,208 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.nbt;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.nbt.NBTCompound;
|
||||||
|
import com.songoda.core.nms.nbt.NBTObject;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.NbtIo;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class NBTCompoundImpl implements NBTCompound {
|
||||||
|
protected CompoundTag compound;
|
||||||
|
|
||||||
|
protected NBTCompoundImpl(CompoundTag compound) {
|
||||||
|
this.compound = compound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NBTCompoundImpl() {
|
||||||
|
this.compound = new CompoundTag();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, String s) {
|
||||||
|
compound.putString(tag, s);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, boolean b) {
|
||||||
|
compound.putBoolean(tag, b);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, int i) {
|
||||||
|
compound.putInt(tag, i);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, double i) {
|
||||||
|
compound.putDouble(tag, i);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, long l) {
|
||||||
|
compound.putLong(tag, l);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, short s) {
|
||||||
|
compound.putShort(tag, s);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, byte b) {
|
||||||
|
compound.putByte(tag, b);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, int[] i) {
|
||||||
|
compound.putIntArray(tag, i);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, byte[] b) {
|
||||||
|
compound.putByteArray(tag, b);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound set(String tag, UUID u) {
|
||||||
|
compound.putUUID(tag, u);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound remove(String tag) {
|
||||||
|
compound.remove(tag);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(String tag) {
|
||||||
|
return compound.contains(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTObject getNBTObject(String tag) {
|
||||||
|
return new NBTObjectImpl(compound, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getString(String tag) {
|
||||||
|
return getNBTObject(tag).asString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getBoolean(String tag) {
|
||||||
|
return getNBTObject(tag).asBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInt(String tag) {
|
||||||
|
return getNBTObject(tag).asInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getDouble(String tag) {
|
||||||
|
return getNBTObject(tag).asDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getLong(String tag) {
|
||||||
|
return getNBTObject(tag).asLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short getShort(String tag) {
|
||||||
|
return getNBTObject(tag).asShort();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte getByte(String tag) {
|
||||||
|
return getNBTObject(tag).asByte();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] getIntArray(String tag) {
|
||||||
|
return getNBTObject(tag).asIntArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getByteArray(String tag) {
|
||||||
|
return getNBTObject(tag).asByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound getCompound(String tag) {
|
||||||
|
if (has(tag)) {
|
||||||
|
return getNBTObject(tag).asCompound();
|
||||||
|
}
|
||||||
|
|
||||||
|
CompoundTag newCompound = new CompoundTag();
|
||||||
|
compound.put(tag, newCompound);
|
||||||
|
return new NBTCompoundImpl(newCompound);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getKeys() {
|
||||||
|
return compound.getAllKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getKeys(String tag) {
|
||||||
|
return compound.getCompound(tag).getAllKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] serialize(String... exclusions) {
|
||||||
|
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
ObjectOutputStream dataOutput = new ObjectOutputStream(outputStream)) {
|
||||||
|
addExtras();
|
||||||
|
CompoundTag compound = this.compound.copy();
|
||||||
|
|
||||||
|
for (String exclusion : exclusions) {
|
||||||
|
compound.remove(exclusion);
|
||||||
|
}
|
||||||
|
|
||||||
|
NbtIo.writeCompressed(compound, dataOutput);
|
||||||
|
|
||||||
|
return outputStream.toByteArray();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deSerialize(byte[] serialized) {
|
||||||
|
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(serialized);
|
||||||
|
ObjectInputStream dataInput = new ObjectInputStream(inputStream)) {
|
||||||
|
compound = NbtIo.readCompressed(dataInput);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addExtras() {
|
||||||
|
// None
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return compound.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.nbt;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.nbt.NBTCore;
|
||||||
|
import com.songoda.core.nms.nbt.NBTEntity;
|
||||||
|
import com.songoda.core.nms.nbt.NBTItem;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public NBTItem of(ItemStack item) {
|
||||||
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
@Override
|
||||||
|
public NBTItem newItem() {
|
||||||
|
return new NBTItemImpl(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTEntity of(Entity entity) {
|
||||||
|
net.minecraft.world.entity.Entity nmsEntity = ((CraftEntity) entity).getHandle();
|
||||||
|
CompoundTag nbt = new CompoundTag();
|
||||||
|
nmsEntity.saveWithoutId(nbt);
|
||||||
|
|
||||||
|
return new NBTEntityImpl(nbt, nmsEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTEntity newEntity() {
|
||||||
|
return new NBTEntityImpl(new CompoundTag(), null);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.nbt;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.nbt.NBTEntity;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.EntityType;
|
||||||
|
import net.minecraft.world.entity.MobSpawnType;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class NBTEntityImpl extends NBTCompoundImpl implements NBTEntity {
|
||||||
|
private Entity nmsEntity;
|
||||||
|
|
||||||
|
public NBTEntityImpl(CompoundTag entityNBT, Entity nmsEntity) {
|
||||||
|
super(entityNBT);
|
||||||
|
|
||||||
|
this.nmsEntity = nmsEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.bukkit.entity.Entity spawn(Location location) {
|
||||||
|
String entityType = getNBTObject("entity_type").asString();
|
||||||
|
|
||||||
|
Optional<EntityType<?>> optionalEntity = EntityType.byString(entityType);
|
||||||
|
if (optionalEntity.isPresent()) {
|
||||||
|
assert location.getWorld() != null;
|
||||||
|
|
||||||
|
Entity spawned = optionalEntity.get().spawn(
|
||||||
|
((CraftWorld) location.getWorld()).getHandle(),
|
||||||
|
compound,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()),
|
||||||
|
MobSpawnType.COMMAND,
|
||||||
|
true,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
|
if (spawned != null) {
|
||||||
|
spawned.load(compound);
|
||||||
|
org.bukkit.entity.Entity entity = spawned.getBukkitEntity();
|
||||||
|
entity.teleport(location);
|
||||||
|
nmsEntity = spawned;
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public org.bukkit.entity.Entity reSpawn(Location location) {
|
||||||
|
nmsEntity.discard();
|
||||||
|
return spawn(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addExtras() {
|
||||||
|
compound.putString("entity_type", Registry.ENTITY_TYPE.getKey(nmsEntity.getType()).toString());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.nbt;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.nbt.NBTItem;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
|
||||||
|
|
||||||
|
public class NBTItemImpl extends NBTCompoundImpl implements NBTItem {
|
||||||
|
private final ItemStack nmsItem;
|
||||||
|
|
||||||
|
public NBTItemImpl(ItemStack nmsItem) {
|
||||||
|
super(nmsItem != null && nmsItem.hasTag() ? nmsItem.getTag() : new CompoundTag());
|
||||||
|
|
||||||
|
this.nmsItem = nmsItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public org.bukkit.inventory.ItemStack finish() {
|
||||||
|
if (nmsItem == null) {
|
||||||
|
return CraftItemStack.asBukkitCopy(ItemStack.of(compound));
|
||||||
|
}
|
||||||
|
|
||||||
|
return CraftItemStack.asBukkitCopy(nmsItem);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.nbt;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.nbt.NBTCompound;
|
||||||
|
import com.songoda.core.nms.nbt.NBTObject;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class NBTObjectImpl implements NBTObject {
|
||||||
|
private final CompoundTag compound;
|
||||||
|
private final String tag;
|
||||||
|
|
||||||
|
public NBTObjectImpl(CompoundTag compound, String tag) {
|
||||||
|
this.compound = compound;
|
||||||
|
this.tag = tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String asString() {
|
||||||
|
return compound.getString(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean asBoolean() {
|
||||||
|
return compound.getBoolean(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int asInt() {
|
||||||
|
return compound.getInt(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double asDouble() {
|
||||||
|
return compound.getDouble(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long asLong() {
|
||||||
|
return compound.getLong(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short asShort() {
|
||||||
|
return compound.getShort(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte asByte() {
|
||||||
|
return compound.getByte(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int[] asIntArray() {
|
||||||
|
return compound.getIntArray(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] asByteArray() {
|
||||||
|
return compound.getByteArray(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NBTCompound asCompound() {
|
||||||
|
return new NBTCompoundImpl(compound.getCompound(tag));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getKeys() {
|
||||||
|
return compound.getAllKeys();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.world;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.world.SItemStack;
|
||||||
|
import net.minecraft.core.particles.ItemParticleOption;
|
||||||
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class SItemStackImpl implements SItemStack {
|
||||||
|
private final ItemStack item;
|
||||||
|
|
||||||
|
public SItemStackImpl(ItemStack item) {
|
||||||
|
this.item = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void breakItem(Player player, int amount) {
|
||||||
|
ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle();
|
||||||
|
|
||||||
|
for (int i = 0; i < amount; ++i) {
|
||||||
|
Vec3 vec3d = new Vec3(((double) random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D);
|
||||||
|
vec3d = vec3d.xRot(-entityPlayer.getXRot() * 0.017453292F);
|
||||||
|
vec3d = vec3d.yRot(-entityPlayer.getYRot() * 0.017453292F);
|
||||||
|
|
||||||
|
double d0 = (double) (-random.nextFloat()) * 0.6D - 0.3D;
|
||||||
|
|
||||||
|
Vec3 vec3d1 = new Vec3(((double) random.nextFloat() - 0.5D) * 0.3D, d0, 0.6D);
|
||||||
|
vec3d1 = vec3d1.xRot(-entityPlayer.getXRot() * 0.017453292F);
|
||||||
|
vec3d1 = vec3d1.yRot(-entityPlayer.getYRot() * 0.017453292F);
|
||||||
|
vec3d1 = vec3d1.add(entityPlayer.getX(), entityPlayer.getEyeY(), entityPlayer.getZ());
|
||||||
|
|
||||||
|
entityPlayer.level.addParticle(new ItemParticleOption(ParticleTypes.ITEM, CraftItemStack.asNMSCopy(item)), vec3d1.x, vec3d1.y, vec3d1.z, vec3d.x, vec3d.y + 0.05D, vec3d.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,132 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.world;
|
||||||
|
|
||||||
|
import com.songoda.core.compatibility.CompatibleMaterial;
|
||||||
|
import com.songoda.core.compatibility.CompatibleParticleHandler;
|
||||||
|
import com.songoda.core.nms.world.SSpawner;
|
||||||
|
import com.songoda.core.nms.world.SpawnedEntity;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.DifficultyInstance;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.Mob;
|
||||||
|
import net.minecraft.world.entity.MobSpawnType;
|
||||||
|
import net.minecraft.world.level.SpawnData;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class SSpawnerImpl implements SSpawner {
|
||||||
|
private final Location spawnerLocation;
|
||||||
|
|
||||||
|
public SSpawnerImpl(Location location) {
|
||||||
|
this.spawnerLocation = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LivingEntity spawnEntity(EntityType type, Location spawnerLocation) {
|
||||||
|
return spawnEntity(type, "EXPLOSION_NORMAL", null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LivingEntity spawnEntity(EntityType type, String particleType, SpawnedEntity spawned, Set<CompatibleMaterial> canSpawnOn) {
|
||||||
|
SpawnData data = new SpawnData();
|
||||||
|
CompoundTag compound = data.getEntityToSpawn();
|
||||||
|
|
||||||
|
String name = type.name().toLowerCase().replace("snowman", "snow_golem")
|
||||||
|
.replace("mushroom_cow", "mooshroom");
|
||||||
|
compound.putString("id", "minecraft:" + name);
|
||||||
|
|
||||||
|
short spawnRange = 4;
|
||||||
|
for (int i = 0; i < 50; i++) {
|
||||||
|
assert spawnerLocation.getWorld() != null;
|
||||||
|
ServerLevel world = ((CraftWorld) spawnerLocation.getWorld()).getHandle();
|
||||||
|
|
||||||
|
Random random = world.getRandom();
|
||||||
|
double x = spawnerLocation.getX() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D;
|
||||||
|
double y = spawnerLocation.getY() + random.nextInt(3) - 1;
|
||||||
|
double z = spawnerLocation.getZ() + (random.nextDouble() - random.nextDouble()) * (double) spawnRange + 0.5D;
|
||||||
|
|
||||||
|
Optional<Entity> optionalEntity = net.minecraft.world.entity.EntityType.create(compound, world);
|
||||||
|
if (optionalEntity.isEmpty()) continue;
|
||||||
|
|
||||||
|
Entity entity = optionalEntity.get();
|
||||||
|
entity.setPos(x, y, z);
|
||||||
|
|
||||||
|
BlockPos position = entity.blockPosition();
|
||||||
|
DifficultyInstance damageScaler = world.getCurrentDifficultyAt(position);
|
||||||
|
|
||||||
|
if (!(entity instanceof Mob entityInsentient)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Location spot = new Location(spawnerLocation.getWorld(), x, y, z);
|
||||||
|
|
||||||
|
if (!canSpawn(world, entityInsentient, spot, canSpawnOn)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
entityInsentient.finalizeSpawn(world, damageScaler, MobSpawnType.SPAWNER, null, null);
|
||||||
|
|
||||||
|
LivingEntity craftEntity = (LivingEntity) entity.getBukkitEntity();
|
||||||
|
|
||||||
|
if (spawned != null && !spawned.onSpawn(craftEntity)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (particleType != null) {
|
||||||
|
float xx = (float) (0 + (Math.random() * 1));
|
||||||
|
float yy = (float) (0 + (Math.random() * 2));
|
||||||
|
float zz = (float) (0 + (Math.random() * 1));
|
||||||
|
|
||||||
|
CompatibleParticleHandler.spawnParticles(CompatibleParticleHandler.ParticleType.getParticle(particleType), spot, 5, xx, yy, zz, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
world.addFreshEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER);
|
||||||
|
|
||||||
|
spot.setYaw(random.nextFloat() * 360.0F);
|
||||||
|
craftEntity.teleport(spot);
|
||||||
|
|
||||||
|
return craftEntity;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canSpawn(ServerLevel world, Mob entityInsentient, Location location, Set<CompatibleMaterial> canSpawnOn) {
|
||||||
|
if (!world.noCollision(entityInsentient, entityInsentient.getBoundingBox())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompatibleMaterial spawnedIn = CompatibleMaterial.getMaterial(location.getBlock());
|
||||||
|
CompatibleMaterial spawnedOn = CompatibleMaterial.getMaterial(location.getBlock().getRelative(BlockFace.DOWN));
|
||||||
|
|
||||||
|
if (spawnedIn == null || spawnedOn == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!spawnedIn.isAir() &&
|
||||||
|
spawnedIn != CompatibleMaterial.WATER &&
|
||||||
|
!spawnedIn.name().contains("PRESSURE") &&
|
||||||
|
!spawnedIn.name().contains("SLAB")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (CompatibleMaterial material : canSpawnOn) {
|
||||||
|
if (material == null) continue;
|
||||||
|
|
||||||
|
if (spawnedOn.equals(material) || material.isAir()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.world;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.world.SWorld;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.level.entity.LevelEntityGetter;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
|
||||||
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SWorldImpl implements SWorld {
|
||||||
|
private final World world;
|
||||||
|
|
||||||
|
public SWorldImpl(World world) {
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<LivingEntity> getLivingEntities() {
|
||||||
|
List<LivingEntity> result = new ArrayList<>();
|
||||||
|
|
||||||
|
ServerLevel worldServer = ((CraftWorld) world).getHandle();
|
||||||
|
LevelEntityGetter<Entity> entities = worldServer.entityManager.getEntityGetter();
|
||||||
|
|
||||||
|
entities.getAll().forEach((mcEnt) -> {
|
||||||
|
org.bukkit.entity.Entity bukkitEntity = mcEnt.getBukkitEntity();
|
||||||
|
|
||||||
|
if (bukkitEntity instanceof LivingEntity && bukkitEntity.isValid()) {
|
||||||
|
result.add((LivingEntity) bukkitEntity);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.world;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.ReflectionUtils;
|
||||||
|
import com.songoda.core.nms.v1_18_R2.world.spawner.BBaseSpawnerImpl;
|
||||||
|
import com.songoda.core.nms.world.BBaseSpawner;
|
||||||
|
import com.songoda.core.nms.world.SItemStack;
|
||||||
|
import com.songoda.core.nms.world.SSpawner;
|
||||||
|
import com.songoda.core.nms.world.SWorld;
|
||||||
|
import com.songoda.core.nms.world.WorldCore;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.util.profiling.ProfilerFiller;
|
||||||
|
import net.minecraft.world.level.BaseSpawner;
|
||||||
|
import net.minecraft.world.level.ChunkPos;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
|
import net.minecraft.world.level.chunk.LevelChunkSection;
|
||||||
|
import net.minecraft.world.level.material.FluidState;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.CreatureSpawner;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.CraftChunk;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
public class WorldCoreImpl implements WorldCore {
|
||||||
|
@Override
|
||||||
|
public SSpawner getSpawner(CreatureSpawner spawner) {
|
||||||
|
return new SSpawnerImpl(spawner.getLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SSpawner getSpawner(Location location) {
|
||||||
|
return new SSpawnerImpl(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SItemStack getItemStack(ItemStack item) {
|
||||||
|
return new SItemStackImpl(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SWorld getWorld(World world) {
|
||||||
|
return new SWorldImpl(world);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BBaseSpawner getBaseSpawner(CreatureSpawner spawner) throws NoSuchFieldException, IllegalAccessException {
|
||||||
|
Object cTileEntity = ReflectionUtils.getFieldValue(spawner, "tileEntity");
|
||||||
|
|
||||||
|
return new BBaseSpawnerImpl(spawner, (BaseSpawner) ReflectionUtils.getFieldValue(cTileEntity, "a"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method is based on {@link ServerLevel#tickChunk(LevelChunk, int)}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void randomTickChunk(org.bukkit.Chunk bukkitChunk, int tickAmount) {
|
||||||
|
LevelChunk chunk = ((CraftChunk) bukkitChunk).getHandle();
|
||||||
|
ServerLevel world = chunk.q;
|
||||||
|
|
||||||
|
ChunkPos chunkCoordIntPair = chunk.getPos();
|
||||||
|
int j = chunkCoordIntPair.getMinBlockX();
|
||||||
|
int k = chunkCoordIntPair.getMinBlockZ();
|
||||||
|
|
||||||
|
ProfilerFiller gameProfilerFiller = world.getProfiler();
|
||||||
|
gameProfilerFiller.popPush("tickBlocks");
|
||||||
|
if (tickAmount > 0) {
|
||||||
|
LevelChunkSection[] aChunkSection = chunk.getSections();
|
||||||
|
|
||||||
|
for (LevelChunkSection chunkSection : aChunkSection) {
|
||||||
|
if (chunkSection.isRandomlyTicking()) {
|
||||||
|
int j1 = chunkSection.bottomBlockY();
|
||||||
|
|
||||||
|
for (int k1 = 0; k1 < tickAmount; ++k1) {
|
||||||
|
BlockPos blockposition2 = world.getBlockRandomPos(j, j1, k, 15);
|
||||||
|
gameProfilerFiller.push("randomTick");
|
||||||
|
BlockState iBlockData1 = chunkSection.getBlockState(blockposition2.getX() - j, blockposition2.getY() - j1, blockposition2.getZ() - k);
|
||||||
|
if (iBlockData1.isRandomlyTicking()) {
|
||||||
|
iBlockData1.randomTick(world, blockposition2, world.random);
|
||||||
|
}
|
||||||
|
|
||||||
|
FluidState fluid = iBlockData1.getFluidState();
|
||||||
|
if (fluid.isRandomlyTicking()) {
|
||||||
|
fluid.randomTick(world, blockposition2, world.random);
|
||||||
|
}
|
||||||
|
|
||||||
|
gameProfilerFiller.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gameProfilerFiller.pop();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,194 @@
|
|||||||
|
package com.songoda.core.nms.v1_18_R2.world.spawner;
|
||||||
|
|
||||||
|
import com.songoda.core.nms.world.BBaseSpawner;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.ListTag;
|
||||||
|
import net.minecraft.server.level.ServerLevel;
|
||||||
|
import net.minecraft.world.Difficulty;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.EntityType;
|
||||||
|
import net.minecraft.world.entity.Mob;
|
||||||
|
import net.minecraft.world.entity.MobSpawnType;
|
||||||
|
import net.minecraft.world.entity.SpawnPlacements;
|
||||||
|
import net.minecraft.world.level.BaseSpawner;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.LightLayer;
|
||||||
|
import net.minecraft.world.level.SpawnData;
|
||||||
|
import net.minecraft.world.phys.AABB;
|
||||||
|
import org.bukkit.block.CreatureSpawner;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.block.CraftCreatureSpawner;
|
||||||
|
import org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory;
|
||||||
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class BBaseSpawnerImpl implements BBaseSpawner {
|
||||||
|
private final CreatureSpawner bukkitSpawner;
|
||||||
|
private final BaseSpawner spawner;
|
||||||
|
|
||||||
|
private static final Random spawnerRandom = new Random(); // Field random in BaseSpawner is private - We use one random for *all* our spawners (should be fine, right?)
|
||||||
|
|
||||||
|
public BBaseSpawnerImpl(CreatureSpawner bukkitSpawner, BaseSpawner spawner) {
|
||||||
|
this.bukkitSpawner = bukkitSpawner;
|
||||||
|
this.spawner = spawner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is based on {@link BaseSpawner#isNearPlayer(Level, BlockPos)}.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("JavadocReference")
|
||||||
|
@Override
|
||||||
|
public boolean isNearPlayer() {
|
||||||
|
BlockPos bPos = getBlockPosition();
|
||||||
|
|
||||||
|
return getWorld().hasNearbyAlivePlayer(
|
||||||
|
(double) bPos.getX() + 0.5D,
|
||||||
|
(double) bPos.getY() + 0.5D,
|
||||||
|
(double) bPos.getZ() + 0.5D,
|
||||||
|
this.spawner.requiredPlayerRange
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is based on {@link BaseSpawner#serverTick(ServerLevel, BlockPos)}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
ServerLevel world = getWorld();
|
||||||
|
BlockPos bPos = getBlockPosition();
|
||||||
|
|
||||||
|
if (this.spawner.spawnDelay == -1) {
|
||||||
|
delay(world, bPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.spawner.spawnDelay > 0) {
|
||||||
|
--this.spawner.spawnDelay;
|
||||||
|
} else {
|
||||||
|
boolean flag = false;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (i >= this.spawner.spawnCount) {
|
||||||
|
if (flag) {
|
||||||
|
delay(world, bPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CompoundTag nbtTagCompound = this.spawner.nextSpawnData.getEntityToSpawn();
|
||||||
|
Optional<EntityType<?>> optional = EntityType.by(nbtTagCompound);
|
||||||
|
if (optional.isEmpty()) {
|
||||||
|
delay(world, bPos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ListTag nbtTagList = nbtTagCompound.getList("Pos", 6);
|
||||||
|
int j = nbtTagList.size();
|
||||||
|
double d0 = j >= 1 ? nbtTagList.getDouble(0) : (double) bPos.getX() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawner.spawnRange + 0.5D;
|
||||||
|
double d1 = j >= 2 ? nbtTagList.getDouble(1) : (double) (bPos.getY() + world.random.nextInt(3) - 1);
|
||||||
|
double d2 = j >= 3 ? nbtTagList.getDouble(2) : (double) bPos.getZ() + (world.random.nextDouble() - world.random.nextDouble()) * (double) this.spawner.spawnRange + 0.5D;
|
||||||
|
if (world.noCollision(optional.get().getAABB(d0, d1, d2))) {
|
||||||
|
label128:
|
||||||
|
{
|
||||||
|
BlockPos blockPosition1 = new BlockPos(d0, d1, d2);
|
||||||
|
if (this.spawner.nextSpawnData.getCustomSpawnRules().isPresent()) {
|
||||||
|
if (!optional.get().getCategory().isFriendly() && world.getDifficulty() == Difficulty.PEACEFUL) {
|
||||||
|
break label128;
|
||||||
|
}
|
||||||
|
|
||||||
|
SpawnData.CustomSpawnRules mobSpawnerDataA = this.spawner.nextSpawnData.getCustomSpawnRules().get();
|
||||||
|
if (!mobSpawnerDataA.blockLightLimit().isValueInRange(world.getBrightness(LightLayer.BLOCK, blockPosition1)) ||
|
||||||
|
!mobSpawnerDataA.skyLightLimit().isValueInRange(world.getBrightness(LightLayer.SKY, blockPosition1))) {
|
||||||
|
break label128;
|
||||||
|
}
|
||||||
|
} else if (!SpawnPlacements.checkSpawnRules(optional.get(), world, MobSpawnType.SPAWNER, blockPosition1, world.getRandom())) {
|
||||||
|
break label128;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entity entity = EntityType.loadEntityRecursive(nbtTagCompound, world, (entity1) -> {
|
||||||
|
entity1.moveTo(d0, d1, d2, entity1.getYRot(), entity1.getXRot());
|
||||||
|
return entity1;
|
||||||
|
});
|
||||||
|
if (entity == null) {
|
||||||
|
delay(world, bPos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int k = world.getEntitiesOfClass(entity.getClass(), (new AABB(bPos.getX(), bPos.getY(), bPos.getZ(), bPos.getX() + 1, bPos.getY() + 1, bPos.getZ() + 1)).inflate(this.spawner.spawnRange)).size();
|
||||||
|
if (k >= this.spawner.maxNearbyEntities) {
|
||||||
|
delay(world, bPos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), world.random.nextFloat() * 360.0F, 0.0F);
|
||||||
|
if (entity instanceof Mob entityInsentient) {
|
||||||
|
if (this.spawner.nextSpawnData.getCustomSpawnRules().isEmpty() && !entityInsentient.checkSpawnRules(world, MobSpawnType.SPAWNER) || !entityInsentient.checkSpawnObstruction(world)) {
|
||||||
|
break label128;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.spawner.nextSpawnData.getEntityToSpawn().size() == 1 && this.spawner.nextSpawnData.getEntityToSpawn().contains("id", 8)) {
|
||||||
|
((Mob) entity).finalizeSpawn(world, world.getCurrentDifficultyAt(entity.blockPosition()), MobSpawnType.SPAWNER, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entityInsentient.level.spigotConfig.nerfSpawnerMobs) {
|
||||||
|
entityInsentient.aware = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CraftEventFactory.callSpawnerSpawnEvent(entity, bPos).isCancelled()) {
|
||||||
|
Entity vehicle = entity.getVehicle();
|
||||||
|
if (vehicle != null) {
|
||||||
|
vehicle.discard();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Entity passenger : entity.getIndirectPassengers()) {
|
||||||
|
passenger.discard();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!world.tryAddFreshEntityWithPassengers(entity, CreatureSpawnEvent.SpawnReason.SPAWNER)) {
|
||||||
|
delay(world, bPos);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
world.levelEvent(2004, bPos, 0);
|
||||||
|
if (entity instanceof Mob) {
|
||||||
|
((Mob) entity).spawnAnim();
|
||||||
|
}
|
||||||
|
|
||||||
|
flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is based on {@link BaseSpawner#delay(Level, BlockPos)}.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("JavadocReference")
|
||||||
|
private void delay(ServerLevel world, BlockPos bPos) {
|
||||||
|
if (this.spawner.maxSpawnDelay <= this.spawner.minSpawnDelay) {
|
||||||
|
this.spawner.spawnDelay = this.spawner.minSpawnDelay;
|
||||||
|
} else {
|
||||||
|
this.spawner.spawnDelay = this.spawner.minSpawnDelay + spawnerRandom.nextInt(this.spawner.maxSpawnDelay - this.spawner.minSpawnDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.spawner.spawnPotentials.getRandom(spawnerRandom).ifPresent((weightedEntryB) -> this.spawner.setNextSpawnData(world, bPos, weightedEntryB.getData()));
|
||||||
|
this.spawner.broadcastEvent(world, bPos, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServerLevel getWorld() {
|
||||||
|
return ((CraftWorld) this.bukkitSpawner.getWorld()).getHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockPos getBlockPosition() {
|
||||||
|
return ((CraftCreatureSpawner) this.bukkitSpawner).getPosition();
|
||||||
|
}
|
||||||
|
}
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
@ -10,11 +10,13 @@ import org.bukkit.entity.Entity;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
public class NBTCoreImpl implements NBTCore {
|
public class NBTCoreImpl implements NBTCore {
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem of(ItemStack item) {
|
public NBTItem of(ItemStack item) {
|
||||||
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
return new NBTItemImpl(CraftItemStack.asNMSCopy(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@Override
|
@Override
|
||||||
public NBTItem newItem() {
|
public NBTItem newItem() {
|
||||||
return new NBTItemImpl(null);
|
return new NBTItemImpl(null);
|
||||||
|
3
pom.xml
3
pom.xml
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>com.songoda</groupId>
|
<groupId>com.songoda</groupId>
|
||||||
<artifactId>SongodaCore-Modules</artifactId>
|
<artifactId>SongodaCore-Modules</artifactId>
|
||||||
<version>2.6.11</version>
|
<version>2.6.12</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
<!-- Run 'mvn versions:set -DgenerateBackupPoms=false -DnewVersion=X.Y.Z' to update version recursively -->
|
<!-- Run 'mvn versions:set -DgenerateBackupPoms=false -DnewVersion=X.Y.Z' to update version recursively -->
|
||||||
@ -45,6 +45,7 @@
|
|||||||
<module>NMS/NMS-v1_16_R3</module>
|
<module>NMS/NMS-v1_16_R3</module>
|
||||||
<module>NMS/NMS-v1_17_R1</module>
|
<module>NMS/NMS-v1_17_R1</module>
|
||||||
<module>NMS/NMS-v1_18_R1</module>
|
<module>NMS/NMS-v1_18_R1</module>
|
||||||
|
<module>NMS/NMS-v1_18_R2</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<issueManagement>
|
<issueManagement>
|
||||||
|
Loading…
Reference in New Issue
Block a user