1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем reZero, 3 май 2018.

Статус темы:
Закрыта.
  1. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Всем ку. Мне нужно каждые 5 минут сохранять время проведенное на сервере игроком в конфиг (для теста сделал каждые 3 секунды). Проблема заключается в том, что при сохранении накидывается лишнее время. Я долго с этим возился и не смог разобраться, попрошу не гнобить :(
    PHP:
    public static void runnableForSave(Main mainPlayer 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) (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(pUtilas.minusTime(pUtilas.playerTime.get(p.getUniqueId())), 10Utilas.minusTime(pUtilas.playerTime.get(p.getUniqueId())));            
                            }
                        }
      
                    }, 
    060);
                    
    runnableMap.put(p.getUniqueId(), taskID);     
        }
     
  2. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Кажется проблема где-то здесь, но не могу понять названия этих переменных.
    PHP:
    int del o/1000;
    int getco db.getInt(p.getName()+".time");
    int tp del getco;
    db.set(p.getName()+".time"tp);
    И у тебя для каждого игрока свой Runnable для сохранения? Серьёзно?
     
  3. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Хм... Я думал что так и надо делать. Если есть способ лучше, расскажи плиз)

    Переменные называл от балды.
    del - делю то что получилось на 1000 дабы получить секунды
    getco - получаю время из конфига в секундах
    tp - прибавляю время которое получилось к времени которое в конфиге и далее сохраняю
     
  4. bristol

    bristol Активный участник Пользователь

    Баллы:
    46
    Лучше один Runnable запускать при включении сразу для всех игроков.
     
  5. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    У тебя что-то в логике не так. Ты сохраняешь время в наигранных секундах, которое потом отнимаешь от времени с 1 января 1970 года.
     
  6. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Возможно реально проблема со мной.
    Я не совсем понял как происходит то, что ты описал.

    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); - сохраняю
    Если я где-то ошибаюсь или что-то не так понимаю, пожалуйста, просвяти
     
  7. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
  8. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ты каждые n минут сохраняешь время, но не обновляешь в playerTime.get(p.getUniqueId()). Сложно вообщем. Проще переделать.

    http://rubukkit.org/threads/schet-naigrannogo-vremeni.157265/
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Лол, так вот от куда идея с сохранением каждые 5 минут. Достаточно же при выходе и рестарте сервера.
     
  10. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Бывают случаи когда сервер падает, вот тогда может пригодится. Хотя сохранения после выхода игрока должно хватать.
     
  11. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Я делаю плагин лвл. В зависимости от наигранного времени надо давать игрокам лвл, но также мне надо обновлять в скорборде статистику, что бы там написано было сколько отыграл игрок. Только ради этого мучаюсь с ранеблом
     
  12. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Попробую обновлять время в мапе
     
  13. iD3LSY

    iD3LSY Активный участник Пользователь

    Баллы:
    76
    Решил проверить, на что я способен без иде.
    PHP:
    package hui;

    public class 
    TopPlagen extends JavaPlugin implements Listener {

        private static final 
    Map<StringLongtimeMap Maps.newHashMap();

        
    //

        
    private int task;

        
    //

        
    @Override
        
    public void onEnable() {
            {
                new 
    ExperienceIncreasement(5l).runTaskTimer(this60 2060 20);
            }
          
            
    Bukkit.getPluginManager().registerEvents(thisthis);
        }

        @
    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++. Импортируешь сам, методы подправишь тоже)
     
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну это случай говносервов только, если оутофмемори.
     
  15. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Если сервер не на дедике а на своём хосте, то можно боятся и отключения электричества.
     
  16. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Всем спасибо! Исправил ошибку
     
Статус темы:
Закрыта.

Поделиться этой страницей