diff --git a/README.md b/README.md index c60eddf..f5af8d3 100644 --- a/README.md +++ b/README.md @@ -16,188 +16,4 @@ EssentialsX,其中D代表Deer。 3. 在 `plugins/EssentialsD/config.yml` 中配置 4. 重启服务器 -## 玩家使用方法 - -### 1. 隐形(发光)展示框 - -![image-20240118174003155](https://ssl.lunadeer.cn:14437/i/2024/01/18/65a8f1f380640.png) - -![image-20240118174020596](https://ssl.lunadeer.cn:14437/i/2024/01/18/65a8f204dcb15.png) - -可以通过`八个木棍`+`一个玻璃板`合成隐形展示框![](https://ssl.lunadeer.cn:14437/i/2024/04/19/6621ce4eeabbf.png) - -或者`一个隐形展示框`+`一个萤石粉`合成隐形发光展示框![](https://ssl.lunadeer.cn:14437/i/2024/04/19/6621ce915ef3c.png) - -当隐形展示框中没有东西时和普通展示框没有区别,**只有在将要展示的物品放置在隐形展示框中时展示框才会自动隐形** -。取下展示框中的物品后展示框会自动恢复到现形状态,避免找不到隐形的空展示框。 - -### 2. 带手的盔甲架 - -使用 `木棍` 对着普通盔甲架单击 `鼠标左键`,即可给盔甲架装上手臂。 - -![](https://ssl.lunadeer.cn:14437/i/2024/01/16/65a62d9d94d8f.gif) - -> 由于游戏特性,盔甲架被打掉后手臂会自动消失,因此每次防止盔甲架都需要重新安装手臂。 - -### 3. 自杀指令 - -使用 `/suicide` 即可自杀,避免因为特殊情况被卡在门中或误入禁区无法动弹。 - -### 4. 帽子 - -使用 `/hat` 可将主手持(一般为右手)的任意物品放到头上,如果头上有东西 - -### 5. 展示物品 - -使用 `/showitem` 可以向服务器内的所有玩家展示你主手持(一般为右手)的物品。 - -### 6. 头颅 - -使用 `/skull` 可将背包中的一个头颅交换为自己的头颅,注意:需要你的背包中有任意一个除玩家之外生物的头颅(苦力怕、凋零、小白等都可以)。 - -### 7. 撬棍 - -![image-20240118174110521](https://ssl.lunadeer.cn:14437/i/2024/01/18/65a8f236d8aa6.png) - -使用`一个铁锭`+`一个木棍` -合成撬棍![image-20240118173808266](https://ssl.lunadeer.cn:14437/i/2024/01/18/65a8f1815937f.png) - -使用撬棍右击平放的铁轨可以改变铁轨的方向。 - -### 8. 快速末影箱 - -使用 `enderchest` 可以快速打开末影箱。 - -### 9. 附魔书堆叠 - -使用两本书可以合成堆叠为2的附魔书: - -![](https://ssl.lunadeer.cn:14437/i/2024/03/19/65f86b5f25303.png) - -此种特殊堆叠可以用于实现大吸力漏斗等特殊效果(详情可自行搜索学习)。 - -### 10. 光源方块 - -可以使用一个火把转换成一个光源方块,光源方块可用于建筑美化。 - -![](https://ssl.lunadeer.cn:14437/i/2024/03/23/65fed55d7815a.png) - -> -以下摘自WIKI:作为一种被设计为隐藏自身存在的方块,光源方块有许多与结构空位相似的性质。光源方块通常是不可见的,并且没有碰撞箱。与结构空位类似,光源方块不会被水或熔岩冲毁,能够阻止其通过。光源方块不能在非创造模式中被挖掘破坏。光源方块会阻碍植物生长。活塞不能推动光源方块。光源方块具有3,600,000.8爆炸抗性,并阻止游戏中的常见爆炸透过光源方块破坏方块。光源方块具有一个完整方块大小的判定箱,但只在玩家手持光源方块时才可以选中,否则玩家只能选中其后方的物体。在光源方块的判定箱上尝试放置不是光源方块的方块时,方块会取代光源方块。光源方块可以含水。含水的光影方块可以通过在光源方块中放置水或在水中放置光源方块来获得,允许玩家创造发光且不会结冰或被熔岩破坏的水体。光源方块是一种“隐形方块”,处于开启了“显示隐形方块”的储存模式结构方块的存储区域范围内的光源方块会显示出一个淡黄色的立方体框。 - -### 11. 传送 - -使用 `/tpa ` 可以向指定玩家发送传送请求,对方可以选择接受或拒绝。 - -### 12. 椅子 - -你可以将楼梯当作椅子右键坐下(根据服主配置可能需要在楼梯两边放置木板)。 - -![](https://ssl.lunadeer.cn:14437/i/2024/04/17/661fd53068264.png) - -## 管理员指南 - -### 1. 无敌模式 - -使用 `/god [player]` 可以将自己或其他玩家设置为无敌模式,无敌模式下玩家不会受到任何伤害。 - -### 2. 飞行模式 - -使用 `/fly [player]` 可以将自己或其他玩家设置为飞行模式,飞行模式下玩家可以在空中飞行。 - -### 3. 复制手持物品 - -使用 `/more [amount]` 可以获取更多手持物品,如果不填写数量则默认为64个。 - -### 4. 设置世界时间 - -- 使用 `/day` 可以将世界时间设置为白天。 -- 使用 `/noon` 可以将世界时间设置为正午。 -- 使用 `/night` 可以将世界时间设置为黑夜。 - -### 5. 设置天气 - -- 使用 `/sun` 可以将天气设置为晴天。 -- 使用 `/rain` 可以将天气设置为下雨。 -- 使用 `/storm` 可以将天气设置为雷雨。 - -### 6. 区域强加载 - -在 `plugins/EssentialsD/config.yml` 中的 `ForceLoadChunks` 中添加需要强加载的区块,格式为 `world:x:z`,其中 `world` -为世界名称,`x` 和 `z` 为区块坐标。 - -### 7. 查看玩家背包 - -使用 `/inspect` 命令可以查看玩家的背包。 - -```yaml -ForceLoadChunks: - - world:0:0 - - world_the_end:-12:12 -``` - -## 指令 - -以下指令尖括号`<>`表示必填参数,方括号`[]`表示可选参数。 - -### 玩家指令 - -| 指令 | 说明 | -|-----------------|-------------------| -| `/suicide` | 自杀 | -| `/hat` | 将主手持的物品放在头部 | -| `/showitem` | 展示主手持的物品 | -| `/skull` | 使用任意头颅交换获得一个自己的头颅 | -| `/enderchest` | 通过指令打开末影箱 | -| `/tpa ` | 请求传送到指定玩家位置 | - -### 管理员指令 - -| 指令 | 说明 | -|------------------|----------| -| `/save` | 手动保存存档 | -| `/god [player]` | 无敌模式 | -| `/fly [player]` | 飞行模式 | -| `/more [amount]` | 获取更多手持物品 | -| `/day` | 设置白天 | -| `/noon` | 设置正午 | -| `/night` | 设置黑夜 | -| `/sun` | 设置晴天 | -| `/rain` | 设置下雨 | -| `/storm` | 设置雷雨 | - -## 配置文件参考 - -```yaml -# 附魔瓶经验值倍率 -ExpBottleRatio: 1.0 - -# 强加载区块列表 -ForceLoadChunks: -# - world:0:0 -# - world_the_end:-12:12 - -# 区块操作延迟(强加载清理、设置) 秒 -# 过低可能导致世界未加载完成时触发操作引起报错 -# -1 为禁用强加载区块操作 -ChunkOperateDelay: 10 - -Teleport: - Enable: true - # 请求有效期 秒 - Expire: 30 - # 传送延迟 秒 - Delay: 0 - # 冷却时间 秒 - CoolDown: 0 - -Chair: - Enable: true - MaxWidth: 4 - SignCheck: false - SitHeight: -0.95 - -Debug: false -``` - ## TODO diff --git a/pom.xml b/pom.xml index 1f8045f..6a624cd 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer EssentialsD - 1.19.0 + 1.20.0 jar EssentialsD diff --git a/src/main/java/cn/lunadeer/essentialsd/events/Experience.java b/src/main/java/cn/lunadeer/essentialsd/events/Experience.java new file mode 100644 index 0000000..02b70c5 --- /dev/null +++ b/src/main/java/cn/lunadeer/essentialsd/events/Experience.java @@ -0,0 +1,51 @@ +package cn.lunadeer.essentialsd.events; + +import cn.lunadeer.essentialsd.EssentialsD; +import cn.lunadeer.essentialsd.dtos.NameRecord; +import cn.lunadeer.essentialsd.dtos.PlayerName; +import com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.player.PlayerLoginEvent; + +import java.util.Collection; + +public class Experience implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onExpOrbSpawn(EntitySpawnEvent event) { + if (!EssentialsD.config.getCombineExpOrbs()) { + return; + } + Entity entity = event.getEntity(); + if (entity.getType() != EntityType.EXPERIENCE_ORB) { + return; + } + ExperienceOrb orb = (ExperienceOrb) entity; + Location loc = entity.getLocation(); + double radius = EssentialsD.config.getCombineExpOrbsRadius(); + Collection entities = loc.getNearbyEntities(radius, radius, radius); + for (Entity e : entities) { + if (e.getType() != EntityType.EXPERIENCE_ORB) { + continue; + } + orb.setExperience(orb.getExperience() + ((ExperienceOrb) e).getExperience()); + e.remove(); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerLogin(PlayerLoginEvent event) { + Player player = event.getPlayer(); + if (EssentialsD.config.getNoExpCoolDown()) { + player.setExpCooldown(0); + } + } +} diff --git a/src/main/java/cn/lunadeer/essentialsd/managers/ConfigManager.java b/src/main/java/cn/lunadeer/essentialsd/managers/ConfigManager.java index b3c88e4..75bf8d3 100644 --- a/src/main/java/cn/lunadeer/essentialsd/managers/ConfigManager.java +++ b/src/main/java/cn/lunadeer/essentialsd/managers/ConfigManager.java @@ -5,6 +5,7 @@ import cn.lunadeer.essentialsd.utils.XLogger; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; import java.util.Collection; import java.util.List; @@ -23,6 +24,9 @@ public class ConfigManager { _debug = _file.getBoolean("Debug", false); _check_update = _file.getBoolean("CheckUpdate", true); _exp_bottle_ratio = (float) _file.getDouble("ExpBottleRatio", 1.0); + _combine_exp_orbs_enable = _file.getBoolean("CombineExpOrbs.Enable", false); + _combine_exp_orbs_radius = (float) _file.getDouble("CombineExpOrbs.Radius", 1.5); + _no_exp_cool_down = _file.getBoolean("NoExpCoolDown", false); _force_load_chunks = _file.getStringList("ForceLoadChunks"); _chunk_operate_delay = _file.getInt("ChunkOperateDelay", 10); _commands_tpa = _file.getBoolean("Commands.Tpa", true); @@ -85,6 +89,43 @@ public class ConfigManager { _plugin.saveConfig(); } + public Boolean getCombineExpOrbs() { + return _combine_exp_orbs_enable; + } + + public void setCombineExpOrbs(Boolean combine) { + _combine_exp_orbs_enable = combine; + _file.set("CombineExpOrbs.Enable", combine); + _plugin.saveConfig(); + } + + public Float getCombineExpOrbsRadius() { + return _combine_exp_orbs_radius; + } + + public void setCombineExpOrbsRadius(Float radius) { + _combine_exp_orbs_radius = radius; + _file.set("CombineExpOrbs.Radius", radius); + _plugin.saveConfig(); + } + + public Boolean getNoExpCoolDown() { + return _no_exp_cool_down; + } + + public void setNoExpCoolDown(Boolean no_cool_down) { + _no_exp_cool_down = no_cool_down; + _file.set("NoExpCoolDown", no_cool_down); + _plugin.saveConfig(); + for (Player player : EssentialsD.instance.getServer().getOnlinePlayers()) { + if (EssentialsD.config.getNoExpCoolDown()) { + player.setExpCooldown(0); + } else { + player.setExpCooldown(1); + } + } + } + public Integer getChunkOperateDelay() { return _chunk_operate_delay; } @@ -283,6 +324,9 @@ public class ConfigManager { private FileConfiguration _file; private boolean _debug; private float _exp_bottle_ratio; + private Boolean _combine_exp_orbs_enable; + private Float _combine_exp_orbs_radius; + private Boolean _no_exp_cool_down; private List _force_load_chunks; private Integer _chunk_operate_delay; private Integer _tp_tpa_expire; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 77a00ac..35e8beb 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -10,6 +10,14 @@ Database: # 附魔瓶经验值倍率 ExpBottleRatio: 1.0 +# 合并经验球 +CombineExpOrbs: + Enable: false + Radius: 1.5 + +# 经验吸收无冷却 +NoExpCoolDown: false + # 强加载区块列表 ForceLoadChunks: [ ] # - world:0:0