// Path: api/src/main/java/net/techcable/npclib/utils/NPCLog.java
// @NoArgsConstructor(access = AccessLevel.PRIVATE)
// public class NPCLog {
// 
//     public static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("npclib.debug", "false"));
// 
//     public static final String PREFIX = "NPCLib";
// 
//     public static void info(String msg) {
//         log(Level.INFO, msg);
//     }
// 
//     public static void info(String msg, Object... args) {
//         log(Level.INFO, msg, args);
//     }
// 
//     public static void warn(String msg) {
//         log(Level.WARNING, msg);
//     }
// 
//     public static void warn(String msg, Object... args) {
//         log(Level.WARNING, msg, args);
//     }
// 
//     public static void warn(String msg, Throwable t) {
//         log(Level.WARNING, msg, t);
//     }
// 
//     public static void severe(String msg, Throwable t) {
//         log(Level.SEVERE, msg, t);
//     }
// 
//     public static void debug(String msg) {
//         if (DEBUG) {
//             log(Level.INFO, msg);
//         }
//     }
// 
//     public static void debug(String msg, Throwable t) {
//         if (DEBUG) {
//             log(Level.INFO, msg, t);
//         }
//     }
// 
//     private static void log(Level level, String msg, Throwable t) {
//         Bukkit.getLogger().log(level, PREFIX + " " + msg, t);
//     }
// 
//     private static void log(Level level, String msg, Object... args) {
//         Bukkit.getLogger().log(level, String.format(msg, args));
//     }
// 
//     private static void log(Level level, String msg) {
//         Bukkit.getLogger().log(level, msg);
//     }
// }


import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import net.techcable.npclib.utils.NPCLog;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
package net.techcable.npclib.ai;



@RequiredArgsConstructor
public class AIEnvironment {
    private final Set<AITask> tasks = new HashSet<>();
    private final List<Runnable> callbacks = new ArrayList<>();

    protected void tick() {
        for (final AITask task : tasks) {
            try {
                task.tick(this);
            } catch (Throwable t) {
// Path: api/src/main/java/net/techcable/npclib/utils/NPCLog.java
// @NoArgsConstructor(access = AccessLevel.PRIVATE)
// public class NPCLog {
// 
//     public static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("npclib.debug", "false"));
// 
//     public static final String PREFIX = "NPCLib";
// 
//     public static void info(String msg) {
//         log(Level.INFO, msg);
//     }
// 
//     public static void info(String msg, Object... args) {
//         log(Level.INFO, msg, args);
//     }
// 
//     public static void warn(String msg) {
//         log(Level.WARNING, msg);
//     }
// 
//     public static void warn(String msg, Object... args) {
//         log(Level.WARNING, msg, args);
//     }
// 
//     public static void warn(String msg, Throwable t) {
//         log(Level.WARNING, msg, t);
//     }
// 
//     public static void severe(String msg, Throwable t) {
//         log(Level.SEVERE, msg, t);
//     }
// 
//     public static void debug(String msg) {
//         if (DEBUG) {
//             log(Level.INFO, msg);
//         }
//     }
// 
//     public static void debug(String msg, Throwable t) {
//         if (DEBUG) {
//             log(Level.INFO, msg, t);
//         }
//     }
// 
//     private static void log(Level level, String msg, Throwable t) {
//         Bukkit.getLogger().log(level, PREFIX + " " + msg, t);
//     }
// 
//     private static void log(Level level, String msg, Object... args) {
//         Bukkit.getLogger().log(level, String.format(msg, args));
//     }
// 
//     private static void log(Level level, String msg) {
//         Bukkit.getLogger().log(level, msg);
//     }
// }


// Path: api/src/main/java/net/techcable/npclib/ai/AIEnvironment.java
import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import net.techcable.npclib.utils.NPCLog;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

package net.techcable.npclib.ai;



@RequiredArgsConstructor
public class AIEnvironment {
    private final Set<AITask> tasks = new HashSet<>();
    private final List<Runnable> callbacks = new ArrayList<>();

    protected void tick() {
        for (final AITask task : tasks) {
            try {
                task.tick(this);
            } catch (Throwable t) {
                NPCLog.warn("AI task " + task.getClass().getSimpleName() + " threw an exception", t);