From 5a155bd0294e975d0db2a697bec2d8fa84940961 Mon Sep 17 00:00:00 2001 From: Mcayear Date: Thu, 25 Jan 2024 14:28:58 +0800 Subject: [PATCH] (feat) New attributes, leveling up blood, new configurations for trinkets (#4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (faat) 实现了属性“生命恢复” * (faat) 重新实现了等级属性加成 * (feat) 饰品添加生效槽配置 --- .idea/misc.xml | 24 ---- lib/EconomyAPI-2.0.2.jar | Bin 0 -> 38907 bytes pom.xml | 4 +- .../java/RcRPG/AttrManager/AttrInterface.java | 2 + src/main/java/RcRPG/AttrManager/ItemAttr.java | 8 ++ .../RcRPG/AttrManager/LittleMonsterAttr.java | 8 ++ src/main/java/RcRPG/AttrManager/Manager.java | 11 ++ .../java/RcRPG/AttrManager/PlayerAttr.java | 32 +++++- .../java/RcRPG/AttrManager/RcEntityAttr.java | 8 ++ src/main/java/RcRPG/Commands.java | 2 +- src/main/java/RcRPG/Events.java | 37 +++--- src/main/java/RcRPG/Handle.java | 17 --- src/main/java/RcRPG/RPG/Armour.java | 105 ++++++++++++------ src/main/java/RcRPG/RPG/Ornament.java | 44 ++++---- src/main/java/RcRPG/RegainHealthEnum.java | 16 +++ src/main/java/RcRPG/Task/loadHealth.java | 26 ----- src/main/resources/Ornament.yml | 3 +- src/main/resources/language/en_US.lang | 3 + src/main/resources/language/zh_CN.lang | 3 + 19 files changed, 215 insertions(+), 138 deletions(-) delete mode 100644 .idea/misc.xml create mode 100644 lib/EconomyAPI-2.0.2.jar create mode 100644 src/main/java/RcRPG/RegainHealthEnum.java delete mode 100644 src/main/java/RcRPG/Task/loadHealth.java 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 0000000000000000000000000000000000000000..88be226ac083ad510ca1eb1aecf23b6e06c5bea3 GIT binary patch literal 38907 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 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效果!