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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем jamesg101, 29 июн 2016.

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

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

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

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

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

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

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    А какая разница между 400,400 и 1,400? Ведь всёравно он в одно и тоже время будет код выполнять.
    Код:
        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 Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    А можно поточнее?

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

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    for (Player player : Bukkit.getOnlinePlayers()) {

    А как изменить переменные, если я уже достал игрока выше.[DOUBLEPOST=1467209901,1467207324][/DOUBLEPOST]Покопался, но не работает. Ивент вызывается.
    Код:
        @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 Старожил Пользователь

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

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

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

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

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

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

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

    Код:
        @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 Старожил Пользователь

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

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    Дошло, но крашится
    Код:
        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);
        }
    Краш:
    Код:
    [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 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
    //
    // 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 Активный участник Пользователь

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

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    тогда вместо add будет put, и вместо contains - containsKey[DOUBLEPOST=1467221876,1467221722][/DOUBLEPOST]
    Код:
        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 Активный участник Пользователь

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

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

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

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

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

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    jamesg101
    Щас скину.
     

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