Использование экономики (Vault API)

BlackBaroness

Модератор
Разработчик
Сообщения
1 790
Решения
78
Веб-сайт
t.me
Имею такой код:

Java:
@Override
    public void onEnable() {
        super.onEnable();
        Bukkit.getPluginManager().registerEvents(new AdminShop(), this);
        this.getCommand("adminshop").setExecutor(new AdminShop());
        AdminShop.init();
        getLogger().info(ChatColor.AQUA + "Successfully enabled.");
    }

Java:
@EventHandler
    public void shopuse(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        Inventory i = e.getClickedInventory();
        p.sendMessage("1");
        if (!i.getTitle().equals(ChatColor.DARK_GREEN + "Админшоп SapphireLife")) return;
        p.sendMessage("2");
        e.setCancelled(true);
        int slot = e.getSlot();
        double amount;
        double money = eco.getBalance(p);
        p.sendMessage("3");
        if (slot == 21) {
            p.sendMessage("4");
            amount = 50;
            if (money < amount) {
                double req = amount - money;
                p.sendMessage(ChatColor.RED + "Вам не хватает " + req + " монет для покупки этого предмета.");
                return;
            }
            eco.withdrawPlayer(p, 50);
            p.sendMessage("5");
        }
    }

    public static void init() {
        Bukkit.getServicesManager().getRegistration(Economy.class).getProvider();
    }

Консоль пишет:
Java:
org.bukkit.event.EventException: null
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:69) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[RegisteredListener.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:503) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:488) [SimplePluginManager.class:git-CatServer-1.12.2-3440193]
        at net.minecraft.network.NetHandlerPlayServer.func_147351_a(NetHandlerPlayServer.java:2113) [pa.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:38) [lf.class:?]
        at net.minecraft.network.play.client.CPacketClickWindow.func_148833_a(CPacketClickWindow.java:12) [lf.class:?]
        at net.minecraft.network.PacketThreadUtil$1.run(SourceFile:13) [hv$1.class:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_241]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_241]
        at net.minecraft.util.Util.func_181617_a(Util.java:50) [h.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:845) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:472) [nz.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:782) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:636) [MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.lang.NullPointerException
        at com.baroness.AdminShop.shopuse(AdminShop.java:61) ~[?:?]
        at catserver.server.executor.asm.generated.GeneratedEventExecutor16.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor$2.execute(EventExecutor.java:67) ~[EventExecutor$2.class:git-CatServer-1.12.2-3440193]
        ... 15 more

То есть строка double money = eco.getBalance(p); неверная. Что я делаю не так?
Объединено

UPD. В классе прописана строка private static Economy eco;
 
Java:
private Economy eco;

@Override
public void onEnable() {
    eco = getServer().getServicesManager().getRegistration(Economy.class).getProvider();
}

public Economy getEco() {
    return eco;
}

Вообще свои инвентари нужно создавать наследуя MenuHolder
 
Black_Baroness,
Java:
public class Foo implements Listener {
    private Economy eco;
    
    public Foo(Main plugin) {
        eco = plugin.getEco();
    }
    
}

public class Main extends JavaPlugin {
    private Economy eco;
    
    @Override
    public void onEnable() {
        eco = getServer().getServicesManager().getRegistration(Economy.class).getProvider();
        Bukkit.getPluginManager.registerEvents(new Foo(eco), this)
    }
    
    public Economy getEco() {
        return eco;
    }
}
Учим жабу
 
Java:
[15:12:02] [Server thread/INFO]: [Baroness] Enabling Baroness v1.0-SNAPSHOT
[15:12:11] [Server thread/ERROR]: [Baroness] Baroness v1.0-SNAPSHOT attempted to register an invalid EventHandler method signature "public void com.baroness.AdminShop.shopuse(org.bukkit.event.inventory.InventoryClickEvent,com.baroness.Baroness)" in class com.baroness.AdminShop
[15:12:11] [Server thread/INFO]: [Baroness] Successfully enabled.
 
mc923,
Java:
package com.baroness;

import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;
import java.util.List;

public class AdminShop implements CommandExecutor, Listener {

    private Economy eco;
    Inventory inv;

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
            Player p = (Player) sender;
            inv = Bukkit.createInventory(null, 54, ChatColor.DARK_GREEN + "Админшоп SapphireLife");

            ItemStack item1 = new ItemStack(Material.FLINT);
            ItemMeta meta1 = item1.getItemMeta();
            meta1.addEnchant(Enchantment.OXYGEN, 1, true);
            meta1.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            meta1.setDisplayName(ChatColor.YELLOW + "Камень Возврата");
            List<String> lore1 = new ArrayList<>();
            lore1.add(ChatColor.GREEN + "Этот предмет позволяет телепортироваться в город.");
            lore1.add(ChatColor.GOLD + "Стоимость: 50 монет. Нажмите, чтобы купить.");
            meta1.setLore(lore1);
            item1.setItemMeta(meta1);
            inv.setItem(21, item1);

            p.openInventory(inv);
        }
        return true;
    }

    @EventHandler
    public void shopuse(InventoryClickEvent e, Baroness plugin) {
        Player p = (Player) e.getWhoClicked();
        Inventory i = e.getClickedInventory();
        p.sendMessage("1");
        if (!i.getTitle().equals(ChatColor.DARK_GREEN + "Админшоп SapphireLife")) return;
        p.sendMessage("2");
        e.setCancelled(true);
        int slot = e.getSlot();
        double amount;
        eco = plugin.getEco();
        double money = eco.getBalance(p);
        p.sendMessage("3");
        if (slot == 21) {
            p.sendMessage("4");
            ItemStack return_stone = new ItemStack(Material.FLINT);
            ItemMeta meta = return_stone.getItemMeta();
            meta.addEnchant(Enchantment.OXYGEN, 1, true);
            meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            meta.setDisplayName(ChatColor.YELLOW + "Камень Возврата");
            List<String> lore = new ArrayList<>();
            lore.add(ChatColor.GREEN + "В этом невзрачном камне заключена магия перемещения в город!");
            lore.add(ChatColor.GREEN + "Учтите, перезарядка подобных действий: " + ChatColor.YELLOW + "15 минут" + ChatColor.GREEN + ".");
            meta.setLore(lore);
            return_stone.setItemMeta(meta);
            amount = 50;
            if (money < amount) {
                double req = amount - money;
                p.sendMessage(ChatColor.RED + "Вам не хватает " + req + " монет для покупки этого предмета.");
                return;
            }
            eco.withdrawPlayer(p, 50);
            p.getInventory().addItem(return_stone);
            p.sendMessage("5");
        }
    }
}
 
Java:
public class Foo implements Listener {
    private Economy eco;
   
    public Foo(Main plugin) {
        eco = plugin.getEco();
    }
   
}

public class Main extends JavaPlugin {
    private Economy eco;
   
    @Override
    public void onEnable() {
        eco = getServer().getServicesManager().getRegistration(Economy.class).getProvider();
    }
   
    public Economy getEco() {
        return eco;
    }
}
public class FooCommand implements CommandExecutor {
    private Economy eco;
   
    public FooCommand(Main plugin) {
        eco = plugin.getEco();
    }
    @Override
    public boolean onCommand(.........) {}
}
 
Java:
[16:41:38] [Server thread/INFO]: [Baroness] Enabling Baroness v1.0-SNAPSHOT
[16:41:38] [Server thread/ERROR]: [Baroness] Baroness v1.0-SNAPSHOT attempted to register an invalid EventHandler method signature "public void com.baroness.AdminShopListener.shopuse(org.bukkit.event.inventory.InventoryClickEvent,com.baroness.Baroness)" in class com.baroness.AdminShopListener
[16:41:39] [Server thread/INFO]: [Baroness] Successfully enabled.

Java:
public final class Baroness extends JavaPlugin {

    private static Baroness instance;
    private Economy eco;

    @Override
    public void onEnable() {
        super.onEnable();
        Bukkit.getPluginManager().registerEvents(new AdminShopListener(this), this);
        this.getCommand("adminshop").setExecutor(new AdminShop(this));
        eco = getServer().getServicesManager().getRegistration(Economy.class).getProvider();
        getLogger().info(ChatColor.AQUA + "Successfully enabled.");
    }
    public Economy getEco() { return eco; }
}

Java:
package com.baroness;

import net.milkbowl.vault.economy.Economy;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;
import java.util.List;

public class AdminShopListener implements Listener {
    private Economy eco;

    public AdminShopListener(Baroness plugin) {
        eco = plugin.getEco();
    }

    @EventHandler
    public void shopuse(InventoryClickEvent e, Baroness plugin) {
        Player p = (Player) e.getWhoClicked();
        Inventory i = e.getClickedInventory();
        p.sendMessage("1");
        if (!i.getTitle().equals(ChatColor.DARK_GREEN + "Админшоп SapphireLife")) return;
        p.sendMessage("2");
        e.setCancelled(true);
        int slot = e.getSlot();
        double amount;
        eco = plugin.getEco();
        double money = eco.getBalance(p);
        p.sendMessage("3");
        if (slot == 21) {
            p.sendMessage("4");
            ItemStack return_stone = new ItemStack(Material.FLINT);
            ItemMeta meta = return_stone.getItemMeta();
            meta.addEnchant(Enchantment.OXYGEN, 1, true);
            meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            meta.setDisplayName(ChatColor.YELLOW + "Камень Возврата");
            List<String> lore = new ArrayList<>();
            lore.add(ChatColor.GREEN + "В этом невзрачном камне заключена магия перемещения в город!");
            lore.add(ChatColor.GREEN + "Учтите, перезарядка подобных действий: " + ChatColor.YELLOW + "15 минут" + ChatColor.GREEN + ".");
            meta.setLore(lore);
            return_stone.setItemMeta(meta);
            amount = 50;
            if (money < amount) {
                double req = amount - money;
                p.sendMessage(ChatColor.RED + "Вам не хватает " + req + " монет для покупки этого предмета.");
                return;
            }
            eco.withdrawPlayer(p, 50);
            p.getInventory().addItem(return_stone);
            p.sendMessage("5");
        }
    }
}

Java:
package com.baroness;

import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;
import java.util.List;

public class AdminShop implements CommandExecutor {

    Inventory inv;
    private Economy eco;

    public AdminShop(Baroness plugin) {
        eco = plugin.getEco();
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
            Player p = (Player) sender;
            inv = Bukkit.createInventory(null, 54, ChatColor.DARK_GREEN + "Админшоп SapphireLife");

            ItemStack item1 = new ItemStack(Material.FLINT);
            ItemMeta meta1 = item1.getItemMeta();
            meta1.addEnchant(Enchantment.OXYGEN, 1, true);
            meta1.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            meta1.setDisplayName(ChatColor.YELLOW + "Камень Возврата");
            List<String> lore1 = new ArrayList<>();
            lore1.add(ChatColor.GREEN + "Этот предмет позволяет телепортироваться в город.");
            lore1.add(ChatColor.GOLD + "Стоимость: 50 монет. Нажмите, чтобы купить.");
            meta1.setLore(lore1);
            item1.setItemMeta(meta1);
            inv.setItem(21, item1);

            p.openInventory(inv);
        }
        return true;
    }
}


Не понимаю, что делаю не так
 
[OFFTOPIC]
[Baroness] Baroness v1.0-SNAPSHOT attempted to register an invalid EventHandler method signature "public void com.baroness.AdminShop.shopuse(org.bukkit.event.inventory.InventoryClickEvent,com.baroness.Baroness)" in class com.baroness.AdminShop
Почему? Проблема ведь с API Vault
Ошибка не связана с Vault'ом.
[/OFFTOPIC]
 
Ты присваиваешь eco значение после того, как уже инициализируешь классы с ним, а надо наборорот.
И на кой тебе синглтон, если ты конструкторы классов делаешь?
Объединено

public void shopuse(InventoryClickEvent e, Baroness plugin) {
Тут вообще бредятина написана, у тебя в аргументах должен быть ивент только, а не что душе угодно.
Объединено

[OFFTOPIC]Чтобы не получить предупреждение от BuseSo перемести тему в отдельный топик, но мне сказать все равно больше нечего.[/OFFTOPIC]
 
Последнее редактирование:
Назад
Сверху Снизу