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 + 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