diff --git a/.gitignore b/.gitignore
index 08ff0d1c..2c4d8e8e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,5 @@ release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
+nbactions.xml
+nb-configuration.xml
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fbfedcc7..8e444d8c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,7 @@ stages:
variables:
name: "SongodaCore"
path: "/builds/$CI_PROJECT_PATH"
- version: "2.1.4"
+ version: "2.1.6"
build:
stage: build
@@ -15,7 +15,7 @@ build:
- find $path/ -type f -name "*SongodaCore.java" -print0 | xargs -0 sed -i -e s/maven-version-number/$version/g
- mvn clean package
- find $path/ -depth -path '*original*' -delete
- - mv $path/target/*.jar $path/
+ - mv $path/Core/target/*.jar $path/
artifacts:
name: $name-$version
paths:
diff --git a/Core/pom.xml b/Core/pom.xml
new file mode 100644
index 00000000..5a914de6
--- /dev/null
+++ b/Core/pom.xml
@@ -0,0 +1,300 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../
+
+
+ com.songoda
+ SongodaCore
+
+ 4.0.0
+ jar
+
+
+ src/main/java
+ clean install
+ SongodaCore-${project.version}
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.0
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.1.0
+
+
+ shaded
+ package
+
+ shade
+
+
+ false
+ true
+
+
+ com.songoda:*
+
+
+
+
+ *:*
+
+ com/
+ META-INF/MANIFEST.MF
+ META-INF/maven/com.songoda/SongodaCore/
+
+
+
+
+
+
+
+
+
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.14.4
+ provided
+
+
+
+
+
+ ${project.groupId}
+ SongodaCore-NMS-API
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_8_R1
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_8_R2
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_8_R3
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_9_R1
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_9_R2
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_10_R1
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_11_R1
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_12_R1
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_13_R1
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_13_R2
+ ${project.version}
+ jar
+ compile
+
+
+ ${project.groupId}
+ SongodaCore-NMS-v1_14_R1
+ ${project.version}
+ jar
+ compile
+
+
+
+ com.gmail.filoghost.holographicdisplays
+ holographicdisplays-api
+ 2.3.2
+ provided
+
+
+ com.sainttx.holograms
+ Holograms
+ 2.9.1
+ provided
+
+
+ com.zrips
+ CMI
+ 8.4.0.2_1
+ provided
+
+
+ net.tnemc
+ Reserve
+ 0.1.3.0
+ provided
+
+
+ org.black_ixx
+ PlayerPoints
+ 2.1.4
+ provided
+
+
+ net.milkbowl
+ VaultAPI
+ 1.7.2
+ provided
+
+
+ us.myles.viaversion-bukkit
+ ViaVersion
+ 2.1.3
+ provided
+
+
+ protocolsupport
+ ProtocolSupport
+ 4.29
+ provided
+
+
+ com.googlecode.json-simple
+ json-simple
+ 1.1
+
+
+ org.jetbrains
+ annotations
+ 13.0
+
+
+ org.yaml
+ snakeyaml
+ 1.25
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.25
+
+
+ org.slf4j
+ slf4j-nop
+ 1.7.25
+
+
+ com.zaxxer
+ HikariCP
+ 3.2.0
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.23.1
+
+
+ com.sk89q.worldguard
+ worldguard-bukkit
+ 7.0.0
+ provided
+
+
+ com.sk89q.worldedit
+ worldedit-bukkit
+ 7.0.0
+ provided
+
+
+ com.songoda
+ UltimateStacker
+ 1.9.6
+ provided
+
+
+ com.bgsoftware
+ WildStacker
+ 2-9-0
+ provided
+
+
+ uk.antiperson
+ stackmob
+ 4-0-2
+ provided
+
+
+
diff --git a/src/main/java/com/songoda/core/SongodaCore.java b/Core/src/main/java/com/songoda/core/SongodaCore.java
similarity index 100%
rename from src/main/java/com/songoda/core/SongodaCore.java
rename to Core/src/main/java/com/songoda/core/SongodaCore.java
diff --git a/src/main/java/com/songoda/core/SongodaPlugin.java b/Core/src/main/java/com/songoda/core/SongodaPlugin.java
similarity index 90%
rename from src/main/java/com/songoda/core/SongodaPlugin.java
rename to Core/src/main/java/com/songoda/core/SongodaPlugin.java
index b5e35357..b4368eed 100644
--- a/src/main/java/com/songoda/core/SongodaPlugin.java
+++ b/Core/src/main/java/com/songoda/core/SongodaPlugin.java
@@ -76,6 +76,7 @@ public abstract class SongodaPlugin extends JavaPlugin {
return;
}
+ console.sendMessage(""); // blank line to speparate chatter
console.sendMessage(ChatColor.GREEN + "=============================");
console.sendMessage(String.format("%s%s %s by %sSongoda <3!", ChatColor.GRAY.toString(),
getDescription().getName(), getDescription().getVersion(), ChatColor.DARK_PURPLE.toString()));
@@ -88,6 +89,7 @@ public abstract class SongodaPlugin extends JavaPlugin {
onPluginEnable();
if(emergencyStop) {
console.sendMessage(ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ console.sendMessage("");
return;
}
// Start Metrics
@@ -96,10 +98,12 @@ public abstract class SongodaPlugin extends JavaPlugin {
getLogger().log(Level.SEVERE, "Unexpected error while loading " + getDescription().getName() + ": Disabling plugin!", t);
emergencyStop();
console.sendMessage(ChatColor.RED + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
+ console.sendMessage("");
return;
}
console.sendMessage(ChatColor.GREEN + "=============================");
+ console.sendMessage(""); // blank line to speparate chatter
}
protected void emergencyStop() {
@@ -112,6 +116,7 @@ public abstract class SongodaPlugin extends JavaPlugin {
if (emergencyStop) {
return;
}
+ console.sendMessage(""); // blank line to speparate chatter
console.sendMessage(ChatColor.GREEN + "=============================");
console.sendMessage(String.format("%s%s %s by %sSongoda <3!", ChatColor.GRAY.toString(),
getDescription().getName(), getDescription().getVersion(), ChatColor.DARK_PURPLE.toString()));
@@ -119,6 +124,7 @@ public abstract class SongodaPlugin extends JavaPlugin {
ChatColor.RED.toString(), "Disabling", ChatColor.GRAY.toString()));
onPluginDisable();
console.sendMessage(ChatColor.GREEN + "=============================");
+ console.sendMessage(""); // blank line to speparate chatter
}
public ConsoleCommandSender getConsole() {
diff --git a/src/main/java/com/songoda/core/commands/AbstractCommand.java b/Core/src/main/java/com/songoda/core/commands/AbstractCommand.java
similarity index 100%
rename from src/main/java/com/songoda/core/commands/AbstractCommand.java
rename to Core/src/main/java/com/songoda/core/commands/AbstractCommand.java
diff --git a/src/main/java/com/songoda/core/commands/CommandManager.java b/Core/src/main/java/com/songoda/core/commands/CommandManager.java
similarity index 100%
rename from src/main/java/com/songoda/core/commands/CommandManager.java
rename to Core/src/main/java/com/songoda/core/commands/CommandManager.java
diff --git a/src/main/java/com/songoda/core/commands/SimpleNestedCommand.java b/Core/src/main/java/com/songoda/core/commands/SimpleNestedCommand.java
similarity index 100%
rename from src/main/java/com/songoda/core/commands/SimpleNestedCommand.java
rename to Core/src/main/java/com/songoda/core/commands/SimpleNestedCommand.java
diff --git a/src/main/java/com/songoda/core/compatibility/ClientVersion.java b/Core/src/main/java/com/songoda/core/compatibility/ClientVersion.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/ClientVersion.java
rename to Core/src/main/java/com/songoda/core/compatibility/ClientVersion.java
diff --git a/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java b/Core/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java
rename to Core/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java
diff --git a/src/main/java/com/songoda/core/compatibility/CompatibleParticleHandler.java b/Core/src/main/java/com/songoda/core/compatibility/CompatibleParticleHandler.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/CompatibleParticleHandler.java
rename to Core/src/main/java/com/songoda/core/compatibility/CompatibleParticleHandler.java
diff --git a/src/main/java/com/songoda/core/compatibility/CompatibleSound.java b/Core/src/main/java/com/songoda/core/compatibility/CompatibleSound.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/CompatibleSound.java
rename to Core/src/main/java/com/songoda/core/compatibility/CompatibleSound.java
diff --git a/src/main/java/com/songoda/core/compatibility/LegacyMaterialAnalouge.java b/Core/src/main/java/com/songoda/core/compatibility/LegacyMaterialAnalouge.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/LegacyMaterialAnalouge.java
rename to Core/src/main/java/com/songoda/core/compatibility/LegacyMaterialAnalouge.java
diff --git a/src/main/java/com/songoda/core/compatibility/LegacyMaterialBlockType.java b/Core/src/main/java/com/songoda/core/compatibility/LegacyMaterialBlockType.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/LegacyMaterialBlockType.java
rename to Core/src/main/java/com/songoda/core/compatibility/LegacyMaterialBlockType.java
diff --git a/src/main/java/com/songoda/core/compatibility/LegacyParticleEffects.java b/Core/src/main/java/com/songoda/core/compatibility/LegacyParticleEffects.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/LegacyParticleEffects.java
rename to Core/src/main/java/com/songoda/core/compatibility/LegacyParticleEffects.java
diff --git a/src/main/java/com/songoda/core/compatibility/LegacyPotionEffects.java b/Core/src/main/java/com/songoda/core/compatibility/LegacyPotionEffects.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/LegacyPotionEffects.java
rename to Core/src/main/java/com/songoda/core/compatibility/LegacyPotionEffects.java
diff --git a/src/main/java/com/songoda/core/compatibility/ServerProject.java b/Core/src/main/java/com/songoda/core/compatibility/ServerProject.java
similarity index 100%
rename from src/main/java/com/songoda/core/compatibility/ServerProject.java
rename to Core/src/main/java/com/songoda/core/compatibility/ServerProject.java
diff --git a/src/main/java/com/songoda/core/compatibility/ServerVersion.java b/Core/src/main/java/com/songoda/core/compatibility/ServerVersion.java
similarity index 91%
rename from src/main/java/com/songoda/core/compatibility/ServerVersion.java
rename to Core/src/main/java/com/songoda/core/compatibility/ServerVersion.java
index a7326861..21d66d2a 100644
--- a/src/main/java/com/songoda/core/compatibility/ServerVersion.java
+++ b/Core/src/main/java/com/songoda/core/compatibility/ServerVersion.java
@@ -25,10 +25,18 @@ public enum ServerVersion {
return this.ordinal() < other.ordinal();
}
+ public boolean isAtOrBelow(ServerVersion other) {
+ return this.ordinal() <= other.ordinal();
+ }
+
public boolean isGreaterThan(ServerVersion other) {
return this.ordinal() > other.ordinal();
}
+ public boolean isAtLeast(ServerVersion other) {
+ return this.ordinal() >= other.ordinal();
+ }
+
public static String getServerVersionString() {
return serverPackageVersion;
}
diff --git a/src/main/java/com/songoda/core/configuration/Comment.java b/Core/src/main/java/com/songoda/core/configuration/Comment.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/Comment.java
rename to Core/src/main/java/com/songoda/core/configuration/Comment.java
diff --git a/src/main/java/com/songoda/core/configuration/Config.java b/Core/src/main/java/com/songoda/core/configuration/Config.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/Config.java
rename to Core/src/main/java/com/songoda/core/configuration/Config.java
diff --git a/src/main/java/com/songoda/core/configuration/ConfigFileConfigurationAdapter.java b/Core/src/main/java/com/songoda/core/configuration/ConfigFileConfigurationAdapter.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/ConfigFileConfigurationAdapter.java
rename to Core/src/main/java/com/songoda/core/configuration/ConfigFileConfigurationAdapter.java
diff --git a/src/main/java/com/songoda/core/configuration/ConfigFormattingRules.java b/Core/src/main/java/com/songoda/core/configuration/ConfigFormattingRules.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/ConfigFormattingRules.java
rename to Core/src/main/java/com/songoda/core/configuration/ConfigFormattingRules.java
diff --git a/src/main/java/com/songoda/core/configuration/ConfigOptionsAdapter.java b/Core/src/main/java/com/songoda/core/configuration/ConfigOptionsAdapter.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/ConfigOptionsAdapter.java
rename to Core/src/main/java/com/songoda/core/configuration/ConfigOptionsAdapter.java
diff --git a/src/main/java/com/songoda/core/configuration/ConfigSection.java b/Core/src/main/java/com/songoda/core/configuration/ConfigSection.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/ConfigSection.java
rename to Core/src/main/java/com/songoda/core/configuration/ConfigSection.java
diff --git a/src/main/java/com/songoda/core/configuration/ConfigSetting.java b/Core/src/main/java/com/songoda/core/configuration/ConfigSetting.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/ConfigSetting.java
rename to Core/src/main/java/com/songoda/core/configuration/ConfigSetting.java
diff --git a/src/main/java/com/songoda/core/configuration/DataStoreObject.java b/Core/src/main/java/com/songoda/core/configuration/DataStoreObject.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/DataStoreObject.java
rename to Core/src/main/java/com/songoda/core/configuration/DataStoreObject.java
diff --git a/src/main/java/com/songoda/core/configuration/SimpleDataStore.java b/Core/src/main/java/com/songoda/core/configuration/SimpleDataStore.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/SimpleDataStore.java
rename to Core/src/main/java/com/songoda/core/configuration/SimpleDataStore.java
diff --git a/src/main/java/com/songoda/core/configuration/editor/ConfigEditorGui.java b/Core/src/main/java/com/songoda/core/configuration/editor/ConfigEditorGui.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/editor/ConfigEditorGui.java
rename to Core/src/main/java/com/songoda/core/configuration/editor/ConfigEditorGui.java
diff --git a/src/main/java/com/songoda/core/configuration/editor/ConfigEditorListEditorGui.java b/Core/src/main/java/com/songoda/core/configuration/editor/ConfigEditorListEditorGui.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/editor/ConfigEditorListEditorGui.java
rename to Core/src/main/java/com/songoda/core/configuration/editor/ConfigEditorListEditorGui.java
diff --git a/src/main/java/com/songoda/core/configuration/editor/PluginConfigGui.java b/Core/src/main/java/com/songoda/core/configuration/editor/PluginConfigGui.java
similarity index 100%
rename from src/main/java/com/songoda/core/configuration/editor/PluginConfigGui.java
rename to Core/src/main/java/com/songoda/core/configuration/editor/PluginConfigGui.java
diff --git a/src/main/java/com/songoda/core/core/LocaleModule.java b/Core/src/main/java/com/songoda/core/core/LocaleModule.java
similarity index 100%
rename from src/main/java/com/songoda/core/core/LocaleModule.java
rename to Core/src/main/java/com/songoda/core/core/LocaleModule.java
diff --git a/src/main/java/com/songoda/core/core/PluginInfo.java b/Core/src/main/java/com/songoda/core/core/PluginInfo.java
similarity index 100%
rename from src/main/java/com/songoda/core/core/PluginInfo.java
rename to Core/src/main/java/com/songoda/core/core/PluginInfo.java
diff --git a/src/main/java/com/songoda/core/core/PluginInfoModule.java b/Core/src/main/java/com/songoda/core/core/PluginInfoModule.java
similarity index 100%
rename from src/main/java/com/songoda/core/core/PluginInfoModule.java
rename to Core/src/main/java/com/songoda/core/core/PluginInfoModule.java
diff --git a/src/main/java/com/songoda/core/core/SongodaCoreCommand.java b/Core/src/main/java/com/songoda/core/core/SongodaCoreCommand.java
similarity index 100%
rename from src/main/java/com/songoda/core/core/SongodaCoreCommand.java
rename to Core/src/main/java/com/songoda/core/core/SongodaCoreCommand.java
diff --git a/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java b/Core/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java
similarity index 100%
rename from src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java
rename to Core/src/main/java/com/songoda/core/core/SongodaCoreDiagCommand.java
diff --git a/src/main/java/com/songoda/core/core/SongodaCoreOverviewGUI.java b/Core/src/main/java/com/songoda/core/core/SongodaCoreOverviewGUI.java
similarity index 100%
rename from src/main/java/com/songoda/core/core/SongodaCoreOverviewGUI.java
rename to Core/src/main/java/com/songoda/core/core/SongodaCoreOverviewGUI.java
diff --git a/src/main/java/com/songoda/core/database/DataManagerAbstract.java b/Core/src/main/java/com/songoda/core/database/DataManagerAbstract.java
similarity index 100%
rename from src/main/java/com/songoda/core/database/DataManagerAbstract.java
rename to Core/src/main/java/com/songoda/core/database/DataManagerAbstract.java
diff --git a/src/main/java/com/songoda/core/database/DataMigration.java b/Core/src/main/java/com/songoda/core/database/DataMigration.java
similarity index 100%
rename from src/main/java/com/songoda/core/database/DataMigration.java
rename to Core/src/main/java/com/songoda/core/database/DataMigration.java
diff --git a/src/main/java/com/songoda/core/database/DataMigrationManager.java b/Core/src/main/java/com/songoda/core/database/DataMigrationManager.java
similarity index 100%
rename from src/main/java/com/songoda/core/database/DataMigrationManager.java
rename to Core/src/main/java/com/songoda/core/database/DataMigrationManager.java
diff --git a/src/main/java/com/songoda/core/database/DatabaseConnector.java b/Core/src/main/java/com/songoda/core/database/DatabaseConnector.java
similarity index 100%
rename from src/main/java/com/songoda/core/database/DatabaseConnector.java
rename to Core/src/main/java/com/songoda/core/database/DatabaseConnector.java
diff --git a/src/main/java/com/songoda/core/database/MySQLConnector.java b/Core/src/main/java/com/songoda/core/database/MySQLConnector.java
similarity index 100%
rename from src/main/java/com/songoda/core/database/MySQLConnector.java
rename to Core/src/main/java/com/songoda/core/database/MySQLConnector.java
diff --git a/src/main/java/com/songoda/core/database/SQLiteConnector.java b/Core/src/main/java/com/songoda/core/database/SQLiteConnector.java
similarity index 100%
rename from src/main/java/com/songoda/core/database/SQLiteConnector.java
rename to Core/src/main/java/com/songoda/core/database/SQLiteConnector.java
diff --git a/Core/src/main/java/com/songoda/core/gui/AnvilGui.java b/Core/src/main/java/com/songoda/core/gui/AnvilGui.java
new file mode 100644
index 00000000..0bc5c254
--- /dev/null
+++ b/Core/src/main/java/com/songoda/core/gui/AnvilGui.java
@@ -0,0 +1,100 @@
+package com.songoda.core.gui;
+
+import com.songoda.core.compatibility.CompatibleMaterial;
+import com.songoda.core.gui.methods.Clickable;
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import com.songoda.core.nms.NmsManager;
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Anvil GUI for text prompts
+ *
+ * @since 2019-09-15
+ * @author jascotty2
+ */
+public class AnvilGui extends Gui {
+
+ final Player player;
+ CustomAnvil anvil;
+
+ public AnvilGui(Player player) {
+ this.player = player;
+ }
+
+ public AnvilGui(Player player, Gui parent) {
+ super(parent);
+ this.player = player;
+ }
+
+ @NotNull
+ public AnvilGui setAction(@Nullable Clickable action) {
+ return (AnvilGui) setAction(2, action);
+ }
+
+ @NotNull
+ public AnvilGui setAction(@Nullable ClickType type, @Nullable Clickable action) {
+ return (AnvilGui) setAction(2, type, action);
+ }
+
+ protected void open() {
+ anvil.open();
+ }
+
+ public AnvilGui setInput(ItemStack item) {
+ return (AnvilGui) this.setItem(0, item);
+ }
+
+ public ItemStack getInput() {
+ return this.getItem(0);
+ }
+
+ public AnvilGui setOutput(ItemStack item) {
+ return (AnvilGui) this.setItem(2, item);
+ }
+
+ public ItemStack getOutput() {
+ return this.getItem(2);
+ }
+
+ public String getInputText() {
+ return anvil != null ? anvil.getRenameText() : null;
+ }
+
+ @NotNull
+ @Override
+ protected Inventory generateInventory(@NotNull GuiManager manager) {
+ this.guiManager = manager;
+
+ createInventory();
+ ItemStack item;
+ if ((item = cellItems.get(0)) != null) {
+ inventory.setItem(0, item);
+ } else if ((item = cellItems.get(1)) != null) {
+ inventory.setItem(1, item);
+ } else if (!acceptsItems) {
+ inventory.setItem(0, GuiUtils.createButtonItem(CompatibleMaterial.PAPER, " ", " "));
+ }
+ if ((item = cellItems.get(2)) != null) {
+ inventory.setItem(2, item);
+ }
+
+ return inventory;
+ }
+
+ @Override
+ protected void createInventory() {
+ CoreNMS nms = NmsManager.getNMS();
+ if (nms != null) {
+ anvil = nms.createAnvil(player, new GuiHolder(guiManager, this));
+ anvil.setCustomTitle(title);
+ anvil.setLevelCost(0);
+ inventory = anvil.getInventory();
+ }
+ }
+}
diff --git a/src/main/java/com/songoda/core/gui/BackgroundType.java b/Core/src/main/java/com/songoda/core/gui/BackgroundType.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/BackgroundType.java
rename to Core/src/main/java/com/songoda/core/gui/BackgroundType.java
diff --git a/src/main/java/com/songoda/core/gui/CustomizableGui.java b/Core/src/main/java/com/songoda/core/gui/CustomizableGui.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/CustomizableGui.java
rename to Core/src/main/java/com/songoda/core/gui/CustomizableGui.java
diff --git a/src/main/java/com/songoda/core/gui/DoubleGui.java b/Core/src/main/java/com/songoda/core/gui/DoubleGui.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/DoubleGui.java
rename to Core/src/main/java/com/songoda/core/gui/DoubleGui.java
diff --git a/src/main/java/com/songoda/core/gui/Gui.java b/Core/src/main/java/com/songoda/core/gui/Gui.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/Gui.java
rename to Core/src/main/java/com/songoda/core/gui/Gui.java
diff --git a/src/main/java/com/songoda/core/gui/GuiHolder.java b/Core/src/main/java/com/songoda/core/gui/GuiHolder.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/GuiHolder.java
rename to Core/src/main/java/com/songoda/core/gui/GuiHolder.java
diff --git a/src/main/java/com/songoda/core/gui/GuiManager.java b/Core/src/main/java/com/songoda/core/gui/GuiManager.java
similarity index 83%
rename from src/main/java/com/songoda/core/gui/GuiManager.java
rename to Core/src/main/java/com/songoda/core/gui/GuiManager.java
index 17e793a3..10c18e6d 100644
--- a/src/main/java/com/songoda/core/gui/GuiManager.java
+++ b/Core/src/main/java/com/songoda/core/gui/GuiManager.java
@@ -74,24 +74,43 @@ public class GuiManager {
*/
public void showGUI(Player player, Gui gui) {
if (shutdown) {
- return;
+ if(plugin.isEnabled()) {
+ // recover if reloaded without calling init manually
+ init();
+ } else {
+ return;
+ }
} else if (!initialized) {
init();
}
- Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ if (gui instanceof AnvilGui) {
+ // bukkit throws a fit now if you try to set anvil stuff asynchronously
Gui openInv = openInventories.get(player);
if (openInv != null) {
openInv.open = false;
}
- Inventory inv = gui.getOrCreateInventory(this);
- Bukkit.getScheduler().runTask(plugin, () -> {
- player.openInventory(inv);
- gui.onOpen(this, player);
- synchronized(lock) {
- openInventories.put(player, gui);
+ gui.getOrCreateInventory(this);
+ ((AnvilGui) gui).open();
+ gui.onOpen(this, player);
+ synchronized (lock) {
+ openInventories.put(player, gui);
+ }
+ } else {
+ Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ Gui openInv = openInventories.get(player);
+ if (openInv != null) {
+ openInv.open = false;
}
+ Inventory inv = gui.getOrCreateInventory(this);
+ Bukkit.getScheduler().runTask(plugin, () -> {
+ player.openInventory(inv);
+ gui.onOpen(this, player);
+ synchronized(lock) {
+ openInventories.put(player, gui);
+ }
+ });
});
- });
+ }
}
public void showPopup(Player player, String message) {
@@ -103,7 +122,7 @@ public class GuiManager {
}
public void showPopup(Player player, String message, CompatibleMaterial icon, BackgroundType background) {
- if (ClientVersion.getClientVersion(player).isServerVersionAtLeast(ServerVersion.V1_12)) {
+ if (ClientVersion.getClientVersion(player).isAtLeast(ServerVersion.V1_12)) {
PopupMessage popup = new PopupMessage(plugin, icon, message, background);
popup.add();
popup.grant(player);
@@ -195,7 +214,11 @@ public class GuiManager {
if (openInv.getHolder() != null && openInv.getHolder() instanceof GuiHolder
&& ((GuiHolder) openInv.getHolder()).manager.uuid.equals(manager.uuid)) {
Gui gui = ((GuiHolder) openInv.getHolder()).getGUI();
- if(!gui.open) {
+ if (gui instanceof AnvilGui) {
+ gui.inventory.clear();
+ gui.inventory = null;
+ }
+ if (!gui.open) {
return;
}
final Player player = (Player) event.getPlayer();
diff --git a/src/main/java/com/songoda/core/gui/GuiType.java b/Core/src/main/java/com/songoda/core/gui/GuiType.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/GuiType.java
rename to Core/src/main/java/com/songoda/core/gui/GuiType.java
diff --git a/src/main/java/com/songoda/core/gui/GuiUtils.java b/Core/src/main/java/com/songoda/core/gui/GuiUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/GuiUtils.java
rename to Core/src/main/java/com/songoda/core/gui/GuiUtils.java
diff --git a/src/main/java/com/songoda/core/gui/PopupMessage.java b/Core/src/main/java/com/songoda/core/gui/PopupMessage.java
similarity index 93%
rename from src/main/java/com/songoda/core/gui/PopupMessage.java
rename to Core/src/main/java/com/songoda/core/gui/PopupMessage.java
index e9d904e9..cc30a8d8 100644
--- a/src/main/java/com/songoda/core/gui/PopupMessage.java
+++ b/Core/src/main/java/com/songoda/core/gui/PopupMessage.java
@@ -31,9 +31,8 @@ class PopupMessage {
private final NamespacedKey key;
private final TextComponent title;
CompatibleMaterial icon;
- int iconAmount = 1; // experimental, untested
TriggerType trigger = TriggerType.IMPOSSIBLE;
- FrameType frame = FrameType.GOAL;
+ FrameType frame = FrameType.GOAL; // TASK is the default
BackgroundType background = BackgroundType.ADVENTURE;
PopupMessage(Plugin source, CompatibleMaterial icon, String title) {
@@ -58,9 +57,6 @@ class PopupMessage {
if (this.icon.usesData()) {
displayIcon.addProperty("data", this.icon.getData());
}
- if (this.iconAmount > 1) {
- displayIcon.addProperty("amount", this.iconAmount); // not entirely sure if this works
- }
advDisplay.add("icon", displayIcon);
}
advDisplay.add("title", gson.fromJson(ComponentSerializer.toString(this.title), JsonElement.class));
diff --git a/src/main/java/com/songoda/core/gui/SimplePagedGui.java b/Core/src/main/java/com/songoda/core/gui/SimplePagedGui.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/SimplePagedGui.java
rename to Core/src/main/java/com/songoda/core/gui/SimplePagedGui.java
diff --git a/src/main/java/com/songoda/core/gui/events/GuiClickEvent.java b/Core/src/main/java/com/songoda/core/gui/events/GuiClickEvent.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/events/GuiClickEvent.java
rename to Core/src/main/java/com/songoda/core/gui/events/GuiClickEvent.java
diff --git a/src/main/java/com/songoda/core/gui/events/GuiCloseEvent.java b/Core/src/main/java/com/songoda/core/gui/events/GuiCloseEvent.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/events/GuiCloseEvent.java
rename to Core/src/main/java/com/songoda/core/gui/events/GuiCloseEvent.java
diff --git a/src/main/java/com/songoda/core/gui/events/GuiDropItemEvent.java b/Core/src/main/java/com/songoda/core/gui/events/GuiDropItemEvent.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/events/GuiDropItemEvent.java
rename to Core/src/main/java/com/songoda/core/gui/events/GuiDropItemEvent.java
diff --git a/src/main/java/com/songoda/core/gui/events/GuiEvent.java b/Core/src/main/java/com/songoda/core/gui/events/GuiEvent.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/events/GuiEvent.java
rename to Core/src/main/java/com/songoda/core/gui/events/GuiEvent.java
diff --git a/src/main/java/com/songoda/core/gui/events/GuiOpenEvent.java b/Core/src/main/java/com/songoda/core/gui/events/GuiOpenEvent.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/events/GuiOpenEvent.java
rename to Core/src/main/java/com/songoda/core/gui/events/GuiOpenEvent.java
diff --git a/src/main/java/com/songoda/core/gui/events/GuiPageEvent.java b/Core/src/main/java/com/songoda/core/gui/events/GuiPageEvent.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/events/GuiPageEvent.java
rename to Core/src/main/java/com/songoda/core/gui/events/GuiPageEvent.java
diff --git a/src/main/java/com/songoda/core/gui/methods/Clickable.java b/Core/src/main/java/com/songoda/core/gui/methods/Clickable.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/methods/Clickable.java
rename to Core/src/main/java/com/songoda/core/gui/methods/Clickable.java
diff --git a/src/main/java/com/songoda/core/gui/methods/Closable.java b/Core/src/main/java/com/songoda/core/gui/methods/Closable.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/methods/Closable.java
rename to Core/src/main/java/com/songoda/core/gui/methods/Closable.java
diff --git a/src/main/java/com/songoda/core/gui/methods/Droppable.java b/Core/src/main/java/com/songoda/core/gui/methods/Droppable.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/methods/Droppable.java
rename to Core/src/main/java/com/songoda/core/gui/methods/Droppable.java
diff --git a/src/main/java/com/songoda/core/gui/methods/Openable.java b/Core/src/main/java/com/songoda/core/gui/methods/Openable.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/methods/Openable.java
rename to Core/src/main/java/com/songoda/core/gui/methods/Openable.java
diff --git a/src/main/java/com/songoda/core/gui/methods/Pagable.java b/Core/src/main/java/com/songoda/core/gui/methods/Pagable.java
similarity index 100%
rename from src/main/java/com/songoda/core/gui/methods/Pagable.java
rename to Core/src/main/java/com/songoda/core/gui/methods/Pagable.java
diff --git a/src/main/java/com/songoda/core/hooks/EconomyManager.java b/Core/src/main/java/com/songoda/core/hooks/EconomyManager.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/EconomyManager.java
rename to Core/src/main/java/com/songoda/core/hooks/EconomyManager.java
diff --git a/src/main/java/com/songoda/core/hooks/EntityStackerManager.java b/Core/src/main/java/com/songoda/core/hooks/EntityStackerManager.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/EntityStackerManager.java
rename to Core/src/main/java/com/songoda/core/hooks/EntityStackerManager.java
diff --git a/src/main/java/com/songoda/core/hooks/HologramManager.java b/Core/src/main/java/com/songoda/core/hooks/HologramManager.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/HologramManager.java
rename to Core/src/main/java/com/songoda/core/hooks/HologramManager.java
diff --git a/src/main/java/com/songoda/core/hooks/Hook.java b/Core/src/main/java/com/songoda/core/hooks/Hook.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/Hook.java
rename to Core/src/main/java/com/songoda/core/hooks/Hook.java
diff --git a/src/main/java/com/songoda/core/hooks/HookManager.java b/Core/src/main/java/com/songoda/core/hooks/HookManager.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/HookManager.java
rename to Core/src/main/java/com/songoda/core/hooks/HookManager.java
diff --git a/src/main/java/com/songoda/core/hooks/PluginHook.java b/Core/src/main/java/com/songoda/core/hooks/PluginHook.java
similarity index 95%
rename from src/main/java/com/songoda/core/hooks/PluginHook.java
rename to Core/src/main/java/com/songoda/core/hooks/PluginHook.java
index 7042fb1b..652470a4 100644
--- a/src/main/java/com/songoda/core/hooks/PluginHook.java
+++ b/Core/src/main/java/com/songoda/core/hooks/PluginHook.java
@@ -4,6 +4,7 @@ import com.songoda.core.hooks.economies.Economy;
import com.songoda.core.hooks.economies.PlayerPointsEconomy;
import com.songoda.core.hooks.economies.ReserveEconomy;
import com.songoda.core.hooks.economies.VaultEconomy;
+import com.songoda.core.hooks.holograms.CMIHolograms;
import com.songoda.core.hooks.stackers.StackMob;
import com.songoda.core.hooks.stackers.Stacker;
import com.songoda.core.hooks.stackers.UltimateStacker;
@@ -33,6 +34,7 @@ public final class PluginHook {
public static final PluginHook STACKER_STACK_MOB = new PluginHook(Stacker.class, "StackMob", StackMob.class);
public static final PluginHook HOLO_DISPLAYS = new PluginHook(Holograms.class, "HolographicDisplays", HolographicDisplaysHolograms.class);
public static final PluginHook HOLO_HOLOGRAMS = new PluginHook(Holograms.class, "Holograms", HologramsHolograms.class);
+ public static final PluginHook HOLO_CMI = new PluginHook(Holograms.class, "CMI", CMIHolograms.class);
/******* Start Manager stuff *******/
diff --git a/src/main/java/com/songoda/core/hooks/WorldGuardHook.java b/Core/src/main/java/com/songoda/core/hooks/WorldGuardHook.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/WorldGuardHook.java
rename to Core/src/main/java/com/songoda/core/hooks/WorldGuardHook.java
diff --git a/src/main/java/com/songoda/core/hooks/economies/Economy.java b/Core/src/main/java/com/songoda/core/hooks/economies/Economy.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/economies/Economy.java
rename to Core/src/main/java/com/songoda/core/hooks/economies/Economy.java
diff --git a/src/main/java/com/songoda/core/hooks/economies/PlayerPointsEconomy.java b/Core/src/main/java/com/songoda/core/hooks/economies/PlayerPointsEconomy.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/economies/PlayerPointsEconomy.java
rename to Core/src/main/java/com/songoda/core/hooks/economies/PlayerPointsEconomy.java
diff --git a/src/main/java/com/songoda/core/hooks/economies/ReserveEconomy.java b/Core/src/main/java/com/songoda/core/hooks/economies/ReserveEconomy.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/economies/ReserveEconomy.java
rename to Core/src/main/java/com/songoda/core/hooks/economies/ReserveEconomy.java
diff --git a/src/main/java/com/songoda/core/hooks/economies/VaultEconomy.java b/Core/src/main/java/com/songoda/core/hooks/economies/VaultEconomy.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/economies/VaultEconomy.java
rename to Core/src/main/java/com/songoda/core/hooks/economies/VaultEconomy.java
diff --git a/Core/src/main/java/com/songoda/core/hooks/holograms/CMIHolograms.java b/Core/src/main/java/com/songoda/core/hooks/holograms/CMIHolograms.java
new file mode 100644
index 00000000..cc172770
--- /dev/null
+++ b/Core/src/main/java/com/songoda/core/hooks/holograms/CMIHolograms.java
@@ -0,0 +1,135 @@
+package com.songoda.core.hooks.holograms;
+
+import com.Zrips.CMI.CMI;
+import com.Zrips.CMI.Modules.Holograms.CMIHologram;
+import com.Zrips.CMI.Modules.Holograms.HologramManager;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.plugin.Plugin;
+
+public class CMIHolograms extends Holograms {
+
+ CMI cmi;
+ HologramManager cmiHologramManager;
+ HashSet ourHolograms = new HashSet();
+ Method cmi_CMIHologram_getLines;
+
+ {
+ try {
+ // test if we need to watch if the lines is an array
+ if (CMIHologram.class.getDeclaredField("lines").getDeclaringClass() == String[].class) {
+ cmi_CMIHologram_getLines = CMIHologram.class.getMethod("getLines");
+ }
+ } catch (Exception ex) {
+ }
+ }
+
+ public CMIHolograms(Plugin plugin) {
+ super(plugin);
+ cmi = (CMI) Bukkit.getPluginManager().getPlugin("CMI");
+ if (cmi != null) {
+ cmiHologramManager = cmi.getHologramManager();
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "CMI";
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return cmi != null && cmi.isEnabled();
+ }
+
+ @Override
+ protected double defaultHeightOffset() {
+ return 0.5;
+ }
+
+ @Override
+ public void createHologram(Location location, List lines) {
+ createAt(fixLocation(location), lines);
+ }
+
+ @Override
+ public void removeHologram(Location location) {
+ location = fixLocation(location);
+ final String id = locStr(location);
+ CMIHologram holo = cmiHologramManager.getByName(id);
+ if (holo != null) {
+ cmiHologramManager.removeHolo(holo);
+ }
+ ourHolograms.remove(id);
+ }
+
+ @Override
+ public void removeAllHolograms() {
+ for (String id : ourHolograms) {
+ CMIHologram holo = cmiHologramManager.getByName(id);
+ if (holo != null) {
+ cmiHologramManager.removeHolo(holo);
+ }
+ }
+ ourHolograms.clear();
+ }
+
+ @Override
+ public void updateHologram(Location location, List lines) {
+ location = fixLocation(location);
+ CMIHologram holo = cmiHologramManager.getByName(locStr(location));
+ if (holo != null) {
+ // only update if there is a change to the text
+ List holoLines;
+ if (cmi_CMIHologram_getLines != null) {
+ try {
+ holoLines = Arrays.asList((String[]) cmi_CMIHologram_getLines.invoke(holo));
+ } catch (Exception ex) {
+ Logger.getLogger(CMIHolograms.class.getName()).log(Level.SEVERE, "CMI Hologram error!", ex);
+ holoLines = Collections.EMPTY_LIST;
+ }
+ } else {
+ holoLines = holo.getLines();
+ }
+ boolean isChanged = lines.size() != holoLines.size();
+ if (!isChanged) {
+ // double-check the lines
+ for (int i = 0; !isChanged && i < lines.size(); ++i) {
+ isChanged = !holo.getLine(i).equals(lines.get(i));
+ }
+ }
+ if (isChanged) {
+ holo.setLines(lines);
+ holo.update();
+ }
+ return;
+ }
+ createAt(location, lines);
+ }
+
+ private String locStr(Location loc) {
+ return String.format("%s-%d-%d-%d", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ }
+
+ private void createAt(Location location, List lines) {
+
+ final String id = locStr(location);
+ CMIHologram holo = new CMIHologram(id, location);
+ holo.setLines(lines);
+
+ cmiHologramManager.addHologram(holo);
+ holo.update();
+
+ if (!ourHolograms.contains(id)) {
+ ourHolograms.add(id);
+ }
+ }
+
+}
diff --git a/src/main/java/com/songoda/core/hooks/holograms/Holograms.java b/Core/src/main/java/com/songoda/core/hooks/holograms/Holograms.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/holograms/Holograms.java
rename to Core/src/main/java/com/songoda/core/hooks/holograms/Holograms.java
diff --git a/src/main/java/com/songoda/core/hooks/holograms/HologramsHolograms.java b/Core/src/main/java/com/songoda/core/hooks/holograms/HologramsHolograms.java
similarity index 99%
rename from src/main/java/com/songoda/core/hooks/holograms/HologramsHolograms.java
rename to Core/src/main/java/com/songoda/core/hooks/holograms/HologramsHolograms.java
index 1c7f11e7..2aad4dd2 100644
--- a/src/main/java/com/songoda/core/hooks/holograms/HologramsHolograms.java
+++ b/Core/src/main/java/com/songoda/core/hooks/holograms/HologramsHolograms.java
@@ -5,11 +5,10 @@ import com.sainttx.holograms.api.HologramPlugin;
import com.sainttx.holograms.api.line.HologramLine;
import com.sainttx.holograms.api.line.TextLine;
import java.util.HashSet;
-import org.bukkit.Location;
-import org.bukkit.plugin.Plugin;
-
import java.util.List;
import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.plugin.Plugin;
public class HologramsHolograms extends Holograms {
diff --git a/src/main/java/com/songoda/core/hooks/holograms/HolographicDisplaysHolograms.java b/Core/src/main/java/com/songoda/core/hooks/holograms/HolographicDisplaysHolograms.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/holograms/HolographicDisplaysHolograms.java
rename to Core/src/main/java/com/songoda/core/hooks/holograms/HolographicDisplaysHolograms.java
diff --git a/src/main/java/com/songoda/core/hooks/stackers/StackMob.java b/Core/src/main/java/com/songoda/core/hooks/stackers/StackMob.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/stackers/StackMob.java
rename to Core/src/main/java/com/songoda/core/hooks/stackers/StackMob.java
diff --git a/src/main/java/com/songoda/core/hooks/stackers/Stacker.java b/Core/src/main/java/com/songoda/core/hooks/stackers/Stacker.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/stackers/Stacker.java
rename to Core/src/main/java/com/songoda/core/hooks/stackers/Stacker.java
diff --git a/src/main/java/com/songoda/core/hooks/stackers/UltimateStacker.java b/Core/src/main/java/com/songoda/core/hooks/stackers/UltimateStacker.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/stackers/UltimateStacker.java
rename to Core/src/main/java/com/songoda/core/hooks/stackers/UltimateStacker.java
diff --git a/src/main/java/com/songoda/core/hooks/stackers/WildStacker.java b/Core/src/main/java/com/songoda/core/hooks/stackers/WildStacker.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/stackers/WildStacker.java
rename to Core/src/main/java/com/songoda/core/hooks/stackers/WildStacker.java
diff --git a/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java b/Core/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java
similarity index 100%
rename from src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java
rename to Core/src/main/java/com/songoda/core/hooks/worldguard/WorldGuardFlagHandler.java
diff --git a/src/main/java/com/songoda/core/input/ChatPrompt.java b/Core/src/main/java/com/songoda/core/input/ChatPrompt.java
similarity index 100%
rename from src/main/java/com/songoda/core/input/ChatPrompt.java
rename to Core/src/main/java/com/songoda/core/input/ChatPrompt.java
diff --git a/src/main/java/com/songoda/core/input/ClickableChat.java b/Core/src/main/java/com/songoda/core/input/ClickableChat.java
similarity index 100%
rename from src/main/java/com/songoda/core/input/ClickableChat.java
rename to Core/src/main/java/com/songoda/core/input/ClickableChat.java
diff --git a/src/main/java/com/songoda/core/locale/Locale.java b/Core/src/main/java/com/songoda/core/locale/Locale.java
similarity index 100%
rename from src/main/java/com/songoda/core/locale/Locale.java
rename to Core/src/main/java/com/songoda/core/locale/Locale.java
diff --git a/src/main/java/com/songoda/core/locale/Message.java b/Core/src/main/java/com/songoda/core/locale/Message.java
similarity index 100%
rename from src/main/java/com/songoda/core/locale/Message.java
rename to Core/src/main/java/com/songoda/core/locale/Message.java
diff --git a/Core/src/main/java/com/songoda/core/nms/NmsManager.java b/Core/src/main/java/com/songoda/core/nms/NmsManager.java
new file mode 100644
index 00000000..e0fec81b
--- /dev/null
+++ b/Core/src/main/java/com/songoda/core/nms/NmsManager.java
@@ -0,0 +1,55 @@
+package com.songoda.core.nms;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.Bukkit;
+
+public class NmsManager {
+
+ private final static String serverPackagePath = Bukkit.getServer().getClass().getPackage().getName();
+ private final static String serverPackageVersion = serverPackagePath.substring(serverPackagePath.lastIndexOf('.') + 1);
+ private final static CoreNMS nms = _getNMS();
+
+ private static CoreNMS _getNMS() {
+// try {
+// return (CoreNMS) Class.forName("com.songoda.core.nms." + serverPackageVersion + ".NMS").newInstance();
+// } catch (Exception ex) {
+// Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version", ex);
+// }
+ // this block was only added to keep minimizeJar happy
+ switch (serverPackageVersion) {
+ case "v1_8_R1":
+ return new com.songoda.core.nms.v1_8_R1.NMS();
+ case "v1_8_R2":
+ return new com.songoda.core.nms.v1_8_R2.NMS();
+ case "v1_8_R3":
+ return new com.songoda.core.nms.v1_8_R3.NMS();
+ case "v1_9_R1":
+ return new com.songoda.core.nms.v1_9_R1.NMS();
+ case "v1_9_R2":
+ return new com.songoda.core.nms.v1_9_R2.NMS();
+ case "v1_10_R1":
+ return new com.songoda.core.nms.v1_10_R1.NMS();
+ case "v1_11_R1":
+ return new com.songoda.core.nms.v1_11_R1.NMS();
+ case "v1_12_R1":
+ return new com.songoda.core.nms.v1_12_R1.NMS();
+ case "v1_13_R1":
+ return new com.songoda.core.nms.v1_13_R1.NMS();
+ case "v1_13_R2":
+ return new com.songoda.core.nms.v1_13_R2.NMS();
+ case "v1_14_R1":
+ return new com.songoda.core.nms.v1_14_R1.NMS();
+ }
+ Logger.getLogger(NmsManager.class.getName()).log(Level.SEVERE, "Failed to load NMS for this server version: version {0} not found", serverPackageVersion);
+ return null;
+ }
+
+ public static CoreNMS getNMS() {
+ return nms;
+ }
+
+ public static boolean hasNMS() {
+ return nms != null;
+ }
+}
diff --git a/src/main/java/com/songoda/core/utils/BlockUtils.java b/Core/src/main/java/com/songoda/core/utils/BlockUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/BlockUtils.java
rename to Core/src/main/java/com/songoda/core/utils/BlockUtils.java
diff --git a/src/main/java/com/songoda/core/utils/BlockUtilsModern.java b/Core/src/main/java/com/songoda/core/utils/BlockUtilsModern.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/BlockUtilsModern.java
rename to Core/src/main/java/com/songoda/core/utils/BlockUtilsModern.java
diff --git a/src/main/java/com/songoda/core/utils/ItemSerializer.java b/Core/src/main/java/com/songoda/core/utils/ItemSerializer.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/ItemSerializer.java
rename to Core/src/main/java/com/songoda/core/utils/ItemSerializer.java
diff --git a/src/main/java/com/songoda/core/utils/ItemUtils.java b/Core/src/main/java/com/songoda/core/utils/ItemUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/ItemUtils.java
rename to Core/src/main/java/com/songoda/core/utils/ItemUtils.java
diff --git a/src/main/java/com/songoda/core/utils/Metrics.java b/Core/src/main/java/com/songoda/core/utils/Metrics.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/Metrics.java
rename to Core/src/main/java/com/songoda/core/utils/Metrics.java
diff --git a/src/main/java/com/songoda/core/utils/NMSUtils.java b/Core/src/main/java/com/songoda/core/utils/NMSUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/NMSUtils.java
rename to Core/src/main/java/com/songoda/core/utils/NMSUtils.java
diff --git a/src/main/java/com/songoda/core/utils/PlayerUtils.java b/Core/src/main/java/com/songoda/core/utils/PlayerUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/PlayerUtils.java
rename to Core/src/main/java/com/songoda/core/utils/PlayerUtils.java
diff --git a/src/main/java/com/songoda/core/utils/ReflectionUtils.java b/Core/src/main/java/com/songoda/core/utils/ReflectionUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/ReflectionUtils.java
rename to Core/src/main/java/com/songoda/core/utils/ReflectionUtils.java
diff --git a/src/main/java/com/songoda/core/utils/RotationUtils.java b/Core/src/main/java/com/songoda/core/utils/RotationUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/RotationUtils.java
rename to Core/src/main/java/com/songoda/core/utils/RotationUtils.java
diff --git a/src/main/java/com/songoda/core/utils/TextUtils.java b/Core/src/main/java/com/songoda/core/utils/TextUtils.java
similarity index 100%
rename from src/main/java/com/songoda/core/utils/TextUtils.java
rename to Core/src/main/java/com/songoda/core/utils/TextUtils.java
diff --git a/NMS/NMS-API/pom.xml b/NMS/NMS-API/pom.xml
new file mode 100644
index 00000000..a79d277a
--- /dev/null
+++ b/NMS/NMS-API/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-API
+
+ 4.0.0
+ jar
+
+
+
+ org.jetbrains
+ annotations
+ 13.0
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-API/src/com/songoda/core/nms/CoreNMS.java b/NMS/NMS-API/src/com/songoda/core/nms/CoreNMS.java
new file mode 100644
index 00000000..f521f023
--- /dev/null
+++ b/NMS/NMS-API/src/com/songoda/core/nms/CoreNMS.java
@@ -0,0 +1,9 @@
+package com.songoda.core.nms;
+
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public interface CoreNMS {
+ public CustomAnvil createAnvil(Player player);
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder);
+}
diff --git a/NMS/NMS-API/src/com/songoda/core/nms/CustomAnvil.java b/NMS/NMS-API/src/com/songoda/core/nms/CustomAnvil.java
new file mode 100644
index 00000000..7513ca34
--- /dev/null
+++ b/NMS/NMS-API/src/com/songoda/core/nms/CustomAnvil.java
@@ -0,0 +1,46 @@
+package com.songoda.core.nms;
+
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+
+/**
+ * NMS interface for creating an anvil view for a single player
+ *
+ * @since 2019-09-13
+ * @author jascotty2
+ */
+public interface CustomAnvil {
+
+ public void setLevelCost(int cost);
+
+ public int getLevelCost();
+
+ public void setCanUse(boolean bool);
+
+ public String getCustomTitle();
+
+ public void setCustomTitle(String title);
+
+ public String getRenameText();
+
+ public void setRenameText(String text);
+
+ public ItemStack getLeftInput();
+
+ public ItemStack getRightInput();
+
+ public ItemStack getOutput();
+
+ public void setLeftInput(ItemStack item);
+
+ public void setRightInput(ItemStack item);
+
+ public void setOutput(ItemStack item);
+
+ public Inventory getInventory();
+
+ /**
+ * Open this anvil for the provided player
+ */
+ public void open();
+}
diff --git a/NMS/NMS-v1_10_R1/pom.xml b/NMS/NMS-v1_10_R1/pom.xml
new file mode 100644
index 00000000..958992e9
--- /dev/null
+++ b/NMS/NMS-v1_10_R1/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_10_R1
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.10.2
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..59189965
--- /dev/null
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/AnvilInventoryCustom.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_10_R1;
+
+import net.minecraft.server.v1_10_R1.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) {
+ super(location, inventory, resultInventory);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/AnvilView.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/AnvilView.java
new file mode 100644
index 00000000..3c0ae393
--- /dev/null
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/AnvilView.java
@@ -0,0 +1,192 @@
+package com.songoda.core.nms.v1_10_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_10_R1.BlockPosition;
+import net.minecraft.server.v1_10_R1.ChatMessage;
+import net.minecraft.server.v1_10_R1.ContainerAnvil;
+import net.minecraft.server.v1_10_R1.EntityHuman;
+import net.minecraft.server.v1_10_R1.EntityPlayer;
+import net.minecraft.server.v1_10_R1.IInventory;
+import net.minecraft.server.v1_10_R1.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/NMS.java b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/NMS.java
new file mode 100644
index 00000000..79c9ed9f
--- /dev/null
+++ b/NMS/NMS-v1_10_R1/src/com/songoda/core/nms/v1_10_R1/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_10_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_11_R1/pom.xml b/NMS/NMS-v1_11_R1/pom.xml
new file mode 100644
index 00000000..7a155960
--- /dev/null
+++ b/NMS/NMS-v1_11_R1/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_11_R1
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.11.2
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..5ae4b2ef
--- /dev/null
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/AnvilInventoryCustom.java
@@ -0,0 +1,22 @@
+package com.songoda.core.nms.v1_11_R1;
+
+import net.minecraft.server.v1_11_R1.ContainerAnvil;
+import net.minecraft.server.v1_11_R1.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
+ super(location, inventory, resultInventory, container);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/AnvilView.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/AnvilView.java
new file mode 100644
index 00000000..0e12b1e6
--- /dev/null
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/AnvilView.java
@@ -0,0 +1,191 @@
+package com.songoda.core.nms.v1_11_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_11_R1.BlockPosition;
+import net.minecraft.server.v1_11_R1.ChatMessage;
+import net.minecraft.server.v1_11_R1.ContainerAnvil;
+import net.minecraft.server.v1_11_R1.EntityHuman;
+import net.minecraft.server.v1_11_R1.EntityPlayer;
+import net.minecraft.server.v1_11_R1.IInventory;
+import net.minecraft.server.v1_11_R1.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) 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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/NMS.java b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/NMS.java
new file mode 100644
index 00000000..790a9cff
--- /dev/null
+++ b/NMS/NMS-v1_11_R1/src/com/songoda/core/nms/v1_11_R1/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_11_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_12_R1/pom.xml b/NMS/NMS-v1_12_R1/pom.xml
new file mode 100644
index 00000000..0169b0b9
--- /dev/null
+++ b/NMS/NMS-v1_12_R1/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_12_R1
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.12.2
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..b4f9ae63
--- /dev/null
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/AnvilInventoryCustom.java
@@ -0,0 +1,22 @@
+package com.songoda.core.nms.v1_12_R1;
+
+import net.minecraft.server.v1_12_R1.ContainerAnvil;
+import net.minecraft.server.v1_12_R1.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
+ super(location, inventory, resultInventory, container);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/AnvilView.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/AnvilView.java
new file mode 100644
index 00000000..205bfd87
--- /dev/null
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/AnvilView.java
@@ -0,0 +1,173 @@
+package com.songoda.core.nms.v1_12_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_12_R1.BlockPosition;
+import net.minecraft.server.v1_12_R1.ChatMessage;
+import net.minecraft.server.v1_12_R1.ContainerAnvil;
+import net.minecraft.server.v1_12_R1.EntityHuman;
+import net.minecraft.server.v1_12_R1.EntityPlayer;
+import net.minecraft.server.v1_12_R1.IInventory;
+import net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) 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 canUse(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.levelCost = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ return this.renameText;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.levelCost;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/NMS.java b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/NMS.java
new file mode 100644
index 00000000..33dc109f
--- /dev/null
+++ b/NMS/NMS-v1_12_R1/src/com/songoda/core/nms/v1_12_R1/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_12_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_13_R1/pom.xml b/NMS/NMS-v1_13_R1/pom.xml
new file mode 100644
index 00000000..6b19d658
--- /dev/null
+++ b/NMS/NMS-v1_13_R1/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_13_R1
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.13
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..2ef4bbde
--- /dev/null
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/AnvilInventoryCustom.java
@@ -0,0 +1,22 @@
+package com.songoda.core.nms.v1_13_R1;
+
+import net.minecraft.server.v1_13_R1.ContainerAnvil;
+import net.minecraft.server.v1_13_R1.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
+ super(location, inventory, resultInventory, container);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/AnvilView.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/AnvilView.java
new file mode 100644
index 00000000..345a596f
--- /dev/null
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/AnvilView.java
@@ -0,0 +1,174 @@
+package com.songoda.core.nms.v1_13_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_13_R1.BlockPosition;
+import net.minecraft.server.v1_13_R1.ChatMessage;
+import net.minecraft.server.v1_13_R1.ContainerAnvil;
+import net.minecraft.server.v1_13_R1.EntityHuman;
+import net.minecraft.server.v1_13_R1.EntityPlayer;
+import net.minecraft.server.v1_13_R1.IInventory;
+import net.minecraft.server.v1_13_R1.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_13_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ EntityPlayer entity;
+ Inventory inventory;
+ String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.checkReachable = false;
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) 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 canUse(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void d() {
+ super.d();
+ if (cost >= 0) {
+ this.levelCost = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ return this.renameText;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.levelCost;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/NMS.java b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/NMS.java
new file mode 100644
index 00000000..c63074ae
--- /dev/null
+++ b/NMS/NMS-v1_13_R1/src/com/songoda/core/nms/v1_13_R1/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_13_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_13_R2/pom.xml b/NMS/NMS-v1_13_R2/pom.xml
new file mode 100644
index 00000000..9ba7468e
--- /dev/null
+++ b/NMS/NMS-v1_13_R2/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_13_R2
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.13.2
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/AnvilInventoryCustom.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/AnvilInventoryCustom.java
new file mode 100644
index 00000000..0d5ee1e5
--- /dev/null
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/AnvilInventoryCustom.java
@@ -0,0 +1,22 @@
+package com.songoda.core.nms.v1_13_R2;
+
+import net.minecraft.server.v1_13_R2.ContainerAnvil;
+import net.minecraft.server.v1_13_R2.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
+ super(location, inventory, resultInventory, container);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/AnvilView.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/AnvilView.java
new file mode 100644
index 00000000..e2cc6306
--- /dev/null
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/AnvilView.java
@@ -0,0 +1,174 @@
+package com.songoda.core.nms.v1_13_R2;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_13_R2.BlockPosition;
+import net.minecraft.server.v1_13_R2.ChatMessage;
+import net.minecraft.server.v1_13_R2.ContainerAnvil;
+import net.minecraft.server.v1_13_R2.EntityHuman;
+import net.minecraft.server.v1_13_R2.EntityPlayer;
+import net.minecraft.server.v1_13_R2.IInventory;
+import net.minecraft.server.v1_13_R2.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.checkReachable = false;
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) 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 canUse(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void d() {
+ super.d();
+ if (cost >= 0) {
+ this.levelCost = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ return this.renameText;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.levelCost;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/NMS.java b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/NMS.java
new file mode 100644
index 00000000..8403b149
--- /dev/null
+++ b/NMS/NMS-v1_13_R2/src/com/songoda/core/nms/v1_13_R2/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_13_R2;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_14_R1/pom.xml b/NMS/NMS-v1_14_R1/pom.xml
new file mode 100644
index 00000000..7258c049
--- /dev/null
+++ b/NMS/NMS-v1_14_R1/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_14_R1
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.14.4
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..bd55fdea
--- /dev/null
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/AnvilInventoryCustom.java
@@ -0,0 +1,22 @@
+package com.songoda.core.nms.v1_14_R1;
+
+import net.minecraft.server.v1_14_R1.ContainerAnvil;
+import net.minecraft.server.v1_14_R1.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory, ContainerAnvil container) {
+ super(location, inventory, resultInventory, container);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/AnvilView.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/AnvilView.java
new file mode 100644
index 00000000..e687092b
--- /dev/null
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/AnvilView.java
@@ -0,0 +1,248 @@
+package com.songoda.core.nms.v1_14_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_14_R1.BlockPosition;
+import net.minecraft.server.v1_14_R1.ChatMessage;
+import net.minecraft.server.v1_14_R1.Container;
+import net.minecraft.server.v1_14_R1.ContainerAccess;
+import net.minecraft.server.v1_14_R1.ContainerAnvil;
+import net.minecraft.server.v1_14_R1.ContainerProperty;
+import net.minecraft.server.v1_14_R1.Containers;
+import net.minecraft.server.v1_14_R1.EntityHuman;
+import net.minecraft.server.v1_14_R1.EntityPlayer;
+import net.minecraft.server.v1_14_R1.IInventory;
+import net.minecraft.server.v1_14_R1.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String customTitle = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("repairInventory");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("resultInventory");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.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.3 and 1.14.4 have different fields for levelCost
+ static boolean compat_mode = true;
+ static Method mc_ContainerProperty_set;
+ static Method mc_ContainerProperty_get;
+ // 1.14 also made this field private. Fun.
+ static Field mc_Container_windowId;
+ // 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_windowId = Container.class.getDeclaredField("windowId");
+ mc_Container_windowId.setAccessible(true);
+ mc_Container_title = Container.class.getDeclaredField("title");
+ mc_Container_title.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ for (Method m : ContainerProperty.class.getMethods()) {
+ if (m.getName().equals("set")) {
+ compat_mode = false;
+ break;
+ }
+ }
+ if (compat_mode) {
+ try {
+ mc_ContainerProperty_set = ContainerProperty.class.getDeclaredMethod("a", int.class);
+ mc_ContainerProperty_get = ContainerProperty.class.getDeclaredMethod("b");
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+ }
+
+ public AnvilView(int id, EntityPlayer entity, InventoryHolder holder) {
+ super(id, entity.inventory, ContainerAccess.at(entity.world, new BlockPosition(0, 0, 0)));
+ this.setTitle(new ChatMessage(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(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) 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 canUse(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ if (compat_mode) {
+ if (mc_ContainerProperty_set != null) {
+ try {
+ mc_ContainerProperty_set.invoke(this.levelCost, 0);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ mc_ContainerProperty_set = null;
+ }
+ }
+ } else {
+ this.levelCost.set(cost);
+ }
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ return this.renameText;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return customTitle;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.customTitle = title;
+ try {
+ mc_Container_title.set(this, new ChatMessage(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;
+ } else if (compat_mode) {
+ if (mc_ContainerProperty_get != null) {
+ try {
+ return (int) mc_ContainerProperty_get.invoke(this.levelCost);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ mc_ContainerProperty_get = null;
+ }
+ }
+ } else {
+ return this.levelCost.get();
+ }
+ return -1;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, Containers.ANVIL, new ChatMessage(customTitle != null ? customTitle : "")));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ try {
+ // Set their active container window id to that counter stuff
+ mc_Container_windowId.set(this, id);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Create Error", ex);
+ }
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/NMS.java b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/NMS.java
new file mode 100644
index 00000000..fdb8756d
--- /dev/null
+++ b/NMS/NMS-v1_14_R1/src/com/songoda/core/nms/v1_14_R1/NMS.java
@@ -0,0 +1,24 @@
+package com.songoda.core.nms.v1_14_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import net.minecraft.server.v1_14_R1.EntityPlayer;
+import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ EntityPlayer p = ((CraftPlayer) player).getHandle();
+ return new AnvilView(p.nextContainerCounter(), p, null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ EntityPlayer p = ((CraftPlayer) player).getHandle();
+ return new AnvilView(p.nextContainerCounter(), p, holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_8_R1/pom.xml b/NMS/NMS-v1_8_R1/pom.xml
new file mode 100644
index 00000000..484c9f4b
--- /dev/null
+++ b/NMS/NMS-v1_8_R1/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_8_R1
+
+ 4.0.0
+ jar
+
+
+
+ org.bukkit
+ craftbukkit
+ 1.8-R0.1-20190912.143550-1
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..0978cdf3
--- /dev/null
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/AnvilInventoryCustom.java
@@ -0,0 +1,20 @@
+package com.songoda.core.nms.v1_8_R1;
+
+import net.minecraft.server.v1_8_R1.IInventory;
+import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) {
+ super(inventory, resultInventory);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/AnvilView.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/AnvilView.java
new file mode 100644
index 00000000..67c2b119
--- /dev/null
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/AnvilView.java
@@ -0,0 +1,189 @@
+package com.songoda.core.nms.v1_8_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_8_R1.BlockPosition;
+import net.minecraft.server.v1_8_R1.ChatMessage;
+import net.minecraft.server.v1_8_R1.ContainerAnvil;
+import net.minecraft.server.v1_8_R1.EntityHuman;
+import net.minecraft.server.v1_8_R1.EntityPlayer;
+import net.minecraft.server.v1_8_R1.IInventory;
+import net.minecraft.server.v1_8_R1.PacketPlayOutOpenWindow;
+import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/NMS.java b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/NMS.java
new file mode 100644
index 00000000..fd5bac2e
--- /dev/null
+++ b/NMS/NMS-v1_8_R1/src/com/songoda/core/nms/v1_8_R1/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_8_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_8_R2/pom.xml b/NMS/NMS-v1_8_R2/pom.xml
new file mode 100644
index 00000000..825b1908
--- /dev/null
+++ b/NMS/NMS-v1_8_R2/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_8_R2
+
+ 4.0.0
+ jar
+
+
+
+ org.bukkit
+ craftbukkit
+ 1.8.3-R0.1-20190912.192032-1
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/AnvilInventoryCustom.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/AnvilInventoryCustom.java
new file mode 100644
index 00000000..62921226
--- /dev/null
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/AnvilInventoryCustom.java
@@ -0,0 +1,20 @@
+package com.songoda.core.nms.v1_8_R2;
+
+import net.minecraft.server.v1_8_R2.IInventory;
+import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) {
+ super(inventory, resultInventory);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/AnvilView.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/AnvilView.java
new file mode 100644
index 00000000..9da27309
--- /dev/null
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/AnvilView.java
@@ -0,0 +1,189 @@
+package com.songoda.core.nms.v1_8_R2;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_8_R2.BlockPosition;
+import net.minecraft.server.v1_8_R2.ChatMessage;
+import net.minecraft.server.v1_8_R2.ContainerAnvil;
+import net.minecraft.server.v1_8_R2.EntityHuman;
+import net.minecraft.server.v1_8_R2.EntityPlayer;
+import net.minecraft.server.v1_8_R2.IInventory;
+import net.minecraft.server.v1_8_R2.PacketPlayOutOpenWindow;
+import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/NMS.java b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/NMS.java
new file mode 100644
index 00000000..fa8949a4
--- /dev/null
+++ b/NMS/NMS-v1_8_R2/src/com/songoda/core/nms/v1_8_R2/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_8_R2;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_8_R3/pom.xml b/NMS/NMS-v1_8_R3/pom.xml
new file mode 100644
index 00000000..ad66433c
--- /dev/null
+++ b/NMS/NMS-v1_8_R3/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_8_R3
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.8.8
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/AnvilInventoryCustom.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/AnvilInventoryCustom.java
new file mode 100644
index 00000000..3fea2f9b
--- /dev/null
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/AnvilInventoryCustom.java
@@ -0,0 +1,20 @@
+package com.songoda.core.nms.v1_8_R3;
+
+import net.minecraft.server.v1_8_R3.IInventory;
+import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, IInventory inventory, IInventory resultInventory) {
+ super(inventory, resultInventory);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/AnvilView.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/AnvilView.java
new file mode 100644
index 00000000..e2ff55c7
--- /dev/null
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/AnvilView.java
@@ -0,0 +1,189 @@
+package com.songoda.core.nms.v1_8_R3;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_8_R3.BlockPosition;
+import net.minecraft.server.v1_8_R3.ChatMessage;
+import net.minecraft.server.v1_8_R3.ContainerAnvil;
+import net.minecraft.server.v1_8_R3.EntityHuman;
+import net.minecraft.server.v1_8_R3.EntityPlayer;
+import net.minecraft.server.v1_8_R3.IInventory;
+import net.minecraft.server.v1_8_R3.PacketPlayOutOpenWindow;
+import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/NMS.java b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/NMS.java
new file mode 100644
index 00000000..ffb918f0
--- /dev/null
+++ b/NMS/NMS-v1_8_R3/src/com/songoda/core/nms/v1_8_R3/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_8_R3;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_9_R1/pom.xml b/NMS/NMS-v1_9_R1/pom.xml
new file mode 100644
index 00000000..8fc65a88
--- /dev/null
+++ b/NMS/NMS-v1_9_R1/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_9_R1
+
+ 4.0.0
+ jar
+
+
+
+
+ org.bukkit
+ craftbukkit
+ 1.9.2-R0.1-20190912.192509-1
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/AnvilInventoryCustom.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/AnvilInventoryCustom.java
new file mode 100644
index 00000000..7b834c4e
--- /dev/null
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/AnvilInventoryCustom.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_9_R1;
+
+import net.minecraft.server.v1_9_R1.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) {
+ super(location, inventory, resultInventory);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/AnvilView.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/AnvilView.java
new file mode 100644
index 00000000..bf9ffc2f
--- /dev/null
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/AnvilView.java
@@ -0,0 +1,191 @@
+package com.songoda.core.nms.v1_9_R1;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_9_R1.BlockPosition;
+import net.minecraft.server.v1_9_R1.ChatMessage;
+import net.minecraft.server.v1_9_R1.ContainerAnvil;
+import net.minecraft.server.v1_9_R1.EntityHuman;
+import net.minecraft.server.v1_9_R1.EntityPlayer;
+import net.minecraft.server.v1_9_R1.IInventory;
+import net.minecraft.server.v1_9_R1.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+
+}
diff --git a/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/NMS.java b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/NMS.java
new file mode 100644
index 00000000..32fc73a5
--- /dev/null
+++ b/NMS/NMS-v1_9_R1/src/com/songoda/core/nms/v1_9_R1/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_9_R1;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/NMS/NMS-v1_9_R2/pom.xml b/NMS/NMS-v1_9_R2/pom.xml
new file mode 100644
index 00000000..03a60df6
--- /dev/null
+++ b/NMS/NMS-v1_9_R2/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ com.songoda
+ SongodaCore-Modules
+ maven-version-number
+ ../../
+
+
+ SongodaCore-NMS-v1_9_R2
+
+ 4.0.0
+ jar
+
+
+
+ com.destroystokyo.papermc
+ paper
+ 1.9.4
+ provided
+
+
+ com.songoda
+ SongodaCore-NMS-API
+ ${project.version}
+ provided
+
+
+
\ No newline at end of file
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/AnvilInventoryCustom.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/AnvilInventoryCustom.java
new file mode 100644
index 00000000..b83f3646
--- /dev/null
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/AnvilInventoryCustom.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_9_R2;
+
+import net.minecraft.server.v1_9_R2.IInventory;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventoryAnvil;
+import org.bukkit.inventory.InventoryHolder;
+
+public class AnvilInventoryCustom extends CraftInventoryAnvil {
+
+ final InventoryHolder holder;
+
+ public AnvilInventoryCustom(InventoryHolder holder, Location location, IInventory inventory, IInventory resultInventory) {
+ super(location, inventory, resultInventory);
+ this.holder = holder;
+ }
+
+ @Override
+ public InventoryHolder getHolder() {
+ return holder;
+ }
+}
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/AnvilView.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/AnvilView.java
new file mode 100644
index 00000000..76c1390f
--- /dev/null
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/AnvilView.java
@@ -0,0 +1,190 @@
+package com.songoda.core.nms.v1_9_R2;
+
+import com.songoda.core.nms.CustomAnvil;
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_9_R2.BlockPosition;
+import net.minecraft.server.v1_9_R2.ChatMessage;
+import net.minecraft.server.v1_9_R2.ContainerAnvil;
+import net.minecraft.server.v1_9_R2.EntityHuman;
+import net.minecraft.server.v1_9_R2.EntityPlayer;
+import net.minecraft.server.v1_9_R2.IInventory;
+import net.minecraft.server.v1_9_R2.PacketPlayOutOpenWindow;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventoryView;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.InventoryHolder;
+import org.bukkit.inventory.ItemStack;
+
+public class AnvilView extends ContainerAnvil implements CustomAnvil {
+
+ private final EntityPlayer entity;
+ private final Inventory inventory;
+ private String title = "Repairing";
+ private int cost = -1;
+ private boolean canUse = true;
+
+ // 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 = ContainerAnvil.class.getDeclaredField("h");
+ mc_ContainerAnvil_repairInventory.setAccessible(true);
+ mc_ContainerAnvil_resultInventory = ContainerAnvil.class.getDeclaredField("g");
+ mc_ContainerAnvil_resultInventory.setAccessible(true);
+ mc_ContainerAnvil_bukkitEntity = ContainerAnvil.class.getDeclaredField("bukkitEntity");
+ mc_ContainerAnvil_bukkitEntity.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Setup Error", ex);
+ }
+ }
+
+ // used for grabbing the rename text string
+ static Field mc_ContainerAnvil_renameText;
+
+ static {
+ try {
+ mc_ContainerAnvil_renameText = ContainerAnvil.class.getDeclaredField("l");
+ mc_ContainerAnvil_renameText.setAccessible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ }
+
+ public AnvilView(EntityPlayer entity, InventoryHolder holder) {
+ super(entity.inventory, entity.world, new BlockPosition(0, 0, 0), entity);
+ this.entity = entity;
+ if (holder != null) {
+ this.inventory = getBukkitView(entity, holder).getTopInventory();
+ } else {
+ this.inventory = getBukkitView().getTopInventory();
+ }
+ }
+
+ public CraftInventoryView getBukkitView(EntityHuman player, InventoryHolder holder) {
+ try {
+ AnvilInventoryCustom craftInventory = new AnvilInventoryCustom(holder,
+ new Location(entity.world.getWorld(), 0, 0, 0),
+ (IInventory) mc_ContainerAnvil_repairInventory.get(this),
+ (IInventory) mc_ContainerAnvil_resultInventory.get(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 a(EntityHuman entityhuman) {
+ return canUse;
+ }
+
+ @Override
+ public void e() {
+ super.e();
+ if (cost >= 0) {
+ this.a = cost;
+ }
+ }
+
+ @Override
+ public String getRenameText() {
+ try {
+ //return this.l;
+ return (String) mc_ContainerAnvil_renameText.get(this);
+ } catch (Exception ex) {
+ Logger.getLogger(AnvilView.class.getName()).log(Level.SEVERE, "Anvil Error", ex);
+ }
+ return null;
+ }
+
+ @Override
+ public void setRenameText(String text) {
+ this.a(text);
+ }
+
+ @Override
+ public String getCustomTitle() {
+ return title;
+ }
+
+ @Override
+ public void setCustomTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setLevelCost(int cost) {
+ this.cost = cost;
+ }
+
+ @Override
+ public int getLevelCost() {
+ return cost >= 0 ? cost : this.a;
+ }
+
+ @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() {
+
+ // Counter stuff that the game uses to keep track of inventories
+ int id = entity.nextContainerCounter();
+
+ // Send the packet
+ entity.playerConnection.sendPacket(new PacketPlayOutOpenWindow(id, "minecraft:anvil", new ChatMessage(title != null ? title : ""), 0));
+
+ // Set their active container to this anvil
+ entity.activeContainer = this;
+
+ // Set their active container window id to that counter stuff
+ entity.activeContainer.windowId = id;
+
+ // Add the slot listener
+ entity.activeContainer.addSlotListener(entity);
+ }
+}
diff --git a/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/NMS.java b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/NMS.java
new file mode 100644
index 00000000..155c38e2
--- /dev/null
+++ b/NMS/NMS-v1_9_R2/src/com/songoda/core/nms/v1_9_R2/NMS.java
@@ -0,0 +1,21 @@
+package com.songoda.core.nms.v1_9_R2;
+
+import com.songoda.core.nms.CoreNMS;
+import com.songoda.core.nms.CustomAnvil;
+import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryHolder;
+
+public class NMS implements CoreNMS {
+
+ @Override
+ public CustomAnvil createAnvil(Player player) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), null);
+ }
+
+ @Override
+ public CustomAnvil createAnvil(Player player, InventoryHolder holder) {
+ return new AnvilView(((CraftPlayer) player).getHandle(), holder);
+ }
+
+}
diff --git a/assembly.xml b/assembly.xml
new file mode 100644
index 00000000..0028b5d6
--- /dev/null
+++ b/assembly.xml
@@ -0,0 +1,20 @@
+
+ dist
+
+ jar
+
+ false
+
+
+
+ true
+ false
+
+ ${project.groupId}:*
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 2ffacd29..1919327b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,12 +1,32 @@
+
com.songoda
- SongodaCore
- 4.0.0
+ SongodaCore-Modules
maven-version-number
- jar
+
+ 4.0.0
+ pom
+
+
+ Core
+ NMS/NMS-API
+ NMS/NMS-v1_8_R1
+ NMS/NMS-v1_8_R2
+ NMS/NMS-v1_8_R3
+ NMS/NMS-v1_9_R1
+ NMS/NMS-v1_9_R2
+ NMS/NMS-v1_10_R1
+ NMS/NMS-v1_11_R1
+ NMS/NMS-v1_12_R1
+ NMS/NMS-v1_13_R1
+ NMS/NMS-v1_13_R2
+ NMS/NMS-v1_14_R1
+
+
+ src
clean install
- SongodaCore-${project.version}
+ ${project.artifactId}-${project.version}
org.apache.maven.plugins
@@ -24,124 +44,17 @@
private
https://repo.songoda.com/artifactory/private/
+
+ spigot-repo
+ https://hub.spigotmc.org/nexus/content/repositories/snapshots/
+
+
- com.destroystokyo.papermc
- paper
- 1.14.4
- provided
-
-
-
- com.gmail.filoghost.holographicdisplays
- holographicdisplays-api
- 2.3.2
- provided
-
-
- com.sainttx.holograms
- Holograms
- 2.9.1
- provided
-
-
- net.tnemc
- Reserve
- 0.1.3.0
- provided
-
-
- org.black_ixx
- PlayerPoints
- 2.1.4
- provided
-
-
- net.milkbowl
- VaultAPI
- 1.7.2
- provided
-
-
- us.myles.viaversion-bukkit
- ViaVersion
- 2.1.3
- provided
-
-
- protocolsupport
- ProtocolSupport
- 4.29
- provided
-
-
- com.googlecode.json-simple
- json-simple
- 1.1
-
-
- org.jetbrains
- annotations
- 13.0
-
-
- org.yaml
- snakeyaml
- 1.25
-
-
- org.slf4j
- slf4j-api
- 1.7.25
-
-
- org.slf4j
- slf4j-nop
- 1.7.25
-
-
- com.zaxxer
- HikariCP
- 3.2.0
-
-
- org.xerial
- sqlite-jdbc
- 3.23.1
-
-
- com.sk89q.worldguard
- worldguard-bukkit
- 7.0.0
- provided
-
-
- com.sk89q.worldedit
- worldedit-bukkit
- 7.0.0
- provided
-
-
- com.songoda
- UltimateStacker
- 1.9.6
- provided
-
-
- com.bgsoftware
- WildStacker
- 2-9-0
- provided
-
-
- uk.antiperson
- stackmob
- 4-0-2
+ spigot-api
+ 1.14.4-R0.1-SNAPSHOT
provided