diff --git a/.gitignore b/.gitignore index 2e54df2..69e5f2c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin setblock pluginsb pluginss -/target/ \ No newline at end of file +/target/ +/project.properties diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6459864 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 wackyls6 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugin.yml b/plugin.yml index 6d1fdfc..53674f4 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,8 +1,8 @@ name: StorageSign main: wacky.storagesign.StorageSignCore -version: 1.3.0 +version: ${version} author: wackyls6 -api-version: 1.16 +api-version: 1.20 softdepend: [WorldGuard] website: https://github.com/wackyls6/StorageSign permissions: diff --git a/pom.xml b/pom.xml index 9e6b80a..3f38ce5 100644 --- a/pom.xml +++ b/pom.xml @@ -1,8 +1,8 @@ 4.0.0 wacky - storagesign - 1.2.8 + StorageSign + 2.0.0 jar StorageSign @@ -10,9 +10,12 @@ spigotmc https://hub.spigotmc.org/nexus/content/repositories/snapshots + + papermc + https://repo.papermc.io/repository/maven-public/ + - ${project.artifactId} src/main/resources @@ -25,26 +28,109 @@ maven-compiler-plugin 3.2 - 1.7 - 1.7 + 21 + 21 ${project.build.sourceEncoding} org.apache.maven.plugins maven-resources-plugin - 2.7 + 3.2.0 ${project.build.sourceEncoding} + + + copy-files-on-build + package + + copy-resources + + + + ${RESOURCE-PATH} + + + ${basedir}/target + ${project.artifactId}-${project.version}.jar + false + + + + + + + + org.codehaus.mojo + properties-maven-plugin + 1.1.0 + + + initialize + + read-project-properties + + + + project.properties + + + + + + + + org.junit + junit-bom + 5.10.2 + pom + import + + + - org.spigotmc - spigot-api - 1.15-R0.1-SNAPSHOT + org.spigotmc + spigot-api + 1.21.4-R0.1-SNAPSHOT + + + io.papermc.paper + paper-api + 1.21.4-R0.1-SNAPSHOT + provided + + + org.junit.jupiter + junit-jupiter + test + + + + org.apache.logging.log4j + log4j-core + 2.23.1 + + + + org.apache.logging.log4j + log4j-api + 2.23.1 + + + com.github.teruteru128 + logger + 1.1.1 + + + org.projectlombok + lombok + 1.18.32 + provided diff --git a/src/main/java/wacky/storagesign/ConfigLoader.java b/src/main/java/wacky/storagesign/ConfigLoader.java new file mode 100644 index 0000000..ae9a193 --- /dev/null +++ b/src/main/java/wacky/storagesign/ConfigLoader.java @@ -0,0 +1,153 @@ +package wacky.storagesign; + +import java.util.Arrays; +import java.util.List; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +/** + * config.ymlを読み取るローダー. + */ +public class ConfigLoader { + + /** + * config.ymlを参照するFileConfigurationの実体. + */ + public static FileConfiguration fileConfig; + + /** + * ローダーの初期化処理. JavaPlugin.onEnableクラスでのみ呼ばれることを想定. + */ + public static void setup(JavaPlugin plugin) { + fileConfig = plugin.getConfig(); + fileConfig.options().copyDefaults(true); + fileConfig.options().setHeader(List.of("StorageSign Configuration")); + plugin.saveConfig(); + } + + /** + * no-permissionの値を取得する. + * + * @return String + */ + public static String getNoPermission() { + return fileConfig.getString("no-permisson"); + } + + /** + * log-levelの値を取得する. + * + * @return String + */ + public static String getLogLevel() { + return fileConfig.getString("log-level"); + } + + /** + * manual-importの値を取得する. + * + * @return boolean + */ + public static boolean getManualImport() { + return fileConfig.getBoolean("manual-import"); + } + + /** + * manual-exportの値を取得する. + * + * @return boolean + */ + public static boolean getManualExport() { + return fileConfig.getBoolean("manual-export"); + } + + /** + * auto-importの値を取得する. + * + * @return boolean + */ + public static boolean getAutoImport() { + return fileConfig.getBoolean("auto-import"); + } + + /** + * auto-exportの値を取得する. + * + * @return boolean + */ + public static boolean getAutoExport() { + return fileConfig.getBoolean("auto-export"); + } + + /** + * autocollectの値を取得する. + * + * @return boolean + */ + public static boolean getAutoCollect() { + return fileConfig.getBoolean("autocollect"); + } + + /** + * hardrecipeの値を取得する. + * + * @return boolean + */ + public static boolean getHardRecipe() { + return fileConfig.getBoolean("hardrecipe"); + } + + /** + * divide-limitの値を取得する. + * + * @return boolean + */ + public static int getDivideLimit() { + return fileConfig.getInt("divide-limit"); + } + + /** + * sneak-divide-limitの値を取得する. + * + * @return boolean + */ + public static int getSneakDivideLimit() { + return fileConfig.getInt("sneak-divide-limit"); + } + + /** + * max-stack-sizeの値を取得する. + * + * @return boolean + */ + public static int getMaxStackSize() { + return fileConfig.getInt("max-stack-size"); + } + + /** + * no-budの値を取得する. + * + * @return boolean + */ + public static boolean getNoBud() { + return fileConfig.getBoolean("no-bud"); + } + + /** + * falling-block-itemSSの値を取得する. + * + * @return boolean + */ + public static boolean getFallingBlockItemSs() { + return fileConfig.getBoolean("falling-block-itemSS"); + } + + /** + * banner-debugの値を取得する. + * + * @return boolean + */ + public static boolean getBannerDebug() { + return fileConfig.getBoolean("banner-debug"); + } +} diff --git a/src/main/java/wacky/storagesign/EnchantInfo.java b/src/main/java/wacky/storagesign/EnchantInfo.java index 53d548f..20b2dbb 100644 --- a/src/main/java/wacky/storagesign/EnchantInfo.java +++ b/src/main/java/wacky/storagesign/EnchantInfo.java @@ -1,48 +1,65 @@ package wacky.storagesign; +import com.github.teruteru128.logger.Logger; import org.bukkit.Material; +import org.bukkit.Registry; import org.bukkit.enchantments.Enchantment; import org.bukkit.util.NumberConversions; public class EnchantInfo { - protected Material mat; - protected Enchantment ench; - protected short damage = 0; + protected Material mat; + protected Enchantment ench; + protected short damage = 0; + private Logger _logger; - public EnchantInfo(Material mat, String[] str){ - this.mat = mat; - ench = getEnch(str[1]); - damage = NumberConversions.toShort(str[2]); - } + public EnchantInfo(Material mat, String[] str, Logger logger) { + this.mat = mat; + this._logger = logger; - private Enchantment getEnch(String substring) { - //後ろ切れても可. - for(Enchantment e : Enchantment.values()) { - if(e.getKey().getKey().startsWith(substring)) return e; + _logger.debug("EnchantInfo:Start"); + ench = getEnch(str[1]); + damage = NumberConversions.toShort(str[2]); + _logger.trace("ench:" + ench); + _logger.trace("damage:" + damage); + } + + public static String getShortType(Enchantment e) { + String key = e.getKey().getKey(); + if (key.matches("fire_protection")) { + return "fire_p"; + } else if (key.matches("fire_aspect")) { + return "fire_a"; + } else if (key.length() <= 5) { + return key; } - return null; - } - - public static String getShortType(Enchantment e){ - String key = e.getKey().getKey(); - if(key.matches("fire_protection")) return "fire_p"; - else if(key.matches("fire_aspect")) return "fire_a"; - - else if(key.length() <= 5) return key; - return key.substring(0, 5); - } - - public short getDamage() { - return damage; - } - - public Material getMaterial() { - return mat; - } - - public Enchantment getEnchantType() { - return ench; - } + return key.substring(0, 5); + } + + private Enchantment getEnch(String substring) { + _logger.debug("getEnch: Start"); + //後ろ切れても可. + for (Enchantment e : Registry.ENCHANTMENT) { + _logger.trace(" e: " + e); + _logger.trace(" e.getKey().getKey().startsWith(substring): " + e.getKey().getKey().startsWith(substring)); + if (e.getKey().getKey().startsWith(substring)) { + return e; + } + } + _logger.error("EnchantType is Not Found!substring:" + substring); + return null; + } + + public short getDamage() { + return damage; + } + + public Material getMaterial() { + return mat; + } + + public Enchantment getEnchantType() { + return ench; + } } diff --git a/src/main/java/wacky/storagesign/Exception/PotionException.java b/src/main/java/wacky/storagesign/Exception/PotionException.java new file mode 100644 index 0000000..aa94821 --- /dev/null +++ b/src/main/java/wacky/storagesign/Exception/PotionException.java @@ -0,0 +1,8 @@ +package wacky.storagesign.Exception; + +public class PotionException extends RuntimeException { + + public PotionException(String message) { + super(message); + } +} diff --git a/src/main/java/wacky/storagesign/OmniousBottleInfo.java b/src/main/java/wacky/storagesign/OmniousBottleInfo.java new file mode 100644 index 0000000..3b95b6a --- /dev/null +++ b/src/main/java/wacky/storagesign/OmniousBottleInfo.java @@ -0,0 +1,74 @@ +package wacky.storagesign; + +import java.util.Objects; +import lombok.Getter; +import org.apache.logging.log4j.LogManager; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.OminousBottleMeta; + +/** + * 不吉な瓶の情報クラス. + * */ +@Getter +public class OmniousBottleInfo { + + /** + * 不吉な瓶のマテリアル. + * */ + private final Material material; + + /** + * 不吉な瓶のマテリアル. + * */ + private final short amplifier; + + public OmniousBottleInfo(Material material, String[] itemStr){ + this.material = material; + this.amplifier = Short.parseShort(itemStr[1]); + } + + public static ItemStack GetItemStack(Material mat, int amount, short damage){ + ItemStack item = new ItemStack(mat); + int amt = Math.min(amount, item.getMaxStackSize()); + // Paperでamtに0を入れるとなぜかアイテムスタックが消えてしまうため、0の場合は設定しない + if(amt != 0) { + item.setAmount(amt); + } + OminousBottleMeta ominousMeta = (OminousBottleMeta) item.getItemMeta(); + Objects.requireNonNull(ominousMeta).setAmplifier(damage); + item.setItemMeta(ominousMeta); + + return item; + } + + public static short GetAmplifierWithMeta(ItemMeta meta){ + OminousBottleMeta ominousMeta = (OminousBottleMeta) meta; + if(ominousMeta.hasAmplifier()) { + return (short)ominousMeta.getAmplifier(); + } else { + return 0; + } + } + + public static String GetTagData(Material mat, short damage, int amount){ + return mat.toString() + ":" + damage + " " + amount; + } + + public static String GetSignString(Material mat, short damage){ + return mat +":" + damage; + } + + public static boolean IsSimilar(ItemMeta meta, short damage){ + OminousBottleMeta omiItemMeta = (OminousBottleMeta) meta; + if (Objects.isNull(omiItemMeta)) { + return false; + } + if(omiItemMeta.hasAmplifier() && ((short)omiItemMeta.getAmplifier()) == damage) { + return true; + } else { + return (!omiItemMeta.hasAmplifier() && damage == 0); + } + } +} diff --git a/src/main/java/wacky/storagesign/PotionInfo.java b/src/main/java/wacky/storagesign/PotionInfo.java index 4b71a0d..0f265ee 100644 --- a/src/main/java/wacky/storagesign/PotionInfo.java +++ b/src/main/java/wacky/storagesign/PotionInfo.java @@ -1,110 +1,319 @@ package wacky.storagesign; + +import static java.util.Map.entry; + +import com.github.teruteru128.logger.Logger; +import java.util.Collections; +import java.util.EnumSet; +import java.util.Map; +import java.util.Set; import org.bukkit.Material; import org.bukkit.potion.PotionType; import org.bukkit.util.NumberConversions; +import wacky.storagesign.Exception.PotionException; + +import static org.bukkit.potion.PotionType.*; public class PotionInfo { - protected Material mat; - protected PotionType pot; - protected short damage = 0; - - public PotionInfo(Material mat, String[] str){ - this.mat = mat; - if(str.length == 2){//ダメージ値 - short old = NumberConversions.toShort(str[1]); - if(old >= 16384) this.mat = Material.SPLASH_POTION; - switch(old % 16){ - case 1: - pot = PotionType.REGEN; - break; - case 2: - pot = PotionType.SPEED; - break; - case 3: - pot = PotionType.FIRE_RESISTANCE; - break; - case 4: - pot = PotionType.POISON; - break; - case 5: - pot = PotionType.INSTANT_HEAL; - break; - case 6: - pot = PotionType.NIGHT_VISION; - break; - case 8: - pot = PotionType.WEAKNESS; - break; - case 9: - pot = PotionType.STRENGTH; - break; - case 10: - pot = PotionType.SLOWNESS; - break; - case 11: - pot = PotionType.JUMP; - break; - case 12: - pot = PotionType.INSTANT_DAMAGE; - break; - case 13: - pot = PotionType.WATER_BREATHING; - break; - case 14: - pot = PotionType.INVISIBILITY; - break; - - default: - if(old == 16) pot = PotionType.AWKWARD; - else if(old == 32) pot = PotionType.THICK; - else if(old == 64 || old == 8192 || old == 16384) pot = PotionType.MUNDANE; - else pot = PotionType.WATER; - } - - if(old % 8192 > 64 && pot.isExtendable()) damage = 1;//延長 - else if(old % 64 > 32 && pot.isUpgradeable()) damage = 2;//強化 - - }else if(str.length == 1) pot = PotionType.WATER; - - else{//タイプとレベル - pot = getType(str[1]); - damage = NumberConversions.toShort(str[2]); - } - } - - private PotionType getType(String substring) { - if(substring.equals("BREAT")) return PotionType.WATER_BREATHING;//例外 - else if(substring.equals("HEAL")) return PotionType.INSTANT_HEAL; - else if(substring.equals("DAMAG")) return PotionType.INSTANT_DAMAGE; - else{ //後ろ切れてるかも - for(PotionType p : PotionType.values()) { - if(p.toString().startsWith(substring)) return p; - } + private static final Set HEAL_POTIONS = + Collections.unmodifiableSet(EnumSet.of(HEALING, STRONG_HEALING)); + private static final Set BREATH_POTIONS = Collections + .unmodifiableSet(EnumSet.of(WATER_BREATHING, LONG_WATER_BREATHING)); + private static final Set DAMAGE_POTIONS = + Collections.unmodifiableSet(EnumSet.of(HARMING, STRONG_HARMING)); + private static final Set JUMP_POTIONS = Collections.unmodifiableSet( + EnumSet.of(LEAPING, LONG_LEAPING, STRONG_LEAPING)); + private static final Set SPEED_POTIONS = Collections.unmodifiableSet( + EnumSet.of(SWIFTNESS, LONG_SWIFTNESS, STRONG_SWIFTNESS)); + private static final Set REGENERATION_POTIONS = Collections.unmodifiableSet( + EnumSet.of(REGENERATION, LONG_REGENERATION, STRONG_REGENERATION)); + protected static String TYPE_SPLASH_PREF = "S"; + protected static String TYPE_LINGERING_PREF = "L"; + private static String ENHANCE_NORMAL_CODE = "0"; + private static String ENHANCE_EXTENSION_CODE = "1"; + private static String ENHANCE_STRONG_CODE = "2"; + private static String ENHANCE_EXTENSION_PREF = "LONG_"; + private static String ENHANCE_STRONG_PREF = "STRONG_"; + private static String SHORT_NAME_HEAL = "HEAL"; + private static String SHORT_NAME_BREAT = "BREAT"; + private static String SHORT_NAME_DAMAG = "DAMAG"; + private static String SHORT_NAME_JUMP = "JUMP"; + private static String SHORT_NAME_SPEED = "SPEED"; + private static String SHORT_NAME_REGEN = "REGEN"; + private static String OLD_HEAL_TYPE_NAME = "INSTANT_HEAL"; + private static String OLD_DAMAGE_TYPE_NAME = "INSTANT_DAMAGE"; + private static String OLD_JUMP_TYPE_NAME = "JUMP"; + private static String OLD_SPEED_TYPE_NAME = "SPEED"; + private static String OLD_REGEN_TYPE_NAME = "REGEN"; + private static final Map NBT_NAME_SHORT_NAMES = Map.of( + OLD_HEAL_TYPE_NAME, SHORT_NAME_HEAL, + OLD_DAMAGE_TYPE_NAME, SHORT_NAME_DAMAG, + OLD_JUMP_TYPE_NAME, SHORT_NAME_JUMP, + OLD_SPEED_TYPE_NAME, SHORT_NAME_SPEED, + OLD_REGEN_TYPE_NAME, SHORT_NAME_REGEN, + WATER_BREATHING.toString(), SHORT_NAME_BREAT + ); + + protected Material mat; + protected PotionType pot; + protected short damage = 0; + protected Logger logger; + + public PotionInfo(Material material, String type, String effName, String enhance, Logger logger) { + + this.logger = logger; + logger.debug("PotionInfo:Start"); + logger.trace("material=" + material + ", type=" + type + ", effName=" + effName + ", enhance=" + + enhance + ", logger=" + logger); + this.mat = material; + + // ポーション種別の設定 + logger.trace("type: " + type); + if (type.startsWith(TYPE_SPLASH_PREF)) { + logger.debug("This Potion Type is SplashPortion."); + this.mat = Material.SPLASH_POTION; + } else if (type.startsWith(TYPE_LINGERING_PREF)) { + // 元のやつだと入ってないからいらない? + logger.debug("This Potion Type is LingeringPortion."); + this.mat = Material.LINGERING_POTION; + } + + this.pot = getType(effName, enhance); + this.damage = NumberConversions.toShort(enhance); + + // 一応前のロジックも入れておく + logger.trace("damage: " + damage); + logger.trace("pot.isExtendable(): " + pot.isExtendable()); + logger.trace("pot.isUpgradeable(): " + pot.isUpgradeable()); + if (damage % 8192 > 64 && pot.isExtendable()) { + this.damage = 1;// 延長 + } else if (damage % 64 > 32 && pot.isUpgradeable()) { + this.damage = 2;// 強化 + } + + } + + public static String getShortName(PotionType pot) { + String name = pot.toString(); + + // 特殊命名ルールの取り出し + if (HEAL_POTIONS.contains(pot)) { + return SHORT_NAME_HEAL; + } else if (BREATH_POTIONS.contains(pot)) { + return SHORT_NAME_BREAT; + } else if (DAMAGE_POTIONS.contains(pot)) { + return SHORT_NAME_DAMAG; + } else if (JUMP_POTIONS.contains(pot)) { + return SHORT_NAME_JUMP; + } else if (SPEED_POTIONS.contains(pot)) { + return SHORT_NAME_SPEED; + } else if (REGENERATION_POTIONS.contains(pot)) { + return SHORT_NAME_REGEN; + } else { + // それ以外のもの + // 延長・強化のプレフィックス除去 + if (name.startsWith(ENHANCE_EXTENSION_PREF)) { + name = name.substring(ENHANCE_EXTENSION_PREF.length()); + } else if (name.startsWith(ENHANCE_STRONG_PREF)) { + name = name.substring(ENHANCE_STRONG_PREF.length()); + } + + // 5文字以内の名前なら、そのまま使う。それ以外なら5文字に切り出す + if (name.length() <= 5) { + return name; + } + } + + return name.substring(0, 5); + } + + public static String getSignData(Material mat, PotionType pot, short damage) { + String prefix = ""; + if (mat == Material.SPLASH_POTION) { + prefix = PotionInfo.TYPE_SPLASH_PREF; + } else if (mat == Material.LINGERING_POTION) { + prefix = PotionInfo.TYPE_LINGERING_PREF; + } + + return prefix + "POTION:" + PotionInfo.getShortName(pot) + ":" + damage; + } + + public static String getTagData(Material mat, PotionType pot, short damage, int amount) { + return mat.toString() + ":" + getNormalType(pot) + ":" + damage + " " + amount; + } + + public static String getPotionTypeCode(PotionType pot) { + String name = pot.toString(); + if (name.startsWith(ENHANCE_EXTENSION_PREF)) { + return ENHANCE_EXTENSION_CODE; + } else if (name.startsWith(ENHANCE_STRONG_PREF)) { + return ENHANCE_STRONG_CODE; + } + return ENHANCE_NORMAL_CODE; + } + + private PotionType getType(String effName, String enhance) { + logger.debug("getType: Start"); + + // 表記上例外のケースたちの判定 + logger.trace("effName: " + effName + ".enhance: " + enhance); + logger.trace("effName.equals(SHORT_NAME_HEAL): " + effName.equals(SHORT_NAME_HEAL)); + logger.trace("effName.equals(SHORT_NAME_BREAT): " + effName.equals(SHORT_NAME_BREAT)); + logger.trace("effName.equals(SHORT_NAME_DAMAG): " + effName.equals(SHORT_NAME_DAMAG)); + logger.trace("effName.equals(SHORT_NAME_JUMP): " + effName.equals(SHORT_NAME_JUMP)); + logger.trace("effName.equals(SHORT_NAME_SPEED): " + effName.equals(SHORT_NAME_SPEED)); + logger.trace("enhance.equals(ENHANCE_NORMAL_CODE)" + enhance.equals(ENHANCE_NORMAL_CODE)); + logger.trace("enhance.equals(ENHANCE_STRONG_CODE)" + enhance.equals(ENHANCE_STRONG_CODE)); + if (effName.equals(SHORT_NAME_HEAL)) { + if (enhance.equals(ENHANCE_NORMAL_CODE)) { + logger.debug("Portion:Heal."); + return HEALING; + } else if (enhance.equals(ENHANCE_STRONG_CODE)) { + logger.debug("Portion:Str_Heal."); + return STRONG_HEALING; + } else { + logger.error("Heal Enhance is not Exist!Enhance: " + enhance); + throw new PotionException("治癒のポーションに対応する種類が存在しません"); + } + } else if (effName.equals(SHORT_NAME_BREAT)) { + if (enhance.equals(ENHANCE_NORMAL_CODE)) { + logger.debug("Portion:Breat."); + return WATER_BREATHING; + } else if (enhance.equals(ENHANCE_EXTENSION_CODE)) { + logger.debug("Portion:Ext_Breat."); + return LONG_WATER_BREATHING; + } else { + logger.error("Breat Enhance is not Exist!Enhance: " + enhance); + throw new PotionException("水中呼吸のポーションに対応する種類が存在しません"); + } + } else if (effName.equals(SHORT_NAME_DAMAG)) { + if (enhance.equals(ENHANCE_NORMAL_CODE)) { + logger.debug("Portion:Damage."); + return HARMING; + } else if (enhance.equals(ENHANCE_STRONG_CODE)) { + logger.debug("Portion:Str_Damage."); + return STRONG_HARMING; + } else { + logger.error("Damage Enhance is not Exist!Enhance: " + enhance); + throw new PotionException("ダメージのポーションに対応する種類が存在しません"); + } + } else if (effName.equals(SHORT_NAME_JUMP)) { + if (enhance.equals(ENHANCE_NORMAL_CODE)) { + logger.debug("Portion:Jump."); + return LEAPING; + } else if (enhance.equals(ENHANCE_EXTENSION_CODE)) { + logger.debug("Portion:Ext_Jump."); + return LONG_LEAPING; + } else if (enhance.equals(ENHANCE_STRONG_CODE)) { + logger.debug("Portion:Str_Jump."); + return STRONG_LEAPING; + } else { + logger.error("Jump Enhance is not Exist!Enhance: " + enhance); + throw new PotionException("跳躍のポーションに対応する種類が存在しません"); + } + } else if (effName.equals(SHORT_NAME_SPEED)) { + if (enhance.equals(ENHANCE_NORMAL_CODE)) { + logger.debug("Portion:Speed."); + return SWIFTNESS; + } else if (enhance.equals(ENHANCE_EXTENSION_CODE)) { + logger.debug("Portion:Ext_Speed."); + return LONG_SWIFTNESS; + } else if (enhance.equals(ENHANCE_STRONG_CODE)) { + logger.debug("Portion:Str_Speed."); + return STRONG_SWIFTNESS; + } else { + logger.error("Speed Enhance is not Exist!Enhance: " + enhance); + throw new PotionException("俊敏のポーションに対応する種類が存在しません"); + } + } else if (effName.equals(SHORT_NAME_REGEN)) { + if (enhance.equals(ENHANCE_NORMAL_CODE)) { + logger.debug("Portion:Regen."); + return REGENERATION; + } else if (enhance.equals(ENHANCE_EXTENSION_CODE)) { + logger.debug("Portion:Ext_Regen."); + return LONG_REGENERATION; + } else if (enhance.equals(ENHANCE_STRONG_CODE)) { + logger.debug("Portion:Str_Regen."); + return STRONG_REGENERATION; + } else { + logger.error("Speed Enhance is not Exist!Enhance: " + enhance); + throw new PotionException("再生のポーションに対応する種類が存在しません"); + } + } else { + // それ以外は命名ルールに従って検索をかける + // 延長、強化があったら先頭にプレフィックスをつけて検索 + logger.debug("SearchPotion"); + String name = effName; + if (enhance.equals(ENHANCE_EXTENSION_CODE)) { + name = ENHANCE_EXTENSION_PREF + name; + } else if (enhance.equals(ENHANCE_STRONG_CODE)) { + name = ENHANCE_STRONG_PREF + name; + } + logger.trace("name: " + name); + for (PotionType p : values()) { + logger.trace(" p: " + p); + logger.trace(" p.toString().startsWith(name): " + p.toString().startsWith(name)); + if (p.toString().startsWith(name)) { + logger.debug(" Potion Is " + p); + return p; } - return null; - } + } + logger.error("Enhance is not Exist!"); + throw new PotionException("ポーションデータが存在しません"); + } + } - public static String getShortType(PotionType pot){ - if(pot == PotionType.WATER_BREATHING) return "BREAT"; - else if(pot == PotionType.INSTANT_HEAL) return "HEAL"; - else if(pot == PotionType.INSTANT_DAMAGE) return "DAMAG"; - else if(pot.toString().length() <= 5) return pot.toString(); - return pot.toString().substring(0, 5); - } + private static String getNormalType(PotionType pot) { + if (HEAL_POTIONS.contains(pot)) { + return OLD_HEAL_TYPE_NAME; + } else if (BREATH_POTIONS.contains(pot)) { + return WATER_BREATHING.toString(); + } else if (DAMAGE_POTIONS.contains(pot)) { + return OLD_DAMAGE_TYPE_NAME; + } else if (JUMP_POTIONS.contains(pot)) { + return OLD_JUMP_TYPE_NAME; + } else if (SPEED_POTIONS.contains(pot)) { + return OLD_SPEED_TYPE_NAME; + } else if (REGENERATION_POTIONS.contains(pot)) { + return OLD_REGEN_TYPE_NAME; + } else { + // それ以外のもの + // 延長・強化のプレフィックス除去 + String name = pot.toString(); + if (name.startsWith(ENHANCE_EXTENSION_PREF)) { + name = name.substring(ENHANCE_EXTENSION_PREF.length()); + } else if (name.startsWith(ENHANCE_STRONG_PREF)) { + name = name.substring(ENHANCE_STRONG_PREF.length()); + } + for (PotionType p : values()) { + String str = p.toString(); + if (str.startsWith(name)) { + return str; + } + } + throw new PotionException("ポーションデータが存在しません"); + } + } + public static String convertNBTNameToShortName(String nbtName) { + if (NBT_NAME_SHORT_NAMES.containsKey(nbtName)) { + return NBT_NAME_SHORT_NAMES.get(nbtName); + } + return nbtName; + } - public short getDamage() { - return damage; - } + public short getDamage() { + return damage; + } - public Material getMaterial() { - return mat; - } + public Material getMaterial() { + return mat; + } - public PotionType getPotionType() { - return pot; - } + public PotionType getPotionType() { + return pot; + } } diff --git a/src/main/java/wacky/storagesign/SignPhysicsEvent.java b/src/main/java/wacky/storagesign/SignPhysicsEvent.java index 87644c2..8c44c4d 100644 --- a/src/main/java/wacky/storagesign/SignPhysicsEvent.java +++ b/src/main/java/wacky/storagesign/SignPhysicsEvent.java @@ -1,20 +1,26 @@ package wacky.storagesign; +import com.github.teruteru128.logger.Logger; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPhysicsEvent; public class SignPhysicsEvent implements Listener { - StorageSignCore plugin; + StorageSignCore plugin; + private Logger _logger; - public SignPhysicsEvent(StorageSignCore plugin) { - this.plugin = plugin; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } + public SignPhysicsEvent(StorageSignCore plugin, Logger logger) { + this.plugin = plugin; + this._logger = logger; - @EventHandler - public void onBlockPhysics(BlockPhysicsEvent event) { - event.setCancelled(plugin.isStorageSign(event.getBlock())); - } + _logger.debug("SignPhysicsEvent:Start"); + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onBlockPhysics(BlockPhysicsEvent event) { + _logger.debug("onBlockPhysics:Start"); + event.setCancelled(StorageSign.isStorageSign(event.getBlock(), _logger)); + } } diff --git a/src/main/java/wacky/storagesign/StorageSign.java b/src/main/java/wacky/storagesign/StorageSign.java index db714f6..3c6ee42 100644 --- a/src/main/java/wacky/storagesign/StorageSign.java +++ b/src/main/java/wacky/storagesign/StorageSign.java @@ -1,396 +1,934 @@ package wacky.storagesign; + +import static java.util.Map.entry; +import static org.bukkit.Material.AIR; +import static org.bukkit.Material.BEEHIVE; +import static org.bukkit.Material.BEE_NEST; +import static org.bukkit.Material.ENCHANTED_BOOK; +import static org.bukkit.Material.END_PORTAL; +import static org.bukkit.Material.FIREWORK_ROCKET; +import static org.bukkit.Material.GHAST_SPAWN_EGG; +import static org.bukkit.Material.GREEN_DYE; +import static org.bukkit.Material.LINGERING_POTION; +import static org.bukkit.Material.OAK_SIGN; +import static org.bukkit.Material.OMINOUS_BOTTLE; +import static org.bukkit.Material.POTION; +import static org.bukkit.Material.RED_DYE; +import static org.bukkit.Material.SMOOTH_STONE_SLAB; +import static org.bukkit.Material.SPLASH_POTION; +import static org.bukkit.Material.STONE_SLAB; +import static org.bukkit.Material.WHITE_BANNER; +import static org.bukkit.Material.YELLOW_DYE; +import static org.bukkit.Material.matchMaterial; +import static org.bukkit.Material.values; + +import com.github.teruteru128.logger.Logger; import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; import java.util.List; - +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import org.apache.logging.log4j.LogManager; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.ShulkerBox; import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BannerMeta; +import org.bukkit.inventory.meta.BlockStateMeta; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; import org.bukkit.util.NumberConversions; -import wacky.storagesign.PotionInfo; +import wacky.storagesign.signdefinition.ShulkerDefinition; +import wacky.storagesign.signdefinition.SignDefinition; +import wacky.storagesign.signdefinition.SignMatStringDefinition; +/** + * StrageSignの実体クラスです. + */ public class StorageSign { - protected Material smat; - protected Material mat; - protected short damage; - protected Enchantment ench; - protected PotionType pot; - protected int amount; - protected int stack; - protected boolean isEmpty; - - //StorageSignだと確認してから使っちくりー - public StorageSign(ItemStack item) { - String[] str = item.getItemMeta().getLore().get(0).split(" "); - if(str[0].matches("Empty")) isEmpty = true; - else { - mat = getMaterial(str[0].split(":")[0]); - if(mat == Material.ENCHANTED_BOOK){ - EnchantInfo ei = new EnchantInfo(mat, str[0].split(":")); - damage = ei.getDamage(); - ench = ei.getEnchantType(); - } - else if(mat == Material.POTION || mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION){ - PotionInfo pi = new PotionInfo(mat, str[0].split(":")); - mat = pi.getMaterial(); - damage = pi.getDamage(); - pot = pi.getPotionType(); - }else if(str[0].contains(":")) damage = NumberConversions.toShort(str[0].split(":")[1]); - else if(mat== Material.STONE_SLAB ) mat = Material.SMOOTH_STONE_SLAB;//1.13の滑らかハーフと1.14の石ハーフ区別 - amount = NumberConversions.toInt(str[1]); - } - smat = item.getType(); - stack = item.getAmount(); + /** ItemStackのデフォルト個数 */ + private static final int DEFAULT_ITEM_AMOUNT = 1; + + private static final String storage_sign_name = "StorageSign"; + + /** + * block_entity_dataタグが付いて、単純な比較では収納ができないアイテム一覧. + */ + private static final Set block_entity_data_Materials = Collections.unmodifiableSet( + EnumSet.of(BEE_NEST, BEEHIVE)); + + /** + * SSの中でポーションと扱われるアイテム一覧. ポーション種類が追加されたら追加する. + */ + private static final Set potion_materials = Collections.unmodifiableSet( + EnumSet.of(POTION, SPLASH_POTION, LINGERING_POTION)); + + /** + * 特殊なアイテム名とアイテム用マテリアルの変換一覧. 特殊処理をするアイテムが追加されたら追加する. + */ + private static final Map mat_string_material_maps = Map.ofEntries( + entry("SIGN", OAK_SIGN), + entry("ROSE_RED", RED_DYE), + entry("DANDELION_YELLOW", YELLOW_DYE), + entry("CACTUS_GREEN", GREEN_DYE), + entry("OMINOUS_BOTTLE", OMINOUS_BOTTLE), + entry("ENCHBOOK", ENCHANTED_BOOK), + entry("SPOTION", SPLASH_POTION), + entry("LPOTION", LINGERING_POTION) + ); + private static final org.apache.logging.log4j.Logger log = LogManager.getLogger( + StorageSign.class); + + /** + * 看板のアイテム素材. + */ + protected Material smat; + + /** + * 看板に収納されるアイテム素材. + */ + protected Material mat; + + /** + * 看板に設定されるダメージ値. + */ + protected short damage; + /** + * 看板に収納されているエンチャント本のエンチャント情報. + */ + protected Enchantment ench; + /** + * 看板に収納されているポーションの種類. + */ + protected PotionType pot; + + /** + * 看板に収納されているアイテム数. + */ + protected int amount; + + /** + * SSのアイテムスタック数. + */ + protected int stack; + /** + * 看板の中身が空か. + */ + protected boolean isEmpty; + + /** + * ログ出力用ロガー. + */ + private final Logger logger; + + /** + * ItemStackに設定されている看板の情報からStorageSignを生成する. + */ + public StorageSign(ItemStack item, Logger logger) { + this.logger = logger; + logger.debug("StorageSign:start"); + + List lore = Objects.requireNonNull(item.getItemMeta()).getLore(); + String[] str = Objects.requireNonNull(lore).getFirst().split(" "); + + if (str[0].matches("Empty")) { + logger.debug("StorageSign is Empty"); + this.isEmpty = true; + + } else { + logger.debug("StorageSign isn't Empty"); + this.mat = getMaterial(str[0].split(":")[0]); + + if (this.mat == OMINOUS_BOTTLE) { + logger.debug("StorageSign have OMINOUS_BOTTLE"); + logger.trace("this.mat: " + this.mat); + logger.trace("str[0].split(\":\"): " + str[0].split(":")); + OmniousBottleInfo oi = new OmniousBottleInfo(this.mat, str[0].split(":")); + this.damage = oi.getAmplifier(); + logger.trace("this.damage: " + this.damage); + }else if (this.mat == ENCHANTED_BOOK) { + logger.debug("StorageSign have ENCHANTED_BOOK"); + EnchantInfo ei = new EnchantInfo(this.mat, str[0].split(":"), logger); + this.damage = ei.getDamage(); + this.ench = ei.getEnchantType(); + + } else if (potion_materials.contains(this.mat)) { + logger.debug("StorageSign have any Potion"); + // PotionInfo pi = new PotionInfo(mat, str[0].split(":")); + String[] potionStr = str[0].split(":"); + PotionInfo pi = new PotionInfo(this.mat, potionStr[0], + PotionInfo.convertNBTNameToShortName(potionStr[1]), potionStr[2], logger); + this.mat = pi.getMaterial(); + this.damage = pi.getDamage(); + this.pot = pi.getPotionType(); + + } else if (str[0].contains(":")) { + logger.debug("str[0].contains\":\""); + this.damage = NumberConversions.toShort(str[0].split(":")[1]); + + } else if (this.mat == STONE_SLAB) { + logger.debug("StorageSign have STONE_SLAB"); + // 1.13の滑らかハーフと1.14の石ハーフ区別 + this.mat = SMOOTH_STONE_SLAB; + + } + this.amount = NumberConversions.toInt(str[1]); } - //Sto(ry - /* public StorageSign(Sign sign) { - this(sign,Material.OAK_SIGN); - }*/ - - public StorageSign(Sign sign,Material signmat) {//上と統合したい - String[] line2 = sign.getLine(1).trim().split(":"); - mat = getMaterial(line2[0]); - isEmpty = mat == null || mat == Material.AIR; - - if(mat == Material.ENCHANTED_BOOK){ - EnchantInfo ei = new EnchantInfo(mat, line2); - damage = ei.getDamage(); - ench = ei.getEnchantType(); - } - else if(mat == Material.POTION || mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION){ - PotionInfo pi = new PotionInfo(mat, line2); - mat = pi.getMaterial(); - damage = pi.getDamage(); - pot = pi.getPotionType(); - } - else if(line2.length == 2) damage = NumberConversions.toShort(line2[1]); - else if(mat== Material.STONE_SLAB ) mat = Material.SMOOTH_STONE_SLAB;//1.13の滑らかハーフと1.14の石ハーフ区別 - - amount = NumberConversions.toInt(sign.getLine(2)); - isEmpty = amount == 0; - stack = 1; - - //壁掛け看板のチェック - if(signmat == Material.OAK_WALL_SIGN) smat = Material.OAK_SIGN; - else if(signmat == Material.BIRCH_WALL_SIGN) smat = Material.BIRCH_SIGN; - else if(signmat == Material.SPRUCE_WALL_SIGN) smat = Material.SPRUCE_SIGN; - else if(signmat == Material.JUNGLE_WALL_SIGN) smat = Material.JUNGLE_SIGN; - else if(signmat == Material.ACACIA_WALL_SIGN) smat = Material.ACACIA_SIGN; - else if(signmat == Material.DARK_OAK_WALL_SIGN) smat = Material.DARK_OAK_SIGN; - else if(signmat == Material.CRIMSON_WALL_SIGN) smat = Material.CRIMSON_SIGN; - else if(signmat == Material.WARPED_WALL_SIGN) smat = Material.WARPED_SIGN; - else smat = signmat; - + this.smat = item.getType(); + this.stack = item.getAmount(); + logger.debug("StorageSign:end"); + } + + /** + * ブロックとして存在している看板の情報からStorageSignを生成する. + */ + public StorageSign(Sign sign, Material signmat, Logger logger) { + this.logger = logger; + logger.debug("StorageSign(Material signmat):start"); + // 上と統合したい + String[] line2 = sign.getSide(Side.FRONT).getLine(1).trim().split(":"); + this.mat = getMaterial(line2[0]); + this.isEmpty = (this.mat == null || this.mat == AIR); + + if (this.mat == OMINOUS_BOTTLE) { + logger.debug("OMINOUS_BOTTLE"); + OmniousBottleInfo oi = new OmniousBottleInfo(this.mat, line2); + logger.trace("this.mat: " + this.mat); + logger.trace("line2: " + line2); + this.damage = oi.getAmplifier(); + logger.trace("this.damage: " + this.damage); + } else if (this.mat == ENCHANTED_BOOK) { + logger.debug("ENCHANTED_BOOK"); + EnchantInfo ei = new EnchantInfo(this.mat, line2, logger); + this.damage = ei.getDamage(); + this.ench = ei.getEnchantType(); + + } else if (potion_materials.contains(this.mat)) { + logger.debug("any POTION"); + // PotionInfo pi = new PotionInfo(mat, line2); + PotionInfo pi = new PotionInfo(this.mat, line2[0], line2[1], line2[2], logger); + this.mat = pi.getMaterial(); + this.damage = pi.getDamage(); + this.pot = pi.getPotionType(); + + } else if (line2.length == 2) { + logger.debug("line2.length is 2"); + this.damage = NumberConversions.toShort(line2[1]); + + } else if (this.mat == STONE_SLAB) { + logger.debug("StorageSign2:STONE_SLAB"); + // 1.13の滑らかハーフと1.14の石ハーフ区別 + this.mat = SMOOTH_STONE_SLAB; + } - //変換 - protected Material getMaterial(String str) { - if (str.matches("")) return Material.AIR; - // if (str.matches("EmptySign")) return Material.END_PORTAL; - else if(str.matches("EmptySign") || str.matches("OakStorageSign")) { - damage = 1; - return Material.OAK_SIGN; - } - else if(str.matches("SpruceStorageSign")) { - damage = 1; - return Material.SPRUCE_SIGN; - } - else if(str.matches("BirchStorageSign")) { - damage = 1; - return Material.BIRCH_SIGN; - } - else if(str.matches("JungleStorageSign")) { - damage = 1; - return Material.JUNGLE_SIGN; - } - else if(str.matches("AcaciaStorageSign")) { - damage = 1; - return Material.ACACIA_SIGN; - } - else if(str.matches("DarkOakStorageSign")) { - damage = 1; - return Material.DARK_OAK_SIGN; - } - else if(str.matches("CrimsonStorageSign")) { - damage = 1; - return Material.CRIMSON_SIGN; - } - else if(str.matches("WarpedStorageSign")) { - damage = 1; - return Material.WARPED_SIGN; - } - if (str.matches("HorseEgg")){ - damage = 1; - return Material.END_PORTAL;//ガスト卵でよくね? - } - //if (str.startsWith("REDSTONE_TORCH")) return Material.REDSTONE_TORCH; - //if (str.startsWith("RS_COMPARATOR")) return Material.COMPARATOR; - //if (str.startsWith("STAINGLASS_P")) return Material.LEGACY_STAINED_GLASS_PANE; - //if (str.startsWith("BROWN_MUSH_B")) return Material.BROWN_MUSHROOM_BLOCK; - //if (str.startsWith("RED_MUSH_BLO")) return Material.RED_MUSHROOM_BLOCK; - - //1.13→1.14用 - if (str.startsWith("SIGN")) return Material.OAK_SIGN; - if (str.startsWith("ROSE_RED")) return Material.RED_DYE; - if (str.startsWith("DANDELION_YELLOW")) return Material.YELLOW_DYE; - if (str.startsWith("CACTUS_GREEN")) return Material.GREEN_DYE; - - //省略用 - if (str.startsWith("ENCHBOOK")) return Material.ENCHANTED_BOOK; - if (str.startsWith("SPOTION")) return Material.SPLASH_POTION; - if (str.startsWith("LPOTION")) return Material.LINGERING_POTION; - - Material mat = Material.matchMaterial(str); - if (mat == null) { //後ろ切れる程度なら対応可 - for (Material m : Material.values()) { - if(m.toString().startsWith(str)) return m; - } - } - return mat;//nullなら空. + this.amount = NumberConversions.toInt(sign.getSide(Side.FRONT).getLine(2)); + this.isEmpty = this.amount == 0; + this.stack = 1; + + // 壁掛け看板のチェック + if (SignDefinition.wall_normal_sign_maps.containsKey(signmat)) { + logger.debug("signmat is " + SignDefinition.wall_normal_sign_maps.get(signmat)); + this.smat = SignDefinition.wall_normal_sign_maps.get(signmat); + } else { + logger.debug("Material isn't WALL_SIGN"); + this.smat = signmat; + } - - protected String getShortName() {//2行目の記載内容 - if (mat == null || mat == Material.AIR) return ""; - else if (mat == Material.END_PORTAL){ - if(damage == 0) return "OakStorageSign"; - if(damage == 1) return "HorseEgg"; - }else if(mat == Material.OAK_SIGN && damage == 1) return "OakStorageSign"; - else if(mat == Material.SPRUCE_SIGN && damage == 1) return "SpruceStorageSign"; - else if(mat == Material.BIRCH_SIGN && damage == 1) return "BirchStorageSign"; - else if(mat == Material.JUNGLE_SIGN && damage == 1) return "JungleStorageSign"; - else if(mat == Material.ACACIA_SIGN && damage == 1) return "AcaciaStorageSign"; - else if(mat == Material.DARK_OAK_SIGN && damage == 1) return "DarkOakStorageSign"; - else if(mat == Material.CRIMSON_SIGN && damage == 1) return "CrimsonStorageSign"; - else if(mat == Material.WARPED_SIGN && damage == 1) return "WarpedStorageSign"; - //else if (mat == Material.LEGACY_STAINED_GLASS_PANE) return damage == 0 ? "STAINGLASS_PANE" : "STAINGLASS_P:" + damage; - //else if (mat == Material.LEGACY_REDSTONE_COMPARATOR) return "RS_COMPARATOR"; - //else if (mat == Material.LEGACY_REDSTONE_TORCH_ON) return "REDSTONE_TORCH"; - //else if (mat == Material.LEGACY_HUGE_MUSHROOM_1) return damage == 0 ? "BROWN_MUSH_BLOC" : "BROWN_MUSH_B:" + damage; - //else if (mat == Material.LEGACY_HUGE_MUSHROOM_2) return damage == 0 ? "RED_MUSH_BLOCK" : "RED_MUSH_BLO:" + damage; - else if (mat == Material.ENCHANTED_BOOK) return "ENCHBOOK:" + EnchantInfo.getShortType(ench) + ":" + damage; - - else if (mat == Material.POTION || mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION) - { - String prefix = ""; - if(mat == Material.SPLASH_POTION) prefix = "S"; - else if(mat == Material.LINGERING_POTION) prefix = "L"; - - return prefix + "POTION:" + PotionInfo.getShortType(pot) +":" + damage; - } - int limit = 99;//リミットブレイク - if (damage != 0) limit -= String.valueOf(damage).length() + 1; - if (mat.toString().length() > limit) { - if (damage != 0) return mat.toString().substring(0, limit) + ":" + damage; - return mat.toString().substring(0, limit); - } else { - if (damage != 0) return mat.toString() + ":" + damage; - return mat.toString(); - } + logger.debug("StorageSign(Material signmat):end"); + } + + /** + * 空のStorageSignを作成して、ItemStackとして取得します. + * + * @return ItemStack 空のStorageSign + */ + public static ItemStack emptySign() { + return emptySign(OAK_SIGN); + } + + /** + * Materialの内容から、空のStorageSignを作成して、ItemStackとして取得します. + * + * @param signMat Material + * @return ItemStack 空のStorageSign + */ + public static ItemStack emptySign(Material signMat) { + return emptySign(signMat, null); + } + + /** + * Materialの内容から、空のStorageSignを作成して、ItemStackとして取得します. + * + * @param smat Material + * @param amount Integer + * @return ItemStack 空のStorageSign + */ + public static ItemStack emptySign(Material smat, Integer amount) { + List list = new ArrayList<>(); + list.add("Empty"); + return createStorageSign(smat, amount, list); + } + + /** + * 引数に渡された情報を基にStorageSignを作成して、ItemStackとして取得します. + * + * @param type Material + * @param amount Integer + * @param list List + * @return ItemStack StorageSign + */ + public static ItemStack createStorageSign(Material type, Integer amount, List list) { + ItemStack sign; + if (Objects.isNull(amount)) { + sign = new ItemStack(type); + } else { + sign = new ItemStack(type, amount); } - public ItemStack getStorageSign() { - ItemStack item = new ItemStack(smat, stack); - ItemMeta meta = item.getItemMeta(); - meta.setDisplayName("StorageSign"); - List list = new ArrayList<>(); - //IDとMaterial名が混ざってたり、エンチャ本対応したり - if (isEmpty) list.add("Empty"); - else if (mat == Material.ENCHANTED_BOOK) list.add(mat.toString() + ":" + ench.getKey().getKey() + ":" + damage + " " + amount); - else if (mat == Material.POTION || mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION){ - list.add(mat.toString() + ":" + pot.toString() + ":" + damage + " " + amount); + ItemMeta meta = sign.getItemMeta(); + Objects.requireNonNull(meta).setDisplayName(storage_sign_name); + meta.setLore(list); + meta.setMaxStackSize(ConfigLoader.getMaxStackSize()); + sign.setItemMeta(meta); + + return sign; + } + + /** + * 指定された文字列でMaterialに変換します. + * + * @param str String + * @return Material + */ + protected Material getMaterial(String str) { + logger.debug("getMaterial:start"); + if (str.matches("")) { + logger.debug("Material is AIR"); + return AIR; + + } else if (str.matches("EmptySign")) { + logger.debug("Material is OldOakStorageSign"); + this.damage = 1; + return OAK_SIGN; + } else if (SignMatStringDefinition.asStringMaterialMap().containsKey(str)) { + logger.debug("Material is " + SignMatStringDefinition.asStringMaterialMap().get(str)); + this.damage = 1; + return SignMatStringDefinition.asStringMaterialMap().get(str); + } else if (mat_string_material_maps.containsKey(str)) { + logger.debug("Material is " + mat_string_material_maps.get(str)); + this.damage = 1; + return mat_string_material_maps.get(str); + } + if (str.matches("HorseEgg")) { + logger.debug("Material is HorseEgg"); + this.damage = 1; + return END_PORTAL; + // ガスト卵でよくね? + } + + Material mat = matchMaterial(str); + + if (Objects.isNull(mat)) { + logger.debug("Material is null"); + // 後ろ切れる程度なら対応可 + for (Material m : values()) { + if (m.toString().startsWith(str)) { + return m; } - else list.add(getShortName() +" "+ amount); - meta.setLore(list); - item.setItemMeta(meta); - return item; + } } - public static ItemStack emptySign() { - return emptySign(Material.OAK_SIGN); - + // nullなら空. + logger.debug("Material isn't bifurcation"); + return mat; + } + + /** + * StorageSignが保持しているMaterialを取得します. + * + * @return Material + */ + public Material getMaterial() { + logger.debug(" return this.mat"); + return this.mat; + } + + /** + * フィールド変数:matのsetter. + */ + public void setMaterial(Material mat) { + logger.debug("setMaterial to Material mat"); + this.mat = mat; + } + + /** + * Materialの短い名前を文字列として取得します. + * + * @return Materialの短い名前 + */ + protected String getShortName() { + logger.debug("getShortName:start"); + // 2行目の記載内容 + logger.trace("this.mat=" + mat); + if (this.mat == null || this.mat == AIR) { + logger.debug("empty"); + return ""; + + } else if (this.mat == END_PORTAL) { + logger.debug("Material.END_PORTAL"); + if (this.damage == 0) { + logger.debug("OakStorageSign"); + return "OakStorageSign"; + } + + if (this.damage == 1) { + logger.debug("HorseEgg"); + return "HorseEgg"; + } + // SS看板に当てはまるものなら、一覧から出力する. + } else if (SignMatStringDefinition.asMaterialStringMap().containsKey(this.mat) + && this.damage == 1) { + logger.debug(SignMatStringDefinition.asMaterialStringMap().get(this.mat)); + return SignMatStringDefinition.asMaterialStringMap().get(this.mat); + } else if (OMINOUS_BOTTLE.equals(this.mat)) { + logger.debug("OMINOUS_BOTTLE + data"); + logger.trace("this.mat: " + this.mat); + logger.trace("this.damage: " + this.damage); + String singString = OmniousBottleInfo.GetSignString(this.mat, this.damage); + logger.trace("singString: " + singString); + return singString; + + } else if (ENCHANTED_BOOK.equals(this.mat)) { + logger.debug("ENCHBOOK + data"); + return "ENCHBOOK:" + EnchantInfo.getShortType(this.ench) + ":" + this.damage; + + } else if (potion_materials.contains(this.mat)) { + logger.debug("any POTION"); + return PotionInfo.getSignData(this.mat, pot, this.damage); + } + // リミットブレイク + int limit = 99; + if (this.damage != 0) { + logger.debug("limit break"); + limit -= String.valueOf(this.damage).length() + 1; } - public static ItemStack emptySign(Material smat) { - ItemStack emptySign = new ItemStack(smat); - ItemMeta meta = emptySign.getItemMeta(); - List list = new ArrayList<>(); - meta.setDisplayName("StorageSign"); - list.add("Empty"); - meta.setLore(list); - emptySign.setItemMeta(meta); - return emptySign; - } - - - private ItemStack emptyHorseEgg() { - ItemStack emptyHorseEgg = new ItemStack(Material.GHAST_SPAWN_EGG); - ItemMeta meta = emptyHorseEgg.getItemMeta(); - List list = new ArrayList<>(); - meta.setDisplayName("HorseEgg"); - list.add("Empty"); - meta.setLore(list); - emptyHorseEgg.setItemMeta(meta); - return emptyHorseEgg; - } - - public String getSigntext(int i) { - String[] sign = new String[4]; - sign[0] = "StorageSign"; - sign[1] = getShortName(); - sign[2] = String.valueOf(amount); - sign[3] = String.valueOf(amount / 3456) + "LC " + String.valueOf(amount % 3456 / 64) + "s " + String.valueOf(amount % 64); - return sign[i]; + if (this.mat.toString().length() > limit) { + logger.debug("this.mat.toString().length() > limit"); + if (this.damage != 0) { + logger.debug("item damage isn't 0"); + return this.mat.toString().substring(0, limit) + ":" + this.damage; + } + + logger.debug("item damage is 0"); + return this.mat.toString().substring(0, limit); + + } else { + logger.debug("else this.mat.toString().length() > limit"); + if (this.damage != 0) { + logger.debug("item damage isn't 0"); + return this.mat.toString() + ":" + this.damage; + } + + logger.debug("item damage is 0"); + return this.mat.toString(); } + } + + /** + * 空のStorageSignを作成して、ItemStackとして取得します. + * + * @return ItemStack 空のStorageSign + */ + public ItemStack getStorageSign() { + logger.debug("getStorageSign:start"); + List list = new ArrayList<>(); + + // IDとMaterial名が混ざってたり、エンチャ本対応したり + if (this.isEmpty) { + logger.debug("Empty"); + return emptySign(this.smat, this.stack); + + } else if (OMINOUS_BOTTLE.equals(this.mat)) { + logger.debug("OMINOUS_BOTTLE"); + logger.trace("this.mat: " + this.mat); + logger.trace("this.damage: " + this.damage); + logger.trace("this.amount: " + this.amount); + String tagData = OmniousBottleInfo.GetTagData(this.mat, this.damage, this.amount); + logger.trace("tagData: " + tagData); + list.add(tagData); + } else if (ENCHANTED_BOOK.equals(this.mat)) { + logger.debug("ENCHANTED_BOOK"); + list.add(this.mat.toString() + ":" + this.ench.getKey().getKey() + ":" + this.damage + " " + + this.amount); + + } else if (potion_materials.contains(this.mat)) { + logger.debug("any POTION"); + list.add(PotionInfo.getTagData(this.mat, pot, this.damage, this.amount)); + + } else { + logger.debug("other"); + list.add(getShortName() + " " + this.amount); - public ItemStack getContents() {//中身取得、一部アイテム用の例外 - if (mat == null) return null; - if (mat == Material.END_PORTAL){ - if(damage == 0) return emptySign(); - if(damage == 1) return emptyHorseEgg(); - }if(mat == Material.STONE_SLAB) return new ItemStack(mat,1);//ダメージ値0にする - else if(mat == Material.OAK_SIGN || mat == Material.SPRUCE_SIGN || mat == Material.BIRCH_SIGN || mat == Material.JUNGLE_SIGN || - mat == Material.ACACIA_SIGN || mat == Material.DARK_OAK_SIGN || mat == Material.CRIMSON_SIGN || mat == Material.WARPED_SIGN) { - if(damage == 0) return new ItemStack(mat,1); - else return emptySign(mat); - } - else if (mat == Material.ENCHANTED_BOOK) { - ItemStack item = new ItemStack(mat, 1); - EnchantmentStorageMeta enchantMeta = (EnchantmentStorageMeta)item.getItemMeta(); - enchantMeta.addStoredEnchant(ench, damage, true); - item.setItemMeta(enchantMeta); - return item; - } - else if(mat == Material.POTION || mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION){ - ItemStack item = new ItemStack(mat, 1); - PotionMeta potionMeta = (PotionMeta)item.getItemMeta(); - potionMeta.setBasePotionData(new PotionData(pot, damage == 1, damage == 2)); - item.setItemMeta(potionMeta); - return item; - }else if(mat == Material.FIREWORK_ROCKET){ - ItemStack item = new ItemStack(mat, 1); - FireworkMeta fireworkMeta = (FireworkMeta)item.getItemMeta(); - fireworkMeta.setPower(damage); - item.setItemMeta(fireworkMeta); - return item; - }else if(mat == Material.WHITE_BANNER && damage == 8) { - ItemStack item = new ItemStack(mat,1); - item.setItemMeta(StorageSignCore.ominousBannerMeta);//どこかからコピー - return item; - - } - if(damage == 0) return new ItemStack(mat, 1);//大半はダメージなくなった - return new ItemStack(mat, 1, damage);//ツール系のみダメージあり } + logger.debug("getStorageSign:end"); + return createStorageSign(this.smat, this.stack, list); + } - //回収可能か判定、エンチャ本は本自身の合成回数を問わない - public boolean isSimilar(ItemStack item) { - if(item == null) return false; - if (mat == Material.ENCHANTED_BOOK && item.getType() == Material.ENCHANTED_BOOK) { - EnchantmentStorageMeta enchantMeta = (EnchantmentStorageMeta)item.getItemMeta(); - if(enchantMeta.getStoredEnchants().size() == 1) - { - Enchantment itemEnch = enchantMeta.getStoredEnchants().keySet().toArray(new Enchantment[0])[0]; - if (itemEnch == ench && enchantMeta.getStoredEnchantLevel(itemEnch) == damage) return true; - } - return false; - }else if(isShulker(mat)){ - //後回し - } - return getContents().isSimilar(item); + /** + * 空のHorseEggを作成して、ItemStackとして取得します. + * + * @return ItemStack 空のHoerseEgg + */ + private ItemStack emptyHorseEgg() { + logger.debug("emptyHorseEgg:start"); + ItemStack emptyHorseEgg = new ItemStack(GHAST_SPAWN_EGG); + ItemMeta meta = emptyHorseEgg.getItemMeta(); + List list = new ArrayList<>(); + + Objects.requireNonNull(meta).setDisplayName("HorseEgg"); + list.add("Empty"); + meta.setLore(list); + emptyHorseEgg.setItemMeta(meta); + + logger.debug("emptyHorseEgg:end"); + return emptyHorseEgg; + } + + /** + * StrageSignから、設置されている看板として表示される文字列を取得します. + * + * @param i 看板の何行目の文字列を取得したいか指定します
(ex.)1行目⇒0 + * @return 取得した文字列 + */ + public String getSigntext(int i) { + logger.debug("getSigntext:start"); + String[] sign = getSigntexts(); + logger.trace("sign[]=" + String.join(" / ", sign)); + logger.debug("getSigntext:end"); + return sign[i]; + } + + /** + * StrageSignから、設置されている看板として表示される文字列配列を取得します. + * + * @return 取得した文字列 + */ + public String[] getSigntexts() { + logger.debug("getSigntexts:start"); + String[] sign = new String[4]; + + sign[0] = storage_sign_name; + sign[1] = getShortName(); + sign[2] = String.valueOf(this.amount); + sign[3] = (this.amount / 3456) + "LC " + (this.amount % 3456 / 64) + + "s " + (this.amount % 64); + + logger.debug("getSigntext:end"); + return sign; + } + + /** + * StrageSignの内容を取得します. + * + * @return ItemStack + */ + public ItemStack getContents() { + // 中身取得、一部アイテム用の例外 + logger.debug("getContents:start"); + if (this.mat == null) { + logger.debug("StrageSign haven't item"); + return null; } - public Material getMaterial() { - return mat; + if (this.mat == END_PORTAL) { + logger.debug("Contents is END_PORTAL"); + if (this.damage == 0) { + logger.debug("emptySign"); + return emptySign(); + } + + if (this.damage == 1) { + logger.debug("emptyHorseEgg"); + return emptyHorseEgg(); + } + } - public void setMaterial(Material mat) { - this.mat = mat; + + if (this.mat == STONE_SLAB) { + logger.debug("STONE_SLAB"); + // ダメージ値0にする + return new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + + } else if (SignDefinition.sign_materials.contains(this.mat)) { + logger.debug("any SIGN"); + + if (this.damage == 0) { + logger.debug("damage is 0"); + return new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + + } else { + logger.debug("damage isn't 0"); + return emptySign(this.mat); + } + + } else if (this.mat == OMINOUS_BOTTLE) { + logger.debug("OMINOUS_BOTTLE"); + logger.trace("this.mat: " + this.mat); + logger.trace("this.damage: " + this.damage); + logger.trace("this.amount: " + this.amount); + ItemStack item = OmniousBottleInfo.GetItemStack(this.mat, DEFAULT_ITEM_AMOUNT, this.damage); + logger.trace("tagData: " + item); + return item; + } else if (this.mat == ENCHANTED_BOOK) { + logger.debug("ENCHANTED_BOOK"); + ItemStack item = new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + + EnchantmentStorageMeta enchantMeta = (EnchantmentStorageMeta) item.getItemMeta(); + Objects.requireNonNull(enchantMeta).addStoredEnchant(this.ench, this.damage, true); + item.setItemMeta(enchantMeta); + + return item; + + } else if (potion_materials.contains(this.mat)) { + logger.debug("any POTION"); + + ItemStack item = new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + PotionMeta potionMeta = (PotionMeta) item.getItemMeta(); + Objects.requireNonNull(potionMeta).setBasePotionType(this.pot); + item.setItemMeta(potionMeta); + + return item; + + } else if (this.mat == FIREWORK_ROCKET) { + logger.debug("FIREWORK_ROCKET"); + ItemStack item = new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + FireworkMeta fireworkMeta = (FireworkMeta) item.getItemMeta(); + // 21.4より飛翔1はダメージ設定要らなくなった + if(1 < this.damage) { + Objects.requireNonNull(fireworkMeta).setPower(this.damage); + } + item.setItemMeta(fireworkMeta); + + return item; + + } else if (this.mat == WHITE_BANNER && this.damage == 8) { + logger.debug("WHITE_BANNER & damage is 8"); + + ItemStack item = new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + // どこかからコピー + item.setItemMeta(StorageSignCore.ominousBannerMeta); + + return item; + } - public short getDamage() { - return damage; + if (this.damage == 0) { + logger.debug("damage is 0"); + // 大半はダメージなくなった + return new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); } - public void setDamage(short damage) { - this.damage = damage; + var itemStack = new ItemStack(this.mat, DEFAULT_ITEM_AMOUNT); + var meta = itemStack.getItemMeta(); + if (meta instanceof Damageable dam) { + logger.debug("meta instanceof Damageable dam"); + dam.setDamage(this.damage); + itemStack.setItemMeta(meta); } - public int getAmount() { - return amount; + // ツール系のみダメージあり + logger.debug("Item is tools"); + return itemStack; + } + + /** + * 回収可能か判定、エンチャ本は本自身の合成回数を問わない. + * + * @return true:回収できるよ/false:回収できないよ + */ + public boolean isSimilar(ItemStack item) { + logger.debug(" isSimilar:start"); + if (item == null) { + logger.debug(" Item isn't Similar"); + return false; + } - public void setAmount(int amount) { - this.amount = amount; - isEmpty = amount == 0; + if (this.mat == OMINOUS_BOTTLE && item.getType() == OMINOUS_BOTTLE) { + logger.debug("OMINOUS_BOTTLE"); + logger.trace("item.getItemMeta(): " + item.getItemMeta()); + logger.trace("this.damage: " + this.damage); + boolean isSimilar = OmniousBottleInfo.IsSimilar(item.getItemMeta(), this.damage); + logger.trace("isSimilar: " + isSimilar); + return isSimilar; + } else if (this.mat == ENCHANTED_BOOK && item.getType() == ENCHANTED_BOOK) { + logger.debug("ENCHANTED_BOOK"); + + EnchantmentStorageMeta enchantMeta = (EnchantmentStorageMeta) item.getItemMeta(); + // ないと思うけど、metaがnullならfalse. + if (Objects.isNull(enchantMeta)) { + return false; + } + if (enchantMeta.getStoredEnchants().size() == 1) { + logger.debug("enchantMeta.getStoredEnchants().size() = 1"); + Enchantment itemEnch = + enchantMeta.getStoredEnchants().keySet().toArray(new Enchantment[0])[0]; + + if (itemEnch.equals(this.ench) + && enchantMeta.getStoredEnchantLevel(itemEnch) == this.damage) { + logger.debug("Item is Similar"); + return true; + } + } + logger.debug(" Item isn't Similar"); + return false; + + } else if (potion_materials.contains(this.mat)) { + logger.debug(" This mat is PotionSeries."); + + logger.trace(" this.mat.equals(item.getType()): " + this.mat.equals(item.getType())); + if (this.mat.equals(item.getType())) { + PotionMeta pom = (PotionMeta) item.getItemMeta(); + // ないと思うけど、pomがnullならfalse + if (Objects.isNull(pom) || Objects.isNull(pom.getBasePotionType())) { + return false; + } + logger.trace(" pom.getBasePotionType().equals(this.pot): " + pom.getBasePotionType() + .equals(this.pot)); + if (pom.getBasePotionType().equals(this.pot)) { + return true; + } + } + } else if (block_entity_data_Materials.contains(this.mat)) { + // block_entity_data_Materialsに入ってるものは、isSimilarで比較できないので、Materialが一緒かで判定 + logger.debug(" This mat is block_entity_data_Materials."); + return this.mat.equals(item.getType()); } - public void addAmount(int amount) { - if(this.amount < -amount) this.amount = 0; - else this.amount += amount; - if(this.amount < 0) this.amount = Integer.MAX_VALUE; - isEmpty = this.amount == 0; + // SSなのかだけ、別ロジックで判定 + ItemStack contents = getContents(); + boolean isStorageSign = isStorageSign(item, logger); + boolean contentIsStorageSign = isStorageSign(contents, logger); + logger.trace("isStorageSign: " + isStorageSign); + logger.trace("contents.getType() == item.getType(): " + (contents.getType() == item.getType())); + if (isStorageSign && contentIsStorageSign) { + if (contents.getType() == item.getType()) { + StorageSign contentSign = new StorageSign(contents, logger); + StorageSign itemSign = new StorageSign(item, logger); + logger.trace( + "cSign.isEmpty() == isign.isEmpty(): " + (contentSign.isEmpty() == itemSign.isEmpty())); + return contentSign.isEmpty() == itemSign.isEmpty(); + } + } else if (this.mat == item.getType() && ShulkerDefinition.shulker_materials.contains(this.mat)) { + // シュルカーボックスの場合は、中身を確認する + BlockStateMeta meta = (BlockStateMeta) item.getItemMeta(); + ShulkerBox shulker = (ShulkerBox) meta.getBlockState(); + if(shulker.getInventory().isEmpty()){ + // 中身が空なら、ItemStackをリセット + item = new ItemStack(item.getType()); + } } - public int getStackSize() { - return stack; + // それ以外のItemはisSimilarで判定 + boolean isSimilar = contents.isSimilar(item); + logger.trace(" isSimilar: " + isSimilar); + return isSimilar; + } + + /** + * フィールド変数:damageのgetter. + */ + public short getDamage() { + logger.debug(" getDamage"); + return this.damage; + } + + /** + * フィールド変数:damageのsetter. + */ + public void setDamage(short damage) { + logger.debug("setDamage"); + this.damage = damage; + } + + /** + * フィールド変数:amountのgetter. + */ + public int getAmount() { + logger.debug("getAmount"); + return this.amount; + } + + /** + * フィールド変数:amountのsetter. + */ + public void setAmount(int amount) { + logger.debug("setAmount"); + this.amount = amount; + this.isEmpty = amount == 0; + } + + /** + * フィールド変数:amountへ加算をします. + * + * @param amount 加算対象の値 + */ + public void addAmount(int amount) { + logger.debug("addAmount:start"); + if (this.amount < -amount) { + logger.debug("set amount 0"); + this.amount = 0; + + } else { + logger.debug("add Amount"); + this.amount += amount; + } - public boolean isEmpty() { - return isEmpty; + if (this.amount < 0) { + logger.debug("set amount to MAX_VALUE"); + this.amount = Integer.MAX_VALUE; + + } + + this.isEmpty = this.amount == 0; + } + + /** + * StorageSignが保持しているStackSizeを取得します. + * + * @return StackSize + */ + public int getStackSize() { + logger.debug("get StorageSign StackSize"); + return this.stack; + } + + /** + * StrageSignが保持している内容か空かを取得します. + * + * @return true:空っぽ/false:入ってます + */ + public boolean isEmpty() { + logger.debug("Check StrageSign is Empty"); + return this.isEmpty; + } + + /** + * フィールド変数:enchのgetter. + */ + public Enchantment getEnchant() { + logger.debug("getEnchant"); + return this.ench; + } + + /** + * フィールド変数:enchのsetter. + */ + public void setEnchant(Enchantment ench) { + logger.debug("setEnchant"); + this.ench = ench; + } + + /** + * フィールド変数:potのgetter. + */ + public PotionType getPotion() { + logger.debug("getPotion"); + return this.pot; + } + + /** + * フィールド変数:potのsetter. + */ + public void setPotion(PotionType pot) { + logger.debug("setPotion"); + this.pot = pot; + } + + /** + * フィールド変数:smatのgetter. + */ + public Material getSmat() { + logger.debug(" getSmat"); + return this.smat; + } + + /** + * 渡されたItemStackがStorageSignか判断. + */ + public static boolean isStorageSign(ItemStack item, Logger logger) { + logger.debug(" isStorageSign(ItemStack):Start"); + if (item == null) { + logger.debug(" item is null."); + return false; + } + + boolean isSignPost = SignDefinition.sign_materials.contains(item.getType()); + logger.trace(" isSignPost:" + isSignPost); + if (isSignPost) { + // ないと思うけど、metaがなかったら比較できないのでfalse. + if (Objects.isNull(item.getItemMeta())) { + return false; + } + + logger.trace( + " !item.getItemMeta().hasDisplayName(): " + !item.getItemMeta().hasDisplayName()); + if (!item.getItemMeta().hasDisplayName()) { + logger.debug(" itemMeta hasn't displayName."); + return false; + } + logger.trace( + " !item.getItemMeta().getDisplayName().matches(\"StorageSign\"): " + !item.getItemMeta() + .getDisplayName().matches(storage_sign_name)); + if (!item.getItemMeta().getDisplayName().matches(storage_sign_name)) { + logger.debug(" itemMetaName hasn't StorageSign."); + return false; + } + logger.trace(" item.getItemMeta().hasLore(): " + item.getItemMeta().hasLore()); + return item.getItemMeta().hasLore(); + } + logger.debug(" isSignPost is false."); + return false; + } + + /** + * 渡されたBlockがStorageSignか判断. + */ + public static boolean isStorageSign(Block block, Logger logger) { + logger.debug(" isStorageSign(Block):Start"); + + boolean isSignPost = SignDefinition.sign_materials.contains(block.getType()); + boolean isWallSign = SignDefinition.wall_sign_materials.contains(block.getType()); + logger.trace(" block.getType(): " + block.getType()); + logger.trace(" isSignPost(block.getType()): " + isSignPost); + logger.trace(" isWallSign(block.getType()) :" + isWallSign); + if (isSignPost || isWallSign) { + logger.debug(" This Block is Sign."); + Sign sign = (Sign) block.getState(); + + logger.trace(" sign.getSide(Side.FRONT).getLine(0).matches(\"StorageSign\"): " + sign.getSide( + Side.FRONT).getLine(0).matches(storage_sign_name)); + if (sign.getSide(Side.FRONT).getLine(0).matches(storage_sign_name)) { + logger.debug(" This Sign is StorageSign."); + return true; + } } - public void setEnchant(Enchantment ench) { - this.ench = ench; - } - - public Enchantment getEnchant() { - return ench; - } - - public void setPotion(PotionType pot) { - this.pot = pot; - } - - public PotionType getPotion() { - return pot; - } - - public Material getSmat() { - return smat; - } - - private boolean isShulker(Material mat) { - switch(mat){ - case SHULKER_BOX: - case WHITE_SHULKER_BOX: - case ORANGE_SHULKER_BOX: - case MAGENTA_SHULKER_BOX: - case LIGHT_BLUE_SHULKER_BOX: - case YELLOW_SHULKER_BOX: - case LIME_SHULKER_BOX: - case PINK_SHULKER_BOX: - case GRAY_SHULKER_BOX: - case LIGHT_GRAY_SHULKER_BOX: - case CYAN_SHULKER_BOX: - case PURPLE_SHULKER_BOX: - case BLUE_SHULKER_BOX: - case BROWN_SHULKER_BOX: - case GREEN_SHULKER_BOX: - case RED_SHULKER_BOX: - case BLACK_SHULKER_BOX: - return true; - default: - } - return false; - } - -} + logger.debug(" This Block isn't StorageSign."); + return false; + } +} \ No newline at end of file diff --git a/src/main/java/wacky/storagesign/StorageSignCore.java b/src/main/java/wacky/storagesign/StorageSignCore.java index f66f2d1..67078ab 100644 --- a/src/main/java/wacky/storagesign/StorageSignCore.java +++ b/src/main/java/wacky/storagesign/StorageSignCore.java @@ -1,26 +1,31 @@ package wacky.storagesign; +import com.github.teruteru128.logger.Logger; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Set; - +import java.util.logging.Level; +import org.apache.logging.log4j.LogManager; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.DyeColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.NamespacedKey; -import org.bukkit.UndefinedNullability; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.DoubleChest; +import org.bukkit.block.Furnace; import org.bukkit.block.Sign; import org.bukkit.block.data.type.WallSign; +import org.bukkit.block.sign.Side; import org.bukkit.command.CommandSender; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; +import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Item; import org.bukkit.entity.Minecart; import org.bukkit.entity.Player; @@ -32,8 +37,10 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.inventory.FurnaceBurnEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.event.inventory.InventoryPickupItemEvent; import org.bukkit.event.inventory.InventoryType; @@ -45,696 +52,1161 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.BannerMeta; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.FireworkMeta; import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.inventory.recipe.CraftingBookCategory; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.potion.PotionData; - -public class StorageSignCore extends JavaPlugin implements Listener{ - - FileConfiguration config; - static BannerMeta ominousBannerMeta; - - @Override - public void onEnable() { - config = this.getConfig(); - config.options().copyDefaults(true); - config.options().header("StorageSign Configuration"); - this.saveConfig(); - - //鯖別レシピが実装されたら - Material[] sign = {Material.OAK_SIGN,Material.BIRCH_SIGN,Material.SPRUCE_SIGN,Material.JUNGLE_SIGN,Material.ACACIA_SIGN,Material.DARK_OAK_SIGN,Material.CRIMSON_SIGN,Material.WARPED_SIGN}; - for(int i= 0 ;i<8;i++) { - - ShapedRecipe storageSignRecipe = new ShapedRecipe(new NamespacedKey(this,"ssr"+i),StorageSign.emptySign(sign[i])); - //ShapedRecipe storageSignRecipe = new ShapedRecipe(StorageSign.emptySign()); - storageSignRecipe.shape("CCC","CSC","CHC"); - storageSignRecipe.setIngredient('C', Material.CHEST); - storageSignRecipe.setIngredient('S', sign[i]); - if (config.getBoolean("hardrecipe")) storageSignRecipe.setIngredient('H', Material.ENDER_CHEST); - else storageSignRecipe.setIngredient('H', Material.CHEST); - getServer().addRecipe(storageSignRecipe); - } - - getServer().getPluginManager().registerEvents(this, this); - if(config.getBoolean("no-bud")) new SignPhysicsEvent(this); - } - - @Override - public void onDisable(){} - - - public boolean isStorageSign(ItemStack item) { - if (item == null) return false; - if(isSignPost(item.getType())) { - - if (!item.getItemMeta().hasDisplayName()) return false; - if (!item.getItemMeta().getDisplayName().matches("StorageSign")) return false; - return item.getItemMeta().hasLore(); - } - return false; - } - - public boolean isStorageSign(Block block) { - if(isSignPost(block.getType()) || isWallSign(block.getType())) { - Sign sign = (Sign) block.getState(); - if (sign.getLine(0).matches("StorageSign")) return true; - } - return false; - } - - public boolean isHorseEgg(ItemStack item){ - if(item.getType() != Material.GHAST_SPAWN_EGG) return false; - if(item.getItemMeta().hasLore()) return true; - return false; - } - - - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - Player player = event.getPlayer(); - Block block; - //手持ちがブロックだと叩いた看板を取得できないことがあるとか - if (event.isCancelled() && event.getAction() == Action.RIGHT_CLICK_AIR) { - try { - block = player.getTargetBlock((Set) null, 3); - } catch (IllegalStateException ex) { - return; - } - } else { - block = event.getClickedBlock(); - } - if (block == null) return; - if(player.getGameMode() == GameMode.SPECTATOR) return; - if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) { - - if (!isStorageSign(block)) return; - if(event.getHand() == EquipmentSlot.OFF_HAND) return;//一応 - event.setUseItemInHand(Result.DENY); - event.setUseInteractedBlock(Result.DENY); - if (!player.hasPermission("storagesign.use")) { - player.sendMessage(ChatColor.RED + config.getString("no-permisson")); - event.setCancelled(true); - return; - } - Sign sign = (Sign) block.getState(); - StorageSign storageSign = new StorageSign(sign,block.getType()); - ItemStack itemMainHand = event.getItem(); - Material mat; - - //アイテム登録 - if (storageSign.getMaterial() == null || storageSign.getMaterial() == Material.AIR) { - if(itemMainHand == null) return;//申し訳ないが素手はNG - mat = itemMainHand.getType(); - if (isStorageSign(itemMainHand)) { - storageSign.setMaterial(mat); - storageSign.setDamage((short) 1); - } - else if (isHorseEgg(itemMainHand)){ - storageSign.setMaterial(Material.END_PORTAL); - storageSign.setDamage((short) 1); - } - else if(mat == Material.STONE_SLAB){ - storageSign.setMaterial(mat); - storageSign.setDamage((short) 1); - } - else if (mat == Material.POTION || mat == Material.SPLASH_POTION || mat == Material.LINGERING_POTION) - { - storageSign.setMaterial(mat); - PotionMeta potionMeta = (PotionMeta)itemMainHand.getItemMeta(); - PotionData potion = potionMeta.getBasePotionData(); - if(potion.isExtended()) storageSign.setDamage((short) 1); - if(potion.isUpgraded()) storageSign.setDamage((short) 2); - storageSign.setPotion(potion.getType()); - } - else if (mat == Material.ENCHANTED_BOOK) - { - EnchantmentStorageMeta enchantMeta = (EnchantmentStorageMeta)itemMainHand.getItemMeta(); - if(enchantMeta.getStoredEnchants().size() == 1) { - Enchantment ench = enchantMeta.getStoredEnchants().keySet().toArray(new Enchantment[0])[0]; - storageSign.setMaterial(mat); - storageSign.setDamage((short) enchantMeta.getStoredEnchantLevel(ench)); - storageSign.setEnchant(ench); - } - }else if(mat == Material.FIREWORK_ROCKET){ - storageSign.setMaterial(mat); - FireworkMeta fireworkMeta = (FireworkMeta)itemMainHand.getItemMeta(); - storageSign.setDamage((short) fireworkMeta.getPower()); - } - else if(mat == Material.WHITE_BANNER){ - storageSign.setMaterial(mat); - BannerMeta bannerMeta = (BannerMeta)itemMainHand.getItemMeta(); - if(bannerMeta.getPatterns().size() == 8) { - ominousBannerMeta = bannerMeta;//襲撃バナー登録 - storageSign.setDamage((short) 8); - } - } - else - { - storageSign.setMaterial(mat); - storageSign.setDamage(itemMainHand.getDurability()); - } - - for (int i=0; i<4; i++) sign.setLine(i, storageSign.getSigntext(i)); - sign.update(); - return; - } - - if (isStorageSign(itemMainHand)) { - //看板合成 - StorageSign itemSign = new StorageSign(itemMainHand); - if (storageSign.getContents().isSimilar(itemSign.getContents()) && config.getBoolean("manual-import")) { - storageSign.addAmount(itemSign.getAmount() * itemSign.getStackSize()); - itemSign.setAmount(0); - player.getInventory().setItemInMainHand(itemSign.getStorageSign()); - }//空看板収納 - else if (itemSign.isEmpty() && storageSign.getMaterial() == itemSign.getSmat() && storageSign.getDamage() == 1 && config.getBoolean("manual-import")) { - if (player.isSneaking() ) { - storageSign.addAmount(itemMainHand.getAmount()); - player.getInventory().clear(player.getInventory().getHeldItemSlot()); - } else for (int i=0; i itemMainHand.getAmount() && config.getBoolean("manual-export")) { - itemSign.setMaterial(storageSign.getMaterial()); - itemSign.setDamage(storageSign.getDamage()); - itemSign.setEnchant(storageSign.getEnchant()); - itemSign.setPotion(storageSign.getPotion()); - - int limit = config.getInt("divide-limit"); - - if (limit > 0 && storageSign.getAmount() > limit * (itemSign.getStackSize() + 1)) itemSign.setAmount(limit); - else itemSign.setAmount(storageSign.getAmount() / (itemSign.getStackSize() + 1)); - player.getInventory().setItemInMainHand(itemSign.getStorageSign()); - storageSign.setAmount(storageSign.getAmount() - (itemSign.getStackSize() * itemSign.getAmount()));//余りは看板に引き受けてもらう - } - for (int i=0; i<4; i++) sign.setLine(i, storageSign.getSigntext(i)); - sign.update(); - return; - } - - //ここから搬入 - if (storageSign.isSimilar(itemMainHand)) { - if (!config.getBoolean("manual-import")) return; - if (player.isSneaking()) { - storageSign.addAmount(itemMainHand.getAmount()); - player.getInventory().clear(player.getInventory().getHeldItemSlot()); - if(isDye(itemMainHand)) sign.setColor(getDyeColor(itemMainHand));//同色用 - } else for (int i=0; i max) { - item.setAmount(max); - storageSign.addAmount(-max); - } else { - item.setAmount(storageSign.getAmount()); - storageSign.setAmount(0); - } - - Location loc = player.getLocation(); - loc.setY(loc.getY() + 0.5); - player.getWorld().dropItem(loc, item); - } +import org.bukkit.potion.PotionType; +import wacky.storagesign.client.paper.PaperSSEvent; +import wacky.storagesign.client.spigot.SpigotSSEvent; +import wacky.storagesign.config.StorageSignNBTConfig; +import wacky.storagesign.runnnable.ExportSign; +import wacky.storagesign.signdefinition.SignDefinition; - for (int i=0; i<4; i++) sign.setLine(i, storageSign.getSigntext(i)); - sign.update(); - } +public class StorageSignCore extends JavaPlugin implements Listener { + + private static final org.apache.logging.log4j.Logger log = LogManager.getLogger( + StorageSignCore.class); + public static BannerMeta ominousBannerMeta; + public Logger logger; + private boolean _fallingBlockSS; + + @Override + public void onEnable() { + // ConfigLoader初期化 + ConfigLoader.setup(this); + + // ロガーの初期設定 + String logLevel = ConfigLoader.getLogLevel(); + // ログ取得 + Logger.register(this, logLevel); + logger = Logger.getInstance(this); + + logger.debug("★onEnable:Start"); +// logger.fatal("serverLog"); +// logger.error("errorLog"); +// logger.warn("warnLog"); +// logger.info("infoLog"); +// logger.debug("debugLog"); +// logger.trace("traceLog"); + + //鯖別レシピが実装されたら + logger.trace("hardrecipe:" + ConfigLoader.getHardRecipe()); + Iterator it = SignDefinition.sign_materials.iterator(); + while(it.hasNext()){ + Material mat = it.next(); + logger.trace("signRecipi name:" + mat); + + ShapedRecipe storageSignRecipe = new ShapedRecipe(new NamespacedKey(this, "ssr" + mat.toString()), + StorageSign.emptySign(mat)); + //ShapedRecipe storageSignRecipe = new ShapedRecipe(StorageSign.emptySign()); + storageSignRecipe.shape("CCC", "CSC", "CHC"); + storageSignRecipe.setIngredient('C', Material.CHEST); + storageSignRecipe.setIngredient('S', mat); + + if (ConfigLoader.getHardRecipe()) { + storageSignRecipe.setIngredient('H', Material.ENDER_CHEST); + } else { + storageSignRecipe.setIngredient('H', Material.CHEST); + } + + // レシピのグループを設定する + storageSignRecipe.setCategory(CraftingBookCategory.MISC); + storageSignRecipe.setGroup("StorageSign"); + + getServer().addRecipe(storageSignRecipe); + logger.trace(mat + "StorageSign Recipe added."); } - @EventHandler - public void onSignChange(SignChangeEvent event) { - if (event.isCancelled())return; - Sign sign = (Sign) event.getBlock().getState(); - - if (sign.getLine(0).matches("StorageSign"))/*変更拒否*/ { - event.setLine(0, sign.getLine(0)); - event.setLine(1, sign.getLine(1)); - event.setLine(2, sign.getLine(2)); - event.setLine(3, sign.getLine(3)); - sign.update(); - } else if (event.getLine(0).equalsIgnoreCase("storagesign"))/*書き込んで生成禁止*/ { - if (event.getPlayer().hasPermission("storagesign.create")) { - event.setLine(0, "StorageSign"); - sign.update(); - } else { - event.getPlayer().sendMessage(ChatColor.RED + config.getString("no-permisson")); - event.setCancelled(true); - } - } + logger.trace("setEvent"); + boolean isPaper = false; + try { + Class.forName("io.papermc.paper.event.player.PlayerOpenSignEvent"); + isPaper = true; + logger.info("ServerType:Paper"); + } catch (ClassNotFoundException e) { + // Spigotの場合確定で起きるので、無視する + logger.info("ServerType:Spigot"); } + getServer().getPluginManager().registerEvents(this, this); - @EventHandler(priority = EventPriority.HIGH) - public void onBlockBreak(BlockBreakEvent event) { - if (event.isCancelled()) return; - Block block = event.getBlock(); - Map breakSignMap = new HashMap<>(); - if (isStorageSign(block)) breakSignMap.put(block.getLocation(), new StorageSign((Sign)block.getState(),block.getType())); + // Paper専用ハンドラの設定 + if(isPaper) { + PaperSSEvent event = new PaperSSEvent(); + event.init(logger); + getServer().getPluginManager().registerEvents(event, this); + } else { + SpigotSSEvent event = new SpigotSSEvent(); + event.init(logger); + getServer().getPluginManager().registerEvents(event, this); + } - for (int i=0; i<5; i++) {//東西南北で判定 - BlockFace[] face = {BlockFace.UP,BlockFace.SOUTH,BlockFace.NORTH,BlockFace.EAST,BlockFace.WEST}; - block = event.getBlock().getRelative(face[i]); - if (i==0 && isSignPost(block) && isStorageSign(block)) breakSignMap.put(block.getLocation(), new StorageSign((Sign)block.getState(),block.getType())); - else if(isWallSign(block) && ((WallSign) block.getBlockData()).getFacing() == face[i] && isStorageSign(block)) breakSignMap.put(block.getLocation(), new StorageSign((Sign)block.getState(),block.getType())); - } - if (breakSignMap.isEmpty()) return; - if (!event.getPlayer().hasPermission("storagesign.break")) { - event.getPlayer().sendMessage(ChatColor.RED + config.getString("no-permisson")); - event.setCancelled(true); - return; + logger.trace("no-bud:" + ConfigLoader.getNoBud()); + if (ConfigLoader.getNoBud()) { + logger.trace("no-bud is True."); + new SignPhysicsEvent(this, logger); + } + _fallingBlockSS = ConfigLoader.getFallingBlockItemSs(); + + // storageSignNBT.configのセットアップ + StorageSignNBTConfig ssConfigClass = new StorageSignNBTConfig(this); + ssConfigClass.init(); + + String version = Bukkit.getBukkitVersion().split("-")[0]; + String nbt = ssConfigClass.getOminousBannerNBT(version); + + // バナーデバッグが入ってる場合は、アイテムスタックを設定しない + if(!ConfigLoader.getBannerDebug()) { + ItemStack stack = Bukkit.getItemFactory().createItemStack(nbt); + ominousBannerMeta = (BannerMeta) stack.getItemMeta(); + } + + logger.debug("★onEnable:End"); + } + + @Override + public void onDisable() { + } + + + + + public boolean isHorseEgg(ItemStack item) { + logger.debug("isHorseEgg: Start"); + if (item.getType() != Material.GHAST_SPAWN_EGG) { + logger.debug("This item isn't HorseEgg."); + return false; + } + if (item.getItemMeta().hasLore()) { + logger.debug("This item is HorseEgg."); + return true; + } + + logger.debug("This item isn't HorseEgg."); + return false; + } + + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + logger.debug("★onPlayerInteract: Start"); + Player player = event.getPlayer(); + Block block; + + // デバッグオプション入ってる場合は、バナーのItemMetaを取得する + if(ConfigLoader.getBannerDebug()){ + ItemStack banItem = event.getItem(); + logger.trace("bannerMeta:" + banItem.getItemMeta().getAsString()); + } + + logger.trace("event.useInteractedBlock() == Result.DENY :" + (event.useInteractedBlock() + == Result.DENY)); + logger.trace("event.getAction() == Action.RIGHT_CLICK_AIR:" + (event.getAction() + == Action.RIGHT_CLICK_AIR)); + //手持ちがブロックだと叩いた看板を取得できないことがあるとか + if (event.useInteractedBlock() == Result.DENY && event.getAction() == Action.RIGHT_CLICK_AIR) { + try { + logger.debug("try getTargetBlock."); + block = player.getTargetBlock((Set) null, 3); + } catch (IllegalStateException ex) { + java.util.logging.Logger log = logger.getLogger(); + log.log(Level.SEVERE, "★getTargetBlock is Error. Trace", ex); + return; + } + } else { + logger.debug("ClickedBlock :" + event.getClickedBlock()); + block = event.getClickedBlock(); + } + logger.trace("block == null:" + (block == null)); + if (block == null) { + logger.debug("★block is null."); + return; + } + + logger.trace("player.getGameMode() == GameMode.SPECTATOR:" + (player.getGameMode() + == GameMode.SPECTATOR)); + if (player.getGameMode() == GameMode.SPECTATOR) { + logger.debug("★UserGameMode is Spectator."); + return; + } + + logger.trace("event.getAction():" + event.getAction()); + if (event.getAction() == Action.RIGHT_CLICK_BLOCK + || event.getAction() == Action.RIGHT_CLICK_AIR) { + logger.debug("UserAction is RIGHT_CLICK_BLOCK or RIGHT_CLICK_AIR"); + + boolean clickBlockIsSS = StorageSign.isStorageSign(block, logger); + logger.trace("clickBlockIsSS: " + clickBlockIsSS); + if (!clickBlockIsSS) { + logger.debug("★This Block not StorageSign."); + return; + } + if (event.getHand() == EquipmentSlot.OFF_HAND) { + logger.debug("★This hand is OFF_HAND."); + //オフハンドでスニーク動作でSSを触り、かつ持ってるアイテムがSSのときは、看板が張り付かないようにイベントをキャンセルする + boolean offItemIsSS = StorageSign.isStorageSign(event.getItem(), logger); + logger.trace("player.isSneaking(): " + player.isSneaking()); + logger.trace("offItemIsSS: " + offItemIsSS); + if (player.isSneaking() && offItemIsSS) { + event.setUseItemInHand(Result.DENY); + event.setUseInteractedBlock(Result.DENY); } + return; + } + event.setUseItemInHand(Result.DENY); + event.setUseInteractedBlock(Result.DENY); + + logger.trace("!player.hasPermission(\"storagesign.use\"): " + !player.hasPermission( + "storagesign.use")); + if (!player.hasPermission("storagesign.use")) { + logger.debug("★This User hasn't permission.storagesign.use"); + player.sendMessage(ChatColor.BLACK + ConfigLoader.getNoPermission()); + event.setCancelled(true); + return; + } + Sign sign = (Sign) block.getState(); + StorageSign storageSign = new StorageSign(sign, block.getType(), logger); + ItemStack itemMainHand = event.getItem(); + Material mat; - for (Location loc : breakSignMap.keySet()) { - StorageSign sign = breakSignMap.get(loc); - Location loc2 = loc; - loc2.add(0.5, 0.5, 0.5);//中心にドロップさせる - loc.getWorld().dropItem(loc2, sign.getStorageSign()); - loc.getBlock().setType(Material.AIR); + logger.debug("Check Event Type."); + logger.trace("sign: " + sign); + logger.trace("storageSign: " + storageSign); + logger.trace("itemMainHand: " + itemMainHand); + logger.trace("storageSign.getMaterial() == null: " + (storageSign.getMaterial() == null)); + logger.trace("storageSign.getMaterial() == Material.AIR: " + (storageSign.getMaterial() + == Material.AIR)); + //アイテム登録 + logger.debug("check Item Regist."); + if (storageSign.getMaterial() == null || storageSign.getMaterial() == Material.AIR) { + logger.debug("SS Material Regist."); + logger.trace("itemMainHand:" + itemMainHand); + logger.trace("itemMainHand == null: " + (itemMainHand == null)); + if (itemMainHand == null) { + logger.debug("★User MainHand is Null."); + //申し訳ないが素手はNG + return; } - } + mat = itemMainHand.getType(); + boolean mainHandIsSS = StorageSign.isStorageSign(itemMainHand, logger); + boolean mainHandIsHE = isHorseEgg(itemMainHand); + logger.trace("isStorageSign(itemMainHand): " + mainHandIsSS); + logger.trace("isHorseEgg(itemMainHand): " + mainHandIsHE); + logger.trace("mat: " + mat); + if (mainHandIsSS) { + logger.debug("main hand has StorageSign."); + storageSign.setMaterial(mat); + storageSign.setDamage((short) 1); + } else if (mainHandIsHE) { + logger.debug("main hand has HorseEgg."); + storageSign.setMaterial(Material.END_PORTAL); + storageSign.setDamage((short) 1); + } else if (mat == Material.STONE_SLAB) { + logger.debug("main hand has STONE_SLAB."); + storageSign.setMaterial(mat); + storageSign.setDamage((short) 1); + } else if (mat == Material.POTION || mat == Material.SPLASH_POTION + || mat == Material.LINGERING_POTION) { + logger.debug("main hand has PotionSeries."); + storageSign.setMaterial(mat); + PotionMeta potionMeta = (PotionMeta) itemMainHand.getItemMeta(); + PotionType pot = potionMeta.getBasePotionType(); + storageSign.setDamage(Short.parseShort(PotionInfo.getPotionTypeCode(pot))); + storageSign.setPotion(pot); + } else if (mat == Material.OMINOUS_BOTTLE) { + logger.debug("main hand has OMINOUS_BOTTLE."); + storageSign.setMaterial(mat); + storageSign.setDamage(OmniousBottleInfo.GetAmplifierWithMeta(itemMainHand.getItemMeta())); + } else if (mat == Material.ENCHANTED_BOOK) { + logger.debug("main hand has EnchantedBook."); + EnchantmentStorageMeta enchantMeta = (EnchantmentStorageMeta) itemMainHand.getItemMeta(); + if (enchantMeta.getStoredEnchants().size() == 1) { + Enchantment ench = enchantMeta.getStoredEnchants().keySet() + .toArray(new Enchantment[0])[0]; + storageSign.setMaterial(mat); + storageSign.setDamage((short) enchantMeta.getStoredEnchantLevel(ench)); + storageSign.setEnchant(ench); + } + } else if (mat == Material.FIREWORK_ROCKET) { + logger.debug("main hand has FireRocket."); + storageSign.setMaterial(mat); + FireworkMeta fireworkMeta = (FireworkMeta) itemMainHand.getItemMeta(); + short power = (short) fireworkMeta.getPower(); + // 21.4より飛翔1はダメージ設定要らなくなった。 + // 過去のものだとdamage1と0が混在してるので、強制的にダメージを設定しないようにする。 + if(1 < power){ + storageSign.setDamage(power); + } + } else if (mat == Material.WHITE_BANNER) { + logger.debug("main hand has WhiteBanner."); + storageSign.setMaterial(mat); + BannerMeta bannerMeta = (BannerMeta) itemMainHand.getItemMeta(); + if (bannerMeta.getPatterns().size() == 8) { + ominousBannerMeta = bannerMeta;//襲撃バナー登録 + storageSign.setDamage((short) 8); + } + } else { + logger.debug("main hand has " + mat); + storageSign.setMaterial(mat); + var meta = itemMainHand.getItemMeta(); - @EventHandler - public void onBlockPlace(BlockPlaceEvent event) { - if (event.isCancelled() || !isStorageSign(event.getItemInHand())) return; - Player player = event.getPlayer(); - if (!player.hasPermission("storagesign.place")) { - player.sendMessage(ChatColor.RED + config.getString("no-permisson")); - event.setCancelled(true); - return; + logger.trace("meta instanceof Damageable dam" + (meta instanceof Damageable dam)); + if (meta instanceof Damageable dam) { + logger.debug("This Item has Damage.damage:" + dam.getDamage()); + storageSign.setDamage((short) dam.getDamage()); + } } - StorageSign storageSign = new StorageSign(event.getItemInHand()); - Sign sign = (Sign)event.getBlock().getState(); - for (int i=0; i<4; i++) sign.setLine(i, storageSign.getSigntext(i)); - - if(storageSign.getSmat() == Material.DARK_OAK_SIGN ) { - sign.setColor(DyeColor.WHITE);//文字色を白くする + + logger.debug("SignTextUpdate."); + for (int i = 0; i < 4; i++) { + logger.trace(" [i]:" + i + ". signText:" + storageSign.getSigntext(i)); + sign.getSide(Side.FRONT).setLine(i, storageSign.getSigntext(i)); } sign.update(); - player.closeInventory();//時差発動が必要らしい - } - - - @EventHandler - public void onItemMove(InventoryMoveItemEvent event) { - if (event.isCancelled()) return; - BlockState[] blockInventory =new BlockState[2]; - Boolean flag = false; - Sign sign = null; - StorageSign storageSign = null; - ItemStack item = event.getItem(); - if (config.getBoolean("auto-import")) { - if (event.getDestination().getLocation() == null);//コンポスター用に生成された一時インベントリ - else if (event.getDestination().getHolder() instanceof Minecart);//何もしない - else if (event.getDestination().getHolder() instanceof DoubleChest) { - DoubleChest lc = (DoubleChest)event.getDestination().getHolder(); - blockInventory[0] = (BlockState) lc.getLeftSide(); - blockInventory[1] = (BlockState) lc.getRightSide(); - } else { - blockInventory[0] = (BlockState) event.getDestination().getHolder(); + + logger.debug("★ItemRegist: End"); + return; + } + + boolean isStorageSign = StorageSign.isStorageSign(itemMainHand, logger); + logger.trace("isStorageSign:" + isStorageSign); + if (isStorageSign) { + //看板合成 + logger.debug("Item move to User StorageSign"); + StorageSign itemSign = new StorageSign(itemMainHand, logger); + logger.trace("itemSign:" + itemSign); + logger.trace("storageSign.getContents().isSimilar(itemSign.getContents()) && config.getBoolean(\n" + + " \"manual-import\"):" + (storageSign.getContents().isSimilar(itemSign.getContents()) && ConfigLoader.getManualImport())); + logger.trace("itemSign.isEmpty() && storageSign.getAmount() > itemMainHand.getAmount()\n" + + " && config.getBoolean(\"manual-export\")" + (itemSign.isEmpty() && storageSign.getAmount() > itemMainHand.getAmount() + && ConfigLoader.getManualExport())); + if (storageSign.getContents().isSimilar(itemSign.getContents()) && ConfigLoader.getManualImport()) { + logger.debug("Sign store Items."); + storageSign.addAmount(itemSign.getAmount() * itemSign.getStackSize()); + itemSign.setAmount(0); + player.getInventory().setItemInMainHand(itemSign.getStorageSign()); + } else if (itemSign.isEmpty() && storageSign.getMaterial() == itemSign.getSmat() + && storageSign.getDamage() == 1 && ConfigLoader.getManualImport()) { + //空看板収納 + logger.debug("Empty Sign store."); + logger.trace("player.isSneaking()" + player.isSneaking()); + if (player.isSneaking()) { + logger.debug("Player is Sneaking."); + storageSign.addAmount(itemMainHand.getAmount()); + player.getInventory().clear(player.getInventory().getHeldItemSlot()); + } else { + logger.debug("store all Empty Sign.SearchPlayer Inventory."); + // アイテム内でサインを探す + for (int i = 0; i < player.getInventory().getSize(); i++) { + ItemStack item = player.getInventory().getItem(i); + boolean isSimilar = storageSign.isSimilar(item); + logger.trace("storageSign.isSimilar(item)" + isSimilar); + if (isSimilar) { + logger.debug("find Empty Sign."); + storageSign.addAmount(item.getAmount()); + player.getInventory().clear(i); + } } + } + } else if (itemSign.isEmpty() && storageSign.getAmount() > itemMainHand.getAmount() + && ConfigLoader.getManualExport()) { + //中身分割機能 + logger.debug("Export Item to Empty Sign."); + itemSign.setMaterial(storageSign.getMaterial()); + itemSign.setDamage(storageSign.getDamage()); + itemSign.setEnchant(storageSign.getEnchant()); + itemSign.setPotion(storageSign.getPotion()); + + int limit; + if (player.isSneaking()){ + limit = ConfigLoader.getSneakDivideLimit(); + } else { + limit = ConfigLoader.getDivideLimit(); + } + + logger.trace("limit > 0 && storageSign.getAmount() > limit * (itemSign.getStackSize() + 1)" + (limit > 0 && storageSign.getAmount() > limit * (itemSign.getStackSize() + 1))); + if (limit > 0 && storageSign.getAmount() > limit * (itemSign.getStackSize() + 1)) { + logger.debug("Item Export EmptySign divide-limit."); + itemSign.setAmount(limit); + } else { + logger.debug("Item Export EmptySign Equality divide."); + itemSign.setAmount(storageSign.getAmount() / (itemSign.getStackSize() + 1)); + } + player.getInventory().setItemInMainHand(itemSign.getStorageSign()); + //余りは看板に引き受けてもらう + storageSign.setAmount(storageSign.getAmount() - (itemSign.getStackSize() + * itemSign.getAmount())); + } + logger.debug("Update StorageSign."); + for (int i = 0; i < 4; i++) { + logger.trace("set Line i:" + i + ". Text: " + storageSign.getSigntext(i)); + sign.getSide(Side.FRONT).setLine(i, storageSign.getSigntext(i)); + } + sign.update(); + logger.debug("★Item move to User StorageSign: End"); + return; + } + + //ここから搬入 + boolean isMainSimiller = storageSign.isSimilar(itemMainHand); + logger.debug("check manual Import."); + logger.trace("storageSign.isSimilar(itemMainHand): " + isMainSimiller); + logger.trace("config.getBoolean(\"manual-import\"): " + ConfigLoader.getManualImport()); + logger.trace("config.getBoolean(\"manual-export\"): " + ConfigLoader.getManualExport()); + if (isMainSimiller) { + logger.debug("StorageSign Import."); - importLoop: - for (int j=0; j<2; j++) { - if (blockInventory[j] == null) break; - for (int i=0; i<5; i++) { - BlockFace[] face = {BlockFace.UP,BlockFace.SOUTH,BlockFace.NORTH,BlockFace.EAST,BlockFace.WEST}; - Block block = blockInventory[j].getBlock().getRelative(face[i]); - if (i==0 && isSignPost(block) && isStorageSign(block)) { - if(item.getType() == Material.WHITE_BANNER) { - // - //襲撃バナー用 - // - } - sign = (Sign) block.getState(); - storageSign = new StorageSign(sign,block.getType()); - if (storageSign.isSimilar(item)) { - flag = true; - break importLoop; - } - } else if (i != 0 && isWallSign(block) && ((WallSign) block.getBlockData()).getFacing() == face[i] && isStorageSign(block)) { - sign = (Sign) block.getState(); - storageSign = new StorageSign(sign,block.getType()); - if (storageSign.isSimilar(item)) { - flag = true; - break importLoop; - } - } - } - } - //搬入先が見つかった(搬入するとは言ってない) - if (flag) importSign(sign, storageSign, item, event.getDestination()); + logger.trace("!config.getBoolean(\"manual-import\"): " + !ConfigLoader.getManualImport()); + if (!ConfigLoader.getManualImport()) { + logger.debug("★option:manual-import is False!"); + return; } + logger.trace("player.isSneaking():" + player.isSneaking()); + if (player.isSneaking()) { + logger.debug("player is Sneaking.Push 1 Item."); + storageSign.addAmount(itemMainHand.getAmount()); + player.getInventory().clear(player.getInventory().getHeldItemSlot()); - //搬出用にリセット - if (config.getBoolean("auto-export")) { - blockInventory[0] = null; - blockInventory[1] = null; - flag = false; - if (event.getSource().getLocation() == null);//一時インベントリ - else if (event.getSource().getHolder() instanceof Minecart); - else if (event.getSource().getHolder() instanceof DoubleChest) { - DoubleChest lc = (DoubleChest)event.getSource().getHolder(); - blockInventory[0] = (BlockState) lc.getLeftSide(); - blockInventory[1] = (BlockState) lc.getRightSide(); - } else { - blockInventory[0] = (BlockState) event.getSource().getHolder(); + logger.trace("isDye(itemMainHand):" + isDye(itemMainHand)); + logger.trace("isSac(itemMainHand):" + isSac(itemMainHand)); + if (isDye(itemMainHand)) { + logger.debug("mainHandItem is Dye."); + sign.getSide(Side.FRONT).setColor(getDyeColor(itemMainHand)); //同色用 + } + if (isSac(itemMainHand)) { + logger.debug("mainHandItem is Sac."); + sign.getSide(Side.FRONT).setGlowingText(isGlowSac(itemMainHand)); //イカスミ用 + } + } else { + logger.debug("push Stack Item."); + for (int i = 0; i < player.getInventory().getSize(); i++) { + ItemStack item = player.getInventory().getItem(i); + boolean itemSimilar = storageSign.isSimilar(item); + logger.trace(" item: " + item); + logger.trace(" storageSign.isSimilar(item): " + itemSimilar); + if (itemSimilar) { + logger.debug(" same Item Found.Push Item to StorageSign."); + storageSign.addAmount(item.getAmount()); + player.getInventory().clear(i); } + } + logger.debug("push Stack Item.End."); + } + + player.updateInventory(); + } else if (ConfigLoader.getManualExport())/*放出*/ { + logger.debug("Export StorageSign Item."); - exportLoop: - for (int j=0; j<2; j++) { - if (blockInventory[j] == null) break; - for (int i=0; i<5; i++) { - BlockFace[] face = {BlockFace.UP,BlockFace.SOUTH,BlockFace.NORTH,BlockFace.EAST,BlockFace.WEST}; - Block block = blockInventory[j].getBlock().getRelative(face[i]); - if (i==0 && isSignPost(block) && isStorageSign(block)) { - sign = (Sign) block.getState(); - storageSign = new StorageSign(sign,block.getType()); - if (storageSign.isSimilar(item)) { - flag = true; - break exportLoop; - } - } else if (i != 0 && isWallSign(block) && ((WallSign) block.getBlockData()).getFacing() == face[i] && isStorageSign(block)) { - sign = (Sign) block.getState(); - storageSign = new StorageSign(sign,block.getType()); - if (storageSign.isSimilar(item)) { - flag = true; - break exportLoop; - } - } - } - } - if (flag) exportSign(sign, storageSign, item, event.getSource(), event.getDestination()); + boolean isDye = false; + boolean isSac = false; + if (itemMainHand != null){ + isDye = isDye(itemMainHand); + isSac = isSac(itemMainHand); } - } + logger.trace("itemMainHand:" + itemMainHand); + logger.trace("itemMainHand != null && isDye:" + (itemMainHand != null && isDye)); + logger.trace("itemMainHand != null && isSac:" + (itemMainHand != null && isSac)); + //染料の場合、放出せずに看板に色がつく + if (itemMainHand != null && isDye) { + logger.debug("★Set SignColor."); + event.setUseItemInHand(Result.ALLOW); + //最初にDENYにしてたので戻す、同色染料が使えない。 + event.setUseInteractedBlock(Result.ALLOW); + return; + } else if (itemMainHand != null && isSac) { + logger.debug("★Set Sac."); + event.setUseItemInHand(Result.ALLOW); + event.setUseInteractedBlock(Result.ALLOW); + return; + } else if (storageSign.isEmpty()) { + logger.debug("★StorageSign is Empty."); + return; + } + ItemStack item = storageSign.getContents(); + int max = item.getMaxStackSize(); - private void importSign(Sign sign, StorageSign storageSign, ItemStack item, Inventory inv) { - //搬入 条件 1スタック以上アイテムが入っている - if (inv.containsAtLeast(item, item.getMaxStackSize())) { - inv.removeItem(item); - storageSign.addAmount(item.getAmount()); + logger.trace("player.isSneaking(): " + player.isSneaking()); + logger.trace("storageSign.getAmount() > max: " + (storageSign.getAmount() > max)); + if (player.isSneaking()) { + logger.debug("Player is Sneaking.Get 1 Item."); + storageSign.addAmount(-1); + } else if (storageSign.getAmount() > max) { + logger.debug("Sign Items bigger than 1Stack.Get 1Stack Items."); + item.setAmount(max); + storageSign.addAmount(-max); + } else { + logger.debug("Get 1Stack Items."); + item.setAmount(storageSign.getAmount()); + storageSign.setAmount(0); } - for (int i=0; i<4; i++) sign.setLine(i, storageSign.getSigntext(i)); - sign.update(); + + logger.debug("drop Item."); + Location loc = player.getLocation(); + loc.setY(loc.getY() + 0.5); + player.getWorld().dropItem(loc, item); + } + + logger.debug("SetSignText."); + for (int i = 0; i < 4; i++) { + logger.trace(" set Line i:" + i + ". Text: " + storageSign.getSigntext(i)); + sign.getSide(Side.FRONT).setLine(i, storageSign.getSigntext(i)); + } + + logger.debug("update Sign."); + sign.update(); } - //搬出先ブロックに枠指定があると事故る - private void exportSign(Sign sign, StorageSign storageSign, ItemStack item, Inventory inv, Inventory dest) { - if (!inv.containsAtLeast(item, item.getMaxStackSize()) && storageSign.getAmount() >= item.getAmount()) { - int stacks = 0; - int amount = 0; - ItemStack[] contents = dest.getContents(); - - if(dest.getType() == InventoryType.BREWING){ - switch(item.getType()){ - case NETHER_WART://上 - case SUGAR: - case REDSTONE: - case GLOWSTONE_DUST: - case GUNPOWDER: - case RABBIT_FOOT: - case GLISTERING_MELON_SLICE: - case GOLDEN_CARROT: - case MAGMA_CREAM: - case GHAST_TEAR: - case SPIDER_EYE: - case FERMENTED_SPIDER_EYE: - case DRAGON_BREATH: - case PUFFERFISH: - case TURTLE_HELMET: - case PHANTOM_MEMBRANE: - if(inv.getLocation().getBlockY() > dest.getLocation().getBlockY()){//上から搬入 - if(contents[3] != null && !item.isSimilar(contents[3])) return;//他のアイテムが詰まってる - else break; - }else return; - - - case BLAZE_POWDER://横or上 - if(inv.getLocation().getBlockY() > dest.getLocation().getBlockY()){//上から搬入 - if(contents[3] != null && !item.isSimilar(contents[3])) return;//他のアイテムが詰まってる - else break; - }else if(inv.getLocation().getBlockY() == dest.getLocation().getBlockY()){//横 - if(contents[4] != null && contents[4].getAmount() == 64) return;//パウダー詰まり - else break; - }else return; - - case POTION: - case SPLASH_POTION: - case LINGERING_POTION://横or下 - if(inv.getLocation().getBlockY() <= dest.getLocation().getBlockY()){ - if(contents[0] != null && contents[1] != null && contents[2] != null) return; - else break; - }else return; - default://ロスト回避 - return; - - } - - - }else if(dest.getType() == InventoryType.FURNACE || dest.getType() == InventoryType.BLAST_FURNACE || dest.getType() == InventoryType.SMOKER){ - if(inv.getLocation().getBlockY() > dest.getLocation().getBlockY()){//上から搬入 - if(contents[0] != null && !item.isSimilar(contents[0])) return;//他のアイテムが詰まってる - }else{//横から(下から) - if(!item.getType().isFuel() || contents[1] != null && !item.isSimilar(contents[1])) return;//燃料以外 or 他のアイテムが詰まってる - } - } - for(int i=0; i< contents.length; i++){//PANPANによるロスト回避 - if(item.isSimilar(contents[i])){ - stacks++; - amount += contents[i].getAmount(); - } - } - if(amount == stacks * item.getMaxStackSize() && dest.firstEmpty() == -1) return; - - - inv.addItem(item); - storageSign.addAmount(-item.getAmount()); - } - for (int i=0; i<4; i++) sign.setLine(i, storageSign.getSigntext(i)); + logger.debug("★onPlayerInteract: End"); + } + + @EventHandler + public void onSignChange(SignChangeEvent event) { + logger.debug("★onSignChangeEvent:Start"); + + logger.trace("event.isCancelled(): " + event.isCancelled()); + if (event.isCancelled()) { + logger.debug("★this Event is Cancelled!"); + return; + } + Sign sign = (Sign) event.getBlock().getState(); + + logger.trace("sign.getSide(Side.FRONT).getLine(0):" + sign.getSide(Side.FRONT).getLine(0)); + if (sign.getSide(Side.FRONT).getLine(0).matches("StorageSign"))/*変更拒否*/ { + event.setLine(0, sign.getSide(Side.FRONT).getLine(0)); + event.setLine(1, sign.getSide(Side.FRONT).getLine(1)); + event.setLine(2, sign.getSide(Side.FRONT).getLine(2)); + event.setLine(3, sign.getSide(Side.FRONT).getLine(3)); + sign.update(); + } else if (event.getLine(0).equalsIgnoreCase("storagesign"))/*書き込んで生成禁止*/ { + logger.debug("Line 0 Str is storagesign"); + + logger.trace("event.getPlayer().hasPermission(\"storagesign.create\")" + event.getPlayer().hasPermission("storagesign.create")); + if (event.getPlayer().hasPermission("storagesign.create")) { + logger.debug("This user has Permission.storagesign.create. make StorageSign."); + event.setLine(0, "StorageSign"); sign.update(); + } else { + logger.debug("This user hasn't Permission.storagesign.create"); + event.getPlayer().sendMessage(ChatColor.RED + ConfigLoader.getNoPermission()); + event.setCancelled(true); + } + } + logger.debug("★onSignChangeEvent:End"); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onBlockBreak(BlockBreakEvent event) { + logger.debug("★onBlockBreak:Start"); + + logger.trace("event.isCancelled(): " + event.isCancelled()); + if (event.isCancelled()) { + logger.debug("★this Event is Cancelled!"); + return; + } + logger.trace("!event.getPlayer().hasPermission(\"storagesign.break\"): " + !event.getPlayer() + .hasPermission("storagesign.break")); + if (!event.getPlayer().hasPermission("storagesign.break")) { + logger.debug("★This user hasn't Permission. storagesign.break."); + event.getPlayer().sendMessage(ChatColor.RED + ConfigLoader.getNoPermission()); + event.setCancelled(true); + return; } - @EventHandler - public void onPlayerCraft(CraftItemEvent event) { - if (isStorageSign(event.getCurrentItem()) && !event.getWhoClicked().hasPermission("storagesign.craft")) { - ((CommandSender) event.getWhoClicked()).sendMessage(ChatColor.RED + config.getString("no-permisson")); - event.setCancelled(true); + dropRelativeSign(event.getBlock()); + + logger.debug("★onBlockBreak:End."); + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + logger.debug("★onBlockPlace: Start"); + + boolean handItemIsSS = StorageSign.isStorageSign(event.getItemInHand(), logger); + logger.trace("event.isCancelled(): " + event.isCancelled()); + logger.trace("!handItemIsSS: " + !handItemIsSS); + if (event.isCancelled() || !handItemIsSS) { + logger.debug("★this Event is Cancelled!"); + return; + } + Player player = event.getPlayer(); + logger.trace("!player.hasPermission(\"storagesign.place\"): " + !player.hasPermission("storagesign.place")); + if (!player.hasPermission("storagesign.place")) { + logger.debug("★This user hasn't Permission. storagesign.place."); + player.sendMessage(ChatColor.RED + ConfigLoader.getNoPermission()); + event.setCancelled(true); + return; + } + + logger.debug("StorageSign Placed in World."); + StorageSign storageSign = new StorageSign(event.getItemInHand(), logger); + Sign sign = (Sign) event.getBlock().getState(); + for (int i = 0; i < 4; i++) { + logger.trace(" set Line i:" + i + ". Text: " + storageSign.getSigntext(i)); + sign.getSide(Side.FRONT).setLine(i, storageSign.getSigntext(i)); + } + + logger.trace("storageSign.getSmat() == Material.DARK_OAK_SIGN: " + (storageSign.getSmat() == Material.DARK_OAK_SIGN)); + if (storageSign.getSmat() == Material.DARK_OAK_SIGN) { + logger.debug("This Sign is DarkOak Sign.0"); + sign.getSide(Side.FRONT).setColor(DyeColor.WHITE);//文字色を白くする + } + + logger.debug("UpdateSign."); + sign.update(); + + //時差発動が必要らしい + player.closeInventory(); + logger.debug("★onBlockPlace: End"); + } + + @EventHandler + public void onItemMove(InventoryMoveItemEvent event) { + logger.debug("★onItemMove: Start"); + logger.trace("event.isCancelled(): " + event.isCancelled()); + if (event.isCancelled()) { + logger.debug("★this Event is Cancelled!"); + return; + } + + logger.debug("ItemMoveEvent check"); + BlockState[] blockInventory = new BlockState[2]; + Boolean moveFlg = false; + Sign sign = null; + StorageSign storageSign = null; + ItemStack item = event.getItem(); + logger.trace("config.getBoolean(\"auto-import\"): " + ConfigLoader.getAutoImport()); + if (ConfigLoader.getAutoImport()) { + logger.debug("auto-import Start"); + logger.trace("event.getDestination().getLocation(): " + event.getDestination().getLocation()); + logger.trace("event.getDestination().getHolder(): " + event.getDestination().getHolder()); + if (event.getDestination().getLocation() == null){ + logger.debug("This Event is Temp Inventory."); + //コンポスター用に生成された一時インベントリ + } else if (event.getDestination().getHolder() instanceof Minecart){ + //何もしない + logger.debug("This Event is Minecart."); + } else if (event.getDestination().getHolder() instanceof DoubleChest) { + logger.debug("This Event is DoubleChest."); + DoubleChest lc = (DoubleChest) event.getDestination().getHolder(); + blockInventory[0] = (BlockState) lc.getLeftSide(); + blockInventory[1] = (BlockState) lc.getRightSide(); + } else if (!(event.getDestination().getHolder() instanceof BlockState)){ + //ブロック情報が取得できない場合も何もしない + logger.debug("This Event not get BlockState."); + } else { + logger.debug("BlockState Set."); + blockInventory[0] = (BlockState) event.getDestination().getHolder(); + logger.trace("blockInventory[0]: " + blockInventory[0]); + } + + logger.debug("importLoop Start."); + importLoop: + for (int j = 0; j < 2; j++) { + logger.trace("j: " + j); + logger.trace("blockInventory[j]: " + blockInventory[j]); + if (blockInventory[j] == null) { + logger.debug("This Inventory is NULL."); + break; + } + logger.debug("BlockFaceCheck Start."); + for (int i = 0; i < 5; i++) { + BlockFace[] face = {BlockFace.UP, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.EAST, + BlockFace.WEST}; + Block block = blockInventory[j].getBlock().getRelative(face[i]); + boolean relIsSignPost = SignDefinition.sign_materials.contains(block.getType()); + boolean relIsStorageSign = StorageSign.isStorageSign(block, logger); + boolean relIsWallSign = SignDefinition.wall_sign_materials.contains(block.getType()); + logger.trace("blockInventory[j].getBlock(): "+ blockInventory[j].getBlock()); + logger.trace("i: " + i); + logger.trace("face[i]: " + face[i]); + logger.trace("block: " + block); + logger.trace("relIsSignPost: " + relIsSignPost); + logger.trace("relIsStorageSign: " + relIsStorageSign); + logger.trace("relIsWallSign: " + relIsWallSign); + if (relIsWallSign) { + logger.trace("((WallSign) block.getBlockData()).getFacing(): " + + ((WallSign) block.getBlockData()).getFacing()); + } + if (i == 0 && relIsSignPost && relIsStorageSign) { + if (item.getType() == Material.WHITE_BANNER) { + // + //襲撃バナー用 + // + } + sign = (Sign) block.getState(); + storageSign = new StorageSign(sign, block.getType(), logger); + logger.trace("storageSign.isSimilar(item): " + storageSign.isSimilar(item)); + if (storageSign.isSimilar(item)) { + logger.debug("This item is StorageSign.break."); + moveFlg = true; + break importLoop; + } + } else if (i != 0 && relIsWallSign + && ((WallSign) block.getBlockData()).getFacing() == face[i] && relIsStorageSign) { + sign = (Sign) block.getState(); + storageSign = new StorageSign(sign, block.getType(), logger); + logger.trace("storageSign.isSimilar(item): " + storageSign.isSimilar(item)); + if (storageSign.isSimilar(item)) { + logger.debug("This item is StorageSign.break."); + moveFlg = true; + break importLoop; + } + } } + } + //搬入先が見つかった(搬入するとは言ってない) + if (moveFlg) { + logger.debug("Import Sign."); + importSign(sign, storageSign, item, event.getDestination()); + } } - @EventHandler - public void onInventoryPickup(InventoryPickupItemEvent event) {//ホッパーに投げ込まれたとき - if (event.isCancelled() || !config.getBoolean("auto-import")) return; - - InventoryHolder holder = event.getInventory().getHolder(); - if (holder instanceof BlockState) { - Sign sign = null; - StorageSign storageSign = null; - boolean flag = false; - for (int i=0; i<5; i++) { - BlockFace[] face = {BlockFace.UP,BlockFace.SOUTH,BlockFace.NORTH,BlockFace.EAST,BlockFace.WEST}; - Block block = ((BlockState)holder).getBlock().getRelative(face[i]); - if (i==0 && isSignPost(block) && isStorageSign(block)) { - sign = (Sign) block.getState(); - storageSign = new StorageSign(sign,block.getType()); - if (storageSign.isSimilar(event.getItem().getItemStack())) { - flag = true; - break; - } - } else if (i != 0 && isWallSign(block) && ((WallSign) block.getBlockData()).getFacing() == face[i] && isStorageSign(block)) {//BlockFaceに変更?(めんどい) - sign = (Sign) block.getState(); - storageSign = new StorageSign(sign,block.getType()); - if (storageSign.isSimilar(event.getItem().getItemStack())) { - flag = true; - break; - } - } + //搬出用にリセット + logger.debug("config.getBoolean(\"auto-export\"): " + ConfigLoader.getAutoExport()); + if (ConfigLoader.getAutoExport()) { + blockInventory[0] = null; + blockInventory[1] = null; + moveFlg = false; + logger.trace("event.getSource(): " + event.getSource()); + logger.trace("event.getSource().getLocation(): " + event.getSource().getLocation()); + logger.trace("event.getSource().getHolder(): " + event.getSource().getHolder()); + if (event.getSource().getLocation() == null){ + //一時インベントリ + logger.debug("This Event is Temp Inventory."); + } else if (event.getSource().getHolder() instanceof Minecart){ + logger.debug("This Event is Minecart."); + } else if (event.getSource().getHolder() instanceof DoubleChest lc) { + logger.debug("This Event is DoubleChest."); + blockInventory[0] = (BlockState) lc.getLeftSide(); + blockInventory[1] = (BlockState) lc.getRightSide(); + } else if (!(event.getSource().getHolder() instanceof BlockState)){ + //ブロック情報が取得できない時も何もしない + logger.debug("This Event not get BlockState."); + } else { + logger.debug("BlockState Set."); + blockInventory[0] = (BlockState) event.getSource().getHolder(); + logger.trace("blockInventory[0]: " + blockInventory[0]); + } + + Block block = null; + exportLoop: + for (int j = 0; j < 2; j++) { + logger.trace("j: " + j); + logger.trace("blockInventory[j]: " + blockInventory[j]); + if (blockInventory[j] == null) { + break; + } + for (int i = 0; i < 5; i++) { + BlockFace[] face = {BlockFace.UP, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.EAST, + BlockFace.WEST}; + block = blockInventory[j].getBlock().getRelative(face[i]); + boolean relIsSignPost = SignDefinition.sign_materials.contains(block.getType()); + boolean relIsStorageSign = StorageSign.isStorageSign(block, logger); + boolean relIsWallSign = SignDefinition.wall_sign_materials.contains(block.getType()); + logger.trace("blockInventory[j].getBlock(): "+ blockInventory[j].getBlock()); + logger.trace("i: " + i); + logger.trace("face[i]: " + face[i]); + logger.trace("block: " + block); + logger.trace("relIsSignPost: " + relIsSignPost); + logger.trace("relIsStorageSign: " + relIsStorageSign); + logger.trace("relIsWallSign: " + relIsWallSign); + if (relIsWallSign) { + logger.trace("((WallSign) block.getBlockData()).getFacing(): " + + ((WallSign) block.getBlockData()).getFacing()); + } + if (i == 0 && relIsSignPost && relIsStorageSign) { + sign = (Sign) block.getState(); + storageSign = new StorageSign(sign, block.getType(), logger); + logger.trace("storageSign.isSimilar(item): " + storageSign.isSimilar(item)); + if (storageSign.isSimilar(item)) { + logger.debug("This item is StorageSign.break."); + moveFlg = true; + break exportLoop; } - if (flag) importSign(sign, storageSign, event.getItem().getItemStack(), event.getInventory()); + } else if (i != 0 && relIsWallSign + && ((WallSign) block.getBlockData()).getFacing() == face[i] && relIsStorageSign) { + sign = (Sign) block.getState(); + storageSign = new StorageSign(sign, block.getType(), logger); + logger.trace("storageSign.isSimilar(item): " + storageSign.isSimilar(item)); + if (storageSign.isSimilar(item)) { + logger.debug("This item is StorageSign.break."); + moveFlg = true; + break exportLoop; + } + } + } + } + if (moveFlg) { + logger.debug("Export Sign."); + new ExportSign(item.clone(), event.getSource(), event.getDestination(), event, block, logger).runTask(this); + } + } + logger.debug("★onItemMove:End."); + } + + private void importSign(Sign sign, StorageSign storageSign, ItemStack item, Inventory inv) { + logger.debug("importSign:Start"); + //搬入 条件 1スタック以上アイテムが入っている + logger.trace("inv.containsAtLeast(item, item.getMaxStackSize()): " + inv.containsAtLeast(item, item.getMaxStackSize())); + if (inv.containsAtLeast(item, item.getMaxStackSize())) { + logger.debug("Item is more 1s.Import Item."); + inv.removeItem(item); + storageSign.addAmount(item.getAmount()); + } + for (int i = 0; i < 4; i++) { + logger.trace(" set Line i:" + i + ". Text: " + storageSign.getSigntext(i)); + sign.getSide(Side.FRONT).setLine(i, storageSign.getSigntext(i)); + } + logger.debug("update Sign."); + sign.update(); + } + + @EventHandler + public void onPlayerCraft(CraftItemEvent event) { + logger.debug("★onPlayerCraft:Start"); + logger.trace("isStorageSign(event.getCurrentItem()): " + StorageSign.isStorageSign(event.getCurrentItem(), logger)); + logger.trace("!event.getWhoClicked().hasPermission(\"storagesign.craft\")" + !event.getWhoClicked().hasPermission("storagesign.craft")); + if (StorageSign.isStorageSign(event.getCurrentItem(), logger) && !event.getWhoClicked() + .hasPermission("storagesign.craft")) { + logger.debug("This user hasn't Permission. storagesign.craft."); + ((CommandSender) event.getWhoClicked()).sendMessage( + ChatColor.RED + ConfigLoader.getNoPermission()); + event.setCancelled(true); + } + logger.debug("★onPlayerCraft:End"); + } + + @EventHandler + public void onInventoryPickup(InventoryPickupItemEvent event) {//ホッパーに投げ込まれたとき + logger.debug("★onInventoryPickup:Start"); + logger.trace("event.isCancelled(): " + event.isCancelled()); + logger.trace("!config.getBoolean(\"auto-import\"): " + !ConfigLoader.getAutoImport()); + if (event.isCancelled() || !ConfigLoader.getAutoImport()) { + logger.debug("★eventCancelled or not set permission.auto-import."); + return; + } + + InventoryHolder holder = event.getInventory().getHolder(); + logger.trace("holder: " + holder); + if (holder instanceof BlockState) { + logger.debug("holder has BlockState."); + + Sign sign = null; + StorageSign storageSign = null; + boolean flag = false; + for (int i = 0; i < 5; i++) { + BlockFace[] face = {BlockFace.UP, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.EAST, + BlockFace.WEST}; + Block block = ((BlockState) holder).getBlock().getRelative(face[i]); + boolean relIsSignPost = SignDefinition.sign_materials.contains(block.getType()); + boolean relIsStorageSign = StorageSign.isStorageSign(block, logger); + boolean relIsWallSign = SignDefinition.wall_sign_materials.contains(block.getType()); + logger.trace(" i: " + i); + logger.trace(" relIsSignPost: " + relIsSignPost); + logger.trace(" relIsStorageSign: " + relIsStorageSign); + logger.trace(" relIsWallSign: " + relIsWallSign); + logger.trace(" face[i]: " + face[i]); + if(relIsWallSign) { + logger.trace(" ((WallSign) block.getBlockData()).getFacing() == face[i]: " + ( + ((WallSign) block.getBlockData()).getFacing() == face[i])); + } + if (i == 0 && relIsSignPost && relIsStorageSign) { + logger.debug(" This block is StorageSign."); + sign = (Sign) block.getState(); + storageSign = new StorageSign(sign, block.getType(), logger); + logger.trace(" storageSign.isSimilar(event.getItem().getItemStack()): " + storageSign.isSimilar(event.getItem().getItemStack())); + if (storageSign.isSimilar(event.getItem().getItemStack())) { + logger.debug(" this Item is Import Item."); + flag = true; + break; + } + } else if (i != 0 && relIsWallSign + && ((WallSign) block.getBlockData()).getFacing() == face[i] && relIsStorageSign) { + //BlockFaceに変更?(めんどい) + logger.debug(" This block is WallStorageSign."); + sign = (Sign) block.getState(); + storageSign = new StorageSign(sign, block.getType(), logger); + logger.trace(" storageSign.isSimilar(event.getItem().getItemStack()): " + storageSign.isSimilar(event.getItem().getItemStack())); + if (storageSign.isSimilar(event.getItem().getItemStack())) { + logger.debug(" this Item is Import Item."); + flag = true; + break; + } } + } + if (flag) { + logger.debug("Import Item."); + importSign(sign, storageSign, event.getItem().getItemStack(), event.getInventory()); + } } + logger.debug("★onInventoryPickup:End"); + } - @EventHandler - public void onPlayerPickupItem(EntityPickupItemEvent event) { - if(event.isCancelled()) return; - if(event.getEntityType() == EntityType.PLAYER && config.getBoolean("autocollect")){ - Player player = (Player) event.getEntity(); - PlayerInventory playerInv = player.getInventory(); - ItemStack item = event.getItem().getItemStack(); - StorageSign storagesign = null; - //ここでは、エラーを出さずに無視する - if(!player.hasPermission("storagesign.autocollect")) return; - if(isStorageSign(playerInv.getItemInMainHand())){ - storagesign = new StorageSign(playerInv.getItemInMainHand()); - if(storagesign.getContents() != null){ - - if (storagesign.isSimilar(item) && playerInv.containsAtLeast(item, item.getMaxStackSize()) && storagesign.getStackSize() == 1) { - storagesign.addAmount(item.getAmount()); - - playerInv.removeItem(item);//1.9,10ではバグる? - playerInv.setItemInMainHand(storagesign.getStorageSign()); - player.updateInventory(); - //event.getItem().remove(); - //player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.6f, 1.5f); - //event.setCancelled(true); - return; - } - } - }if(isStorageSign(playerInv.getItemInOffHand())){//メインハンドで回収されなかった時 - storagesign = new StorageSign(playerInv.getItemInOffHand()); - if(storagesign.getContents() != null){ - - if (storagesign.isSimilar(item) && playerInv.containsAtLeast(item, item.getMaxStackSize()) && storagesign.getStackSize() == 1) { - storagesign.addAmount(item.getAmount()); - playerInv.removeItem(item); - playerInv.setItemInOffHand(storagesign.getStorageSign()); - player.updateInventory(); - //event.getItem().remove(); - //player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.6f, 1.5f); - //event.setCancelled(true); - return; - } - } - } - }//SSをプレイヤー以外拾えなくする - if(event.getEntityType() != EntityType.PLAYER){ - Item item = event.getItem(); - if(isStorageSign(item.getItemStack())){ - item.setPickupDelay(20);//毎tickキャンセルしてたら重そう - event.setCancelled(true); - } - } - } - - private boolean isSignPost(Block block) { - Material mat = block.getType(); - return isSignPost(mat); - } - - private boolean isWallSign(Block block) { - Material mat = block.getType(); - return isWallSign(mat); - } - - //看板も8種類になったし、mat版おいとく - private boolean isSignPost(Material mat) { - switch(mat) { - case OAK_SIGN: - case BIRCH_SIGN: - case SPRUCE_SIGN: - case JUNGLE_SIGN: - case ACACIA_SIGN: - case DARK_OAK_SIGN: - case CRIMSON_SIGN: - case WARPED_SIGN: - return true; - default: - } - return false; - } - - private boolean isWallSign(Material mat) { - switch(mat) { - case OAK_WALL_SIGN: - case BIRCH_WALL_SIGN: - case SPRUCE_WALL_SIGN: - case JUNGLE_WALL_SIGN: - case ACACIA_WALL_SIGN: - case DARK_OAK_WALL_SIGN: - case CRIMSON_WALL_SIGN: - case WARPED_WALL_SIGN: - return true; - default: - } - return false; - } - - private boolean isDye(ItemStack item) { - Material mat = item.getType(); - switch(mat) { - case WHITE_DYE: - case ORANGE_DYE: - case MAGENTA_DYE: - case LIGHT_BLUE_DYE: - case YELLOW_DYE: - case LIME_DYE: - case PINK_DYE: - case GRAY_DYE: - case LIGHT_GRAY_DYE: - case CYAN_DYE: - case PURPLE_DYE: - case BLUE_DYE: - case BROWN_DYE: - case GREEN_DYE: - case RED_DYE: - case BLACK_DYE: - return true; - default: - } - return false; - } - - private DyeColor getDyeColor(ItemStack item) { - Material mat = item.getType(); - switch(mat) { - case WHITE_DYE: - return DyeColor.WHITE; - case ORANGE_DYE: - return DyeColor.ORANGE; - case MAGENTA_DYE: - return DyeColor.MAGENTA; - case LIGHT_BLUE_DYE: - return DyeColor.LIGHT_BLUE; - case YELLOW_DYE: - return DyeColor.YELLOW; - case LIME_DYE: - return DyeColor.LIME; - case PINK_DYE: - return DyeColor.PINK; - case GRAY_DYE: - return DyeColor.GRAY; - case LIGHT_GRAY_DYE: - return DyeColor.LIGHT_GRAY; - case CYAN_DYE: - return DyeColor.CYAN; - case PURPLE_DYE: - return DyeColor.PURPLE; - case BLUE_DYE: - return DyeColor.BLUE; - case BROWN_DYE: - return DyeColor.BROWN; - case GREEN_DYE: - return DyeColor.GREEN; - case RED_DYE: - return DyeColor.RED; - case BLACK_DYE: - return DyeColor.BLACK; - default: - } - return null; + @EventHandler + public void onPlayerPickupItem(EntityPickupItemEvent event) { + logger.debug("★onPlayerPickupItem:Start"); + logger.trace("event.isCancelled(): " + event.isCancelled()); + if (event.isCancelled()) { + logger.debug("★Event Cancelled."); + return; } + logger.trace("event.getEntityType(): " + event.getEntityType()); + logger.trace("config.getBoolean(\"autocollect\"): " + ConfigLoader.getAutoCollect()); + if (event.getEntityType() == EntityType.PLAYER && ConfigLoader.getAutoCollect()) { + Player player = (Player) event.getEntity(); + PlayerInventory playerInv = player.getInventory(); + ItemStack item = event.getItem().getItemStack(); + StorageSign storagesign = null; + + logger.trace("!player.hasPermission(\"storagesign.autocollect\"): " + !player.hasPermission("storagesign.autocollect")); + //ここでは、エラーを出さずに無視する + if (!player.hasPermission("storagesign.autocollect")) { + logger.debug("★This user hasn't Permission. storagesign.autocollect."); + return; + } + + boolean mainHandhasSS = StorageSign.isStorageSign(playerInv.getItemInMainHand(), logger); + boolean offHandhasSS = StorageSign.isStorageSign(playerInv.getItemInOffHand(), logger); + logger.trace("mainHandhasSS: " + mainHandhasSS); + logger.trace("offHandisSS: " + offHandhasSS); + logger.debug("check mainHand has SS."); + if (mainHandhasSS) { + logger.debug("MainHand has StorageSign."); + storagesign = new StorageSign(playerInv.getItemInMainHand(), logger); + + logger.trace("storagesign.getContents(): " + storagesign.getContents()); + if (storagesign.getContents() != null) { + logger.debug("This SS is not Empty"); + + logger.trace("storagesign.isSimilar(item): " + storagesign.isSimilar(item)); + logger.trace("playerInv.containsAtLeast(item, item.getMaxStackSize()): " + playerInv.containsAtLeast(item, item.getMaxStackSize())); + logger.trace("storagesign.getStackSize(): " + storagesign.getStackSize()); + if (storagesign.isSimilar(item) && playerInv.containsAtLeast(item, item.getMaxStackSize()) + && storagesign.getStackSize() == 1) { + logger.debug("★Pickup Item to StorageSign."); + storagesign.addAmount(item.getAmount()); + + //1.9,10ではバグる? + playerInv.removeItem(item); + playerInv.setItemInMainHand(storagesign.getStorageSign()); + player.updateInventory(); + //event.getItem().remove(); + //player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.6f, 1.5f); + //event.setCancelled(true); + return; + } + } + } + logger.debug("check offHand has SS."); + if (offHandhasSS) {//メインハンドで回収されなかった時 + logger.debug("OffHand has StorageSign."); + storagesign = new StorageSign(playerInv.getItemInOffHand(), logger); + if (storagesign.getContents() != null) { + logger.debug("This SS is not Empty"); + + logger.trace("storagesign.isSimilar(item): " + storagesign.isSimilar(item)); + logger.trace("playerInv.containsAtLeast(item, item.getMaxStackSize()): " + playerInv.containsAtLeast(item, item.getMaxStackSize())); + logger.trace("storagesign.getStackSize(): " + storagesign.getStackSize()); + if (storagesign.isSimilar(item) && playerInv.containsAtLeast(item, item.getMaxStackSize()) + && storagesign.getStackSize() == 1) { + logger.debug("★Pickup Item to StorageSign."); + storagesign.addAmount(item.getAmount()); + playerInv.removeItem(item); + playerInv.setItemInOffHand(storagesign.getStorageSign()); + player.updateInventory(); + //event.getItem().remove(); + //player.playSound(player.getLocation(), Sound.ENTITY_ITEM_PICKUP, 0.6f, 1.5f); + //event.setCancelled(true); + return; + } + } + } + } + //SSをプレイヤー以外拾えなくする + if (event.getEntityType() != EntityType.PLAYER) { + logger.debug("This Entity isn't Player."); + Item item = event.getItem(); + + boolean isStorageSign = StorageSign.isStorageSign(item.getItemStack(), logger); + logger.trace("isStorageSign(item.getItemStack()): " + isStorageSign); + if (isStorageSign) { + logger.debug("Delay Picked Entity StorageSign."); + item.setPickupDelay(20);//毎tickキャンセルしてたら重そう + event.setCancelled(true); + } + } + logger.debug("★onPlayerPickupItem:End."); + } + + @EventHandler + public void onEntityChangeBlock(EntityChangeBlockEvent event) { + if(_fallingBlockSS){ + logger.debug("★onEntityChangeBlock:Start"); + logger.trace("event.getEntity(): " + event.getEntity()); + if (event.getEntity() instanceof FallingBlock fallingBlock) { + logger.debug("check Falling relativeBlock."); + dropRelativeSign(event.getBlock()); + } + logger.debug("★onEntityChangeBlock:End"); + } + } + + private void dropRelativeSign(Block block) { + logger.debug(" dropRelativeSign:Start"); + Map breakSignMap = new HashMap<>(); + boolean isStorageSign = StorageSign.isStorageSign(block, logger); + logger.trace(" isStorageSign: " + isStorageSign); + if (isStorageSign) { + logger.debug(" breakItem is StorageSign."); + breakSignMap.put(block.getLocation(), + new StorageSign((Sign) block.getState(), block.getType(), logger)); + } + + for (int i = 0; i < 5; i++) {//東西南北で判定 + logger.trace(" i: " + i); + BlockFace[] face = {BlockFace.UP, BlockFace.SOUTH, BlockFace.NORTH, BlockFace.EAST, + BlockFace.WEST}; + Block relBlock = block.getRelative(face[i]); + + boolean relIsSignPost = SignDefinition.sign_materials.contains(relBlock.getType()); + boolean relIsStorageSign = StorageSign.isStorageSign(relBlock, logger); + boolean relIsWallSign = SignDefinition.wall_sign_materials.contains(relBlock.getType()); + logger.trace(" relBlock: " + relBlock); + logger.trace(" relIsSignPost: " + relIsSignPost); + logger.trace(" relIsStorageSign: " + relIsStorageSign); + logger.trace(" relIsWallSign: " + relIsWallSign); + if (i == 0 && relIsSignPost && relIsStorageSign) { + logger.debug(" This Block is StorageSign."); + breakSignMap.put(relBlock.getLocation(), + new StorageSign((Sign) relBlock.getState(), relBlock.getType(), logger)); + } else if (relIsWallSign && ((WallSign) relBlock.getBlockData()).getFacing() == face[i] + && relIsStorageSign) { + logger.debug(" This Block is WallStorageSign."); + breakSignMap.put(relBlock.getLocation(), + new StorageSign((Sign) relBlock.getState(), relBlock.getType(), logger)); + } + } + + logger.trace(" breakSignMap.isEmpty(): " + breakSignMap.isEmpty()); + if (breakSignMap.isEmpty()) { + logger.debug(" This Block isn't block StorageSign."); + return; + } + + logger.debug(" Break StorageSign Set Item in World."); + for (Location loc : breakSignMap.keySet()) { + StorageSign sign = breakSignMap.get(loc); + logger.trace(" loc: " + loc); + logger.trace(" sign:" + sign); + + Location loc2 = loc; + loc2.add(0.5, 0.5, 0.5);//中心にドロップさせる + loc.getWorld().dropItem(loc2, sign.getStorageSign()); + loc.getBlock().setType(Material.AIR); + logger.debug(" Storage Sign drop in World."); + } + } + + private boolean isDye(ItemStack item) { + logger.debug(" isDye: Start"); + Material mat = item.getType(); + + logger.trace(" mat: " + mat); + switch (mat) { + case WHITE_DYE: + case ORANGE_DYE: + case MAGENTA_DYE: + case LIGHT_BLUE_DYE: + case YELLOW_DYE: + case LIME_DYE: + case PINK_DYE: + case GRAY_DYE: + case LIGHT_GRAY_DYE: + case CYAN_DYE: + case PURPLE_DYE: + case BLUE_DYE: + case BROWN_DYE: + case GREEN_DYE: + case RED_DYE: + case BLACK_DYE: + return true; + default: + } + return false; + } + + private DyeColor getDyeColor(ItemStack item) { + logger.debug("getDyeColor: Start"); + Material mat = item.getType(); + + logger.trace("mat: " + mat); + switch (mat) { + case WHITE_DYE: + return DyeColor.WHITE; + case ORANGE_DYE: + return DyeColor.ORANGE; + case MAGENTA_DYE: + return DyeColor.MAGENTA; + case LIGHT_BLUE_DYE: + return DyeColor.LIGHT_BLUE; + case YELLOW_DYE: + return DyeColor.YELLOW; + case LIME_DYE: + return DyeColor.LIME; + case PINK_DYE: + return DyeColor.PINK; + case GRAY_DYE: + return DyeColor.GRAY; + case LIGHT_GRAY_DYE: + return DyeColor.LIGHT_GRAY; + case CYAN_DYE: + return DyeColor.CYAN; + case PURPLE_DYE: + return DyeColor.PURPLE; + case BLUE_DYE: + return DyeColor.BLUE; + case BROWN_DYE: + return DyeColor.BROWN; + case GREEN_DYE: + return DyeColor.GREEN; + case RED_DYE: + return DyeColor.RED; + case BLACK_DYE: + return DyeColor.BLACK; + default: + } + return null; + } + + private boolean isSac(ItemStack item) { + logger.debug(" isSac: Start"); + Material mat = item.getType(); + + logger.trace(" mat: " + mat); + switch (mat) { + case INK_SAC: + case GLOW_INK_SAC: + return true; + default: + } + return false; + } + + private boolean isGlowSac(ItemStack item) { + logger.debug(" isSac: Start"); + Material mat = item.getType(); + + logger.trace(" mat: " + mat); + switch (mat) { + case INK_SAC: + return false; + case GLOW_INK_SAC: + return true; + default: + } + return false; + } } \ No newline at end of file diff --git a/src/main/java/wacky/storagesign/client/paper/PaperSSEvent.java b/src/main/java/wacky/storagesign/client/paper/PaperSSEvent.java new file mode 100644 index 0000000..e597026 --- /dev/null +++ b/src/main/java/wacky/storagesign/client/paper/PaperSSEvent.java @@ -0,0 +1,38 @@ +package wacky.storagesign.client.paper; + +import com.github.teruteru128.logger.Logger; +import io.papermc.paper.event.player.PlayerOpenSignEvent; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerSignOpenEvent; +import wacky.storagesign.StorageSign; +import wacky.storagesign.common.StorageSignEventCompoment; + +public class PaperSSEvent implements Listener { + private Logger logger; + public void init(Logger logger){ + this.logger = logger; + } + + @EventHandler + public void onPlayerOpenSign(PlayerOpenSignEvent event){ + logger.debug("★onPlayerOpenSign:Start"); + + logger.trace("event.isCancelled(): " + event.isCancelled()); + if (event.isCancelled()) { + logger.debug("★this Event is Cancelled!"); + return; + } + + Block block = event.getSign().getBlock(); + boolean isStorageSign = StorageSignEventCompoment.isStorageSign(block, logger); + logger.trace("isStorageSign: " + isStorageSign); + if (isStorageSign) { + logger.debug("StorageSignEdit Cancel."); + event.setCancelled(true); + } + + logger.debug("★onPlayerOpenSign:End"); + } +} diff --git a/src/main/java/wacky/storagesign/client/spigot/SpigotSSEvent.java b/src/main/java/wacky/storagesign/client/spigot/SpigotSSEvent.java new file mode 100644 index 0000000..b97eaa7 --- /dev/null +++ b/src/main/java/wacky/storagesign/client/spigot/SpigotSSEvent.java @@ -0,0 +1,37 @@ +package wacky.storagesign.client.spigot; + +import com.github.teruteru128.logger.Logger; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerSignOpenEvent; +import wacky.storagesign.StorageSign; +import wacky.storagesign.common.StorageSignEventCompoment; + +public class SpigotSSEvent implements Listener { + private Logger logger; + public void init(Logger logger){ + this.logger = logger; + } + + @EventHandler + public void onPlayerSignOpen(PlayerSignOpenEvent event){ + logger.debug("★onPlayerSignOpen:Start"); + + logger.trace("event.isCancelled(): " + event.isCancelled()); + if (event.isCancelled()) { + logger.debug("★this Event is Cancelled!"); + return; + } + + Block block = event.getSign().getBlock(); + boolean isStorageSign = StorageSignEventCompoment.isStorageSign(block, logger); + if (isStorageSign) { + logger.debug("StorageSignEdit Cancel."); + event.setCancelled(true); + } + + logger.debug("★onPlayerSignOpen:End"); + } + +} diff --git a/src/main/java/wacky/storagesign/common/StorageSignEventCompoment.java b/src/main/java/wacky/storagesign/common/StorageSignEventCompoment.java new file mode 100644 index 0000000..8c000f4 --- /dev/null +++ b/src/main/java/wacky/storagesign/common/StorageSignEventCompoment.java @@ -0,0 +1,13 @@ +package wacky.storagesign.common; + +import com.github.teruteru128.logger.Logger; +import org.bukkit.block.Block; +import wacky.storagesign.StorageSign; + +public class StorageSignEventCompoment { + public static boolean isStorageSign(Block block, Logger logger) { + boolean isStorageSign = StorageSign.isStorageSign(block, logger); + logger.trace("isStorageSign: " + isStorageSign); + return isStorageSign; + } +} diff --git a/src/main/java/wacky/storagesign/config/StorageSignNBTConfig.java b/src/main/java/wacky/storagesign/config/StorageSignNBTConfig.java new file mode 100644 index 0000000..c07feab --- /dev/null +++ b/src/main/java/wacky/storagesign/config/StorageSignNBTConfig.java @@ -0,0 +1,124 @@ +package wacky.storagesign.config; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.logging.Level; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; + +/** + * key.config用セットアップクラス. + */ +public class StorageSignNBTConfig { + + private static final String PLUGIN_PATH = "plugins/StorageSign"; + private FileConfiguration config = null; + private File configFile; + private String file; + private Plugin plugin; + + + /** + * Pluginだけのコンストラクタ. + */ + public StorageSignNBTConfig(Plugin plugin) { + this(plugin, "storageSignNBT.yml"); + } + + /** + * コンストラクタ. + */ + private StorageSignNBTConfig(Plugin plugin, String fileName) { + this.plugin = plugin; + this.file = fileName; + + // プラグインのパスを受け取って、コンフィグ作成 + FileConfiguration config = plugin.getConfig(); + String path = PLUGIN_PATH; + + configFile = new File(path, file); + } + + /** + * デフォルトのConfigファイルの保存. + */ + public void saveDefaultConfig() { + if (!configFile.exists()) { + saveConfig(); + } + } + + /** + * Configファイルの再読み込み. + */ + public void reloadConfig() { + config = YamlConfiguration.loadConfiguration(configFile); + + final InputStream defConfigStream = plugin.getResource(file); + if (defConfigStream == null) { + return; + } + + config.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defConfigStream, StandardCharsets.UTF_8))); + } + + /** + * Configファイル取得. + */ + public FileConfiguration getConfig() { + if (config == null) { + reloadConfig(); + } + return config; + } + public void saveConfig() { + if (config == null) { + return; + } + try { + getConfig().save(configFile); + } catch (IOException ex) { + plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex); + } + } + + public void init(){ + config = this.getConfig(); + config.options().copyDefaults(true); + // 特性上、何度も上書き処理を走らせたくないため、上書き制御付きのdefaultConfigを呼ぶ + // このファイル自体は子のプラグインでは利用せず、StorageSignでのみ使用 + this.saveDefaultConfig(); + } + + public String getOminousBannerNBT(String version){ + List> l = (List>) config.getMapList("ominusBunner"); + List> list = (List>) (List) l; + + return extractNbtForVersion(l, version).orElse(""); + } + + private static Optional extractNbtForVersion(List> rawList, String version) { + for (Map rawMap : rawList) { + // 安全なキー・値のチェック + if (rawMap.size() != 1) continue; + + Map.Entry entry = rawMap.entrySet().iterator().next(); + + if (!(entry.getKey() instanceof String key) || !(entry.getValue() instanceof String value)) continue; + + if (version.equals(key)) { + return Optional.of(value); + } + } + return Optional.empty(); + } + +} \ No newline at end of file diff --git a/src/main/java/wacky/storagesign/runnnable/ExportSign.java b/src/main/java/wacky/storagesign/runnnable/ExportSign.java new file mode 100644 index 0000000..b7ca1bc --- /dev/null +++ b/src/main/java/wacky/storagesign/runnnable/ExportSign.java @@ -0,0 +1,235 @@ +package wacky.storagesign.runnnable; + +import com.github.teruteru128.logger.Logger; +import java.util.EnumSet; +import java.util.Set; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; +import org.bukkit.event.inventory.InventoryMoveItemEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import wacky.storagesign.StorageSign; + +public class ExportSign extends BukkitRunnable { + + private Logger _logger; + private InventoryMoveItemEvent _event; + private ItemStack _moveItem; + private Inventory _inventory; + private Inventory _destInventory; + private Block _block; + + public ExportSign(ItemStack moveItemStack, Inventory sourceInventory, Inventory destInventory, InventoryMoveItemEvent event, Block block, Logger logger){ + _logger = logger; + _logger.debug("★exportSign:Start."); + _logger.trace("moveItem: " + moveItemStack); + _logger.trace("moveItem.getAmount(): " + moveItemStack.getAmount()); + _logger.trace("sourceInventory.getLocation(): " + sourceInventory.getLocation()); + _moveItem = moveItemStack; + _inventory = sourceInventory; + _destInventory = destInventory; + _event = event; + _block = block; + _logger.debug("★exportSign:End."); + } + /** + * Runs this operation. + */ + @Override + public void run() { + _destInventory = _event.getSource(); + Sign sign = (Sign) _block.getState(); + StorageSign ss = new StorageSign(sign, _block.getType(), _logger);; + + _logger.debug("exportSign:Start."); + _logger.trace("item: " + _moveItem); + _logger.trace("!inv.containsAtLeast(item, item.getMaxStackSize(): " + !_inventory.containsAtLeast(_moveItem, _moveItem.getMaxStackSize())); + _logger.trace("storageSign.getAmount(): " + ss.getAmount()); + _logger.trace("item.getAmount(): " + _moveItem.getAmount()); + if (!_inventory.containsAtLeast(_moveItem, _moveItem.getMaxStackSize()) + && ss.getAmount() >= _moveItem.getAmount()) { + int stacks = 0; + int amount = 0; + ItemStack[] contents = _destInventory.getContents(); + + _logger.trace("dest.getType(): " + _destInventory.getType()); + _logger.trace("item.getType(): " + _moveItem.getType()); + if (_destInventory.getType() == InventoryType.BREWING) { + switch (_moveItem.getType()) { + case NETHER_WART://上 + case SUGAR: + case REDSTONE: + case GLOWSTONE_DUST: + case GUNPOWDER: + case RABBIT_FOOT: + case GLISTERING_MELON_SLICE: + case GOLDEN_CARROT: + case MAGMA_CREAM: + case GHAST_TEAR: + case SPIDER_EYE: + case FERMENTED_SPIDER_EYE: + case DRAGON_BREATH: + case PUFFERFISH: + case TURTLE_HELMET: + case PHANTOM_MEMBRANE: + case BREEZE_ROD: + case SLIME_BLOCK: + case COBWEB: + case STONE: + //上から搬入 + _logger.debug("This item is PHANTOM_MEMBRANE."); + _logger.trace("inv.getLocation().getBlockY()" + _inventory.getLocation().getBlockY()); + _logger.trace("dest.getLocation().getBlockY()" + _destInventory.getLocation().getBlockY()); + _logger.trace("inv.getLocation().getBlockY() > dest.getLocation().getBlockY()" + (_inventory.getLocation().getBlockY() > _destInventory.getLocation().getBlockY())); + _logger.trace("contents[3]: " + contents[3]); + if (_inventory.getLocation().getBlockY() > _destInventory.getLocation().getBlockY()) { + _logger.debug("This item import at up."); + if (contents[3] != null && !_moveItem.isSimilar(contents[3])) { + //他のアイテムが詰まってる + _logger.debug("This item is clog."); + return; + } else { + _logger.debug("This item Export."); + break; + } + } else { + _logger.debug("This item import not."); + return; + } + + case BLAZE_POWDER: + //横or上 + _logger.debug("This item is BLAZE_POWDER."); + _logger.trace("inv.getLocation().getBlockY()" + _inventory.getLocation().getBlockY()); + _logger.trace("dest.getLocation().getBlockY()" + _destInventory.getLocation().getBlockY()); + _logger.trace("inv.getLocation().getBlockY() > dest.getLocation().getBlockY()" + (_inventory.getLocation().getBlockY() > _destInventory.getLocation().getBlockY())); + _logger.trace("inv.getLocation().getBlockY() == dest.getLocation().getBlockY(): " + (_inventory.getLocation().getBlockY() == _destInventory.getLocation().getBlockY())); + if (_inventory.getLocation().getBlockY() > _destInventory.getLocation().getBlockY()) {//上から搬入 + _logger.debug("This item import at up."); + _logger.trace("contents[3]: " + contents[3]); + if (contents[3] != null && !_moveItem.isSimilar(contents[3])) { + //他のアイテムが詰まってる + _logger.debug("This item is clog."); + return; + } else { + _logger.debug("This item import not."); + break; + } + } else if (_inventory.getLocation().getBlockY() == _destInventory.getLocation().getBlockY()) {//横 + _logger.debug("This item import at beside."); + _logger.trace("contents[4]: " + contents[4]); + if (contents[4] != null && contents[4].getAmount() == 64) { + //パウダー詰まり + _logger.debug("This item is clog."); + return; + } else { + _logger.debug("This item Export."); + break; + } + } else { + _logger.debug("This item import not."); + return; + } + + case POTION: + case SPLASH_POTION: + case LINGERING_POTION: + //横or下 + _logger.debug("This item is POTIONS."); + _logger.trace("inv.getLocation().getBlockY()" + _inventory.getLocation().getBlockY()); + _logger.trace("dest.getLocation().getBlockY()" + _destInventory.getLocation().getBlockY()); + _logger.trace("inv.getLocation().getBlockY() <= dest.getLocation().getBlockY()" + (_inventory.getLocation().getBlockY() <= _destInventory.getLocation().getBlockY())); + if (_inventory.getLocation().getBlockY() <= _destInventory.getLocation().getBlockY()) { + _logger.debug("This item import at beside or down."); + _logger.trace("contents[0]: " + contents[0]); + _logger.trace("contents[1]: " + contents[1]); + _logger.trace("contents[2]: " + contents[2]); + if (contents[0] != null && contents[1] != null && contents[2] != null) { + _logger.debug("This item is clog."); + return; + } else { + _logger.debug("This item Export."); + break; + } + } else { + _logger.debug("This item import not."); + return; + } + default://ロスト回避 + _logger.debug("This Item not support BREW Item."); + return; + } + } else if (_destInventory.getType() == InventoryType.FURNACE + || _destInventory.getType() == InventoryType.BLAST_FURNACE + || _destInventory.getType() == InventoryType.SMOKER) { + _logger.debug("This Type is Furnace Series."); + _logger.trace("inv.getLocation().getBlockY()" + _inventory.getLocation().getBlockY()); + _logger.trace("dest.getLocation().getBlockY()" + _destInventory.getLocation().getBlockY()); + _logger.trace("inv.getLocation().getBlockY() > dest.getLocation().getBlockY(): " + (_inventory.getLocation().getBlockY() > _destInventory.getLocation().getBlockY())); + if (_inventory.getLocation().getBlockY() > _destInventory.getLocation().getBlockY()) {//上から搬入 + _logger.debug("This item import at up."); + _logger.trace("contents[0]: " + contents[0]); + if (contents[0] != null && !_moveItem.isSimilar(contents[0])) { + //他のアイテムが詰まってる + _logger.debug("This item is clog."); + return; + } + } else { + //横から(下から) + _logger.debug("This item import at beside or down."); + _logger.trace("contents[1]: " + contents[1]); + if (!_moveItem.getType().isFuel() || contents[1] != null && !_moveItem.isSimilar(contents[1])) { + //燃料以外 or 他のアイテムが詰まってる + _logger.debug("This item is clog or not Fuel."); + return; + } + } + } + + _logger.debug("Export Item"); + //PANPANによるロスト回避 + for (int i = 0; i < contents.length; i++) { + _logger.trace("i: " + i); + _logger.trace("contents[i]: " + contents[i]); + if (_moveItem.isSimilar(contents[i])) { + stacks++; + amount += contents[i].getAmount(); + _logger.trace(" stacks: " + stacks); + _logger.trace(" amount: " + amount); + } + } + _logger.trace("amount == stacks * item.getMaxStackSize(): " + (amount + == stacks * _moveItem.getMaxStackSize())); + _logger.trace("dest.firstEmpty() == -1: " + (_destInventory.firstEmpty() == -1)); + if (amount == stacks * _moveItem.getMaxStackSize() && _destInventory.firstEmpty() == -1) { + _logger.debug("Item less than Stack.not Export."); + return; + } + + _logger.debug("Export Item to Inventory."); + ItemStack cItem = _moveItem.clone(); + // 合計スタック数-存在数で、転送されたアイテム数分アイテムを補充する + // stacksが0なら、最大値 + int addAmount = 0; + if(stacks == 0) { + addAmount = cItem.getMaxStackSize(); + } else { + addAmount = cItem.getMaxStackSize() * stacks - amount; + } + cItem.setAmount(addAmount); + _inventory.addItem(cItem); + ss.addAmount(-cItem.getAmount()); + } + for (int i = 0; i < 4; i++) { + _logger.trace("set Line i:" + i + ". Text: " + ss.getSigntext(i)); + sign.getSide(Side.FRONT).setLine(i, ss.getSigntext(i)); + } + sign.update(); + _logger.debug("ExportSign:End"); + } +} diff --git a/src/main/java/wacky/storagesign/signdefinition/ShulkerDefinition.java b/src/main/java/wacky/storagesign/signdefinition/ShulkerDefinition.java new file mode 100644 index 0000000..b1b9f5e --- /dev/null +++ b/src/main/java/wacky/storagesign/signdefinition/ShulkerDefinition.java @@ -0,0 +1,47 @@ +package wacky.storagesign.signdefinition; + +import static org.bukkit.Material.ACACIA_SIGN; +import static org.bukkit.Material.BAMBOO_SIGN; +import static org.bukkit.Material.BIRCH_SIGN; +import static org.bukkit.Material.BLACK_SHULKER_BOX; +import static org.bukkit.Material.BLUE_SHULKER_BOX; +import static org.bukkit.Material.BROWN_SHULKER_BOX; +import static org.bukkit.Material.CHERRY_SIGN; +import static org.bukkit.Material.CRIMSON_SIGN; +import static org.bukkit.Material.CYAN_SHULKER_BOX; +import static org.bukkit.Material.DARK_OAK_SIGN; +import static org.bukkit.Material.GRAY_SHULKER_BOX; +import static org.bukkit.Material.GREEN_SHULKER_BOX; +import static org.bukkit.Material.JUNGLE_SIGN; +import static org.bukkit.Material.LIGHT_BLUE_SHULKER_BOX; +import static org.bukkit.Material.LIGHT_GRAY_SHULKER_BOX; +import static org.bukkit.Material.LIME_SHULKER_BOX; +import static org.bukkit.Material.MAGENTA_SHULKER_BOX; +import static org.bukkit.Material.MANGROVE_SIGN; +import static org.bukkit.Material.OAK_SIGN; +import static org.bukkit.Material.ORANGE_SHULKER_BOX; +import static org.bukkit.Material.PALE_OAK_SIGN; +import static org.bukkit.Material.PINK_SHULKER_BOX; +import static org.bukkit.Material.PURPLE_SHULKER_BOX; +import static org.bukkit.Material.RED_SHULKER_BOX; +import static org.bukkit.Material.SHULKER_BOX; +import static org.bukkit.Material.SPRUCE_SIGN; +import static org.bukkit.Material.WARPED_SIGN; +import static org.bukkit.Material.WHITE_SHULKER_BOX; +import static org.bukkit.Material.YELLOW_SHULKER_BOX; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; +import org.bukkit.Material; + +public class ShulkerDefinition { + + /** + * 看板と扱われるアイテム一覧. + * 看板種類が追加されたら追加する. + */ + public static final Set shulker_materials = Collections.unmodifiableSet( + EnumSet.of(SHULKER_BOX, WHITE_SHULKER_BOX, ORANGE_SHULKER_BOX, MAGENTA_SHULKER_BOX, LIGHT_BLUE_SHULKER_BOX, YELLOW_SHULKER_BOX, LIME_SHULKER_BOX, PINK_SHULKER_BOX, GRAY_SHULKER_BOX, LIGHT_GRAY_SHULKER_BOX, CYAN_SHULKER_BOX, PURPLE_SHULKER_BOX, BLUE_SHULKER_BOX, BROWN_SHULKER_BOX, GREEN_SHULKER_BOX, RED_SHULKER_BOX, BLACK_SHULKER_BOX)); + +} \ No newline at end of file diff --git a/src/main/java/wacky/storagesign/signdefinition/SignDefinition.java b/src/main/java/wacky/storagesign/signdefinition/SignDefinition.java new file mode 100644 index 0000000..5fc2910 --- /dev/null +++ b/src/main/java/wacky/storagesign/signdefinition/SignDefinition.java @@ -0,0 +1,67 @@ +package wacky.storagesign.signdefinition; + +import static java.util.Map.entry; +import static org.bukkit.Material.ACACIA_SIGN; +import static org.bukkit.Material.ACACIA_WALL_SIGN; +import static org.bukkit.Material.BAMBOO_SIGN; +import static org.bukkit.Material.BAMBOO_WALL_SIGN; +import static org.bukkit.Material.BIRCH_SIGN; +import static org.bukkit.Material.BIRCH_WALL_SIGN; +import static org.bukkit.Material.CHERRY_SIGN; +import static org.bukkit.Material.CHERRY_WALL_SIGN; +import static org.bukkit.Material.CRIMSON_SIGN; +import static org.bukkit.Material.CRIMSON_WALL_SIGN; +import static org.bukkit.Material.DARK_OAK_SIGN; +import static org.bukkit.Material.DARK_OAK_WALL_SIGN; +import static org.bukkit.Material.JUNGLE_SIGN; +import static org.bukkit.Material.JUNGLE_WALL_SIGN; +import static org.bukkit.Material.MANGROVE_SIGN; +import static org.bukkit.Material.MANGROVE_WALL_SIGN; +import static org.bukkit.Material.OAK_SIGN; +import static org.bukkit.Material.OAK_WALL_SIGN; +import static org.bukkit.Material.PALE_OAK_SIGN; +import static org.bukkit.Material.PALE_OAK_WALL_SIGN; +import static org.bukkit.Material.SPRUCE_SIGN; +import static org.bukkit.Material.SPRUCE_WALL_SIGN; +import static org.bukkit.Material.WARPED_SIGN; +import static org.bukkit.Material.WARPED_WALL_SIGN; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.Map; +import java.util.Set; +import org.bukkit.Material; + +public class SignDefinition { + + /** + * 看板と扱われるアイテム一覧. + * 看板種類が追加されたら追加する. + */ + public static final Set sign_materials = Collections.unmodifiableSet( + EnumSet.of(OAK_SIGN, SPRUCE_SIGN, BIRCH_SIGN, JUNGLE_SIGN, ACACIA_SIGN, DARK_OAK_SIGN, CRIMSON_SIGN, WARPED_SIGN, MANGROVE_SIGN, CHERRY_SIGN, BAMBOO_SIGN, PALE_OAK_SIGN)); + /** + * 看板と扱われるアイテム一覧. + * 看板種類が追加されたら追加する. + */ + public static final Set wall_sign_materials = Collections.unmodifiableSet(EnumSet.of(OAK_WALL_SIGN, SPRUCE_WALL_SIGN, BIRCH_WALL_SIGN, JUNGLE_WALL_SIGN, ACACIA_WALL_SIGN, DARK_OAK_WALL_SIGN, CRIMSON_WALL_SIGN, WARPED_WALL_SIGN, MANGROVE_WALL_SIGN, CHERRY_WALL_SIGN, BAMBOO_WALL_SIGN, PALE_OAK_WALL_SIGN)); + /** + * 壁掛け看板と通常看板の変換一覧. + * 看板種類が追加されたら追加する. + */ + public static final Map wall_normal_sign_maps = Map.ofEntries( + entry(OAK_WALL_SIGN, OAK_SIGN), + entry(BIRCH_WALL_SIGN, BIRCH_SIGN), + entry(SPRUCE_WALL_SIGN, SPRUCE_SIGN), + entry(JUNGLE_WALL_SIGN, JUNGLE_SIGN), + entry(ACACIA_WALL_SIGN, ACACIA_SIGN), + entry(DARK_OAK_WALL_SIGN, DARK_OAK_SIGN), + entry(CRIMSON_WALL_SIGN, CRIMSON_SIGN), + entry(WARPED_WALL_SIGN, WARPED_SIGN), + entry(MANGROVE_WALL_SIGN, MANGROVE_SIGN), + entry(CHERRY_WALL_SIGN, CHERRY_SIGN), + entry(BAMBOO_WALL_SIGN, BAMBOO_SIGN), + entry(PALE_OAK_WALL_SIGN , PALE_OAK_SIGN) + + ); +} diff --git a/src/main/java/wacky/storagesign/signdefinition/SignMatStringDefinition.java b/src/main/java/wacky/storagesign/signdefinition/SignMatStringDefinition.java new file mode 100644 index 0000000..fc2a633 --- /dev/null +++ b/src/main/java/wacky/storagesign/signdefinition/SignMatStringDefinition.java @@ -0,0 +1,54 @@ +package wacky.storagesign.signdefinition; + +import static java.util.Map.entry; +import static org.bukkit.Material.ACACIA_SIGN; +import static org.bukkit.Material.BAMBOO_SIGN; +import static org.bukkit.Material.BIRCH_SIGN; +import static org.bukkit.Material.CHERRY_SIGN; +import static org.bukkit.Material.CRIMSON_SIGN; +import static org.bukkit.Material.DARK_OAK_SIGN; +import static org.bukkit.Material.JUNGLE_SIGN; +import static org.bukkit.Material.MANGROVE_SIGN; +import static org.bukkit.Material.OAK_SIGN; +import static org.bukkit.Material.PALE_OAK_SIGN; +import static org.bukkit.Material.SPRUCE_SIGN; +import static org.bukkit.Material.WARPED_SIGN; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.bukkit.Material; + +@AllArgsConstructor +@Getter +public enum SignMatStringDefinition { + OAK_SS("OakStorageSign", OAK_SIGN), + SPRUCE_SS("SpruceStorageSign", SPRUCE_SIGN), + BIRCH_SS("BirchStorageSign", BIRCH_SIGN), + JUNGLE_SS("JungleStorageSign", JUNGLE_SIGN), + ACACIA_SS("AcaciaStorageSign", ACACIA_SIGN), + DARKOAK_SS("DarkOakStorageSign", DARK_OAK_SIGN), + CRIMSON_SS("CrimsonStorageSign", CRIMSON_SIGN), + WARPED_SS("WarpedStorageSign", WARPED_SIGN), + MANGROVE_SS("MangroveStorageSign", MANGROVE_SIGN), + CHERRY_SS("CherryStorageSign", CHERRY_SIGN), + BAMBOO_SS("BambooStorageSign", BAMBOO_SIGN), + PALEOAK_SS("PaleOakStorageSign", PALE_OAK_SIGN); + + private String materialString; + private Material material; + + public static Map asStringMaterialMap() { + Map map = new LinkedHashMap<>(); + Arrays.stream(values()).forEach(e -> map.put(e.materialString, e.material)); + return map; + } + + public static Map asMaterialStringMap() { + Map map = new LinkedHashMap<>(); + Arrays.stream(values()).forEach(e -> map.put(e.material, e.materialString)); + return map; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ea53406..a7c6f28 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,6 +1,8 @@ #StorageSign Configuration no-permisson: You don't have permission +log-level: INFO +#log-level: WARN manual-import: true manual-export: true auto-import: true @@ -9,4 +11,8 @@ autocollect: true hardrecipe: false divide-limit: 345600 +max-stack-size: 16 +sneak-divide-limit: 34560 no-bud: false +falling-block-itemSS: false +banner-debug: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2776d03..e125219 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,10 +1,12 @@ name: StorageSign main: wacky.storagesign.StorageSignCore -version: 1.2.8 +version: ${version} +description: StorageSign Plugin for Spigot. You can 2billion items storeing to wooden sign. author: wackyls6 -api-version: 1.15 +api-version: 1.21.4 +depend: [Logger, FarmNBT] softdepend: [WorldGuard] -website: http://forum.minecraftuser.jp/viewtopic.php?t=15065 +website: https://github.com/wackyls6/StorageSign permissions: storagesign.*: description: diff --git a/src/test/java/jar/AppTest.java b/src/test/java/jar/AppTest.java index 4f2fe94..2c7c1b4 100644 --- a/src/test/java/jar/AppTest.java +++ b/src/test/java/jar/AppTest.java @@ -1,38 +1,16 @@ package jar; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Unit test for simple App. */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } +public class AppTest { - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); + @Test + public void testApp() { + assertTrue(true); } }