package net.theprogrammersworld.herobrine; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.WorldCreator; import org.bukkit.command.CommandExecutor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.ServerLoadEvent; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; import net.minecraft.server.v1_15_R1.Entity; import net.minecraft.server.v1_15_R1.EntityTypes; import net.minecraft.server.v1_15_R1.EnumCreatureType; import net.minecraft.server.v1_15_R1.IRegistry; import net.theprogrammersworld.herobrine.AI.AICore; import net.theprogrammersworld.herobrine.AI.Core.CoreType; import net.theprogrammersworld.herobrine.AI.extensions.GraveyardWorld; import net.theprogrammersworld.herobrine.NPC.NPCCore; import net.theprogrammersworld.herobrine.NPC.AI.Path; import net.theprogrammersworld.herobrine.NPC.AI.PathManager; import net.theprogrammersworld.herobrine.NPC.Entity.HumanNPC; import net.theprogrammersworld.herobrine.commands.CmdExecutor; import net.theprogrammersworld.herobrine.entity.CustomSkeleton; import net.theprogrammersworld.herobrine.entity.CustomZombie; import net.theprogrammersworld.herobrine.entity.EntityManager; import net.theprogrammersworld.herobrine.listeners.BlockListener; import net.theprogrammersworld.herobrine.listeners.EntityListener; import net.theprogrammersworld.herobrine.listeners.InventoryListener; import net.theprogrammersworld.herobrine.listeners.PlayerListener; import net.theprogrammersworld.herobrine.listeners.WorldListener; import net.theprogrammersworld.herobrine.misc.UpdateScanner; public class Herobrine extends JavaPlugin implements Listener { private static Herobrine pluginCore; private AICore aicore; private ConfigDB configdb; private Support support; private EntityManager entMng; private PathManager pathMng; private NPCCore NPCman; public HumanNPC HerobrineNPC; public long HerobrineEntityID; public boolean isInitDone = false; private int pathUpdateINT = 0; public static String versionStr = "UNDEFINED"; public static boolean isNPCDisabled = false; public static int HerobrineHP = 200; public static int HerobrineMaxHP = 200; public static final boolean isDebugging = false; public static boolean AvailableWorld = false; public static List AllowedBlocks = new ArrayList(); public Map PlayerApple = new HashMap(); public static Logger log = Logger.getLogger("Minecraft"); @Override public void onEnable() { // Custom Entity Injection if (!isNPCDisabled) { try { addCustomEntity("mzombie", CustomZombie::new, EnumCreatureType.MONSTER); addCustomEntity("mskeleton", CustomSkeleton::new, EnumCreatureType.MONSTER); } catch (Exception e) { e.printStackTrace(); this.setEnabled(false); } } else { log.warning("[Herobrine] Custom NPCs have been disabled due to an incompatibility error."); } getServer().getPluginManager().registerEvents(this, this); } @EventHandler public void onServerLoad(ServerLoadEvent event) { PluginDescriptionFile pdf = this.getDescription(); versionStr = pdf.getVersion(); isInitDone = true; Herobrine.pluginCore = this; this.configdb = new ConfigDB(log); this.NPCman = new NPCCore(this); // Initialize PathManager this.pathMng = new PathManager(); // Initialize AICore this.aicore = new AICore(); // Initialize EntityManager this.entMng = new EntityManager(); // Config loading configdb.Startup(); configdb.Reload(); // Spawn Herobrine Location nowloc = new Location((World) Bukkit.getServer().getWorlds().get(0), (float) 0, (float) -20, (float) 0); nowloc.setYaw((float) 1); nowloc.setPitch((float) 1); HerobrineSpawn(nowloc); HerobrineNPC.setItemInHand(configdb.ItemInHand.getItemStack()); // Graveyard World if (this.configdb.UseGraveyardWorld == true && Bukkit.getServer().getWorld(configdb.HerobrineWorldName) == null) { WorldCreator wc = new WorldCreator(configdb.HerobrineWorldName); wc.generateStructures(false); org.bukkit.WorldType type = org.bukkit.WorldType.FLAT; wc.type(type); wc.createWorld(); GraveyardWorld.Create(); } getServer().getPluginManager().registerEvents(new EntityListener(this), this); getServer().getPluginManager().registerEvents(new BlockListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); getServer().getPluginManager().registerEvents(new PlayerListener(this), this); getServer().getPluginManager().registerEvents(new WorldListener(), this); // Init Block Types AllowedBlocks.add(Material.AIR); AllowedBlocks.add(Material.SNOW); AllowedBlocks.add(Material.RAIL); AllowedBlocks.add(Material.ACTIVATOR_RAIL); AllowedBlocks.add(Material.DETECTOR_RAIL); AllowedBlocks.add(Material.POWERED_RAIL); AllowedBlocks.add(Material.DEAD_BUSH); AllowedBlocks.add(Material.DANDELION); AllowedBlocks.add(Material.POPPY); AllowedBlocks.add(Material.ACACIA_PRESSURE_PLATE); AllowedBlocks.add(Material.BIRCH_PRESSURE_PLATE); AllowedBlocks.add(Material.DARK_OAK_PRESSURE_PLATE); AllowedBlocks.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE); AllowedBlocks.add(Material.JUNGLE_PRESSURE_PLATE); AllowedBlocks.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE); AllowedBlocks.add(Material.OAK_PRESSURE_PLATE); AllowedBlocks.add(Material.SPRUCE_PRESSURE_PLATE); AllowedBlocks.add(Material.STONE_PRESSURE_PLATE); AllowedBlocks.add(Material.VINE); AllowedBlocks.add(Material.TORCH); AllowedBlocks.add(Material.REDSTONE); AllowedBlocks.add(Material.REDSTONE_TORCH); AllowedBlocks.add(Material.LEVER); AllowedBlocks.add(Material.STONE_BUTTON); AllowedBlocks.add(Material.LADDER); pathUpdateINT = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { public void run() { if (Utils.getRandomGen().nextInt(4) == 2 && Herobrine.getPluginCore().getAICore().getCoreTypeNow() .equals(CoreType.RANDOM_POSITION)) { pathMng.setPath(new Path(Utils.getRandomGen().nextInt(15) - 7f, Utils.getRandomGen().nextInt(15) - 7f, Herobrine.getPluginCore())); } } }, 1 * 200L, 1 * 200L); Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { public void run() { pathMng.update(); } }, 1 * 5L, 1 * 5L); // Command Executors this.getCommand("hb").setExecutor((CommandExecutor) new CmdExecutor(this)); this.getCommand("hero").setExecutor((CommandExecutor) new CmdExecutor(this)); // Support initialize this.support = new Support(); // If the plugin configuration has updated checking turned on, start the thread responsible for performing the check. if(configdb.CheckForUpdates) new Thread(new UpdateScanner()).start(); } @Override public void onDisable() { if (isInitDone) { this.entMng.killAllMobs(); Bukkit.getServer().getScheduler().cancelTask(pathUpdateINT); NPCman.DisableTask(); aicore.Stop_BD(); aicore.Stop_CG(); aicore.Stop_MAIN(); aicore.Stop_RC(); aicore.Stop_RM(); aicore.Stop_RP(); aicore.Stop_RS(); aicore.disableAll(); } } public java.io.InputStream getInputStreamData(String src) { return Herobrine.class.getResourceAsStream(src); } public AICore getAICore() { return this.aicore; } public EntityManager getEntityManager() { return this.entMng; } public static Herobrine getPluginCore() { return Herobrine.pluginCore; } public void HerobrineSpawn(Location loc) { HerobrineNPC = (HumanNPC) NPCman.spawnHumanNPC(ChatColor.WHITE + "Herobrine", loc); HerobrineNPC.getBukkitEntity().setMetadata("NPC", new FixedMetadataValue(this, true)); HerobrineEntityID = HerobrineNPC.getBukkitEntity().getEntityId(); } public void HerobrineRemove() { HerobrineEntityID = 0; HerobrineNPC = null; NPCman.removeAll(); } public ConfigDB getConfigDB() { return this.configdb; } public String getVersionStr() { return versionStr; } public Support getSupport() { return this.support; } public PathManager getPathManager() { return this.pathMng; } public boolean canAttackPlayer(Player player, Player sender) { boolean opCheck = true; boolean creativeCheck = true; boolean ignoreCheck = true; if (!configdb.AttackOP && player.isOp()) { opCheck = false; } if (!configdb.AttackCreative && player.getGameMode() == GameMode.CREATIVE) { creativeCheck = false; } if (configdb.UseIgnorePermission && player.hasPermission("herobrine.ignore")) { ignoreCheck = false; } if (opCheck && creativeCheck && ignoreCheck) { return true; } else { if(sender == null){ if (!opCheck) log.info("[Herobrine] " + player.getDisplayName() + " is an OP."); else if (!creativeCheck) log.info("[Herobrine] " + player.getDisplayName() + " is in creative mode."); else if (!ignoreCheck) log.info("[Herobrine] " + player.getDisplayName() + " has ignore permission."); }else{ if (!opCheck) sender.sendMessage(ChatColor.RED + "[Herobrine] " + player.getDisplayName() + " is an OP."); else if (!creativeCheck) sender.sendMessage(ChatColor.RED + "[Herobrine] " + player.getDisplayName() + " is in creative mode."); else if (!ignoreCheck) sender.sendMessage(ChatColor.RED + "[Herobrine] " + player.getDisplayName() + " has ignore permission."); } return false; } } public boolean canAttackPlayerNoMSG(Player player) { boolean opCheck = true; boolean creativeCheck = true; boolean ignoreCheck = true; if (!configdb.AttackOP && player.isOp()) { opCheck = false; } if (!configdb.AttackCreative && player.getGameMode() == GameMode.CREATIVE) { creativeCheck = false; } if (configdb.UseIgnorePermission && player.hasPermission("herobrine.ignore")) { ignoreCheck = false; } if (opCheck && creativeCheck && ignoreCheck) { return true; } else { return false; } } public String getAvailableWorldString() { if (AvailableWorld) { return "Yes"; } else { return "No"; } } private static void addCustomEntity(String customName, EntityTypes.b _func, EnumCreatureType enumCreatureType) { // Registers a custom entity. Adapted from https://www.spigotmc.org/threads/handling-custom-entity-registry-on-spigot-1-13.353426/#post-3447111 EntityTypes.a entity = EntityTypes.a.a(_func, enumCreatureType); entity.b(); IRegistry.a(IRegistry.ENTITY_TYPE, customName, entity.a(customName)); } }