[上一章](第七章-PluginBase类.md) [下一章](第一章-主要的事件介绍.md)
# 第一部分 第八章 案例课:玩家进入案例演示
参与编写者: MagicLu550
#### 建议学习时间: 30分钟
##### 学习要点: 对于之前知识的巩固和加深认识

这个项目的需求很简单.实现一个玩家加入自定义提示信息,可以手动取消信息的功能
我们列举下步骤
- 创建项目
- 导入nukkit包
- 创建初始化配置文件set-info.yml
- 创建plugin.yml
- 创建主类
    - 创建配置

- 创建监听器
    - 读取配置内容
    - 发送玩家信息
- 创建命令
    -判断
- 注册监听器和命令
- 完成

1.第一到二步请自己完成
2.set-inf的内容
```yaml
message: 欢迎${player}加入了服务器
```
3.我的plugin.yml的内容
```yaml
name: MyJoin             
main: net.noyark.www.MyJoin  
version: "0.0.1"              
author: magiclu550
api: ["1.0.9"]                   
description: My first plugin
#当采用注册时，控制权限需要在这里声明
commands:    
 set:                              
   permission: myjoin.set               
permissions:
  myjoin.set:              
    default: op              
```
4.创建主类 MyJoin   
```java
package net.noyark.www;

import cn.nukkit.plugin.PluginBase;


public class MyJoin extends PluginBase {
    
    private Map<String,Boolean> cancel;

    private static MyJoin instance;

    @Override
    public void onLoad() {
        this.getLogger().info("插件开始加载");
    }

    @Override
    public void onEnable() {
        instance = this;
        this.saveDefaultConfig();
        this.getLogger().info("插件初始化完毕");

    }

    @Override
    public void onDisable() {
        this.getLogger().info("插件已经关闭");
    }

    public static MyJoin getInstance() {
        return instance;
    }
    
    public void setCancel(String name,boolean isCancel) {
        cancel.put(name,isCancel);
    }
    
    public Map<String, Boolean> getCancel() {
        return cancel;
    } 
}

```
5.创建监听器
```java
package net.noyark.www;

import cn.nukkit.event.EventHandler;
import cn.nukkit.event.Listener;
import cn.nukkit.event.player.PlayerJoinEvent;

public class MyJoinListener implements Listener {

    @EventHandler
    public void onJoin(PlayerJoinEvent e){
        Boolean isCancel = MyJoin.getInstance().getCancel().get(e.getPlayer().getName());
        if(isCancel!=null&&!isCancel) {
            String message = MyJoin.getInstance().getConfig().getString("message");
            e.setJoinMessage(message.replace("${player}", e.getPlayer().getName()));
        }else{
            MyJoin.getInstance().getCancel().put(e.getPlayer().getName(),true);
        }
    }

}

```
6.创建命令
```java
package net.noyark.www;

import cn.nukkit.command.Command;
import cn.nukkit.command.CommandSender;

public class MyCommand extends Command {

    public MyCommand() {
        super("set","设置是否改变加入信息","/set");
    }

    @Override
    public boolean execute(CommandSender sender, String commandLabel, String[] args) {
        if(args.length!=0)
            MyJoin.getInstance().getCancel().put(sender.getName(),Boolean.valueOf(args[0]));
        else
            //这行代码可能会吓到你，不要担心，他只是一个找玩家名字来找到是否取消
            //如果为空，则默认取消，如果不是空，则把玩家之前的状态取反
            MyJoin.getInstance().getCancel().put(sender.getName(),
                    MyJoin.getInstance().getCancel().get(
                            sender.getName()
                    )==null?false:!MyJoin.getInstance()
                            .getCancel()
                            .get(sender.getName()
                    )
            );
        return true;
    }
}
```
7. 注册
```java
package net.noyark.www;

import cn.nukkit.plugin.PluginBase;

import java.util.Map;


public class MyJoin extends PluginBase {

    private Map<String,Boolean> cancel;
    private static MyJoin instance;

    @Override
    public void onLoad() {
        this.getLogger().info("插件开始加载");
    }

    @Override
    public void onEnable() {
        instance = this;
        this.saveDefaultConfig();
        //一定在它的后面注册！！否则会出现一系列奇怪问题...
        this.getServer().getCommandMap().register("",new MyCommand());
        this.getServer().getPluginManager().registerEvents(new MyJoinListener(),this);
        this.getLogger().info("插件初始化完毕");

    }

    @Override
    public void onDisable() {
        this.getLogger().info("插件已经关闭");
    }

    public static MyJoin getInstance() {
        return instance;
    }

    public void setCancel(String name,boolean isCancel) {
        cancel.put(name,isCancel);
    }

    public Map<String, Boolean> getCancel() {
        return cancel;
    }
}

```

这大概是这个项目的流程，很简单，但是大家可以练一练，扎实基本功，我们马上开始推入下一章
感谢你们的支持

[上一章](第七章-PluginBase类.md) [下一章](第一章-主要的事件介绍.md)