Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

Помогите Уменьшения здоровья без эффектов.

Discussion in 'Разработка плагинов для новичков' started by jamesg101, Jun 29, 2016.

  1. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Всем привет. Написал два ивента на кровотечение. Все прекрасно работает, но люди будут умирать быстро, что не очень весело. Вот и назрел этот вопрос.

    Можно ли как-то уменьшать 2 сердечка каждые 20 секунд?
     
  2. Хостинг MineCraft
    <
  3. MrTrojan

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

    Trophy Points:
    98
    Skype:
    mrtrojan.ru
    Имя в Minecraft:
    MrTrojan
    Да.
    Code:
    new BukkitRunnable() {
                public void run() {
                    player.setHealth(player.getHealth() - 2);
                }
            }.runTaskTimer(plugin, 1L, 400L);
     
  4. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    А какая разница между 400,400 и 1,400? Ведь всёравно он в одно и тоже время будет код выполнять.
    Code:
        public void aaa() {
            Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                @Override
                public void run() {
                    System.out.print("20,20");
                }
            }, 20L, 20L);
        }
        public void aaa2() {
            Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                @Override
                public void run() {
                    System.out.print("1,20");
                }
            }, 1L, 20L);
        }
    [​IMG]
     
  5. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    А можно поточнее?

    Мне надо так, что если игрок получит травму (неважно какую) то он получит эту проблему и эта проблема будет до тех пор, пока он не заюзает предмет. У меня это все есть, но в виде эффектов, а я хочу заменить эти эффекты, но вот этот метод, правда я вообще не понимаю.
     
  6. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Ну при запуске сервера запускаешь таймер который будет каждые 20 сек убавлять хп у тех игроков, которые есть в ArrayList или HaspMap.
    Как то так:
    Code:
            for (Player p : Bukkit.getOnlinePlayers()) {
                if (hashmap.contains(p) {
                    p.setHealth(p.getHealth()-2);
                }
            }
        
    [DOUBLEPOST=1467206843,1467206692][/DOUBLEPOST]Ну а когда он использует предмет то убирать его из листа или мапы
     
  7. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    for (Player player : Bukkit.getOnlinePlayers()) {

    А как изменить переменные, если я уже достал игрока выше.[DOUBLEPOST=1467209901,1467207324][/DOUBLEPOST]Покопался, но не работает. Ивент вызывается.
    Code:
        @EventHandler
        public void onBlooding(EntityDamageEvent e) {
           
            if (e.getEntity() instanceof Player) {
                final Player p = (Player)e.getEntity();
               
                if(!this.plugin.worlds.contains(p.getWorld().getName())) {
                    return;
                }
           
                if(r.nextInt(100) <= 50) {
                   
                    if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
                       
                        ml.blooding_players.put(p, "blood");
                       
                        MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
                       
                        for (Player player : Bukkit.getOnlinePlayers()) {
                            if (ml.blooding_players.containsKey(player)) {
                                player.setHealth(player.getHealth()-2);
                            }
                        }
                    }
                }
            }
        }
     
  8. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Ну так цикл токо один раз отрабатывается.
     
  9. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    А как его повторять до тех пор, пока не юзанешь предмет?[DOUBLEPOST=1467215776,1467212761][/DOUBLEPOST]return [что-то]?
     
  10. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Я же писал что при запуске сервера запускай таймер, который повторяется каждые 20 секунд, и в нём используй тот код с for
     
  11. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Таймер поставил, но не работает...
    Таймер стоит в мейн классе.
    Код таймера
    Code:
        public void timer() {
            Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                @Override
                public void run() {
                }
            }, 1L, 20L);
        }
    Код ивента:

    Code:
        @EventHandler
        public void onBlooding(EntityDamageEvent e) {
           
            if (e.getEntity() instanceof Player) {
                final Player p = (Player)e.getEntity();
               
                if(!this.plugin.worlds.contains(p.getWorld().getName())) {
                    return;
                }
           
                if(r.nextInt(100) <= 50) {
                   
                    if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
                       
                        ml.blooding_players.put(p, "blood");
                       
                        MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
                       
                        for (Player player : Bukkit.getOnlinePlayers()) {
                            if (ml.blooding_players.containsKey(player)) {
                                player.setHealth(player.getHealth()-2);
                            }
                        }
                    }
                }
            }
        }
     
  12. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    ну так надо в сам таймер добавить код, а в евенте только добавлять в мапу.
     
  13. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Дошло, но крашится
    Code:
        public void timer() {
            Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                @Override
                public void run() {
                    for (Player player : Bukkit.getOnlinePlayers()) {
                        if (ml.blooding_players.containsKey(player)) {
                            player.setHealth(player.getHealth()-2);
                        }
                    }
                }
            }, 1L, 20L);
        }
    Краш:
    Code:
    [19:30:26 ERROR]: Could not load 'plugins\Blood.jar' in folder 'plugins'
    org.bukkit.plugin.InvalidPluginException: Abnormal plugin type
            at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:80) ~[server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugins(CraftServer.java:292) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.craftbukkit.v1_8_R3.CraftServer.reload(CraftServer.java:739) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.Bukkit.reload(Bukkit.java:535) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) [server.jar:git-Spigot-db6de12-18fbb24]
            at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchServerCommand(CraftServer.java:627) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.DedicatedServer.aO(DedicatedServer.java:412) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:375) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
            at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [server.jar:git-Spigot-db6de12-18fbb24]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_91]
    Caused by: java.lang.InstantiationException: com.blood.api.API
            at java.lang.Class.newInstance(Unknown Source) ~[?:1.8.0_91]
            at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:76) ~[server.jar:git-Spigot-db6de12-18fbb24]
            ... 15 more
    Caused by: java.lang.NoSuchMethodException: com.blood.api.API.<init>()
            at java.lang.Class.getConstructor0(Unknown Source) ~[?:1.8.0_91]
            at java.lang.Class.newInstance(Unknown Source) ~[?:1.8.0_91]
            at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:76) ~[server.jar:git-Spigot-db6de12-18fbb24]
            ... 15 more
    [DOUBLEPOST=1467219802,1467218290][/DOUBLEPOST]Что не так? Весь код в мейн классе, хешмап видит.[DOUBLEPOST=1467220982][/DOUBLEPOST]Я в крашах, если честно вообще не понимаю ничего
     
  14. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Code:
    //
    // Decompiled by Procyon v+0.5.29
    //
    
    package ru.xtime;
    
    import java.util.ArrayList;
    import java.util.Random;
    
    import org.bukkit.Bukkit;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageEvent;
    import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
    import org.bukkit.plugin.java.JavaPlugin;
    
    
    public class FUCK2 extends JavaPlugin implements Listener,Runnable
    {
        FUCK2 helper = this;
        ArrayList<Player> al = new ArrayList<Player>();
        Random r;
        public void onEnable() {
            r = new Random();
            Bukkit.getPluginManager().registerEvents(this, helper);
            Bukkit.getScheduler().runTaskTimerAsynchronously(this, helper, 20, 20);
        }
        @EventHandler
        public void onBlooding(EntityDamageEvent e) {
    
            if (e.getEntity().getType() == EntityType.PLAYER) {
                final Player p = (Player)e.getEntity();
    
                if(!this.plugin.worlds.contains(p.getWorld().getName())) {
                    return;
                }
    
                if(r.nextInt(100) <= 50) {
    
                    if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
    
                        al.add(p);
    
                        MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
    
                    }
                }
            }
        }
        @Override
        public void run() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                if (al.contains(player)) {
                    player.setHealth(player.getHealth()-2);
                }
            }
    
        }
    
    }
    
     
  15. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    А если с вместо аррэй листа юзать хешмеп?
     
  16. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    тогда вместо add будет put, и вместо contains - containsKey[DOUBLEPOST=1467221876,1467221722][/DOUBLEPOST]
    Code:
        FUCK2 helper = this;
        HashMap<Player, Boolean> al = new HashMap<Player, Boolean>();
        Random r;
        public void onEnable() {
            r = new Random();
            Bukkit.getPluginManager().registerEvents(this, helper);
            Bukkit.getScheduler().runTaskTimerAsynchronously(this, helper, 20, 20);
        }
        @EventHandler
        public void onBlooding(EntityDamageEvent e) {
    
            if (e.getEntity().getType() == EntityType.PLAYER) {
                final Player p = (Player)e.getEntity();
    
                if(!this.plugin.worlds.contains(p.getWorld().getName())) {
                    return;
                }
    
                if(r.nextInt(100) <= 50) {
    
                    if(e.getCause().equals(DamageCause.ENTITY_ATTACK) && p.getLastDamageCause().getDamage() <= 5.0f) {
    
                        al.put(p, true);
    
                        MessageManager.getManager().msg(p, MsgType.INFORMATION, "Я получил серьезную рану и из нее течет кровь!");
    
                    }
                }
            }
        }
        @Override
        public void run() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                if (al.containsKey(player) && al.get(player)) {
                    player.setHealth(player.getHealth()-2);
                }
            }
    
        }
        /* Если игрок использовал предмет. al.remove(player) или al.put(player, false) */
     
  17. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Ругается на аннотацию @Override. Просит удалить. Я удалил
     
  18. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    не должен ругаться.
     
  19. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Так ругается
    The method timer() of type API must override or implement a supertype method
     
  20. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    так зачем тебе метод timer? Пришли мне в лс папку с исходниками, отредактирую как нужно.
     
  21. Автор темы
    jamesg101

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

    Trophy Points:
    76
    Имя в Minecraft:
    jamesg101
    Щас скину.
     

Share This Page