Solved Increase food over time problems

Discussion in 'Plugin Development' started by awesomebutter234, Nov 24, 2017.

Thread Status:
Not open for further replies.
  1. OK, new update, I fixed all of the other stuff, but I need to know how I would make this Bukkit Scheduler run more than once(It only executes the stuff in the scheduler when the FoodLevelChange Event Happens).

    Code:
    Code:
    @EventHandler
        public void Hunger(FoodLevelChangeEvent e)
        {
    
        
            //KitPvp
            if(e.getEntity().getWorld() == Bukkit.getWorld("KitPvp"))
            {
                //Send stuff to let me know if somethign is wrong
            
                if(e.getFoodLevel() < 20 && !(food.contains(e.getEntity().getUniqueId())))
                {
                    food.add(e.getEntity().getUniqueId());
                    if(Bukkit.getScheduler().isCurrentlyRunning(i) == false)
                     i = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin,new Runnable()
                             {
                             public void run() {
                                 Bukkit.broadcastMessage("Size of Array Before:" + String.valueOf(Player_Settings.food.size()));
                                    //for(int i=1;i <= Player_Settings.food.size();i++) {
                                        //UUID p = Player_Settings.food.get(i-1);
                                List<UUID> myObject = Player_Settings.food;
                                
                                   for(UUID p : myObject)
                                    {
                                     Player b = Bukkit.getPlayer(p);
                                     if(b.hasPotionEffect(PotionEffectType.HUNGER) == false)
                                     {
                                     b.setFoodLevel(b.getFoodLevel() + 1);
                                     b.getPlayer().sendMessage("Gave Hunger");
                                     }
                                        }
                               
                                   for(int b=1;b <= Player_Settings.food.size();b++) {
                                        Player p = Bukkit.getPlayer(Player_Settings.food.get(b-1));
                                        if(p.getFoodLevel() >= 20)
                                             Bukkit.broadcastMessage("Who is getting removed:" + Player_Settings.food.get(b-1).toString());
                                            Player_Settings.food.remove(b-1);
                                   }
                            
                                  
                               
                                    if(Player_Settings.food.isEmpty() == true)
                                     {
                                        myObject.clear();
                                         Bukkit.broadcastMessage("Size of Array Before Clear:" + String.valueOf(Player_Settings.food.size()));
                                        Bukkit.getScheduler().cancelTask(i);
                                         return;
                                     }
                             
                             
                             }
                         
                             }, 5*20, 5 * 20);
                         
                        //Food.runTaskTimer(plugin, 0, 5*20);
                
                
            
                }
    Solve Edit: I forgot to put brackets around the if statement, so it just kept removing the player without checking the condition, which led to this only running once. Thank you timtower and OfficerDeveloper for guiding me in the right direction.
     
    Last edited: Nov 26, 2017
  2. Offline

    timtower Administrator Administrator Moderator

    @awesomebutter234 Use a BukkitRunnable instead.
    And maybe just 1 that handles all players.
    And no sleeps.
     
  3. ^^ Use a BukkitRunnable and use a SyncRepeatingTask to call it for what looks like you want every 5 seconds which would be 100 ticks. Also, your while loop doesn't ever break out so it is continuously running for every player that loses hunger.

    You also don't check to see if the entity is a player so just assuming it is and casting it to a player is going to cause problems.
     
  4. Offline

    CraftCreeper6

    @OfficerDeveloper
    Can you not pass BukkitRunnable a value of how many times to run?
     
  5. @CraftCreeper6

    I'm unsure if there is a repeating method inside of if you do BukkitRunnable.runRepeatingTaskTimer(), but you can schedule a repeating task.

    EDIT: Looked at the wiki and refreshed myself, there is and inside the class just use cancel(); to end the task.
     
  6. Okay, ran into a problem. When I'm using the CodeV1, I can't remove and iterate at the same time, but when I'm using CodeV2, if the hunger drops too fast it causes an IllegalStateException. Also I'm unsure if I'm supposed to even create an object for TestBukkitRunnable.

    This is what I have now for the actual code

    Code:
    public class Player_Settings implements Listener {
    Main plugin;
    TestBukkitRunnable Food = new TestBukkitRunnable();
    public static ArrayList<UUID> food = new ArrayList<UUID>();
    
        public Player_Settings(Main plugin)
        {
            this.plugin = plugin;
         
        }
    //Some other unrelated code inbetween
    
    @EventHandler
        public void Hunger(FoodLevelChangeEvent e)
        {
     
         
            //KitPvp
            if(e.getEntity().getWorld() == Bukkit.getWorld("KitPvp"))
            {
                //Send stuff to let me know if somethign is wrong
                if(e.getFoodLevel() == 20)
                 {
                     Player_Settings.food.remove(e.getEntity().getUniqueId());
                 }
             
             
             
                if(e.getFoodLevel() < 20 && !(food.contains(e.getEntity().getUniqueId())))
                {
                    food.add(e.getEntity().getUniqueId());
                    for(UUID c : Player_Settings.food)
                    {
                        Bukkit.broadcastMessage(Bukkit.getPlayer(c).getName());
                    }
                    Food.runTaskTimer(plugin, 0, 5*20);
                 
                 
             
                }
                 
                    //Thread t = new Thread(new Test(e));
                    //t.start();
                     
                }
                 
                         
                 
                }
    CodeV1
    Code:
    public class TestBukkitRunnable extends BukkitRunnable {
    
        @Override
        public void run() {
    //I know the problem is here, I can't iterate and remove at the same time, but I don't know how to fix this.
                for(UUID p : Player_Settings.food)
                {
                 Player b = Bukkit.getPlayer(p);
                 b.setFoodLevel(b.getFoodLevel() + 1);
                 b.getPlayer().sendMessage("Gave Hunger");
                 if(b.getFoodLevel() == 20)
                 {
                     Player_Settings.food.remove(p);
                 }
              
                 if(Player_Settings.food.isEmpty() == true)
                 {
                     this.cancel();
                 }
                 
                 
                }
            }
         
        }
    CodeV1 Exception
    Code:
    [19:41:19 WARN]: [ServerStuff] Task #15 for ServerStuff v0 generated an exceptio
    n
    java.util.ConcurrentModificationException: null
            at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.
    8.0_151]
            at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_151]
            at com.ServerFeatures.potato.TestBukkitRunnable.run(TestBukkitRunnable.j
    ava:13) ~[?:?]
            at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.jav
    a:53) ~[craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHe
    artbeat(CraftScheduler.java:352) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:
    690) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:
    371) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:
    651) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.jav
    a:555) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]
    CodeV2
    Code:
    @Override
        public void run() {
          
          Bukkit.broadcastMessage("Size of Array Before:" + String.valueOf(Player_Settings.food.size()));
                for(int i=1;i <= Player_Settings.food.size();i++) {
                    UUID p = Player_Settings.food.get(i-1);
              
              
            //    for(UUID p : Player_Settings.food)
            //        {
                 Player b = Bukkit.getPlayer(p);
                 b.setFoodLevel(b.getFoodLevel() + 1);
                 b.getPlayer().sendMessage("Gave Hunger");
                 if(b.getFoodLevel() == 20)
                         {
                     Bukkit.broadcastMessage("Removing:" + b.getPlayer().getUniqueId().toString());
                     Player_Settings.food.remove(b.getPlayer().getUniqueId());
                     Bukkit.broadcastMessage("Size of Array After:" + String.valueOf(Player_Settings.food.size()));
                         }
                    }
              
                if(Player_Settings.food.isEmpty() == true)
                 {
                     this.cancel();
                 }
    
            }
          
        }
    CodeV2 exeption
    Code:
    [22:28:22 INFO]: awesomebutter234 issued server command: /effect @s minecraft:hu
    nger 10 255
    [22:28:22 INFO]: c455d413-c871-4196-bdd1-45ab4c97232d
    [22:28:22 ERROR]: Could not pass event FoodLevelChangeEvent to ServerStuff v0
    org.bukkit.event.EventException: null
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:298) ~[craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:62) ~[craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
    ava:498) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:483) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callFoodLevel
    ChangeEvent(CraftEventFactory.java:668) [craftbukkit-1.12.2.jar:git-Bukkit-53fcc
    df]
            at net.minecraft.server.v1_12_R1.FoodMetaData.a(FoodMetaData.java:50) [c
    raftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.EntityHuman.B_(EntityHuman.java:157) [c
    raftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.EntityPlayer.playerTick(EntityPlayer.ja
    va:304) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.PlayerConnection.e(PlayerConnection.jav
    a:138) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:22
    4) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.ServerConnection.c(SourceFile:187) [cra
    ftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:
    768) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:
    371) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:
    651) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.jav
    a:555) [craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at java.lang.Thread.run(Unknown Source) [?:1.8.0_151]
    Caused by: java.lang.IllegalStateException: Already scheduled as 11
            at org.bukkit.scheduler.BukkitRunnable.checkNotYetScheduled(BukkitRunnab
    le.java:155) ~[craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at org.bukkit.scheduler.BukkitRunnable.runTaskTimer(BukkitRunnable.java:
    110) ~[craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            at com.ServerFeatures.potato.Player_Settings.Hunger(Player_Settings.java
    :79) ~[?:?]
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0
    _151]
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0
    _151]
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1
    .8.0_151]
            at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_151]
            at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
    va:296) ~[craftbukkit-1.12.2.jar:git-Bukkit-53fccdf]
            ... 15 more
     
  7. Offline

    Unknown123

  8. I corrected myself after that post :)
     
  9. Offline

    Unknown123

    @OfficerDeveloper oops. Just that there is runTaskTimer instead of runRepeatingTaskTimer
     
  10. Yeah, that's true. I'm unfamiliar with the methods that a BukkitRunnable uses since I don't use them all that often :p
     
Thread Status:
Not open for further replies.

Share This Page