diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 2ff5aab..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/lib/EconomyAPI-2.0.2.jar b/lib/EconomyAPI-2.0.2.jar new file mode 100644 index 0000000..88be226 Binary files /dev/null and b/lib/EconomyAPI-2.0.2.jar differ diff --git a/pom.xml b/pom.xml index 0e2824b..50ba62e 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,9 @@ me.onebone economyapi - 2.0.0-SNAPSHOT + 2.0.2 + system + ${pom.basedir}/lib/EconomyAPI-2.0.2.jar diff --git a/src/main/java/RcRPG/AttrManager/AttrInterface.java b/src/main/java/RcRPG/AttrManager/AttrInterface.java index 385f024..c60ac7f 100644 --- a/src/main/java/RcRPG/AttrManager/AttrInterface.java +++ b/src/main/java/RcRPG/AttrManager/AttrInterface.java @@ -62,5 +62,7 @@ public interface AttrInterface { float[] getHpPerSecond(); + float[] getHpPerNature(); + float[] getMovementSpeedMultiplier(); } diff --git a/src/main/java/RcRPG/AttrManager/ItemAttr.java b/src/main/java/RcRPG/AttrManager/ItemAttr.java index eeb9399..f5a9ded 100644 --- a/src/main/java/RcRPG/AttrManager/ItemAttr.java +++ b/src/main/java/RcRPG/AttrManager/ItemAttr.java @@ -339,6 +339,14 @@ public float[] getHpPerSecond() { return new float[0]; } + @Override + public float[] getHpPerNature() { + if (mainAttr.containsKey("生命恢复")) { + return mainAttr.get("生命恢复"); + } + return new float[]{ 0.0f, 0.0f }; + } + @Override public float[] getMovementSpeedMultiplier() { if (mainAttr.containsKey("移速加成")) { diff --git a/src/main/java/RcRPG/AttrManager/LittleMonsterAttr.java b/src/main/java/RcRPG/AttrManager/LittleMonsterAttr.java index cd10e5e..0ccec2c 100644 --- a/src/main/java/RcRPG/AttrManager/LittleMonsterAttr.java +++ b/src/main/java/RcRPG/AttrManager/LittleMonsterAttr.java @@ -281,6 +281,14 @@ public float[] getHpPerSecond() { return new float[]{ 0.0f, 0.0f }; } + @Override + public float[] getHpPerNature() { + if (mainAttr.containsKey("生命恢复")) { + return mainAttr.get("生命恢复"); + } + return new float[]{ 0.0f, 0.0f }; + } + @Override public float[] getMovementSpeedMultiplier() { if (mainAttr.containsKey("移速加成")) { diff --git a/src/main/java/RcRPG/AttrManager/Manager.java b/src/main/java/RcRPG/AttrManager/Manager.java index 8bce9a1..9251de3 100644 --- a/src/main/java/RcRPG/AttrManager/Manager.java +++ b/src/main/java/RcRPG/AttrManager/Manager.java @@ -32,6 +32,7 @@ public Manager(){} public float armorStrengthMultiplier = 0.0f; public float experienceGainMultiplier = 0.0f; public float hpPerSecond = 0.0f; + public float hpPerNature = 0.0f; public float movementSpeedMultiplier = 0.0f; public void updateComp() { @@ -64,6 +65,7 @@ public void updateComp() { // 辅助增益 3 experienceGainMultiplier = getRandomNum(getExperienceGainMultiplier()); hpPerSecond = getRandomNum(getHpPerSecond()); + hpPerNature = getRandomNum(getHpPerNature()); movementSpeedMultiplier = getRandomNum(getMovementSpeedMultiplier()); // ...继续更新其他变量的值 } @@ -359,6 +361,15 @@ public float[] getHpPerSecond() { return new float[]{ 0.0f, 0.0f }; } + /** + * 生命恢复(自然恢复时的额外恢复血量) + * @return + */ + @Override + public float[] getHpPerNature() { + return new float[]{ 0.0f, 0.0f }; + } + /** * 移速加成 * @return diff --git a/src/main/java/RcRPG/AttrManager/PlayerAttr.java b/src/main/java/RcRPG/AttrManager/PlayerAttr.java index e3d446a..ac4daf6 100644 --- a/src/main/java/RcRPG/AttrManager/PlayerAttr.java +++ b/src/main/java/RcRPG/AttrManager/PlayerAttr.java @@ -33,6 +33,25 @@ public static void setPlayerAttr(Player player) { } public void update() { + // 等级加点 + if (Main.instance.config.exists("等级增加血量")) { + String[] s = Main.instance.config.getString("等级增加血量").split(":"); + int lvAddHealth; + if (Level.enable) { + lvAddHealth = Level.getLevel(player) / Integer.parseInt(s[0]) * Integer.parseInt(s[1]); + } else { + lvAddHealth = player.getExperienceLevel() / Integer.parseInt(s[0]) * Integer.parseInt(s[1]); + } + if (lvAddHealth > 0) { + PlayerAttr pAttr = PlayerAttr.getPlayerAttr(player); + Map attr = new HashMap<>(); + attr.put("血量值", new float[]{lvAddHealth, lvAddHealth}); + if (pAttr != null) { + pAttr.setItemAttrConfig(Main.getI18n().tr(player.getLanguageCode(), "rcrpg.playerattr.lv"), attr); + } + } + } + ArrayList beforeLabel = new ArrayList<>(labelList); labelList.clear(); @@ -79,9 +98,10 @@ public void update() { Map map = OrnamentPanel.getPanel(player); if (!map.isEmpty()) { Map attr = new HashMap<>(); - for(int i = 0;i < Math.min(Main.getInstance().config.getInt("饰品生效格数"),map.size());i++){ + for(int i = 0; i < Math.min(Main.getInstance().config.getInt("饰品生效格数"), map.size()); i++){ Ornament ornament = Main.loadOrnament.get(map.get(i).getNamedTag().getString("name")); - if(ornament == null) continue; + if (ornament == null) continue; + if (!ornament.isValidSlot(i)) continue; OverAttr(attr,ornament.getMainAttr()); setItemAttrConfig(ornament.getLabel(), attr); @@ -629,6 +649,14 @@ public float[] getHpPerSecond() { return new float[]{ 0.0f, 0.0f }; } + @Override + public float[] getHpPerNature() { + if (getItemAttrMap().containsKey("生命恢复")) { + return getItemAttrMap().get("生命恢复"); + } + return new float[]{ 0.0f, 0.0f }; + } + @Override public float[] getMovementSpeedMultiplier() { if (getItemAttrMap().containsKey("移速加成")) { diff --git a/src/main/java/RcRPG/AttrManager/RcEntityAttr.java b/src/main/java/RcRPG/AttrManager/RcEntityAttr.java index d1f9628..5a196b9 100644 --- a/src/main/java/RcRPG/AttrManager/RcEntityAttr.java +++ b/src/main/java/RcRPG/AttrManager/RcEntityAttr.java @@ -281,6 +281,14 @@ public float[] getHpPerSecond() { return new float[]{ 0.0f, 0.0f }; } + @Override + public float[] getHpPerNature() { + if (mainAttr.containsKey("生命恢复")) { + return mainAttr.get("生命恢复"); + } + return new float[]{ 0.0f, 0.0f }; + } + @Override public float[] getMovementSpeedMultiplier() { if (mainAttr.containsKey("移速加成")) { diff --git a/src/main/java/RcRPG/Commands.java b/src/main/java/RcRPG/Commands.java index 7fec66b..a98a106 100644 --- a/src/main/java/RcRPG/Commands.java +++ b/src/main/java/RcRPG/Commands.java @@ -201,7 +201,7 @@ public int execute(CommandSender sender, String commandLabel, Map.Entry MaxH ? MaxH : H); } else { - damager.heal(new EntityRegainHealthEvent(damager, (float) lifeSteal, 3)); + damager.heal(new EntityRegainHealthEvent(damager, (float) lifeSteal, RegainHealthEnum.LifeSteal.getCode())); } if (damagerIsPlayer) { ((Player) damager).sendMessage(Main.getI18n().tr(((Player) damager).getLanguageCode(), "rcrpg.events.life_steal_message", lifeSteal)); @@ -579,10 +578,23 @@ public void toggleSprintEvent(PlayerToggleSprintEvent event) { Player player = event.getPlayer(); PlayerAttr attr = PlayerAttr.getPlayerAttr(player); if (attr == null) return; - float speedAddition = attr.movementSpeedMultiplier; + float speedAddition = attr.movementSpeedMultiplier;// 处理移速加成 if (speedAddition > 0) player.sendMovementSpeed(speedAddition); } + @EventHandler + public void onRegainHealth(EntityRegainHealthEvent event) { + if (event.getRegainReason() != EntityRegainHealthEvent.CAUSE_EATING) return; + Entity entity = event.getEntity(); + if (!(entity instanceof Player player)) return; + PlayerAttr manager = PlayerAttr.getPlayerAttr(player); + if (manager != null) { + int amount = (int) manager.hpPerNature; + if (amount < 1) return; + player.heal(new EntityRegainHealthEvent(player, amount, RegainHealthEnum.HpPerNature.getCode())); + } + } + @EventHandler public void chatEvent(PlayerChatEvent event){ if (Main.instance.disableChatStyle) return; @@ -638,11 +650,6 @@ public void joinEvent(PlayerPreLoginEvent event){ player.setNameTagVisible(); player.setNameTagAlwaysVisible(); } - if (hasHealthAPI) { - Handle.getMaxHealth(player); - } else { - player.setMaxHealth(Handle.getMaxHealth(player)); - } } diff --git a/src/main/java/RcRPG/Handle.java b/src/main/java/RcRPG/Handle.java index af2f7fb..06f0160 100644 --- a/src/main/java/RcRPG/Handle.java +++ b/src/main/java/RcRPG/Handle.java @@ -1,7 +1,5 @@ package RcRPG; -import RcRPG.AttrManager.PlayerAttr; -import RcRPG.RPG.Level; import RcRPG.RPG.Stone; import RcRPG.Society.Shop; import cn.nukkit.Player; @@ -138,21 +136,6 @@ public static void remove(Player player,String[] s){ } } - public static int getMaxHealth(Player player){ - if(Handle.getPlayerConfig(player.getName()) == null) return 20; - String s = Main.instance.config.getString("等级增加血量"); - int health1 = Level.getLevel(player) / Integer.parseInt(s.split(":")[0]) * Integer.parseInt(s.split(":")[1]); - int health2 = 0; - if (PlayerAttr.playerlist.containsKey(player)) { - PlayerAttr pAttr = PlayerAttr.playerlist.get(player); - int hp = (int) pAttr.getHp()[0]; - float hpMulti = pAttr.getHpRegenMultiplier()[0]; - int hpAdd = (int) (hpMulti * hp); - health2 = hp + hpAdd; - } - return health2 + health1 + 20; - } - public static int random(int a,int b) { return new Random().nextInt(b-a+1)+a; } diff --git a/src/main/java/RcRPG/RPG/Armour.java b/src/main/java/RcRPG/RPG/Armour.java index 220a7fc..bd56968 100644 --- a/src/main/java/RcRPG/RPG/Armour.java +++ b/src/main/java/RcRPG/RPG/Armour.java @@ -11,8 +11,10 @@ import cn.nukkit.nbt.tag.StringTag; import cn.nukkit.potion.Effect; import cn.nukkit.utils.Config; +import cn.nukkit.utils.ConfigSection; import lombok.Getter; import lombok.Setter; +import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.ArrayList; @@ -26,8 +28,22 @@ public class Armour extends ItemAttr { private String name; + /** + * -- SETTER -- + * 仅作为属性分类的标识 + * + * @param label + */ + @Setter private String label; + /** + * -- GETTER -- + * 物品名,替代源label用法 + * + * @return + */ + @Getter private String showName; private Item item; @@ -40,10 +56,13 @@ public class Armour extends ItemAttr { private ArrayList effects = new ArrayList<>(); + @Getter private Object attr; private int stone; + private ColorRGB color; + /** * 分解方案 */ @@ -81,6 +100,9 @@ public static Armour loadArmour(String name,Config config){ armour.setAttr(config.get("属性")); } armour.setMessage(config.getString("介绍")); + + armour.setColor(loadColorFromConfig(config)); + armour.setDismantle(config.getString("分解", "")); armour.setSuit(config.getString("套装", "")); armour.setTipText(config.getString("底部显示")); @@ -88,12 +110,8 @@ public static Armour loadArmour(String name,Config config){ armour.setServerMessage(config.getString("全服通知")); armour.setStone(config.getInt("宝石孔数")); - ArrayList list1 = new ArrayList<>(); - for(String effect : config.getStringList("药水效果")){ - String[] o = effect.split(":"); - list1.add(Effect.getEffect(Integer.parseInt(o[0])).setAmplifier(Integer.parseInt(o[1])-1).setDuration(Integer.parseInt(o[2])*20)); - } - armour.setEffects(list1); + armour.setEffects(loadEffectsFromConfig(config)); + ArrayList list2 = new ArrayList<>(config.getStringList("显示")); armour.setLoreList(list2); ArrayList list3 = new ArrayList<>(config.getStringList("宝石槽")); @@ -101,11 +119,40 @@ public static Armour loadArmour(String name,Config config){ return armour; }catch(Exception e){ + e.printStackTrace(); Main.instance.getLogger().error("加载盔甲"+name+"配置文件失败"); return null; } } + @NotNull + private static ColorRGB loadColorFromConfig(Config config) { + if (!config.exists("染色")) { + return new ColorRGB(-1, -1, -1); + } + ConfigSection rgb = config.getSection("染色"); + + return new ColorRGB(rgb.getInt("r", -1), rgb.getInt("g", -1), rgb.getInt("b", -1)); + } + + @NotNull + private static ArrayList loadEffectsFromConfig(Config config) { + ArrayList effects = new ArrayList<>(); + if (!config.exists("药水效果")) { + return effects; + } + for (String effect : config.getStringList("药水效果")) { + String[] parts = effect.split(":"); + if (parts.length == 3) { + effects.add(Effect.getEffect(Integer.parseInt(parts[0])) + .setAmplifier(Integer.parseInt(parts[1]) - 1) + .setDuration(Integer.parseInt(parts[2]) * 20)); + } + } + return effects; + } + + public static Config getArmourConfig(String name){ File file = new File(Main.instance.getDataFolder()+"/Armour/"+name+".yml"); Config config; @@ -140,13 +187,15 @@ public static Item getItem(String name, int count) { Armour armour = Main.loadArmour.get(name); Item item = armour.getItem(); item.setCount(count); - CompoundTag tag = item.getNamedTag(); - if(tag == null){ - tag = new CompoundTag(); - } + CompoundTag tag = item.hasCompoundTag() ? item.getNamedTag() : new CompoundTag(); tag.putString("type","armour"); tag.putString("name",name); tag.putByte("Unbreakable",1); + + if (!armour.getColor().isEmpty()) { + tag.putInt("customColor", armour.getColor().getRgb()); + } + item.setNamedTag(tag); item.setCustomName(armour.getShowName()); Armour.setArmourLore(item); @@ -158,13 +207,13 @@ public static boolean giveArmour(Player player, String name, int count){ } Armour armour = Main.loadArmour.get(name); player.getInventory().addItem(getItem(name, count)); - if(!armour.getMyMessage().equals("")){ + if(!armour.getMyMessage().isEmpty()){ String text = armour.getMyMessage(); if(text.contains("@player")) text = text.replace("@player", player.getName()); if(text.contains("@item")) text = text.replace("@item", armour.getLabel()); player.sendMessage(text); } - if(!armour.getServerMessage().equals("")){ + if(!armour.getServerMessage().isEmpty()){ String text = armour.getServerMessage(); if(text.contains("@player")) text = text.replace("@player", player.getName()); if(text.contains("@item")) text = text.replace("@item", armour.getLabel()); @@ -285,28 +334,22 @@ public static Item setArmourLore(Item item){ return item; } - /** - * 仅作为属性分类的标识 - * @param label - */ - public void setLabel(String label) { - this.label = label; - } - - /** - * 物品名,替代源label用法 - * @return - */ - public String getShowName() { - return showName; - } - - public Object getAttr() { - return attr; - } public void setAttr(Object attr) { this.attr = attr; setItemAttrConfig(attr); } + @Getter + @Setter + public static class ColorRGB { + private int rgb; + + public ColorRGB(int r, int g, int b) { + this.setRgb((r << 16) | (g << 8) | b); + } + + public boolean isEmpty() { + return getRgb() == -1; + } + } } diff --git a/src/main/java/RcRPG/RPG/Ornament.java b/src/main/java/RcRPG/RPG/Ornament.java index 5a7ae74..4ef3b24 100644 --- a/src/main/java/RcRPG/RPG/Ornament.java +++ b/src/main/java/RcRPG/RPG/Ornament.java @@ -21,14 +21,29 @@ public class Ornament extends ItemAttr { private String name; + /** + * -- SETTER -- + * 仅作为属性分类的标识 + * + * @param label + */ + @Setter private String label; + /** + * -- GETTER -- + * 物品名,替代源label用法 + * + * @return + */ + @Getter private String showName; private Item item; private int level; + @Getter private Object attr; private String tipText; @@ -39,6 +54,8 @@ public class Ornament extends ItemAttr { private String message; + private int effectiveSlot; + private ArrayList loreList = new ArrayList<>(); /** * 套装方案 @@ -76,6 +93,7 @@ public static Ornament loadOrnament(String name, Config config){ ornament.setTipText(config.getString("底部显示")); ornament.setMyMessage(config.getString("个人通知")); ornament.setServerMessage(config.getString("全服通知")); + ornament.setEffectiveSlot(config.getInt("生效槽", -1)); return ornament; }catch(Exception e){ Main.instance.getLogger().error("加载饰品"+name+"配置文件失败"); @@ -180,29 +198,15 @@ public static Item setOrnamentLore(Item item){ return item; } - /** - * 仅作为属性分类的标识 - * @param label - */ - public void setLabel(String label) { - this.label = label; - } - - /** - * 物品名,替代源label用法 - * @return - */ - public String getShowName() { - return showName; - } - - public Object getAttr() { - return attr; - } - public void setAttr(Object attr) { this.attr = attr; setItemAttrConfig(attr); } + public boolean isValidSlot(int slot) { + if (this.effectiveSlot == -1) return true; + if (this.effectiveSlot == slot) return true; + return false; + } + } diff --git a/src/main/java/RcRPG/RegainHealthEnum.java b/src/main/java/RcRPG/RegainHealthEnum.java new file mode 100644 index 0000000..8e3b62e --- /dev/null +++ b/src/main/java/RcRPG/RegainHealthEnum.java @@ -0,0 +1,16 @@ +package RcRPG; + +import lombok.Getter; + +@Getter +public enum RegainHealthEnum { + LifeSteal(1001), + HpPerNature(1002); + + private final int code; + + RegainHealthEnum(int code) { + this.code = code; + } + +} diff --git a/src/main/java/RcRPG/Task/loadHealth.java b/src/main/java/RcRPG/Task/loadHealth.java deleted file mode 100644 index 891a406..0000000 --- a/src/main/java/RcRPG/Task/loadHealth.java +++ /dev/null @@ -1,26 +0,0 @@ -package RcRPG.Task; - -import RcRPG.Handle; -import RcRPG.Main; -import cn.nukkit.Player; -import cn.nukkit.scheduler.PluginTask; - -public class loadHealth extends PluginTask { - - public loadHealth(Main main){ - super(main); - } - - @Override - public void onRun(int i) { - for(Player player:Main.instance.getServer().getOnlinePlayers().values()){ - if(Handle.getPlayerConfig(player.getName()) == null) continue; - if(player.getHealth() == player.getMaxHealth()) continue; - - if(player.getMaxHealth() != Handle.getMaxHealth(player)){ - player.setMaxHealth(Handle.getMaxHealth(player)); - if(player.getHealth() > player.getMaxHealth()) player.setHealth(player.getMaxHealth()); - } - } - } -} diff --git a/src/main/resources/Ornament.yml b/src/main/resources/Ornament.yml index 4578fb7..8e371c5 100644 --- a/src/main/resources/Ornament.yml +++ b/src/main/resources/Ornament.yml @@ -21,4 +21,5 @@ - §r§6◈§f═§7╞════════════╡§f═ 底部显示: '' 个人通知: '' -全服通知: '' \ No newline at end of file +全服通知: '' +# 生效槽: 1 # 仅放置在饰品背包对应槽位上时生效,-1为不限制,0为第一个槽,1为第二个槽... \ No newline at end of file diff --git a/src/main/resources/language/en_US.lang b/src/main/resources/language/en_US.lang index a0fc1ac..b346980 100644 --- a/src/main/resources/language/en_US.lang +++ b/src/main/resources/language/en_US.lang @@ -1,9 +1,12 @@ +rpg.commands.reloaded=§aConfiguration reload successful + rcrpg.events.insufficient_level_for_weapon=Insufficient level, unable to use this weapon rcrpg.events.life_steal_message=You have drained §c§l{%0}§r health from the opponent rcrpg.events.critical_damage_message=You dealt §l{%1}§r critical damage to {%0} rcrpg.events.dodge_message_you_evaded=You evaded the attack from {%0} rcrpg.events.dodge_message_enemy_evaded={%0}§r evaded your attack +rcrpg.playerattr.lv=Level Attr Points rcrpg.playerattr.suit.label={%0} {%1} Set rcrpg.playerattr.set_suit_message=You feel the effects of §l{%0} ({%1})§r's §dSet§f! diff --git a/src/main/resources/language/zh_CN.lang b/src/main/resources/language/zh_CN.lang index 356ecb8..a542a2b 100644 --- a/src/main/resources/language/zh_CN.lang +++ b/src/main/resources/language/zh_CN.lang @@ -1,9 +1,12 @@ +rpg.commands.reloaded=§a配置文件重载成功 + rcrpg.events.insufficient_level_for_weapon=等级不足,无法使用此武器 rcrpg.events.life_steal_message=你已汲取对方 §c§l{%0}§r 血量值 rcrpg.events.critical_damage_message=你对 {%0} 造成了 §l{%1}§r 点暴击伤害 rcrpg.events.dodge_message_you_evaded=你闪避了 {%0} §r的攻击 rcrpg.events.dodge_message_enemy_evaded={%0} §r闪避了你的攻击 +rcrpg.playerattr.lv=等级加点 rcrpg.playerattr.suit.label={%0} {%1}件套 rcrpg.playerattr.set_suit_message=你感受到了 §l{%0} ({%1}) §r的§d套装§f效果!