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

jamesg101

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

Можно ли как-то уменьшать 2 сердечка каждые 20 секунд?
 
Всем привет. Написал два ивента на кровотечение. Все прекрасно работает, но люди будут умирать быстро, что не очень весело. Вот и назрел этот вопрос.

Можно ли как-то уменьшать 2 сердечка каждые 20 секунд?
Да.
Java:
new BukkitRunnable() {
            public void run() {
                player.setHealth(player.getHealth() - 2);
            }
        }.runTaskTimer(plugin, 1L, 400L);
 
runTaskTimer(plugin, 1L, 400L);
А какая разница между 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);
    }
17ea09b2fce028b1f84a025343d68d4c.png
 
А можно поточнее?

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

Мне надо так, что если игрок получит травму (неважно какую) то он получит эту проблему и эта проблема будет до тех пор, пока он не заюзает предмет. У меня это все есть, но в виде эффектов, а я хочу заменить эти эффекты, но вот этот метод, правда я вообще не понимаю.
Ну при запуске сервера запускаешь таймер который будет каждые 20 сек убавлять хп у тех игроков, которые есть в ArrayList или HaspMap.
Как то так:
Код:
        for (Player p : Bukkit.getOnlinePlayers()) {
            if (hashmap.contains(p) {
                p.setHealth(p.getHealth()-2);
            }
        }

Ну а когда он использует предмет то убирать его из листа или мапы
 
for (Player player : Bukkit.getOnlinePlayers()) {

А как изменить переменные, если я уже достал игрока выше.
Покопался, но не работает. Ивент вызывается.
JavaScript:
    @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);
                        }
                    }
                }
            }
        }
    }
 
for (Player player : Bukkit.getOnlinePlayers()) {

А как изменить переменные, если я уже достал игрока выше.
Покопался, но не работает. Ивент вызывается.
JavaScript:
    @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);
                        }
                    }
                }
            }
        }
    }
Ну так цикл токо один раз отрабатывается.
 
Я же писал что при запуске сервера запускай таймер, который повторяется каждые 20 секунд, и в нём используй тот код с for
 
Таймер поставил, но не работает...
Таймер стоит в мейн классе.
Код таймера
JavaScript:
    public void timer() {
        Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
            }
        }, 1L, 20L);
    }

Код ивента:

JavaScript:
    @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);
                        }
                    }
                }
            }
        }
    }
 
Таймер поставил, но не работает...
Таймер стоит в мейн классе.
Код таймера
JavaScript:
    public void timer() {
        Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
            }
        }, 1L, 20L);
    }

Код ивента:

JavaScript:
    @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);
                        }
                    }
                }
            }
        }
    }
ну так надо в сам таймер добавить код, а в евенте только добавлять в мапу.
 
Дошло, но крашится
JavaScript:
    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

Что не так? Весь код в мейн классе, хешмап видит.
Я в крашах, если честно вообще не понимаю ничего
 
Java:
//
// 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);
            }
        }

    }

}
 
А если с вместо аррэй листа юзать хешмеп?
 
тогда вместо add будет put, и вместо contains - containsKey
Java:
    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) */
 
Ругается на аннотацию @Override. Просит удалить. Я удалил
 
Так ругается
The method timer() of type API must override or implement a supertype method
 
Назад
Верх