Помогите Оптимизация таймера

JolyHoska

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
JolyNoska
Всем привет!На днях у меня появилась такая проблема как Анти-релог. Для тех кто не знает, что это такое!Это - плагин который запускает таймер игроку который дерутся, если от отключается, то его убивает! Так вот. У каждого игрока свой cooldawn, если онлайн большой, то нагрузка очень большая, подскажите оптимизированную версию это плагина(отдельный поток не помог(()
 
Точно, что именно ты хочешь не понял, но ты можешь обрабатывать все в одном шедулере - все зависит от реализации твоей задумки.
 
Всем привет!На днях у меня появилась такая проблема как Анти-релог. Для тех кто не знает, что это такое!Это - плагин который запускает таймер игроку который дерутся, если от отключается, то его убивает! Так вот. У каждого игрока свой cooldawn, если онлайн большой, то нагрузка очень большая, подскажите оптимизированную версию это плагина(отдельный поток не помог(()
После входа в бой записываешь время этого события в хешмеп<ник игрока, время события(newDate().getTimeMillis())> когда игрок выходит из игры проверяешь, сколько времени прошло с момента записанного в хешмеп.
 
Java:
package me.xDark.darkAPI.time;

public class Timer {

    private long startMS;

    public Timer() {
        reset();
    }

    public void reset() {
        startMS = System.currentTimeMillis();
    }

    public long getMSPassed() {
        return (System.currentTimeMillis() - startMS);
    }

    public boolean hasMSPassed(long time) {
        return getMSPassed() >= time;
    }
}
 
я тоже не очень все понимаю в этих таймерах..
 
Сделай как я сделал в этом плагине: http://rubukkit.org/threads/sec-mec...ot-pvp-tested-1-8-1-11-2.135020/#post-1447008
Класс CombatTag:
Код:
public class CombatTag
{
  private static Map<String, Long> players = new HashMap();
 
  public static void addCombat(String name, int time)
  {
    players.put(name, Long.valueOf(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(time)));
  }
 
  public static boolean isCombat(String name)
  {
    return players.containsKey(name);
  }
 
  public static long getEndTime(String name)
  {
    return isCombat(name) ? ((Long)players.get(name)).longValue() : -1L;
  }
 
  public static boolean isEnded(String name)
  {
    return ((Long)players.get(name)).longValue() - System.currentTimeMillis() < 0L;
  }
 
  public static void remove(String name)
  {
    players.remove(name);
  }
}

Класс-Шедулер, который чистит базу:
Лучше конечно будет, если будешь брать список игроков с класса CombatTag, а не из getOnlinePlayers.
Код:
public class CombatSheduler
  implements Runnable
{
  public void run()
  {
    for (Player p : Bukkit.getOnlinePlayers())
    {
      String name = p.getName();
      if ((CombatTag.isCombat(name)) && (CombatTag.isEnded(name)))
      {
        p.sendMessage(Config.REMOVE_COMBAT_MODE);
        CombatTag.remove(name);
      }
    }
  }
}
 
Можно реализовать с помощью HashMap или.. специального метода ведра..
 
Я и так использовал HashMap:
Код:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.*********ventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Core extends JavaPlugin implements Listener {
    Map<String, Long> time= new ConcurrentHashMap();
    List<String> l = new ArrayList();

    public Core() {
    }

    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
        int time= true;
        (new Core$1(this)).runTaskTimer(this, 0L, 50L);
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent e) {
        Player p = e.getPlayer();
        if(this.time.containsKey(p.getName())) {
            this.time.remove(p.getName());
            this.l.add(p.getName());
        }

    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player p = e.getPlayer();
        if(this.l.contains(p.getName())) {
            p.sendMessage("§4Анти-Релог §rВы получаете наказание за выход");
            p.getInventory().clear();
            p.getInventory().setArmorContents((ItemStack[])null);
            p.teleport(p.getWorld().getSpawnLocation());
            this.l.remove(p.getName());
        }

    }

    @EventHandler(
        priority = EventPriority.LOWEST,
        ignoreCancelled = true
    )
    public void onDamage(EntityDamageByEntityEvent e) {
        if(e.getEntity() instanceof Player && (e.getDamager() instanceof Player || e.getDamager() instanceof Arrow && ((Arrow)e.getDamager()).getShooter() instanceof Player)) {
            Player p = e.getDamager() instanceof Player?(Player)e.getDamager():(Player)((Arrow)e.getDamager()).getShooter();
            Player tar = (Player)e.getEntity();
            if(target == p) {
                return;
            }

            if(!this.cool.containsKey(p.getName())) {
                p.sendMessage("§4Анти-Релог §rВы вошли в PvP режим с §b"+tar.getName());
                this.time.put(p.getName(), Long.valueOf(System.currentTimeMillis()));
            }

            if(!this.time.containsKey(target.getName())) {
                this.time.put(target.getName(), Long.valueOf(System.currentTimeMillis()));
                target.sendMessage("§4Анти-Релог §rВы вошли в PvP с §b"+p.getName());
            }
        }

    }
}
 
Я и так использовал HashMap:
Код:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.*********ventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Core extends JavaPlugin implements Listener {
    Map<String, Long> time= new ConcurrentHashMap();
    List<String> l = new ArrayList();

    public Core() {
    }

    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
        int time= true;
        (new Core$1(this)).runTaskTimer(this, 0L, 50L);
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent e) {
        Player p = e.getPlayer();
        if(this.time.containsKey(p.getName())) {
            this.time.remove(p.getName());
            this.l.add(p.getName());
        }

    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player p = e.getPlayer();
        if(this.l.contains(p.getName())) {
            p.sendMessage("§4Анти-Релог §rВы получаете наказание за выход");
            p.getInventory().clear();
            p.getInventory().setArmorContents((ItemStack[])null);
            p.teleport(p.getWorld().getSpawnLocation());
            this.l.remove(p.getName());
        }

    }

    @EventHandler(
        priority = EventPriority.LOWEST,
        ignoreCancelled = true
    )
    public void onDamage(EntityDamageByEntityEvent e) {
        if(e.getEntity() instanceof Player && (e.getDamager() instanceof Player || e.getDamager() instanceof Arrow && ((Arrow)e.getDamager()).getShooter() instanceof Player)) {
            Player p = e.getDamager() instanceof Player?(Player)e.getDamager():(Player)((Arrow)e.getDamager()).getShooter();
            Player tar = (Player)e.getEntity();
            if(target == p) {
                return;
            }

            if(!this.cool.containsKey(p.getName())) {
                p.sendMessage("§4Анти-Релог §rВы вошли в PvP режим с §b"+tar.getName());
                this.time.put(p.getName(), Long.valueOf(System.currentTimeMillis()));
            }

            if(!this.time.containsKey(target.getName())) {
                this.time.put(target.getName(), Long.valueOf(System.currentTimeMillis()));
                target.sendMessage("§4Анти-Релог §rВы вошли в PvP с §b"+p.getName());
            }
        }

    }
}
Попробуй использовать метод BukkitRunnable
 
Я и так использовал HashMap:
Код:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.*********ventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

public class Core extends JavaPlugin implements Listener {
    Map<String, Long> time= new ConcurrentHashMap();
    List<String> l = new ArrayList();

    public Core() {
    }

    public void onEnable() {
        this.getServer().getPluginManager().registerEvents(this, this);
        int time= true;
        (new Core$1(this)).runTaskTimer(this, 0L, 50L);
    }

    @EventHandler
    public void onQuit(PlayerQuitEvent e) {
        Player p = e.getPlayer();
        if(this.time.containsKey(p.getName())) {
            this.time.remove(p.getName());
            this.l.add(p.getName());
        }

    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player p = e.getPlayer();
        if(this.l.contains(p.getName())) {
            p.sendMessage("§4Анти-Релог §rВы получаете наказание за выход");
            p.getInventory().clear();
            p.getInventory().setArmorContents((ItemStack[])null);
            p.teleport(p.getWorld().getSpawnLocation());
            this.l.remove(p.getName());
        }

    }

    @EventHandler(
        priority = EventPriority.LOWEST,
        ignoreCancelled = true
    )
    public void onDamage(EntityDamageByEntityEvent e) {
        if(e.getEntity() instanceof Player && (e.getDamager() instanceof Player || e.getDamager() instanceof Arrow && ((Arrow)e.getDamager()).getShooter() instanceof Player)) {
            Player p = e.getDamager() instanceof Player?(Player)e.getDamager():(Player)((Arrow)e.getDamager()).getShooter();
            Player tar = (Player)e.getEntity();
            if(target == p) {
                return;
            }

            if(!this.cool.containsKey(p.getName())) {
                p.sendMessage("§4Анти-Релог §rВы вошли в PvP режим с §b"+tar.getName());
                this.time.put(p.getName(), Long.valueOf(System.currentTimeMillis()));
            }

            if(!this.time.containsKey(target.getName())) {
                this.time.put(target.getName(), Long.valueOf(System.currentTimeMillis()));
                target.sendMessage("§4Анти-Релог §rВы вошли в PvP с §b"+p.getName());
            }
        }

    }
}
Позволь тогда спросить, а откуда ты знаешь, что это нагружает сервер?
 
Нафиг эти таймеры, просто удерживать объект игрока 5-10 секунд после выхода.
Такое было в линяге, ты вышел, а тебя успели кильнуть).
 
Знаю, у меня был большой онлайн TPS было 16, я решил проверить какой плагин больше всего нагружает сервер через один плуг. И вот узнал, и еще как лучше, когда вся информация в одном евенте (PlayerJoinEvent например) или раскидана по многим PlayerJoinEvent?
 
Знаю, у меня был большой онлайн TPS было 16, я решил проверить какой плагин больше всего нагружает сервер через один плуг. И вот узнал, и еще как лучше, когда вся информация в одном евенте (PlayerJoinEvent например) или раскидана по многим PlayerJoinEvent?
Вообще пофигу, в итоге идет общее время выполнения.
 
Так я не понял, как оптимизировать?
 
Назад
Верх