Giter VIP home page Giter VIP logo

valkyrie's Introduction

🌳 About @ElaBosak233

Hi, there~ My name is Ela /ˈɛlə/, and my Chinese name is 埃拉 /āi lā/. Meeting you is a really lucky thing in my life. 💖

Ela's GitHub stats Ela's Most used Languages

U can read more about me at my website E23.DEV.

valkyrie's People

Contributors

elabosak233 avatar loinko avatar subilan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

valkyrie's Issues

异常处理

https://github.com/ElaBosak233/Valkyrie/blob/master/source/Part02/2.7-%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86.md
类名拼写错误
原文:ArrayIndexOutOfBoundException
应为:ArrayIndexOutOfBoundsException

jshell> (new byte[]{})[0]
|  异常错误 java.lang.ArrayIndexOutOfBoundsException:Index 0 out of bounds for length 0
|        at (#5:1)
public void throwException() {
    throw new Exception("this is a exception");
}

这里的Exception是受检异常,应改为

public void throwException() throws Exception {
    throw new Exception("this is a exception");
}

大驼峰命名这个地方

https://github.com/ElaBosak233/Valkyrie/blame/master/source/Part02/2.2-Java%E4%BB%A3%E7%A0%81%E8%A7%84%E7%BA%A6.md
Java属性名习惯上使用小驼峰
命名空间不得出现大写字母!!否则会出现不识别等问题,因此大驼峰命名空间一定是非法命名空间
而且命名空间属于Minecraft内容而非Java内容
以下内容来自MCWiki

命名空间和名称只能包含以下字符:

    0123456789 数字
    abcdefghijklmnopqrstuvwxyz 小写字母
    _ 下划线
    - 连字符号
命名空间和名称的最好命名方法是小写单词加下划线。 

第三章中的文章错误

具体位置在“https://valkyrie.ela.ac.cn/#/./source/Part03/3.4-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6?id=%e9%bb%98%e8%ae%a4%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6”
中“我们在 config.yml 中添加一个键,希望用来记录玩家放置方块的总数,既然要监听破坏方块,那么我们创建一个监听器类 BlockPlace.java,在每次写入数据之前,我们得先判断,key 下面是否有对应的值,并且,我们需要获取它的值,如果没有,那么就将它定义为 0,然后我们再向其中写入值,玩家每放置一个方块,那么 score 就会 +1,当然,这些都完成后,千万不能忘记保存 config.yml,否则你做的一切,可能就没了!”我们要监听的是玩家的放置方块而教程却写成了“监听破坏方块”

关于TabExecutor的问题

我已经按照valkyrie上的教程写下了tabexecutor的类,并且放在Command.java类中,`public class Command implements TabExecutor {
@OverRide
public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) {
if (sender instanceof Player) {
Player p = (Player) sender;
if (p.hasPermission("val.op")) {
if (args.length == 0) {
p.sendMessage("缺少子命令");
return true;
} else if (args[0].equalsIgnoreCase("name")) {
p.sendMessage("Hello, " + p.getName());
return true;
} else if (args[0].equalsIgnoreCase("uuid")) {
p.sendMessage("Hello, your UUID is " + p.getUniqueId());
return true;
} else {
p.sendMessage("子命令无效");
return true;
}
} else {
p.sendMessage("你没有权限执行该指令");
return true;
}
} else {
sender.sendMessage("你不是玩家无法执行该命令");
return true;
}
}

@Override
public List<String> onTabComplete(CommandSender sender, org.bukkit.command.Command command, String alias, String[] args) {
    if (args.length == 1) {
        List<String> subCommands = new ArrayList<>();
        subCommands.add("name");
        subCommands.add("uuid");
        return subCommands;
    }
    return null;
}

}具体是这么写的,但是当我放入服务器后却显示报错信息如下[23:25:14 ERROR]: Error occurred while enabling Valkyrie v1.0-SNAPSHOT (Is it up to date?)
java.lang.NullPointerException: null
at com.shiyu.valkyrie.Valkyrie.onEnable(Valkyrie.java:14) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:265) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:347) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:410) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at org.bukkit.craftbukkit.v1_13_R2.CraftServer.enablePlugin(CraftServer.java:436) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at org.bukkit.craftbukkit.v1_13_R2.CraftServer.enablePlugins(CraftServer.java:350) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at net.minecraft.server.v1_13_R2.MinecraftServer.l(MinecraftServer.java:580) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at net.minecraft.server.v1_13_R2.MinecraftServer.a(MinecraftServer.java:542) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at net.minecraft.server.v1_13_R2.MinecraftServer.a(MinecraftServer.java:420) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at net.minecraft.server.v1_13_R2.DedicatedServer.init(DedicatedServer.java:294) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at net.minecraft.server.v1_13_R2.MinecraftServer.run(MinecraftServer.java:698) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]在主类中是这样写的@OverRide
public void onEnable() {
// Plugin startup logic
Bukkit.getPluginCommand("val").setExecutor(new Command());
}`

valkyrie中信息出错

在valkyrie4.4ItemMeta与子类一章中讲到了“屠龙宝刀”的示例,在代码中的注释似乎有一点问题
`ItemStack dragonSword = new ItemStack(Material.GOLDEN_SWORD);
ItemMeta dragonSwordMeta = dragonSword.getItemMeta(); // 从普通的金剑中获取它的 ItemMeta

dragonSwordMeta.setDisplayName(ChatColor.DARK_PURPLE+"屠龙宝刀"); // 设置 屠龙宝刀 的名字

ArrayList lore = new ArrayList();
lore.add(ChatColor.RED+"一刀 999 级");
lore.add(ChatColor.GREEN+"大家好,我系渣渣灰");
dragonSwordMeta.setLore(lore); // 设置 屠龙宝刀 的 lore

dragonSwordMeta.addEnchant(Enchantment.DAMAGE_ALL, 999, true); // 设置 屠龙宝刀 的附魔,第一个是附魔类型,第二个是等级,第三个是忽略等级限制

dragonSword.setItemMeta(dragonSwordMeta); // 将 goldenSword 设置成 屠龙宝刀 的 ItemMeta,后面只需要把这个 goldenSword给玩家就行了
`
最后一行应该是dragonSword才对

switch

a和b不一定是数值,字符串和枚举值也可以
switch...case...

switch...case... 结构可以判断一个变量与一系列的某个值是否相等,每个值称为一个 分支

switch( 变量 ){
case 数值a:
// 将要做什么
break; // 如果没有 break 语句,后续的所有 case 的值都会被输出!
case 数值b:
// 将要做什么
break;
... // 这里代表无数个 case 语句
default:
// 当没有任何数值匹配的时候,会自动进入 default 中,当然,default 请写在最后面
}

关于创建inventory遇到的问题

如题,我在valkyrie章节4.3中按照教程写入了玩家加入打开gui事件,在idea中这样写的
@EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Inventory inventory = Bukkit.createInventory(null, InventoryType.CHEST, ChatColor.GOLD+"Valkyrie"); inventory.setItem(11, new ItemStack(Material.DIAMOND, 64)); inventory.setItem(13, new ItemStack(Material.GOLD_BLOCK, 32)); inventory.setItem(15, new ItemStack(Material.EMERALD, 64)); event.getPlayer().openInventory(inventory); }
而我导入服务端并且登入后却无法登入,在游戏内的报错信息为Internal server error
在后台则提示报错信息为
java.lang.IllegalArgumentException: Listener already listening at net.minecraft.server.v1_13_R2.Container.addSlotListener(Container.java:55) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.EntityPlayer.syncInventory(EntityPlayer.java:302) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.PlayerList.a(PlayerList.java:215) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.LoginListener.b(LoginListener.java:149) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.LoginListener.tick(LoginListener.java:53) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.NetworkManager.a(NetworkManager.java:230) ~[spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.ServerConnection.c(ServerConnection.java:119) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.MinecraftServer.b(MinecraftServer.java:994) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.DedicatedServer.b(DedicatedServer.java:417) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.MinecraftServer.a(MinecraftServer.java:831) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at net.minecraft.server.v1_13_R2.MinecraftServer.run(MinecraftServer.java:729) [spigot-1.13.2.jar:git-Spigot-1a3504a-84f3da3] at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
求解

配置文件

https://valkyrie.ela.ac.cn/#/./source/Part03/3.4-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6?id=%e5%ba%8f%e5%88%97%e5%8c%96%e8%87%aa%e5%ae%9a%e4%b9%89%e5%af%b9%e8%b1%a1

public static Operator deserialize(Map<String, Object> map) {
    String name;
    Integer level;
    if (map.get("name") != null) {
        name = (String) map.get("name");
    } else {
        name = null;
    }
    if (map.get("level") != null) {
        level = (Integer) map.get("level");
    } else {
        level = null;
    }
    return new Operator(name, level);
}

上面这个函数和下面这个函数没有任何区别,因为你判断完空指针之后又把它name和level赋值为空,这和直接保留空指针没有区别
注意上面这段函数执行4次get操作,下面这段函数只执行2次get操作,耗时更低
并且下面这个函数长度远远小于上面这个,可读性更强

public static Operator deserialize(Map<String, Object> map) {
    return new Operator((String) map.get("name"), (Integer)map.get("level"));
}

格式上的小建议

好巧不巧看到了这样一个 Bukkit 教程,粗略地看来一下,虽然不是内容不是非常深入和非常丰富的那种,但是对于我这样的 Bukkit 新手玩家已经可以说是很难得的好教程了!不过作为格式强迫症的我还是想在 Markdown 格式上面提一些小建议,可以酌情考虑参考~

首先,恰当使用 accent block。对于 Docsify 中出现的一些 accent block(也就是 !>?>),很多时候前者是用来警告「这样做会导致 ... 严重后果」「因为 ... 所以千万不要这样做!」之类的重要消息,而后者可以用来写一些「你知道吗?」「知识拓展」「小练笔」亦或者是简单的几句论述性的文字。混用也许不仔细看并不能看出什么奇怪的地方,但是总感觉有一些不妥之处。例如 1.2-了解BukkitAPI.md 中的

!> 虽然你会觉得 **Minecraft** 的每个更新都是个 **`大更新`**,实际上并不是,在 **Bukkit API** 里面实际上大同小异,就是说,老版本有的一个很简单的发送消息的 API,在高版本仍然可以实现,但是如果你想在 `1.13` 版本中放置**哭泣的黑曜石(`1.16`)**,那是不可能的!**Valkyrie** 虽然使用 `1.13` 作为教学,**但是一切,都要看你对自己插件版本的定位**

这样的段落,实际上无需采用 accent block,或者使用绿色的 ?> 即可。那么究竟不恰当使用 accent block 会有哪些危害呢?其实很简单,有两点:

  • 造成视觉上的疲劳。如果一篇文章或者一个整体系列中屡次出现 accent block,尤其是出现与该 accent block 并不适配的文字时,极有可能出现视觉疲劳;
  • 造成理解上的困难。如果 accent block 的内容与其视觉上想要表达的相违背,那么无论这些内容是否真的「合适」,在经过一次又一次的混淆之后,也许就可能难以理解。在这里的「理解」并不是说理解这段文字在表达什么,而是理解这段文字在形式上的含义,究竟是「极为重要」还是「提醒劝告」还是「我就说说」还是「你知道吗」?

其次,合理安排自己的 Markdown 格式使用。还是拿这句话来举例子。比如

**`大更新`**
**哭泣的黑曜石(`1.16`)**

这些用法极为罕见。同时,我也发现从 README 开始,这个电子书就充斥了许许多多的粗体,让人看起来就像是在演讲,粗体则代表上扬的语气。我认为并不需要这样,因为也许反而在你想要真正强调有些东西的时候,就找不到合适的格式来用了,因为一些「并不那么重要」的语句都已经被冠上了粗体。那么在这个时候可能就会出现奇奇怪怪的格式,比如 这样子的格式

我认为对于这种 粗体代码块,更恰当的用法是「对代码进行强调」。例如,这个地方就用得非常好:

...

你就可以看到 **`Hello Valkyrie`** 显示在控制台内,恭喜你,你掌握了如何使用 API,但别忘了,这只是开始,后续还有更多 API 等着你使用

然而代码块的滥用也是不太好的,例如这里

服务端分为 **`Vanilla`** (即官方原版服务器)、**`Bukkit / Spigot`** (即插件服务器,在原版的基础上可以额外加装插件,类似的还有 **`PaperSpigot`****`TorchSpigot`** 等)、**`Forge`** (如果你学过模组,这个应该很明显了,就是模组服务端,可以在服务器中加装模组,前提是,客户端也拥有同版本的同样模组)、**`Sponge`** (这个就比较神奇了,它支持插件+模组的混合使用,但唯一遗憾的一点是,**Bukkit** 的插件并不支持 **`Sponge`**,它有它自己的插件开发方式和规范)、**`社区服务端`** (不管其它的如何,光是社区端就五花八门了,而且社区端一个个能力都不差,比如 **`CatServer`****`Arclight`**,不仅仅支持使用模组,还能安装 **Bukkit** 插件)

我归纳出了三点问题

  • 大量的 粗体代码块 使用在非代码名词上;
  • 括号的内容过于冗长
  • 非代码名词的格式不统一

诸如 VanillaBukkit / Spigot 这类文字,其实是不需要使用代码块括起来的,它们只是几个普通的名字。而对于那些我们在实际过程中可能获取到的值,比如上文中的 Hello World,使用代码块则是再合适不过了。

如果想要解释某个名字,不如用注解符号1。这种符号虽然并不包含在 Markdown 的标准范畴内,但是如果能够用 HTML 实现出来,想必效果是不错的。对于括号,则应用在一些并不复杂的句子上,如果括号的内容过多,甚至成段成段地写,就会打断用户对原本句子的整体理解,固然是不好的。

然后就是要注意格式之间的统一。假设我们真的用 这种方式 来标记 Bukkit、Spigot 等名词,也要尽量确保这些名词都被应用同一种格式。这段文字中出现的纰漏正是

**Bukkit** 的插件并不支持 **`Sponge`** ...
比如 **`CatServer`****`Arclight`**,不仅仅支持使用模组,还能安装 **Bukkit** 插件

Bukkit 在这段话中与其它提到的名词之间并不存在类义上的区别,因此应当尽量保证格式统一。

以上就是我对格式的想法。很支持你的这个电子书,已经 Star 了~ 期待 Ela 能够带来更多优质的内容!如果你有什么想法的话,欢迎与我讨论,在这个 issue 下或者给我发邮件都可以。

类,方法,关键字建议

https://github.com/ElaBosak233/Valkyrie/blob/master/source/Part02/2.4-%E7%B1%BB%E6%96%B9%E6%B3%95%E5%85%B3%E9%94%AE%E5%AD%97.md
第一行这里加个分号会好一点吧,虽然只是一个示意

package cn.elabosak.hello

import ... // 这里是导入外部的依赖,经常用到

/**
 * @author Valkyrie
 */
public final class Main extends JavaPlugin { // Main 继承了 JavaPlugin,Main 是 JavaPlugin 的子类
    @Override
    public void onEnable() {
        Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.GREEN+"我的插件被调用了");
    }
    @Override
    public void onDisable() {
        // 你觉得你的插件被关闭时,你会干什么?
    }
}

集合类

Map是个接口,HashMap实现了Map接口,你这俩调用的都是HashMap#put(String, Integer)和HashMap#get(String)怎么会有区别呢,你这也太扯了吧,其次集合是Set而不是Map,Map是映射


集合 Map & HashMap

Map 和 HashMap 都是一种以 <Key,Value> 形式存储数据的数据结构,就是说,一个 Key 对应一个 Value,但先讲一下 Map 和 HashMap 的区别,简单来说,Map 就是一种 Key 不可重复,Value 可重复集合,而 HashMap 跟 Map 一样,但 HashMap 在只有一个线程的时候,访问效率较高,所以在 Bukkit 开发的时候,我们常用 HashMap,当然,我们可以这么用,两者都一样,但是前者在变动的时候,方便维护,隔离性强,而后者在变动的时候,维护更加麻烦

public static Map<String, Integer> map1 = new HashMap<String, Integer>();
public static HashMap<String, Integer> map2 = new HashMap<>();

放值

map1.put("String", 1);
map2.put("String", 2);

取值

map1.get("String");
map2.get("String");

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.