[РЕШЕНО]Не работает HashMap, хотя всё вроде правильно

Статус
Закрыто для дальнейших ответов.

thematdev

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
thematdev
Так вот, я писал плагин на киты, всё довольно таки работает, пермишионы сам настрою, но меня до сих пор мучает одна проблема как сделать так чтобы игрок мог брать кит раз в день, а не тупо бесконечно кликать. Исходник одного кита так уж и быть спалю:
fc224c2daa824128b16f6eaabe62cd9e.png

Вопрос что нужно дописать в if(условие) и что нужно дописать в if(действие)?
Заранее благодарен за помощь!
Ну так вот теперь не работает HashMap

PHP:
package gUIMenu;

import java.util.HashMap;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.*********ventory.Inventory;
import org.*********ventory.ItemStack;

import gUIMenu.utils.ItemUtil;

public class GUI implements Listener {
    static HashMap<Player, Long> playermap = new HashMap<Player, Long>();
   
    public static void openKitGUI(Player p) {
        Inventory inv = Bukkit.createInventory(null, 9, "Выбор кита");
        inv.setItem(0, ItemUtil.create(Material.LEATHER_HELMET, ChatColor.translateAlternateColorCodes('&', "&7Кит пользователя")));
        inv.setItem(1, ItemUtil.create(Material.IRON_HELMET, ChatColor.translateAlternateColorCodes('&', "&fКит IRON")));
        inv.setItem(2, ItemUtil.create(Material.GLOWSTONE, ChatColor.translateAlternateColorCodes('&', "&2Кит VIP")));
        inv.setItem(3, ItemUtil.create(Material.REDSTONE, ChatColor.translateAlternateColorCodes('&', "&8Кит VIP+")));
        inv.setItem(4, ItemUtil.create(Material.GOLD_CHESTPLATE, ChatColor.translateAlternateColorCodes('&', "&eКит GOLD")));
        inv.setItem(5, ItemUtil.create(Material.DIAMOND_SWORD, ChatColor.translateAlternateColorCodes('&', "&bКит DIAMOND")));
        inv.setItem(6, ItemUtil.create(Material.GOLD_BLOCK, ChatColor.translateAlternateColorCodes('&', "&6&lКит SPONSOR")));
        inv.setItem(8, ItemUtil.create(Material.WOOD_DOOR, ChatColor.translateAlternateColorCodes('&', "&4Выход")));
       
        p.openInventory(inv);
       
    }
    @EventHandler
    public static void OnInventoryClick (InventoryClickEvent e) {
        long currenttime = System.currentTimeMillis();
        long lasttime = 0;
        Player p = (Player) e.getWhoClicked();
       
        if (e.getInventory().getName().equalsIgnoreCase("Выбор кита")) {
            e.setCancelled(true);
           
           
            if (e.getCurrentItem().getType() == Material.WOOD_DOOR) {
                p.closeInventory();
            }
           
                else if (e.getCurrentItem().getType() == Material.LEATHER_HELMET) {
                    if (playermap.containsKey(p)) {
                        playermap.put(p, currenttime - 87600000);
                    } else {
                        lasttime = playermap.get(p);
                    }
                    if (currenttime - lasttime >= 87600000) {
                        p.getInventory().setHelmet(new ItemStack(Material.LEATHER_HELMET));
                        p.getInventory().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE));
                        p.getInventory().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS));
                        p.getInventory().setBoots(new ItemStack(Material.LEATHER_BOOTS));
                        p.getInventory().addItem(new ItemStack(Material.WOOD_SWORD));
                        p.getInventory().addItem(new ItemStack(Material.COBBLESTONE, 64));
                        p.getInventory().addItem(new ItemStack(Material.LAVA_BUCKET));
                        p.getInventory().addItem(new ItemStack(Material.WATER_BUCKET));
                       
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2Поздравляем Вы получили набор &7&lОБЫЧНОГО ПОЛЬЗОВАТЕЛЯ&2!"));
                    }
                    else {
                        p.sendMessage(ChatColor.RED + "Вы уже получали кит ОБЫЧНОГО ПОЛЬЗОВАТЕЛЯ сегодня!");
                    }
                    /*
                    p.getInventory().setHelmet(new ItemStack(Material.LEATHER_HELMET));
                    p.getInventory().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE));
                    p.getInventory().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS));
                    p.getInventory().setBoots(new ItemStack(Material.LEATHER_BOOTS));
                    p.getInventory().addItem(new ItemStack(Material.WOOD_SWORD));
                    p.getInventory().addItem(new ItemStack(Material.COBBLESTONE, 64));
                    p.getInventory().addItem(new ItemStack(Material.LAVA_BUCKET));
                    p.getInventory().addItem(new ItemStack(Material.WATER_BUCKET));
                   
                    p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2Поздравляем Вы получили набор &7&lОБЫЧНОГО ПОЛЬЗОВАТЕЛЯ&2!"));
                    */
                }
//Тут костыли и анархия(другие киты) и поэтому в них пока нет хэшмэпа, они работают и не мешают(хоть и бесконечные)

[17:08:30] [Server thread/ERROR]: Could not pass event InventoryClickEvent to GUIMenu v1.0
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:305) ~[Spigot.jar:git-Spigot-8a983f9-e81edfc]
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[Spigot.jar:git-Spigot-8a983f9-e81edfc]
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.PlayerConnection.a(PlayerConnection.java:1588) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.PacketPlayInWindowClick.a(SourceFile:31) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.PacketPlayInWindowClick.a(SourceFile:9) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.PacketHandleTask.run(SourceFile:13) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_141]
at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_141]
at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:696) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:316) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:634) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:537) [Spigot.jar:git-Spigot-8a983f9-e81edfc]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_141]
Caused by: java.lang.NullPointerException
at gUIMenu.GUI.OnInventoryClick(GUI.java:52) ~[?:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_141]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_141]
at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_141]
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:301) ~[Spigot.jar:git-Spigot-8a983f9-e81edfc]
... 14 more
Буду очень благодарен тому, кто поможет. Заранее спасибо :3
 
Последнее редактирование:
Получи время, когда он его получил(храни его где-то). Когда он снова попробует получить его опять получи время и сравни, если больше дня прошло - выдавай, в противном случае gg.
 
Получи время, когда он его получил(храни его где-то). Когда он снова попробует получить его опять получи время и сравни, если больше дня прошло - выдавай, в противном случае gg.
Это и дауну понятно. Только с помощью чего лучше делать, итак нагрузка от самописов большая будет, а тут ещё и это...
 
Код:
DateFormat dateFormat = new SimpleDateFormat("dd"); //Full date: yyyy/MM/dd HH:mm:ss
Date date = new Date();
String curDate = dateFormat.format(date);
 
Данный код вернёт день в строке curDate, дальше записывай его например в yml
Я записываю в хэш-мап... Так проще типа, и да табы не вставились поч-то. Но с ними варнов и ошибок нету)
 
Вообщем не работает посмотрите код и плиз найдите ошибку:
public class GUI implements Listener {
private final Map<Player, Long> PLAYER_MAP = Maps.newHashMap();

public static void openKitGUI(Player p) {
Inventory inv = Bukkit.createInventory(null, 9, "Выбор кита");
inv.setItem(0, ItemUtil.create(Material.LEATHER_HELMET, ChatColor.translateAlternateColorCodes('&', "&7Кит пользователя")));
inv.setItem(1, ItemUtil.create(Material.IRON_HELMET, ChatColor.translateAlternateColorCodes('&', "&fКит IRON")));
inv.setItem(2, ItemUtil.create(Material.GLOWSTONE, ChatColor.translateAlternateColorCodes('&', "&2Кит VIP")));
inv.setItem(3, ItemUtil.create(Material.REDSTONE, ChatColor.translateAlternateColorCodes('&', "&8Кит VIP+")));
inv.setItem(4, ItemUtil.create(Material.GOLD_CHESTPLATE, ChatColor.translateAlternateColorCodes('&', "&eКит GOLD")));
inv.setItem(5, ItemUtil.create(Material.DIAMOND_SWORD, ChatColor.translateAlternateColorCodes('&', "&bКит DIAMOND")));
inv.setItem(6, ItemUtil.create(Material.GOLD_BLOCK, ChatColor.translateAlternateColorCodes('&', "&6&lКит SPONSOR")));
inv.setItem(8, ItemUtil.create(Material.WOOD_DOOR, ChatColor.translateAlternateColorCodes('&', "&4Выход")));

p.openInventory(inv);

}
@EventHandler
public void OnInventoryClick (InventoryClickEvent e) {
Date lastdate = new Date();
long lastl = lastdate.getTime();
Date newdate = new Date();
long newl = newdate.getTime();
Player p = (Player) e.getWhoClicked();

if (e.getInventory().getName().equalsIgnoreCase("Выбор кита")) {
e.setCancelled(true);


if (e.getCurrentItem().getType() == Material.WOOD_DOOR) {
p.closeInventory();
}

else if (e.getCurrentItem().getType() == Material.LEATHER_HELMET) {
if (PLAYER_MAP.containsKey(p)) {
PLAYER_MAP.put(p, newl - 86400000);
} else {
lastl = PLAYER_MAP.get(p);
}
newdate = new Date();
newl = newdate.getTime();
if (newl - lastl >= 86400000) {
p.getInventory().setHelmet(new ItemStack(Material.LEATHER_HELMET));
p.getInventory().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE));
p.getInventory().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS));
p.getInventory().setBoots(new ItemStack(Material.LEATHER_BOOTS));
p.getInventory().addItem(new ItemStack(Material.WOOD_SWORD));
p.getInventory().addItem(new ItemStack(Material.COBBLESTONE, 64));
p.getInventory().addItem(new ItemStack(Material.LAVA_BUCKET));
p.getInventory().addItem(new ItemStack(Material.WATER_BUCKET));

PLAYER_MAP.put(p, newl);

p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2Поздравляем Вы получили набор &7&lОБЫЧНОГО ПОЛЬЗОВАТЕЛЯ&2!"));
} else {
p.sendMessage(ChatColor.RED + "Вы уже получали набор ОБЫЧНОГО ПОЛЬЗОВАТЕЛЯ сегодня!");
}
}
// Дальше идут костыли и анархия, но со скобками точно ничего не перепутал, варнов и ошибок нет, когда нажимаю на кит пользователя ничё не просиходит


Почему у тебя мапа в uppercase идет? Это че константа?
 
Почему у тебя мапа в uppercase идет? Это че константа?
На переменные Eclipse ругается, на это нет, ну блин я не знаю как ещё это делать, ведь в YML много места надо. Ну так почему не работает?
UPD: Поменял и ниче не поменялось(
 
Время не может достать с мапы. Если игрока там нету - возвращает null. Втули проверку.
 
Время не может достать с мапы. Если игрока там нету - возвращает null. Втули проверку.
PHP:
                    if (playermap.containsKey(p)) {
                        playermap.put(p, currenttime - 87600000);
                    } else {
                        lasttime = playermap.get(p);
                    }

Это по твоему что?
 
Ты так пишешь, будто люди обязаны твою проблему фиксить.
Нет, но блин посмотри актив на остальных темах, и на моей... Ну а проблема большая и тормозит разработку плагина, что очень плохо. Да и ещё люди не разбираясь в коде пишут:
Время не может достать с мапы. Если игрока там нету - возвращает null. Втули проверку.
Печаль конечно, но всё равно спасибо :3 Надеюсь решится...
 
PHP:
                    if (playermap.containsKey(p)) {
                        playermap.put(p, currenttime - 87600000);
                    } else {
                        lasttime = playermap.get(p);
                    }

Это по твоему что?
Ты че, обкурился? Ты проверяешь: если есть игрок - добавить, если нет - получить...
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх