Помогите Неправильно сохраняется время

  • Автор темы Автор темы reZero
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

reZero

Активный участник
Пользователь
Баллы
76
Всем ку. Мне нужно каждые 5 минут сохранять время проведенное на сервере игроком в конфиг (для теста сделал каждые 3 секунды). Проблема заключается в том, что при сохранении накидывается лишнее время. Я долго с этим возился и не смог разобраться, попрошу не гнобить ☹️
PHP:
public static void runnableForSave(Main main, Player p)
    { 
                int taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(main, new Runnable()
                {
                    @Override
                    public void run()
                    {
                        if(playerInFile(p))
                        {               
                            long s = System.currentTimeMillis();
                            long get = playerTime.get(p.getUniqueId());
                            int o = (int) (s-get);
                            int del = o/1000;
                            int getco = db.getInt(p.getName()+".time");
                            int tp = del + getco;
                            db.set(p.getName()+".time", tp);
                            long gen = playerTime.get(p.getUniqueId());
                            int ma = (int) (s - gen);
                            int m = ma/1000;
                            int getconf = db.getInt(p.getName()+".lvlprint");
                            int to = m+getconf;
                            db.set(p.getName()+".lvlprint", to);
                            Bukkit.getLogger().info("TIME IS: "+tp);
                            Bukkit.getLogger().info("LVLPRINT IS: "+to);
                            saveData();         
                        }
                        else
                        {
                            Utilas.addPlayer(p, Utilas.minusTime(p, Utilas.playerTime.get(p.getUniqueId())), 1, 0, Utilas.minusTime(p, Utilas.playerTime.get(p.getUniqueId())));            
                        }
                    }
  
                }, 0, 60);
                runnableMap.put(p.getUniqueId(), taskID);     
    }
 
Всем ку. Мне нужно каждые 5 минут сохранять время проведенное на сервере игроком в конфиг (для теста сделал каждые 3 секунды). Проблема заключается в том, что при сохранении накидывается лишнее время. Я долго с этим возился и не смог разобраться, попрошу не гнобить ☹️
PHP:
public static void runnableForSave(Main main, Player p)
    {
                int taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(main, new Runnable()
                {
                    @Override
                    public void run()
                    {
                        if(playerInFile(p))
                        {           
                            long s = System.currentTimeMillis();
                            long get = playerTime.get(p.getUniqueId());
                            int o = (int) (s-get);
                            int del = o/1000;
                            int getco = db.getInt(p.getName()+".time");
                            int tp = del + getco;
                            db.set(p.getName()+".time", tp);
                            long gen = playerTime.get(p.getUniqueId());
                            int ma = (int) (s - gen);
                            int m = ma/1000;
                            int getconf = db.getInt(p.getName()+".lvlprint");
                            int to = m+getconf;
                            db.set(p.getName()+".lvlprint", to);
                            Bukkit.getLogger().info("TIME IS: "+tp);
                            Bukkit.getLogger().info("LVLPRINT IS: "+to);
                            saveData();     
                        }
                        else
                        {
                            Utilas.addPlayer(p, Utilas.minusTime(p, Utilas.playerTime.get(p.getUniqueId())), 1, 0, Utilas.minusTime(p, Utilas.playerTime.get(p.getUniqueId())));        
                        }
                    }
 
                }, 0, 60);
                runnableMap.put(p.getUniqueId(), taskID); 
    }
Кажется проблема где-то здесь, но не могу понять названия этих переменных.
PHP:
int del = o/1000;
int getco = db.getInt(p.getName()+".time");
int tp = del + getco;
db.set(p.getName()+".time", tp);
И у тебя для каждого игрока свой Runnable для сохранения? Серьёзно?
 
И у тебя для каждого игрока свой Runnable для сохранения? Серьёзно?
Хм... Я думал что так и надо делать. Если есть способ лучше, расскажи плиз)

Кажется проблема где-то здесь, но не могу понять названия этих переменных.
PHP:
int del = o/1000;
int getco = db.getInt(p.getName()+".time");
int tp = del + getco;
db.set(p.getName()+".time", tp);
Переменные называл от балды.
del - делю то что получилось на 1000 дабы получить секунды
getco - получаю время из конфига в секундах
tp - прибавляю время которое получилось к времени которое в конфиге и далее сохраняю
 
Переменные называл от балды.
del - делю то что получилось на 1000 дабы получить секунды
getco - получаю время из конфига в секундах
tp - прибавляю время которое получилось к времени которое в конфиге и далее сохраняю
У тебя что-то в логике не так. Ты сохраняешь время в наигранных секундах, которое потом отнимаешь от времени с 1 января 1970 года.
 
У тебя что-то в логике не так. Ты сохраняешь время в наигранных секундах, которое потом отнимаешь от времени с 1 января 1970 года.
Возможно реально проблема со мной.
Я не совсем понял как происходит то, что ты описал.

PHP:
long s = System.currentTimeMillis(); - я беру настоящее время в мл.сек
                            long get = playerTime.get(p.getUniqueId()); - я достаю время игрока из мапы, которое записываю при входе
                            int o = (int) (s-get); - тут, я думаю, понятно
                            int del = o/1000; - тут тоже
                            int getco = db.getInt(p.getName()+".time"); - беру время которое записано в конфиге (если оно там есть, выше у меня есть проверка)
                            int tp = del + getco; - прибавляю секунды которые получил выше путем деления на 1000 к тому что в конфиге
                            db.set(p.getName()+".time", tp); - сохраняю
Если я где-то ошибаюсь или что-то не так понимаю, пожалуйста, просвяти
 
long get = playerTime.get(p.getUniqueId()); - я достаю время игрока из мапы, которое записываю при входе
int getco = db.getInt(p.getName()+".time"); - беру время которое записано в конфиге (если оно там есть, выше у меня есть проверка)
int tp = del + getco; - прибавляю секунды которые получил выше путем деления на 1000 к тому что в конфиге
Ты каждые n минут сохраняешь время, но не обновляешь в playerTime.get(p.getUniqueId()). Сложно вообщем. Проще переделать.

http://rubukkit.org/threads/schet-naigrannogo-vremeni.157265/
 
Ты каждые n минут сохраняешь время, но не обновляешь в playerTime.get(p.getUniqueId()). Сложно вообщем. Проще переделать.

http://rubukkit.org/threads/schet-naigrannogo-vremeni.157265/
Лол, так вот от куда идея с сохранением каждые 5 минут. Достаточно же при выходе и рестарте сервера.
 
Лол, так вот от куда идея с сохранением каждые 5 минут. Достаточно же при выходе и рестарте сервера.
Я делаю плагин лвл. В зависимости от наигранного времени надо давать игрокам лвл, но также мне надо обновлять в скорборде статистику, что бы там написано было сколько отыграл игрок. Только ради этого мучаюсь с ранеблом
 
Решил проверить, на что я способен без иде.
PHP:
package hui;

public class TopPlagen extends JavaPlugin implements Listener {

    private static final Map<String, Long> timeMap = Maps.newHashMap();

    //

    private int task;

    //

    @Override
    public void onEnable() {
        {
            new ExperienceIncreasement(5l).runTaskTimer(this, 5 * 60 * 20, 5 * 60 * 20);
        }
      
        Bukkit.getPluginManager().registerEvents(this, this);
    }

    @Override
    public void onDisable() {
        ConfigurationSection config = getConfig();

        {
            timeMap.forEach(entry -> config.set(config.getOrDefault("players." + entry.getKey(), 0) + timeMap.getOrDefault(entry.getKey(), 0)));
        }

        saveConfig();
    }

    /**
    *
    * Будет добавлять в конфигурацию N время всем игрокам.
    * Единица измерения может быть чем-угодно, т.к. всегда можно выразить :)
    *
    */
    class ExperienceIncreasement extends BukkitRunnable {

        private long step;

        public ExperienceIncreasement(long step) {
            this.step = step;
        }

        @Override
        public void run() {
            Bukkit.getOnlinePlayers().forEach(player -> timeMap.put(timeMap.getOrDefault(player.getName(), 0) + step));
        }

    }

}
Если чо, как сказал выше, писал в notepad++. Импортируешь сам, методы подправишь тоже)
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх