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效果!