早晨解说
想做一个死亡加钱的Bukkit Plugin,目前状况↓

  1. /*有一点的删减,不影响阅读*/
  2. import me.clip.placeholderapi.PlaceholderAPI;
  3. import org.bukkit.ChatColor;
  4. import org.bukkit.event.EventHandler;
  5. import org.bukkit.event.Listener;
  6. import org.bukkit.event.player.PlayerRespawnEvent;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.plugin.Plugin;
  9. import net.milkbowl.vault.chat.Chat;
  10. import net.milkbowl.vault.economy.Economy;
  11. import net.milkbowl.vault.economy.EconomyResponse;
  12. import net.milkbowl.vault.permission.Permission;
  13. import java.util.logging.Logger;
  14. public class Die implements Listener {
  15.     private static final Logger log = Logger.getLogger("Minecraft");
  16.     private static Permission perms = null;
  17.     private static Chat chat = null;
  18.     Plugin plugin = me.myplugin.one.One.getProvidingPlugin(me.myplugin.one.One.class);
  19.     private static Economy econ = null;
  20.     @EventHandler
  21.     public void Die(PlayerRespawnEvent die){
  22.         Player player = die.getPlayer();
复制代码
根据https://github.com/MilkBowl/VaultAPI,我写了一行EconomyResponse r = econ.depositPlayer(player, 1);//这一行是减钱,并把Vault放进了依赖(当然头文件有),程序不会报错

但死了以后那一行确确实实执行了,但钱没有变化
(可能描述的不详细,如果要补偿随时提出)

LanAnY
在你这个类加上
  1.   public static Economy getEconomy() {
  2.     return econ;
  3.   }
复制代码
然后再在你的事件里加入
  1.         Economy economy = getEconomy();
  2.         EconomyResponse response = economy.withdrawPlayer(player, money);
复制代码



BellTune
本帖最后由 BellTune 于 2021-1-11 21:05 编辑

噗,哈哈哈哈
一、API用法不当
这里直接给你傻瓜式用法:
  1. RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
  2.         economy = economyProvider.getProvider();
复制代码

二、加减错误
deposit 指的是 存储,存入,存款 指的是加钱
withdraw 指的是撤退,撤回,取出 指的是扣钱
  1. economy.withdrawPlayer(player, 1); #扣玩家一块钱
复制代码
三、判断余额
扣钱之前最好判断一下玩家的余额免得扣成负数

早晨解说
GhostSkyV9 发表于 2021-1-11 20:13
在你这个类加上然后再在你的事件里加入

加了,还是没反应,钱没变,服务器执行到那一行报错,写的时候编译器不报错


  1. import me.clip.placeholderapi.PlaceholderAPI;
  2. import org.bukkit.ChatColor;
  3. import org.bukkit.event.EventHandler;
  4. import org.bukkit.event.Listener;
  5. import org.bukkit.event.player.PlayerRespawnEvent;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.plugin.Plugin;
  8. import net.milkbowl.vault.economy.Economy;
  9. import net.milkbowl.vault.economy.EconomyResponse;

  10. public class Die implements Listener {
  11.     public static Economy getEconomy() {
  12.         return econ;
  13.     }

  14.     Plugin plugin = me.myplugin.one.One.getProvidingPlugin(me.myplugin.one.One.class);
  15.     private static Economy econ = null;
  16.     @EventHandler
  17.     public void Die1(PlayerRespawnEvent die){
  18.         Player player = die.getPlayer();
  19.         Economy economy = getEconomy();
  20.         EconomyResponse response = economy.withdrawPlayer(player, 1);
  21.     }
  22. }
复制代码

LanAnY
早晨解说 发表于 2021-1-13 17:32
加了,还是没反应,钱没变,服务器执行到那一行报错,写的时候编译器不报错
...

请提供一下你得报错信息

早晨解说
GhostSkyV9 发表于 2021-1-13 20:24
请提供一下你得报错信息

执行到那一行就报这个
  1. [09:28:32] [Server thread/ERROR]: Could not pass event PlayerRespawnEvent to Dieevents v1.0.2
  2. org.bukkit.event.EventException: null
  3.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  4.         at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  5.         at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  6.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  7.         at net.minecraft.server.v1_12_R1.PlayerList.moveToWorld(PlayerList.java:654) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  8.         at net.minecraft.server.v1_12_R1.PlayerList.moveToWorld(PlayerList.java:582) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  9.         at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1655) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  10.         at net.minecraft.server.v1_12_R1.PacketPlayInClientCommand.a(SourceFile:31) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  11.         at net.minecraft.server.v1_12_R1.PacketPlayInClientCommand.a(SourceFile:8) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  12.         at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  13.         at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_271]
  14.         at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_271]
  15.         at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  16.         at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  17.         at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  18.         at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  19.         at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  20.         at java.lang.Thread.run(Unknown Source) [?:1.8.0_271]
  21. Caused by: java.lang.NullPointerException
  22.         at me.myplugin.one.event.Die.Die1(Die.java:27) ~[?:?]
  23.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_271]
  24.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_271]
  25.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_271]
  26.         at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_271]
  27.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
  28.         ... 17 more
复制代码

LanAnY
本帖最后由 GhostSkyV9 于 2021-1-14 10:56 编辑
早晨解说 发表于 2021-1-14 08:55
执行到那一行就报这个
  1. at me.myplugin.one.event.Die.Die1(Die.java:27) ~[?:?]
复制代码

你这里传了一个null进去,代码是什么
  1.     @EventHandler
  2.     public void Die(PlayerRespawnEvent die) {
  3.         Player player = die.getPlayer();
  4.         Economy economy = Main.getEconomy();
  5.         EconomyResponse response = economy.withdrawPlayer(player, 1);
  6.         if (response.transactionSuccess()){
  7.             player.sendMessage("你被扣除了一元");
  8.         }
  9.     }
复制代码
我把getEconomy放到了主类,然后在主类写一个
  1.     private boolean setupEconomy() {
  2.         if (getServer().getPluginManager().getPlugin("Vault") == null) {
  3.             return false;
  4.         }
  5.         RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
  6.         if (rsp == null) {
  7.             return false;
  8.         }
  9.         econ = rsp.getProvider();
  10.         return econ != null;
  11.     }
复制代码



早晨解说
GhostSkyV9 发表于 2021-1-14 10:37
你这里传了一个null进去,代码是什么
我把getEconomy放到了主类,然后在主类写一个

这样子吗



LanAnY

嗯对,然后你要把你事件类的那个变量放到主类

早晨解说
GhostSkyV9 发表于 2021-1-14 20:23
嗯对,然后你要把你事件类的那个变量放到主类

报错丫,报错了……
是放在event的那个里还是主类里,我放在主类里的


LanAnY
早晨解说 发表于 2021-1-14 20:51
报错丫,报错了……
是放在event的那个里还是主类里,我放在主类里的

setupEconomy和getEconomy这两个方法放到主类,然后在你的事件类去调用getEconomy方法然后
  1. private static Economy econ = null;
复制代码
这个变量也是放到主类。

你这报错我看的有点迷

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