gjmeng
本插件是一个消费飞行插件,主要就是让玩家消费vault的金钱或者消费经验来飞行,源码是使用maven来构建的
思路:
    由主类onEnable()方法初始化,1.保存默认配置 2.将配置类保存到ConfigUtil中 3.注册command 4.加载vault插件 5.注册玩家的事件监听

  1. package xin.rainyn.consumefly;

  2. //import省略

  3. /**
  4. * 消费飞行
  5. * [url=home.php?mod=space&uid=1231151]@author[/url] Rainyner
  6. *
  7. */
  8. public class ConsumeFly extends JavaPlugin{
  9.        
  10.         @Override
  11.         public void onDisable() {
  12.                 super.onDisable();
  13.                 Logger.debug("消费飞行插件已卸载!!!  作者:Rainyner");
  14.         }

  15.         @Override
  16.         public void onEnable() {
  17.                 super.onEnable();
  18.                 //保存默认配置文件,并获取到配置文件
  19.                 saveDefaultConfig();
  20.                 ConfigUtil.getConfig().setFileConfiguration(getConfig());
  21.                 //设置命令对象
  22.                 getCommand("consumefly").setExecutor(new ConsumflyCommandExecutor());
  23.                 //加载vault插件
  24.                 if(ConfigUtil.getConfig().isVaultEnable() && !loadVault()) {
  25.                         Logger.consoleError("初始化Vault支持失败,请检测是否已经安装Vault插件,已禁用消费飞行插件!!!");
  26.                 }
  27.                 //注册玩家的事件监听
  28.                 Bukkit.getPluginManager().registerEvents(new PlayerListener(), this);
  29.                
  30.                 //保存当前主类
  31.                 Logger.CONSUMEFLY = this;
  32.                 Logger.info("消费飞行插件已启用!!!  作者:Rainyner","调试输出:"+(ConfigUtil.getConfig().isDebug()?"是":"否"));
  33.                
  34.                 //配置文件调试输出
  35.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "玩家加入显示提示信息:"+(ConfigUtil.getConfig().isPlayerJoinMessageEnable()?"是":"否"));
  36.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "玩家加入提示消息:");
  37.                 for(String str : ConfigUtil.getConfig().getPlayerJoinMessage()) {
  38.                         Logger.consoleDebug(ColorUtil.GREEN_DAN_A + str);
  39.                 }
  40.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "消费经验飞行:"+(ConfigUtil.getConfig().isLevelEnable()?"是":"否"));
  41.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "未启用消费经验飞行的提示语:"+(ConfigUtil.getConfig().getLevelMessage()));
  42.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "1级经验可飞行时间(秒):"+(ConfigUtil.getConfig().getLevelTime()));
  43.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "消费金币飞行:"+(ConfigUtil.getConfig().isVaultEnable()?"是":"否"));
  44.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "未启用消费金币飞行的提示语:"+(ConfigUtil.getConfig().getVaultMessage()));
  45.                 Logger.consoleDebug(ColorUtil.GREEN_DAN_A + "1金币可飞行时间(秒):"+(ConfigUtil.getConfig().getVaultTime()));
  46.                
  47.         }
  48.        
  49.         private boolean loadVault() {
  50.                 boolean hasNull = false;
  51.                 //初始化经济系统实例
  52.         RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
  53.         if (economyProvider != null) {
  54.             if ((EconomyUtil.economy = economyProvider.getProvider()) == null) hasNull = true;
  55.         }
  56.         return !hasNull;
  57.         }

  58.         @Override
  59.         public void onLoad() {
  60.                 super.onLoad();
  61.                 Logger.setLogger(getLogger());
  62.                 Logger.info("消费飞行插件已加载!!!  作者:Rainyner");
  63.         }
  64.        
  65. }
复制代码

    当玩家输入命令时,通过ConsumflyCommandExecutor类来实例化对应的消费类,并调用对应消费类fly()方法,在消费接口的实现类中去设置飞行并扣除等级或金钱
  1. package xin.rainyn.consumefly.command;

  2. //import省略

  3. public class ConsumflyCommandExecutor implements CommandExecutor{
  4.         public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
  5.                 if(!cmd.getName().equalsIgnoreCase("consumefly")) {
  6.                         return false;
  7.                 }
  8.                 //判断是否是玩家,不是玩家提示信息
  9.                 if(!(sender instanceof Player)) {
  10.                         sender.sendMessage(Logger.addPrefix("请在游戏内使用此命令,谢谢!!!"));
  11.                         return true;
  12.                 }
  13.                 //强转为玩家类
  14.                 Player player = (Player)sender;
  15.                
  16.                 //没有参数,显示帮助信息
  17.                 if(args.length == 0) {
  18.                         sendHelp(player);
  19.                         return true;
  20.                 }
  21.                 //帮助信息显示
  22.                 if(args.length >= 1 && ("help".equals(args[0]) || "?".equals("args[0]"))) {
  23.                         sendHelp(player);
  24.                         return true;
  25.                 }
  26.                 //根据第一个参数设置消费的类型
  27.                 if(args.length >= 1 && ("info".equals(args[0]))) {
  28.                         info(player);
  29.                         return true;
  30.                 }
  31.                 Consume consume = null;
  32.                 if(args.length >= 1 && ("level".equals(args[0]))) {
  33.                         consume = new LevelConsumeImpl();
  34.                 }
  35.                 if(args.length >= 1 && ("vault".equals(args[0]))) {
  36.                         consume = new VaultConsumeImpl();
  37.                 }
  38.                 if(consume != null) {
  39.                         consume.fly(player, args);
  40.                 }else {
  41.                         player.sendMessage(ColorUtil.RED_4 + "请输入正确的参数!!!");
  42.                 }
  43.                 return true;
  44.         }
  45.        
  46.        
  47.         private void info(Player player) {
  48.                 Map<String,String> map = new HashMap<String,String>();
  49.                 map.put("消费经验飞行:", ConfigUtil.getConfig().isLevelEnable()?"是":"否");
  50.                 map.put("1级经验可飞行时间(秒):", ConfigUtil.getConfig().getLevelTime()+"");
  51.                 map.put("消费金币飞行:", ConfigUtil.getConfig().isVaultEnable()?"是":"否");
  52.                 map.put("1金币可飞行时间(秒):", ConfigUtil.getConfig().getVaultTime()+"");
  53.                 sendMap(player,map);
  54.         }
  55.         /**
  56.          * 给玩家发送帮助信息
  57.          * @param player
  58.          */
  59.         private void sendHelp(Player player) {
  60.                 Map<String,String> map = new HashMap<String,String>();
  61.                 map.put("/costfly info", "查询能够使用的消费方式");
  62.                 map.put("/costfly level num <num>", "使用等级飞行");
  63.                 map.put("/costfly level time <num>", "使用多少等级飞行多少秒");
  64.                 map.put("/costfly vault num <num>", "使用多少金币飞行");
  65.                 map.put("/costfly vault time <num>", "使用金币飞行多少秒");
  66.                 sendMap(player,map);
  67.         }
  68.        
  69.         private void sendMap(Player player, Map<String, String> map) {
  70.                 player.sendMessage(ColorUtil.appendString(ColorUtil.LAN_1, "======================== ",ColorUtil.QING_DAN_3,"消费飞行",ColorUtil.LAN_1, " ========================"));
  71.                 for( Entry<String, String> entry : map.entrySet()) {
  72.                         player.sendMessage(ColorUtil.appendString(ColorUtil.PINK_DAN_5,entry.getKey(),"  ",ColorUtil.GREEN_2,entry.getValue()));
  73.                 }
  74.                 player.sendMessage(ColorUtil.appendString(ColorUtil.LAN_1, "==========================================================="));
  75.         }

  76. }
复制代码


consume接口:
  1. package xin.rainyn.consumefly.consume;

  2. import org.bukkit.entity.Player;

  3. /**
  4. * 所有的消费
  5. * @author Rainyner
  6. *
  7. */
  8. public interface Consume {
  9.         /**
  10.          * 飞行统一对外函数
  11.          * @param player
  12.          * @param args
  13.          */
  14.         public void fly(Player player, String... args);
  15. }
复制代码
消费等级飞行的实现类
  1. package xin.rainyn.consumefly.consume.impl;

  2. //import 省略

  3. public class LevelConsumeImpl implements Consume{

  4.         public void fly(Player player, int num) {
  5.                 //判断是否已经开启等级飞行
  6.                 if(ConfigUtil.getConfig().isLevelEnable()) {
  7.                         //判断等级是否足够
  8.                         if(player.getLevel() >= num) {
  9.                                 //计算飞行多长时间
  10.                                 Long time = num * ConfigUtil.getConfig().getLevelTime();
  11.                                 //扣除等级
  12.                                 player.setLevel(player.getLevel() - num);
  13.                                 //启动线程计时,到时停止飞行
  14.                                 FlyRunnable runnable = new FlyRunnable(time, player);
  15.                                 runnable.runTask(Logger.CONSUMEFLY);
  16.                                 player.sendMessage(Logger.addPrefix("您使用"+num+"级来飞行"+time+"秒!!!"));
  17.                         }else {
  18.                                 player.sendMessage(Logger.addPrefix("您当前等级不足,请先升级!!!"));
  19.                         }
  20.                 }else {
  21.                         player.sendMessage(Logger.addPrefix(ConfigUtil.getConfig().getLevelMessage()));
  22.                 }
  23.         }

  24.         public void flyTime(Player player, Long time) {
  25.                 //判断是否已经开启等级飞行
  26.                 if(ConfigUtil.getConfig().isLevelEnable()) {
  27.                         //计算需要多少等级
  28.                         int num = (int) (time / ConfigUtil.getConfig().getLevelTime());
  29.                         //如果不能整除,要多扣一级
  30.                         if(time % ConfigUtil.getConfig().getLevelTime() > 0) {
  31.                                 num++;
  32.                         }
  33.                         //判断等级是否足够
  34.                         if(player.getLevel() >= num) {
  35.                                 //扣除等级
  36.                                 player.setLevel(player.getLevel() - num);
  37.                                 //启动线程计时,到时停止飞行
  38.                                 FlyRunnable runnable = new FlyRunnable(time, player);
  39.                                 runnable.runTask(Logger.CONSUMEFLY);
  40.                                 player.sendMessage(Logger.addPrefix("您使用"+num+"级来飞行"+time+"秒!!!"));
  41.                         }else {
  42.                                 player.sendMessage(Logger.addPrefix("您当前等级不足,请先升级!!!"));
  43.                         }
  44.                 }else {
  45.                         player.sendMessage(Logger.addPrefix(ConfigUtil.getConfig().getLevelMessage()));
  46.                 }
  47.         }
  48.        
  49.        

  50.         public void fly(Player player, String... args) {
  51.                 //先判断是否已经可以飞行
  52.                 if(player.getAllowFlight()) {
  53.                         player.sendMessage(Logger.addPrefix("您已拥有飞行权限,无需再消费飞行!!!"));
  54.                 }else {
  55.                         if(args.length == 3) {
  56.                                 if("num".equals(args[1])) {
  57.                                         if(StringUtil.isInteger(args[2])) {
  58.                                                 this.fly(player, Integer.parseInt(args[2]));
  59.                                         }else {
  60.                                                 player.sendMessage(Logger.addPrefix("请输入正确的参数!!!"));
  61.                                         }
  62.                                 }
  63.                                 if("time".equals(args[1])) {
  64.                                         if(StringUtil.isInteger(args[2])) {
  65.                                                 this.flyTime(player, Long.parseLong(args[2]));
  66.                                         }else {
  67.                                                 player.sendMessage(Logger.addPrefix("请输入正确的参数!!!"));
  68.                                         }
  69.                                 }
  70.                         }else {
  71.                                 player.sendMessage(Logger.addPrefix("请输入正确的参数!!!"));
  72.                         }
  73.                 }
  74.         }


  75. }
复制代码
消费金钱飞行的实现类
  1. package xin.rainyn.consumefly.consume.impl;

  2. //import 省略

  3. public class VaultConsumeImpl implements Consume{

  4.         public void fly(Player player, int num) {
  5.                 //判断是否已经开启等级飞行
  6.                 if(ConfigUtil.getConfig().isLevelEnable()) {
  7.                         //判断金钱是否足够
  8.                         if(EconomyUtil.economy.has(player, num)) {
  9.                                 //计算飞行多长时间
  10.                                 Long time = num * ConfigUtil.getConfig().getVaultTime();
  11.                                 //扣除金币
  12.                                 EconomyResponse response = EconomyUtil.economy.withdrawPlayer(player, num);
  13.                                 if(response.type == ResponseType.SUCCESS) {
  14.                                         //启动线程计时,到时停止飞行
  15.                                         FlyRunnable runnable = new FlyRunnable(time, player);
  16.                                         runnable.runTask(Logger.CONSUMEFLY);
  17.                                         player.sendMessage(Logger.addPrefix("您使用"+num+"金币来飞行"+time+"秒!!!"));
  18.                                 }else {
  19.                                         player.sendMessage(Logger.addPrefix(ColorUtil.RED_4+"金钱扣除失败:"+response.errorMessage));
  20.                                 }
  21.                         }else {
  22.                                 player.sendMessage(Logger.addPrefix("您的金币不足"+num+",不能启动飞行!!!"));
  23.                         }
  24.                 }else {
  25.                         player.sendMessage(Logger.addPrefix(ConfigUtil.getConfig().getLevelMessage()));
  26.                 }
  27.         }

  28.         public void flyTime(Player player, Long time) {
  29.                 //判断是否已经开启等级飞行
  30.                 if(ConfigUtil.getConfig().isLevelEnable()) {
  31.                         //计算需要多少金币
  32.                         int num = (int) (time / ConfigUtil.getConfig().getVaultTime());
  33.                         //如果不能整除,要多扣1金币
  34.                         if(time % ConfigUtil.getConfig().getLevelTime() > 0) {
  35.                                 num++;
  36.                         }
  37.                         //判断金币是否足够
  38.                         if(EconomyUtil.economy.has(player, num)) {
  39.                                 //扣除金币
  40.                                 EconomyResponse response = EconomyUtil.economy.withdrawPlayer(player, num);
  41.                                 if(response.type == ResponseType.SUCCESS) {
  42.                                         //启动线程计时,到时停止飞行
  43.                                         FlyRunnable runnable = new FlyRunnable(time, player);
  44.                                         runnable.runTask(Logger.CONSUMEFLY);
  45.                                         player.sendMessage(Logger.addPrefix("您使用"+num+"金币来飞行"+time+"秒!!!"));
  46.                                 }else {
  47.                                         player.sendMessage(Logger.addPrefix(ColorUtil.RED_4+"金钱扣除失败:"+response.errorMessage));
  48.                                 }
  49.                         }else {
  50.                                 player.sendMessage(Logger.addPrefix("您当前等级不足,请先升级!!!"));
  51.                         }
  52.                 }else {
  53.                         player.sendMessage(Logger.addPrefix(ConfigUtil.getConfig().getLevelMessage()));
  54.                 }
  55.         }

  56.         public void fly(Player player, String... args) {
  57.                 //先判断是否已经可以飞行
  58.                 if(player.getAllowFlight()) {
  59.                         player.sendMessage(Logger.addPrefix("您已拥有飞行权限,无需再消费飞行!!!"));
  60.                 }else {
  61.                         if(args.length == 3) {
  62.                                 if("num".equals(args[1])) {
  63.                                         if(StringUtil.isInteger(args[2])) {
  64.                                                 this.fly(player, Integer.parseInt(args[2]));
  65.                                         }else {
  66.                                                 player.sendMessage(Logger.addPrefix("请输入正确的参数!!!"));
  67.                                         }
  68.                                 }
  69.                                 if("time".equals(args[1])) {
  70.                                         if(StringUtil.isInteger(args[2])) {
  71.                                                 this.flyTime(player, Long.parseLong(args[2]));
  72.                                         }else {
  73.                                                 player.sendMessage(Logger.addPrefix("请输入正确的参数!!!"));
  74.                                         }
  75.                                 }
  76.                         }else {
  77.                                 player.sendMessage(Logger.addPrefix("请输入正确的参数!!!"));
  78.                         }
  79.                 }
  80.         }


  81. }
复制代码
源码下载


gjmeng
本帖最后由 gjmeng 于 2018-5-20 10:11 编辑

本插件只是用于学习交流,由于有些bug,所以不要放到自己的服里使用下载地址重新附上:链接:https://pan.baidu.com/s/19STX51oV2tJjg3Fx91It7g 密码:ej25
github:https://github.com/gjmeng/ConsumeFly

隔壁老吕
大佬大佬,真是个666的插件

耗子
分享源码请使用github

Create_Dreams
你好,在下想和你讨论一个project,请问您的联系方式是?

gjmeng
Create_Dreams 发表于 2018-5-20 22:34
你好,在下想和你讨论一个project,请问您的联系方式是?

可以加Q:913706016

GhostGuJI_Dada
感谢分享,支持一下~

345793738
支持一下,不过以后分享源码还是建议使用github或者coding

宇亓
支持一下。

第一页 上一页 下一页 最后一页