diff --git a/pom.xml b/pom.xml index 2fa8fd7..d6105dd 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ RcRPG.RcRPGMain RcRPG - 1.1.5-MOT + 1.1.6-MOT UTF-8 diff --git a/src/main/java/RcRPG/Events.java b/src/main/java/RcRPG/Events.java index 7f4f336..f099a7e 100644 --- a/src/main/java/RcRPG/Events.java +++ b/src/main/java/RcRPG/Events.java @@ -636,16 +636,21 @@ public void chatEvent(PlayerChatEvent event){ } @EventHandler(priority = EventPriority.LOWEST) - public void joinEvent(PlayerPreLoginEvent event){ + public void joinEvent(PlayerLocallyInitializedEvent event){ + RcRPGMain.updateItemLore(event.getPlayer());// 更新玩家背包物品 + } + + @EventHandler(priority = EventPriority.LOWEST) + public void preJoinEvent(PlayerPreLoginEvent event){ Player player = event.getPlayer(); String name = player.getName(); - PlayerAttr.setPlayerAttr(player); + PlayerAttr.setPlayerAttr(player);// 设置玩家属性 File file = new File(RcRPGMain.getInstance().getDataFolder()+"/Players/"+name+".yml"); if(!file.exists()) { RcRPGMain.getInstance().saveResource("Players/Player.yml","/Players/"+name+".yml",false); - Config config = new Config(RcRPGMain.getInstance().getPlayerFile()+"/"+name+".yml"); + Config config = new Config(RcRPGMain.getInstance().getPlayerFile()+File.separator + name+".yml"); config.set("名称",name); config.set("公会", MainConfig.getInitialGuild()); config.set("称号", MainConfig.getInitialPrefix()); diff --git a/src/main/java/RcRPG/RPG/Armour.java b/src/main/java/RcRPG/RPG/Armour.java index 47c36c9..f32c7e5 100644 --- a/src/main/java/RcRPG/RPG/Armour.java +++ b/src/main/java/RcRPG/RPG/Armour.java @@ -5,6 +5,7 @@ import RcRPG.RcRPGMain; import cn.nukkit.Player; import cn.nukkit.item.Item; +import cn.nukkit.lang.LangCode; import cn.nukkit.nbt.tag.CompoundTag; import cn.nukkit.nbt.tag.ListTag; import cn.nukkit.nbt.tag.StringTag; @@ -192,7 +193,7 @@ public static boolean delArmourConfig(String name) { return false; } - public static Item getItem(String name, int count) { + public static Item getItem(String name, int count, LangCode langCode) { Armour armour = RcRPGMain.loadArmour.get(name); Item item = armour.getItem(); item.setCount(count); @@ -207,8 +208,13 @@ public static Item getItem(String name, int count) { item.setNamedTag(tag); item.setCustomName(armour.getShowName()); - Armour.setArmourLore(item); + Armour.setArmourLore(item, langCode); return item; + + } + + public static Item getItem(String name, int count) { + return getItem(name, count, LangCode.en_US); } public static boolean giveArmour(Player player, String name, int count) { @@ -291,7 +297,7 @@ public static void setStone(Player player, Item item, LinkedList list) { CompoundTag tag = item.getNamedTag(); tag.putList(stoneList); item.setNamedTag(tag); - player.getInventory().setItemInHand(Armour.setArmourLore(item)); + player.getInventory().setItemInHand(Armour.setArmourLore(item, player.getLanguageCode())); } public static int getStoneHealth(Item item) { @@ -333,7 +339,7 @@ public static int getStoneReDamage(Item item) { return 0; } - public static Item setArmourLore(Item item) { + public static Item setArmourLore(Item item, LangCode langCode) { if (Armour.isArmour(item)) { Armour armour = RcRPGMain.loadArmour.get(item.getNamedTag().getString("name")); ArrayList lore = (ArrayList) armour.getLoreList().clone(); @@ -346,6 +352,9 @@ public static Item setArmourLore(Item item) { s = s.replace("@stoneDamage", String.valueOf(Armour.getStoneDamage(item))); if (s.contains("@stoneReDamage")) s = s.replace("@stoneReDamage", String.valueOf(Armour.getStoneReDamage(item))); + if (s.contains("@gemLore")) + s = s.replace("@gemLore", RcRPGMain.getInstance().getGemTemplateConfig().getTemplateText(langCode, item.getNamedTag(), armour.getStone(), armour.getStoneList())); + s = armour.replaceAttrTemplate(s);// 替换属性的值 lore.set(i, s); } @@ -354,6 +363,10 @@ public static Item setArmourLore(Item item) { return item; } + public static Item setArmourLore(Item item) { + return setArmourLore(item, LangCode.en_US); + } + public void setAttr(Map attr) { this.attr = attr; setItemAttrConfig(attr); diff --git a/src/main/java/RcRPG/RPG/Suit.java b/src/main/java/RcRPG/RPG/Suit.java index 1f9fb8b..4855e54 100644 --- a/src/main/java/RcRPG/RPG/Suit.java +++ b/src/main/java/RcRPG/RPG/Suit.java @@ -6,6 +6,7 @@ import cn.nukkit.utils.ConfigSection; import lombok.Getter; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -16,7 +17,7 @@ public class Suit { public static void init() { suitInfo.clear(); - Config cfg = new Config(RcRPGMain.getInstance().getDataFolder() + "/SuitPlan.yml"); + Config cfg = new Config(RcRPGMain.getInstance().getDataFolder() + File.separator + "suitPlan.yml"); cfg.getAll().keySet().forEach(suitName -> { RcRPGMain.getInstance().getLogger().info("suitName: "+suitName); suitInfo.put(suitName, new SuitConfig(cfg.getSection(suitName))); diff --git a/src/main/java/RcRPG/RPG/Weapon.java b/src/main/java/RcRPG/RPG/Weapon.java index 3639a41..2b110f4 100644 --- a/src/main/java/RcRPG/RPG/Weapon.java +++ b/src/main/java/RcRPG/RPG/Weapon.java @@ -5,6 +5,7 @@ import RcRPG.RcRPGMain; import cn.nukkit.Player; import cn.nukkit.item.Item; +import cn.nukkit.lang.LangCode; import cn.nukkit.nbt.tag.CompoundTag; import cn.nukkit.nbt.tag.ListTag; import cn.nukkit.nbt.tag.StringTag; @@ -187,7 +188,7 @@ public static boolean delWeaponConfig(String name) { return false; } - public static Item getItem(String name, int count) { + public static Item getItem(String name, int count, LangCode langCode) { Weapon weapon = RcRPGMain.loadWeapon.get(name); Item item = weapon.getItem(); item.setCount(count); @@ -204,10 +205,14 @@ public static Item getItem(String name, int count) { tag.putList(stoneList); item.setNamedTag(tag); item.setCustomName(weapon.getShowName()); - Weapon.setWeaponLore(item); + Weapon.setWeaponLore(item, langCode); return item; } + public static Item getItem(String name, int count) { + return getItem(name, count, LangCode.en_US); + } + public static boolean giveWeapon(Player player, String name, int count) { if (!RcRPGMain.loadWeapon.containsKey(name)) { return false; @@ -288,7 +293,7 @@ public static void setStone(Player player, Item item, LinkedList list) { CompoundTag tag = item.getNamedTag(); tag.putList(stoneList); item.setNamedTag(tag); - player.getInventory().setItemInHand(Weapon.setWeaponLore(item)); + player.getInventory().setItemInHand(Weapon.setWeaponLore(item, player.getLanguageCode())); } public static int getStoneDamage(Item item) { @@ -297,7 +302,7 @@ public static int getStoneDamage(Item item) { int damage = 0; for (Stone stone : list) { if (stone == null) continue; - damage += stone.getItemAttr("PVE攻击力"); + damage += (int) stone.getItemAttr("PVE攻击力"); } return damage; } @@ -317,7 +322,7 @@ public static int getStoneReDamage(Item item) { return 0; } - public static Item setWeaponLore(Item item) { + public static Item setWeaponLore(Item item, LangCode langCode) { if (Weapon.isWeapon(item)) { Weapon weapon = RcRPGMain.loadWeapon.get(item.getNamedTag().getString("name")); ArrayList lore; @@ -331,6 +336,9 @@ public static Item setWeaponLore(Item item) { s = s.replace("@stoneDamage", String.valueOf(Weapon.getStoneDamage(item))); if (s.contains("@stoneReDamage")) s = s.replace("@stoneReDamage", String.valueOf(Weapon.getStoneReDamage(item))); + if (s.contains("@gemLore")) + s = s.replace("@gemLore", RcRPGMain.getInstance().getGemTemplateConfig().getTemplateText(langCode, item.getNamedTag(), weapon.getStone(), weapon.getStoneList())); + s = weapon.replaceAttrTemplate(s);// 替换属性的值 lore.set(i, s); } @@ -339,6 +347,10 @@ public static Item setWeaponLore(Item item) { return item; } + public static Item setWeaponLore(Item item) { + return setWeaponLore(item, LangCode.en_US); + } + /** * 仅作为属性分类的标识 * diff --git a/src/main/java/RcRPG/RcRPGMain.java b/src/main/java/RcRPG/RcRPGMain.java index 657d73f..a8a8fc6 100644 --- a/src/main/java/RcRPG/RcRPGMain.java +++ b/src/main/java/RcRPG/RcRPGMain.java @@ -3,16 +3,20 @@ import RcRPG.RPG.*; import RcRPG.RPG.forging.ForgingPaper; import RcRPG.RPG.forging.ForgingStone; -import RcRPG.task.BoxTimeTask; -import RcRPG.task.PlayerAttrUpdateTask; -import RcRPG.task.PlayerTipTask; import RcRPG.command.Commands; +import RcRPG.config.GemTemplateConfig; import RcRPG.config.MainConfig; import RcRPG.floatingtext.TextEntity; +import RcRPG.task.BoxTimeTask; +import RcRPG.task.PlayerAttrUpdateTask; +import RcRPG.task.PlayerTipTask; import RcRPG.tips.TipsVariables; +import cn.nukkit.Player; import cn.nukkit.Server; import cn.nukkit.entity.Entity; import cn.nukkit.event.Listener; +import cn.nukkit.inventory.PlayerInventory; +import cn.nukkit.item.Item; import cn.nukkit.lang.LangCode; import cn.nukkit.lang.PluginI18n; import cn.nukkit.lang.PluginI18nManager; @@ -35,6 +39,9 @@ public class RcRPGMain extends PluginBase implements Listener { public static LangCode serverLangCode; + @Getter + public GemTemplateConfig gemTemplateConfig; + public Config ornamentConfig; /** @@ -86,7 +93,7 @@ public void onEnable() { this.getServer().getScheduler().scheduleRepeatingTask(new PlayerTipTask(this), 20); } this.getServer().getScheduler().scheduleRepeatingTask(new BoxTimeTask(this), 20); - //this.getServer().getScheduler().scheduleRepeatingTask(new loadHealth(this), 10); + // this.getServer().getScheduler().scheduleRepeatingTask(new loadHealth(this), 10); this.getServer().getScheduler().scheduleRepeatingTask(new PlayerAttrUpdateTask(this), 20); this.getServer().getPluginManager().addPermission(new Permission("plugin.rcrpg", "rcrpg 命令权限", "true")); @@ -108,21 +115,24 @@ public void onEnable() { public void init() { MainConfig.init(); - this.saveResource("OrnamentConfig.yml", "/OrnamentConfig.yml", false); + this.saveResource("OrnamentConfig.yml", "OrnamentConfig.yml", false); ornamentConfig = new Config(this.getDataFolder() + File.separator + "OrnamentConfig.yml"); - this.saveResource("DismantlePlan.yml", "/DismantlePlan.yml", false); - dismantleConfig = new Config(this.getDataFolder() + File.separator + "DismantlePlan.yml"); + this.saveResource("dismantlePlan.yml", "dismantlePlan.yml", false); + dismantleConfig = new Config(this.getDataFolder() + File.separator + "dismantlePlan.yml"); - this.saveResource("SuitPlan.yml", "/SuitPlan.yml", false); + this.saveResource("suitPlan.yml", "suitPlan.yml", false); Suit.init(); + this.saveResource("gemTemplate.yml", "gemTemplate.yml", false); + gemTemplateConfig = new GemTemplateConfig(new Config(this.getDataFolder() + File.separator + "gemTemplate.yml")); + this.getLogger().info("开始读取武器信息"); loadWeapon.clear(); for (String name : Handle.getDefaultFiles("Weapon")) { Weapon weapon = null; try { - weapon = Weapon.loadWeapon(name, new Config(this.getDataFolder() + File.separator + "Weapon/" + name + ".yml", Config.YAML)); + weapon = Weapon.loadWeapon(name, new Config(this.getDataFolder() + File.separator + "Weapon" + File.separator + name + ".yml", Config.YAML)); } catch (Exception e) { throw new RuntimeException(e); } @@ -330,4 +340,35 @@ public void initServerLangCode() { } } + public static void updateItemLore(Player player) { + if (player == null) { + return; + } + + PlayerInventory bag = player.getInventory(); + + for (int num = 0; num < bag.getSize(); num++) { + Item item = bag.getItem(num); + + if (item.isNull() || !item.hasCompoundTag()) { + continue; + } + + Item newItem; + if (Weapon.isWeapon(item)) { + newItem = Weapon.setWeaponLore(item.clone(), player.getLanguageCode()); + } else if (Armour.isArmour(item)) { + newItem = Armour.setArmourLore(item.clone(), player.getLanguageCode()); + } else { + continue; + } + + if (!item.equals(newItem)) { + newItem.setCount(item.count); + bag.remove(item); + bag.setItem(num, newItem); + } + } + } + } \ No newline at end of file diff --git a/src/main/java/RcRPG/command/Commands.java b/src/main/java/RcRPG/command/Commands.java index e22689f..80bff7b 100644 --- a/src/main/java/RcRPG/command/Commands.java +++ b/src/main/java/RcRPG/command/Commands.java @@ -258,6 +258,7 @@ public boolean execute(CommandSender sender, String label, String[] args) { return false; } RcRPGMain.getInstance().init(); + Server.getInstance().getOnlinePlayers().values().forEach(RcRPGMain::updateItemLore); sender.sendMessage(TextFormat.GREEN + i18n.tr(langCode, "rcrpg.commands.reloaded")); return true; } diff --git a/src/main/java/RcRPG/config/GemTemplateConfig.java b/src/main/java/RcRPG/config/GemTemplateConfig.java new file mode 100644 index 0000000..1fdd66e --- /dev/null +++ b/src/main/java/RcRPG/config/GemTemplateConfig.java @@ -0,0 +1,110 @@ +package RcRPG.config; + +import cn.nukkit.lang.LangCode; +import cn.nukkit.nbt.tag.CompoundTag; +import cn.nukkit.nbt.tag.ListTag; +import cn.nukkit.nbt.tag.StringTag; +import cn.nukkit.utils.Config; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import static RcRPG.RcRPGMain.loadStone; + +@Getter +public class GemTemplateConfig { + + private final Map>> MULTI_LANGUAGE = new HashMap<>(); + + public GemTemplateConfig(Config cfg) { + // 遍历所有语言代码 (en_US, zh_CN 等) + for (String langKey : cfg.getKeys(false)) { + LangCode langCode = LangCode.valueOf(langKey); // 假设 LangCode 枚举与语言代码匹配 + Map> gemTemplates = new HashMap<>(); + + // 获取该语言的所有宝石类型配置 (default, 攻击宝石, 生命宝石 等) + Map langSection = cfg.getSection(langKey); + for (String gemType : langSection.keySet()) { + Map states = new HashMap<>(); + + // 获取具体的`insertable`和`embedded`值 + String insertable = cfg.getString(langKey + "." + gemType + ".insertable"); + String embedded = cfg.getString(langKey + "." + gemType + ".embedded"); + + // 存储这些值到 states 中 + states.put("insertable", insertable); + states.put("embedded", embedded); + + // 将 states 存储到 gemTemplates 中 + gemTemplates.put(gemType, states); + } + + // 将语言代码与其模板数据对应,存入 MULTI_LANGUAGE + MULTI_LANGUAGE.put(langCode, gemTemplates); + } + } + + /** + * 根据语言代码和宝石类型获取模板信息,带有回退机制。 + * + * @param langCode 语言代码 + * @param gemType 宝石类型 + * @param state 状态 (insertable 或 embedded) + * @return 模板字符串 + */ + public String templateTr(LangCode langCode, String gemType, String state) { + // 尝试获取指定语言的宝石配置 + Map> langData = MULTI_LANGUAGE.getOrDefault(langCode, MULTI_LANGUAGE.get(LangCode.en_US)); + + // 尝试获取指定的宝石类型,如果没有则回退到 default + Map gemData = langData.getOrDefault(gemType, langData.get("default")); + + // 获取具体的状态 (insertable 或 embedded) 的值 + return gemData.get(state); + } + + /** + * 根据语言代码和宝石类型获取模板信息,带有回退机制。 + * + * @param langCode 语言代码 + * @param nbt 物品nbt + * @param stoneMax 最大宝石数量 + * @param stoneSlots 宝石槽位列表 + * @return 模板字符串 + */ + public String getTemplateText(LangCode langCode, CompoundTag nbt, int stoneMax, ArrayList stoneSlots) { + ListTag stoneList = (ListTag) nbt.getList("stone"); + ArrayList templateList = new ArrayList<>(); // 用于存储每个模板字符串 + + for (int i = 0; i < stoneMax; i++) { + String template; + if (stoneList.isEmpty() || i >= stoneList.size()) { + if (i < stoneSlots.size()) { + template = templateTr(langCode, stoneSlots.get(i), "insertable") + .replace("@stoneType", stoneSlots.get(i)); + } else { + template = templateTr(langCode, "default", "insertable") + .replace("@stoneType", stoneSlots.get(i)); + } + } else { + String stoneName = stoneList.get(i).parseValue(); + if (stoneName.isEmpty()) { + template = templateTr(langCode, stoneSlots.get(i), "insertable") + .replace("@stoneType", stoneSlots.get(i)); + } else if (i < stoneSlots.size()) { + template = templateTr(langCode, stoneSlots.get(i), "embedded") + .replace("@stoneName", loadStone.get(stoneName).getShowName()); + } else { + template = templateTr(langCode, "default", "embedded") + .replace("@stoneName", loadStone.get(stoneName).getShowName()); + } + } + templateList.add(template); // 将模板字符串添加到列表中 + } + + return String.join("\n", templateList); + } + +} diff --git a/src/main/java/RcRPG/config/MainConfig.java b/src/main/java/RcRPG/config/MainConfig.java index bc55709..da090c5 100644 --- a/src/main/java/RcRPG/config/MainConfig.java +++ b/src/main/java/RcRPG/config/MainConfig.java @@ -60,9 +60,7 @@ public class MainConfig { public static List attrDisplayPercent = new ArrayList<>(); public static void init() { - if (!new File(RcRPGMain.getInstance().getDataFolder(), "config.yml").exists()) { - RcRPGMain.getInstance().saveResource("config.yml"); - } + RcRPGMain.getInstance().saveResource("config.yml"); config = new Config(new File(RcRPGMain.getInstance().getDataFolder(), "config.yml"), Config.YAML); // 读取配置文件中的值 diff --git a/src/main/resources/Weapon/Weapon.yml b/src/main/resources/Weapon/Weapon.yml index 972439b..a9c4fa7 100644 --- a/src/main/resources/Weapon/Weapon.yml +++ b/src/main/resources/Weapon/Weapon.yml @@ -38,6 +38,7 @@ - §r§6◈§7PVP攻击§6◈§a {{PVP攻击力}} - §r§6◈§7吸血倍率§6◈§a {{吸血倍率}} - §r§6◈§f═§7╞════════════╡§f═ + - @gemLore 攻击者药水效果: [] 受击者药水效果: [] 群体药水效果: [] diff --git a/src/main/resources/DismantlePlan.yml b/src/main/resources/dismantlePlan.yml similarity index 100% rename from src/main/resources/DismantlePlan.yml rename to src/main/resources/dismantlePlan.yml diff --git a/src/main/resources/gemTemplate.yml b/src/main/resources/gemTemplate.yml new file mode 100644 index 0000000..94c2fa1 --- /dev/null +++ b/src/main/resources/gemTemplate.yml @@ -0,0 +1,20 @@ +en_US: + default: + insertable: §aInsertable<§7@stoneType§a> + embedded: "@stoneName" + 攻击宝石: + insertable: §aInsertable<§c@stoneType§a> + embedded: "@stoneName" + 生命宝石: + insertable: §aInsertable<§a§l@stoneType§r§a> + embedded: "@stoneName" +zh_CN: + default: + insertable: §a可镶嵌<§7@stoneType§a> + embedded: "@stoneName" + 攻击宝石: + insertable: §a可镶嵌<§c@stoneType§a> + embedded: "@stoneName" + 生命宝石: + insertable: §a可镶嵌<§a§l@stoneType§r§a> + embedded: "@stoneName" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d68a25b..bdb1805 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: RcRPG main: RcRPG.RcRPGMain -version: 1.1.5 +version: 1.1.6 author: 若尘 authors: ["若尘", "Mcayear"] api: 1.0.8 diff --git a/src/main/resources/SuitPlan.yml b/src/main/resources/suitPlan.yml similarity index 100% rename from src/main/resources/SuitPlan.yml rename to src/main/resources/suitPlan.yml