16第三方API
添加依赖:
这里我们想要用一个经济API,需要去依赖这个插件,当然自己的服务器需要自己下载Vault和EssentialX插件
<!-- Vault API-->
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<!-- scope作用于为provided时,maven不会把该依赖打包到插件jar文件中。-->
<!-- 因为服务端已经加载了Vault插件,相当于服务端中存在了Vault的代码,于是我们就不需要再把依赖打包到当前插件中了。-->
<!-- 对于其他的API依赖也是同样的道理。-->
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>bukkit</artifactId>
<groupId>org.bukkit</groupId>
</exclusion>
</exclusions>
</dependency>
声明必要的前置插件
# 声明必要的前置插件(服务端会检查有没有该插件正在运行,如果没有则不会启用当前插件)
depend:
- Vault
# 可忽略的前置依赖 (这里即使我随便地写,当前插件都能被服务端正常启用)
softdepend:
- PlaceholderAPI
初始化:
// 判断Vault前置插件是否存在(如果plugin.yml中已经声明了 soft: [Vault] 则不需要有这一步)
if (getServer().getPluginManager().getPlugin("Vault") == null) {
getLogger().info("没有发现Vault前置,本插件无法继续使用!");
// 禁用插件
getServer().getPluginManager().disablePlugin(this);
return;
}
// 初始化经济服务
if (!YunfeiExecutor.setupEconomy()) {
// VaultAPI没有发现其他 经济插件
getLogger().severe("我这个插件就是要调用经济API的,没了Eco服务我还运行干嘛!");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
getCommand("yunfei").setExecutor(new YunfeiExecutor());
Bukkit.getPluginManager().registerEvents(new YunfeiExecutor(), this);
使用:
/**
* @author houyunfei
*/
public class YunfeiExecutor implements CommandExecutor, Listener {
/**
* Vault API提供的经济服务接口
*/
public static Economy econ = null;
public static boolean setupEconomy() {
// 获取Economy服务(说简单点,就是看看有没有EssentialX等经济插件被加载了,如果有,VaultAPI就能够提供对应的经济服务)
RegisteredServiceProvider<Economy> rsp = Bukkit.getServer().getServicesManager()
.getRegistration(Economy.class);
econ = rsp.getProvider();
return Objects.nonNull(econ);
}
/**
* 需要让PlaceholderAPI下载Vault & Player拓展
* /papi ecloud download Vault
* /papi ecloud download Player
* /papi reload
*/
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent joinEvent) {
Player player = joinEvent.getPlayer();
// 设置占位符字符串
String rawMessage = "瞧!是拥有§4%vault_eco_balance%§f钱的大富豪§4%player_name%§f来了!";
// 替换占位符
// String formattedMessage = PlaceholderAPI.setPlaceholders(player, rawMessage);
String formattedMessage = rawMessage.replace("%vault_eco_balance%", String.valueOf(econ.getBalance(player)))
.replace("%player_name%", player.getName());
joinEvent.setJoinMessage(formattedMessage);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
MyPlugin.instance.getLogger().info("只有玩家才能这么做");
return true;
}
boolean flag = false;
Player player = (Player) sender;
if (args.length > 0) {
switch (args[0].toLowerCase()) {
case "add":
// /senko add <金额> 添加金额到玩家的钱包
flag = doAdd(player, args);
break;
case "remove":
// /senko remove <金额> 从玩家的钱包中移除金额
flag = doRemove(player, args);
break;
case "get":
// /senko get 获取玩家的钱包金额
flag = doGet(player, args);
break;
}
}
return flag;
}
/**
* 涉及到很重要的操作,请务必加上日志
*/
private boolean doAdd(Player player, String... args) {
if (args.length < 2) {
player.sendMessage("你忘了在后面输入金额!");
return false;
}
try {
int amount = Integer.parseInt(args[1]);
player.sendMessage("将要给你加" + amount + "元");
// Economy#depositePlayer(Player, int) 方法用于将金额添加到玩家的钱包中
EconomyResponse response = econ.depositPlayer(player, amount);
MyPlugin.instance.getLogger().info("玩家" + player.getName() + "向自己添加了" + response.amount + "元");
if (response.transactionSuccess()) {
// Economy#getBalance(Player) 方法用于获取玩家的钱包金额
player.sendMessage("你现在有" + econ.getBalance(player) + "元");
return true;
} else {
player.sendMessage(response.errorMessage);
return false;
}
} catch (NumberFormatException e) {
player.sendMessage("你输入的金额不是数字!");
return false;
}
}
private boolean doRemove(Player player, String... args) {
if (args.length < 2) {
player.sendMessage("你忘了在后面输入金额!");
return false;
}
try {
int amount = Integer.parseInt(args[1]);
player.sendMessage("将要从你扣除" + amount + "元");
// Economy#withdrawPlayer(String, int) 方法用于从玩家的钱包中移除金额
EconomyResponse response = econ.withdrawPlayer(player, amount);
MyPlugin.instance.getLogger().info("玩家" + player.getName() + "从自己扣除了" + response.amount + "元");
if (response.transactionSuccess()) {
player.sendMessage("你现在有" + econ.getBalance(player) + "元");
return true;
} else {
player.sendMessage(response.errorMessage);
return false;
}
} catch (NumberFormatException e) {
player.sendMessage("你输入的金额不是数字!");
return false;
}
}
private boolean doGet(Player player, String... args) {
player.sendMessage("你现在有" + econ.getBalance(player) + "元");
return true;
}
}
效果: