diff --git a/build.gradle.kts b/build.gradle.kts index 2af65ad88..c69ffba5e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,37 +6,38 @@ plugins { } group = "com.iridium" -version = "4.1.3-b1" +version = "4.1.3-b1_KEPLAR" description = "Skyblock Redefined" repositories { mavenCentral() mavenLocal() - maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") - maven("https://ci.ender.zone/plugin/repository/everything/") - maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/") - maven("https://papermc.io/repo/repository/maven-public/") - maven("https://jitpack.io") - maven("https://maven.enginehub.org/repo/") + maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // spigotmc + maven("https://ci.ender.zone/plugin/repository/everything/") // enderzone + maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/") // our super cool repo + maven("https://papermc.io/repo/repository/maven-public/") // papermc + maven("https://jitpack.io") // jitpack + maven("https://maven.enginehub.org/repo/") // maven } dependencies { // Dependencies that we want to shade in - implementation("org.jetbrains:annotations:26.0.2-1") - implementation("com.j256.ormlite:ormlite-core:6.1") - implementation("com.j256.ormlite:ormlite-jdbc:6.1") - implementation("com.iridium:IridiumTeams:2.6.10") - implementation("commons-lang:commons-lang:2.6") + implementation("org.jetbrains:annotations:26.0.2-1") // annotations + implementation("com.j256.ormlite:ormlite-core:6.1") // SQL OrmLite + implementation("com.j256.ormlite:ormlite-jdbc:6.1") // SQL OrmLite java bridge + implementation("com.iridium:IridiumTeams:2.6.10") // teams + // implementation("commons-lang:commons-lang:2.6") // lang (needed for generator config) // Other dependencies that are not required or already available at runtime - compileOnly("org.projectlombok:lombok:1.18.42") - compileOnly("org.spigotmc:spigot-api:1.21.4-R0.1-SNAPSHOT") - compileOnly("com.github.MilkBowl:VaultAPI:1.7.1") - compileOnly("net.ess3:EssentialsXSpawn:2.16.1") - compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.13-SNAPSHOT") + compileOnly("org.projectlombok:lombok:1.18.42") // annotations + compileOnly("org.spigotmc:spigot-api:1.21.4-R0.1-SNAPSHOT") // spigot + compileOnly("com.github.MilkBowl:VaultAPI:1.7.1") // vault + compileOnly("net.ess3:EssentialsXSpawn:2.16.1") // essentialsx spawn + compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.13-SNAPSHOT") // WE, AWE, & FAWE + compileOnly("net.dmulloy2:ProtocolLib:5.3.0") // protocol lib (5.4.0+ is java 17+) // Enable lombok annotation processing - annotationProcessor("org.projectlombok:lombok:1.18.42") + annotationProcessor("org.projectlombok:lombok:1.18.42") // annotations } bukkit { @@ -55,7 +56,8 @@ bukkit { "EssentialsSpawn", "RoseStacker", "WorldEdit", - "ObsidianStacker" + "ObsidianStacker", + "ProtocolLib" ) commands { diff --git a/src/main/java/com/iridium/iridiumskyblock/IridiumSkyblock.java b/src/main/java/com/iridium/iridiumskyblock/IridiumSkyblock.java index 1ce4abded..1da5a67e5 100644 --- a/src/main/java/com/iridium/iridiumskyblock/IridiumSkyblock.java +++ b/src/main/java/com/iridium/iridiumskyblock/IridiumSkyblock.java @@ -1,422 +1,472 @@ -package com.iridium.iridiumskyblock; - -import com.cryptomorin.xseries.reflection.XReflection; -import com.iridium.iridiumcore.Item; -import com.iridium.iridiumskyblock.configs.*; -import com.iridium.iridiumskyblock.database.Island; -import com.iridium.iridiumskyblock.database.User; -import com.iridium.iridiumskyblock.generators.FlatGenerator; -import com.iridium.iridiumskyblock.generators.OceanGenerator; -import com.iridium.iridiumskyblock.generators.VoidGenerator; -import com.iridium.iridiumskyblock.listeners.*; -import com.iridium.iridiumskyblock.managers.*; -import com.iridium.iridiumskyblock.placeholders.IslandPlaceholderBuilder; -import com.iridium.iridiumskyblock.placeholders.TeamChatPlaceholderBuilder; -import com.iridium.iridiumskyblock.placeholders.UserPlaceholderBuilder; -import com.iridium.iridiumteams.IridiumTeams; -import com.iridium.iridiumteams.managers.MissionManager; -import com.iridium.iridiumteams.managers.ShopManager; -import com.iridium.iridiumteams.managers.SupportManager; -import com.iridium.iridiumteams.teleport.TeleportManager; -import lombok.Getter; -import net.milkbowl.vault.economy.Economy; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.plugin.PluginDescriptionFile; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.java.JavaPluginLoader; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Objects; - -@Getter -public class IridiumSkyblock extends IridiumTeams { - private static IridiumSkyblock instance; - - private Configuration configuration; - private Messages messages; - private Permissions permissions; - private Inventories inventories; - private Commands commands; - private BankItems bankItems; - private Enhancements enhancements; - private BlockValues blockValues; - private Top top; - private SQL sql; - private Missions missions; - private Schematics schematics; - private Shop shop; - private Biomes biomes; - private Settings settings; - private Generators generators; - private TeamLogs teamLogs; - - private IslandPlaceholderBuilder teamsPlaceholderBuilder; - private UserPlaceholderBuilder userPlaceholderBuilder; - private TeamChatPlaceholderBuilder teamChatPlaceholderBuilder; - - private IslandManager teamManager; - private UserManager userManager; - private CommandManager commandManager; - private DatabaseManager databaseManager; - private MissionManager missionManager; - private SchematicManager schematicManager; - private ShopManager shopManager; - private BiomeManager biomeManager; - private SupportManager supportManager; - private TeleportManager teleportManager; - - private Economy economy; - - private ChunkGenerator chunkGenerator; - - public IridiumSkyblock(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { - super(loader, description, dataFolder, file); - instance = this; - } - - public IridiumSkyblock() { - instance = this; - } - - @Override - public void onLoad() { - super.onLoad(); - - getLogger().info("Loading world generator..."); - getLogger().info("Generator Type = " + IridiumSkyblock.getInstance().getConfiguration().generatorType); - - // This switch statement is here so that if we end up adding another generator type, we can throw it in this. - switch (IridiumSkyblock.getInstance().getConfiguration().generatorType) { - case OCEAN: { - this.chunkGenerator = new OceanGenerator(); - break; - } - case FLAT: { - this.chunkGenerator = new FlatGenerator(); - break; - } - case VANILLA: { - this.chunkGenerator = null; - break; - } - case VOID: { - this.chunkGenerator = new VoidGenerator(); - break; - } - default: { - getLogger().warning("Invalid generator type [" + IridiumSkyblock.getInstance().getConfiguration().generatorType + "], valid types are " + Arrays.toString(GeneratorType.values())); - getLogger().info("Generator Type = " + GeneratorType.VOID); - this.chunkGenerator = new VoidGenerator(); - break; - } - } - } - - @Override - public void onEnable() { - instance = this; - - this.teamManager = new IslandManager(); - - this.teamManager.createWorld(World.Environment.NORMAL, configuration.worldName); - this.teamManager.createWorld(World.Environment.NETHER, configuration.worldName + "_nether"); - this.teamManager.createWorld(World.Environment.THE_END, configuration.worldName + "_the_end"); - - this.schematicManager = new SchematicManager(); - this.userManager = new UserManager(); - this.commandManager = new CommandManager("iridiumskyblock"); - this.databaseManager = new DatabaseManager(); - this.missionManager = new MissionManager<>(this); - this.shopManager = new ShopManager<>(this); - this.biomeManager = new BiomeManager(); - this.supportManager = new SupportManager<>(this); - this.teleportManager = new TeleportManager<>(this); - - supportManager.registerDefaults(); - - try { - databaseManager.init(); - } catch (SQLException exception) { - // We don't want the plugin to start if the connection fails - exception.printStackTrace(); - Bukkit.getPluginManager().disablePlugin(this); - return; - } - - Bukkit.getScheduler().runTask(this, () -> this.economy = setupEconomy()); - - Bukkit.getServer().getOnlinePlayers().forEach(player -> getIslandManager().sendIslandBorder(player)); - - addBstats(5825); - startUpdateChecker(62480); - super.onEnable(); - this.teamsPlaceholderBuilder = new IslandPlaceholderBuilder(); - this.userPlaceholderBuilder = new UserPlaceholderBuilder(); - this.teamChatPlaceholderBuilder = new TeamChatPlaceholderBuilder(); - } - - private Economy setupEconomy() { - RegisteredServiceProvider economyProvider = getServer().getServicesManager().getRegistration(Economy.class); - if (economyProvider == null) { - getLogger().warning("You do not have an economy plugin installed (like Essentials)"); - return null; - } - return economyProvider.getProvider(); - } - - @Override - public void registerListeners() { - super.registerListeners(); - Bukkit.getPluginManager().registerEvents(new PlayerMoveListener(), this); - Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), this); - Bukkit.getPluginManager().registerEvents(new BlockFormListener(), this); - Bukkit.getPluginManager().registerEvents(new EnhancementUpdateListener(), this); - Bukkit.getPluginManager().registerEvents(new PlayerTeleportListener(), this); - Bukkit.getPluginManager().registerEvents(new PlayerPortalListener(), this); - Bukkit.getPluginManager().registerEvents(new PlayerInteractListener(), this); - Bukkit.getPluginManager().registerEvents(new PlayerRespawnEventListener(), this); - Bukkit.getPluginManager().registerEvents(new EntityDamageListener(), this); - if(!XReflection.supports(15)) Bukkit.getPluginManager().registerEvents(new PortalCreateListener(), this); - } - - @Override - public void loadConfigs() { - this.configuration = getPersist().load(Configuration.class); - this.messages = getPersist().load(Messages.class); - this.commands = getPersist().load(Commands.class); - this.sql = getPersist().load(SQL.class); - this.inventories = getPersist().load(Inventories.class); - this.permissions = getPersist().load(Permissions.class); - this.bankItems = getPersist().load(BankItems.class); - this.enhancements = getPersist().load(Enhancements.class); - this.blockValues = getPersist().load(BlockValues.class); - this.top = getPersist().load(Top.class); - this.missions = getPersist().load(Missions.class); - this.schematics = getPersist().load(Schematics.class); - this.shop = getPersist().load(Shop.class); - this.biomes = getPersist().load(Biomes.class); - this.settings = getPersist().load(Settings.class); - this.generators = getPersist().load(Generators.class); - this.teamLogs = getPersist().load(TeamLogs.class); - getLogger().info("GENERATOR TYPE: " + IridiumSkyblock.getInstance().getConfiguration().generatorType); - super.loadConfigs(); - - int maxSize = enhancements.sizeEnhancement.levels.values().stream() - .max(Comparator.comparing(sizeUpgrade -> sizeUpgrade.size)) - .map(sizeEnhancementData -> sizeEnhancementData.size) - .orElse(150); - if (configuration.distance <= maxSize) { - getLogger().warning("Distance: " + configuration.distance + " Is too low, must be higher than the maximum island size " + maxSize); - configuration.distance = maxSize + 1; - getLogger().warning("New Distance set to: " + configuration.distance); - } - - if (schematicManager != null) { - schematicManager.reload(); - } - - migrateData(); - } - - @Override - public void saveConfigs() { - super.saveConfigs(); - getPersist().save(configuration); - getPersist().save(messages); - getPersist().save(commands); - getPersist().save(sql); - getPersist().save(inventories); - getPersist().save(permissions); - getPersist().save(bankItems); - getPersist().save(enhancements); - getPersist().save(blockValues); - getPersist().save(top); - getPersist().save(missions); - getPersist().save(schematics); - getPersist().save(shop); - getPersist().save(biomes); - getPersist().save(settings); - getPersist().save(generators); - getPersist().save(teamLogs); - saveSchematics(); - } - - @Override - public void saveData() { - getDatabaseManager().getUserTableManager().save(); - getDatabaseManager().getIslandTableManager().save(); - getDatabaseManager().getInvitesTableManager().save(); - getDatabaseManager().getTrustTableManager().save(); - getDatabaseManager().getPermissionsTableManager().save(); - getDatabaseManager().getBankTableManager().save(); - getDatabaseManager().getEnhancementTableManager().save(); - getDatabaseManager().getTeamBlockTableManager().save(); - getDatabaseManager().getTeamSpawnerTableManager().save(); - getDatabaseManager().getTeamWarpTableManager().save(); - getDatabaseManager().getTeamMissionTableManager().save(); - getDatabaseManager().getTeamMissionDataTableManager().save(); - getDatabaseManager().getTeamRewardsTableManager().save(); - getDatabaseManager().getTeamSettingsTableManager().save(); - getDatabaseManager().getLostItemsTableManager().save(); - } - - @Override - public void initializeBankItem() { - super.initializeBankItem(); - addBankItem(getBankItems().crystalsBankItem); - } - - @Override - public void initializeEnhancements() { - super.initializeEnhancements(); - addEnhancement("size", getEnhancements().sizeEnhancement); - addEnhancement("void", getEnhancements().voidEnhancement); - addEnhancement("generator", getEnhancements().generatorEnhancement); - } - - @Override - public void initializePermissions() { - super.initializePermissions(); - addPermission("border", getPermissions().border); - addPermission("regen", getPermissions().regen); - } - - private void saveSchematics() { - File schematicFolder = new File(getDataFolder(), "schematics"); - if (!schematicFolder.exists()) { - schematicFolder.mkdir(); - } - - // Return if there are already schematics in the schematics folder - if (Objects.requireNonNull(schematicFolder.list()).length != 0) { - return; - } - - saveFile(schematicFolder, "desert.schem"); - saveFile(schematicFolder, "mushroom.schem"); - saveFile(schematicFolder, "jungle.schem"); - saveFile(schematicFolder, "desert_nether.schem"); - saveFile(schematicFolder, "mushroom_nether.schem"); - saveFile(schematicFolder, "jungle_nether.schem"); - saveFile(schematicFolder, "desert_end.schem"); - saveFile(schematicFolder, "mushroom_end.schem"); - saveFile(schematicFolder, "jungle_end.schem"); - } - - private void saveFile(File parent, String name) { - File file = new File(parent, name); - if (!file.exists()) { - try { - InputStream source = getResource(name); - Path target = file.toPath(); - - if (source == null) - return; - Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); - } catch (IOException exception) { - getLogger().warning("Could not copy " + name + " to " + file.getAbsolutePath()); - } - } - } - - public void migrateData(){ - processFields(BankItems.class, getBankItems(), 0); - processFields(BlockValues.class, getBlockValues(), 0); - processFields(Commands.class, getCommands(), 0); - processFields(Configuration.class, getConfiguration(), 0); - processFields(Enhancements.class, getEnhancements(), 0); - processFields(Inventories.class, getInventories(), 0); - processFields(Messages.class, getMessages(), 0); - processFields(Missions.class, getMissions(), 0); - processFields(Permissions.class, getPermissions(), 0); - processFields(Settings.class, getSettings(), 0); - processFields(Shop.class, getShop(), 0); - processFields(Top.class, getTop(), 0); - - getInventories().islandMenu.items.values().forEach(Item::migrateData); - getSchematics().schematics.values().forEach(schematicConfig -> schematicConfig.item.migrateData()); - } - - private void processFields(Class clazz, Object instance, int depth) { - if(depth > 3){ - return; - } - // Get all declared fields (including private fields) - Field[] fields = clazz.getDeclaredFields(); - - for (Field field : fields) { - if (!field.getType().getName().startsWith("com.iridium")) { - continue; - } - - field.setAccessible(true); // Allow access to private fields - - try { - Object fieldValue = field.get(instance); - - if (fieldValue != null) { - Class fieldType = fieldValue.getClass(); - - // Check if the field is an instance of Item - if (isItemClass(fieldType)) { - // Call the migrate method - invokeMigrateMethod(fieldValue); - } else { - // If the field is not an Item, process its fields recursively - processFields(fieldType, fieldValue, depth + 1); - } - } - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - - private boolean isItemClass(Class clazz) { - // Check if the class or any of its enclosing classes is Item - if (clazz.getName().equals("com.iridium.iridiumcore.Item")) { - return true; - } - - Class enclosingClass = clazz.getEnclosingClass(); - return enclosingClass != null && isItemClass(enclosingClass); - } - - private void invokeMigrateMethod(Object itemInstance) { - try { - // Get the migrate method from the Item class - Method migrateMethod = itemInstance.getClass().getMethod("migrateData"); - - // Invoke the migrate method on the instance - migrateMethod.invoke(itemInstance); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - } - } - - @Override - public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { - return this.chunkGenerator; - } - - public IslandManager getIslandManager() { - return teamManager; - } - - public static IridiumSkyblock getInstance() { - return instance; - } -} +package com.iridium.iridiumskyblock; + +import com.cryptomorin.xseries.reflection.XReflection; +import com.iridium.iridiumcore.Item; +import com.iridium.iridiumskyblock.configs.*; +import com.iridium.iridiumskyblock.database.Island; +import com.iridium.iridiumskyblock.database.User; +import com.iridium.iridiumskyblock.generators.*; +import com.iridium.iridiumskyblock.generators.blockPopulators.*; +import com.iridium.iridiumskyblock.listeners.*; +import com.iridium.iridiumskyblock.managers.*; +import com.iridium.iridiumskyblock.placeholders.IslandPlaceholderBuilder; +import com.iridium.iridiumskyblock.placeholders.TeamChatPlaceholderBuilder; +import com.iridium.iridiumskyblock.placeholders.UserPlaceholderBuilder; +import com.iridium.iridiumteams.IridiumTeams; + +import com.iridium.iridiumteams.managers.MissionManager; +import com.iridium.iridiumteams.managers.ShopManager; +import com.iridium.iridiumteams.managers.SupportManager; +import com.iridium.iridiumteams.teleport.TeleportManager; +import lombok.Getter; +import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; +import org.bukkit.World; + +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPluginLoader; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Objects; +import java.util.List; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.stream.Collectors; + +@Getter +public class IridiumSkyblock extends IridiumTeams { + + @Getter + private static IridiumSkyblock instance; + + private Configuration configuration; + private Messages messages; + private Permissions permissions; + private Inventories inventories; + private Commands commands; + private BankItems bankItems; + private Enhancements enhancements; + private BlockValues blockValues; + private Top top; + private SQL sql; + private Missions missions; + private Schematics schematics; + private Shop shop; + private Biomes biomes; + private Settings settings; + private Generators generators; + private TeamLogs teamLogs; + + private IslandPlaceholderBuilder teamsPlaceholderBuilder; + private UserPlaceholderBuilder userPlaceholderBuilder; + private TeamChatPlaceholderBuilder teamChatPlaceholderBuilder; + + private IslandManager teamManager; + private UserManager userManager; + private CommandManager commandManager; + private DatabaseManager databaseManager; + private MissionManager missionManager; + private SchematicManager schematicManager; + private ShopManager shopManager; + private BiomeManager biomeManager; + private SupportManager supportManager; + private TeleportManager teleportManager; + + private Economy economy; + + private ChunkGenerator chunkGenerator; + @Getter + private int mcVersion; + private List iridiumChunkGenerators = new ArrayList<>(); + private final HashMap> blockPopulatorList = new HashMap<>(); + + public IridiumSkyblock(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + super(loader, description, dataFolder, file); + instance = this; + } + + public IridiumSkyblock() { instance = this; } + + @Override + public void onLoad() { + super.onLoad(); + setMcVersion(); + } + + @Override + public void onEnable() { + instance = this; + + this.teamManager = new IslandManager(); + + getLogger().info("Loading world generator..."); + + registerGenerators(); + setBlockPopulators(); + + if(IridiumSkyblock.getInstance().getConfiguration().generatorType.equalsIgnoreCase("vanilla")) { + this.chunkGenerator = null; + } else { + this.chunkGenerator = validateGenerator(IridiumSkyblock.getInstance().getConfiguration().generatorType); + } + + this.teamManager.createWorld(World.Environment.NORMAL, configuration.worldName); + this.teamManager.createWorld(World.Environment.NETHER, configuration.worldName + "_nether"); + this.teamManager.createWorld(World.Environment.THE_END, configuration.worldName + "_the_end"); + + this.schematicManager = new SchematicManager(); + this.userManager = new UserManager(); + this.commandManager = new CommandManager("iridiumskyblock"); + this.databaseManager = new DatabaseManager(); + this.missionManager = new MissionManager<>(this); + this.shopManager = new ShopManager<>(this); + this.biomeManager = new BiomeManager(); + this.supportManager = new SupportManager<>(this); + this.teleportManager = new TeleportManager<>(this); + + supportManager.registerDefaults(); + + try { + databaseManager.init(); + } catch (SQLException exception) { + // We don't want the plugin to start if the connection fails + exception.printStackTrace(); + Bukkit.getPluginManager().disablePlugin(this); + return; + } + + this.teamsPlaceholderBuilder = new IslandPlaceholderBuilder(); + this.userPlaceholderBuilder = new UserPlaceholderBuilder(); + this.teamChatPlaceholderBuilder = new TeamChatPlaceholderBuilder(); + + Bukkit.getScheduler().runTask(this, () -> this.economy = setupEconomy()); + + Bukkit.getServer().getOnlinePlayers().forEach(player -> getIslandManager().sendIslandBorder(player)); + + addBstats(5825); + startUpdateChecker(62480); + super.onEnable(); + } + + private Economy setupEconomy() { + RegisteredServiceProvider economyProvider = getServer().getServicesManager().getRegistration(Economy.class); + if (economyProvider == null) { + getLogger().warning("You do not have an economy plugin installed (like Essentials)."); + return null; + } + return economyProvider.getProvider(); + } + + @Override + public void registerListeners() { + super.registerListeners(); + Bukkit.getPluginManager().registerEvents(new PlayerMoveListener(), this); + Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), this); + Bukkit.getPluginManager().registerEvents(new BlockFormListener(), this); + Bukkit.getPluginManager().registerEvents(new EnhancementUpdateListener(), this); + Bukkit.getPluginManager().registerEvents(new PlayerTeleportListener(), this); + Bukkit.getPluginManager().registerEvents(new PlayerPortalListener(), this); + Bukkit.getPluginManager().registerEvents(new PlayerInteractListener(), this); + Bukkit.getPluginManager().registerEvents(new PlayerRespawnEventListener(), this); + Bukkit.getPluginManager().registerEvents(new EntityDamageListener(), this); + if(!XReflection.supports(15)) Bukkit.getPluginManager().registerEvents(new PortalCreateListener(), this); + + if (Bukkit.getPluginManager().isPluginEnabled("ProtocolLib")) { + IridiumSkyblock.getInstance().getLogger().warning("ProtocolLib is installed. Extended features enabled."); + new ProtocolLibPacketListener().registerListeners(); + } else if (IridiumSkyblock.getInstance().getConfiguration().fixHorizon) IridiumSkyblock.getInstance().getLogger().warning("ProtocolLib is not installed. Features will be limited."); + } + + @Override + public void loadConfigs() { + this.configuration = getPersist().load(Configuration.class); + this.messages = getPersist().load(Messages.class); + this.commands = getPersist().load(Commands.class); + this.sql = getPersist().load(SQL.class); + this.inventories = getPersist().load(Inventories.class); + this.permissions = getPersist().load(Permissions.class); + this.bankItems = getPersist().load(BankItems.class); + this.enhancements = getPersist().load(Enhancements.class); + this.blockValues = getPersist().load(BlockValues.class); + this.top = getPersist().load(Top.class); + this.missions = getPersist().load(Missions.class); + this.schematics = getPersist().load(Schematics.class); + this.shop = getPersist().load(Shop.class); + this.biomes = getPersist().load(Biomes.class); + this.settings = getPersist().load(Settings.class); + this.generators = getPersist().load(Generators.class); + this.teamLogs = getPersist().load(TeamLogs.class); + // We want to log this data specifically because changing + // the generator type during a server's lifetime can cause issues. + getLogger().info("GENERATOR TYPE: " + IridiumSkyblock.getInstance().getConfiguration().generatorType); + super.loadConfigs(); + + int maxSize = enhancements.sizeEnhancement.levels.values().stream() + .max(Comparator.comparing(sizeUpgrade -> sizeUpgrade.size)) + .map(sizeEnhancementData -> sizeEnhancementData.size) + .orElse(150); + if (configuration.distance <= maxSize) { + getLogger().warning("Distance: " + configuration.distance + " Is too low, must be higher than the maximum island size " + maxSize); + configuration.distance = maxSize + 1; + getLogger().warning("New Distance set to: " + configuration.distance); + } + + if (schematicManager != null) { + schematicManager.reload(); + } + + migrateData(); + } + + @Override + public void saveConfigs() { + super.saveConfigs(); + getPersist().save(configuration); + getPersist().save(messages); + getPersist().save(commands); + getPersist().save(sql); + getPersist().save(inventories); + getPersist().save(permissions); + getPersist().save(bankItems); + getPersist().save(enhancements); + getPersist().save(blockValues); + getPersist().save(top); + getPersist().save(missions); + getPersist().save(schematics); + getPersist().save(shop); + getPersist().save(biomes); + getPersist().save(settings); + getPersist().save(generators); + getPersist().save(teamLogs); + saveSchematics(); + } + + @Override + public void saveData() { + getDatabaseManager().getUserTableManager().save(); + getDatabaseManager().getIslandTableManager().save(); + getDatabaseManager().getInvitesTableManager().save(); + getDatabaseManager().getTrustTableManager().save(); + getDatabaseManager().getPermissionsTableManager().save(); + getDatabaseManager().getBankTableManager().save(); + getDatabaseManager().getEnhancementTableManager().save(); + getDatabaseManager().getTeamBlockTableManager().save(); + getDatabaseManager().getTeamSpawnerTableManager().save(); + getDatabaseManager().getTeamWarpTableManager().save(); + getDatabaseManager().getTeamMissionTableManager().save(); + getDatabaseManager().getTeamMissionDataTableManager().save(); + getDatabaseManager().getTeamRewardsTableManager().save(); + getDatabaseManager().getTeamSettingsTableManager().save(); + getDatabaseManager().getLostItemsTableManager().save(); + } + + @Override + public void initializeBankItem() { + super.initializeBankItem(); + addBankItem(getBankItems().crystalsBankItem); + } + + @Override + public void initializeEnhancements() { + super.initializeEnhancements(); + addEnhancement("size", getEnhancements().sizeEnhancement); + addEnhancement("void", getEnhancements().voidEnhancement); + addEnhancement("generator", getEnhancements().generatorEnhancement); + } + + @Override + public void initializePermissions() { + super.initializePermissions(); + addPermission("border", getPermissions().border); + addPermission("regen", getPermissions().regen); + } + + private void saveSchematics() { + File schematicFolder = new File(getDataFolder(), "schematics"); + if (!schematicFolder.exists()) { + schematicFolder.mkdir(); + } + + // Return if there are already schematics in the schematics folder + if (Objects.requireNonNull(schematicFolder.list()).length != 0) { + return; + } + + saveFile(schematicFolder, "desert.schem"); + saveFile(schematicFolder, "mushroom.schem"); + saveFile(schematicFolder, "jungle.schem"); + saveFile(schematicFolder, "desert_nether.schem"); + saveFile(schematicFolder, "mushroom_nether.schem"); + saveFile(schematicFolder, "jungle_nether.schem"); + saveFile(schematicFolder, "desert_end.schem"); + saveFile(schematicFolder, "mushroom_end.schem"); + saveFile(schematicFolder, "jungle_end.schem"); + } + + private void saveFile(File parent, String name) { + File file = new File(parent, name); + if (!file.exists()) { + try { + InputStream source = getResource(name); + Path target = file.toPath(); + + if (source == null) + return; + Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException exception) { + getLogger().warning("Could not copy " + name + " to " + file.getAbsolutePath()); + } + } + } + + public void migrateData(){ + processFields(BankItems.class, getBankItems(), 0); + processFields(BlockValues.class, getBlockValues(), 0); + processFields(Commands.class, getCommands(), 0); + processFields(Configuration.class, getConfiguration(), 0); + processFields(Enhancements.class, getEnhancements(), 0); + processFields(Inventories.class, getInventories(), 0); + processFields(Messages.class, getMessages(), 0); + processFields(Missions.class, getMissions(), 0); + processFields(Permissions.class, getPermissions(), 0); + processFields(Settings.class, getSettings(), 0); + processFields(Shop.class, getShop(), 0); + processFields(Top.class, getTop(), 0); + + getInventories().islandMenu.items.values().forEach(Item::migrateData); + getSchematics().schematics.values().forEach(schematicConfig -> schematicConfig.item.migrateData()); + } + + private void processFields(Class clazz, Object instance, int depth) { + if(depth > 3){ + return; + } + // Get all declared fields (including private fields) + Field[] fields = clazz.getDeclaredFields(); + + for (Field field : fields) { + if (!field.getType().getName().startsWith("com.iridium")) { + continue; + } + + field.setAccessible(true); // Allow access to private fields + + try { + Object fieldValue = field.get(instance); + + if (fieldValue != null) { + Class fieldType = fieldValue.getClass(); + + // Check if the field is an instance of Item + if (isItemClass(fieldType)) { + // Call the migrate method + invokeMigrateMethod(fieldValue); + } else { + // If the field is not an Item, process its fields recursively + processFields(fieldType, fieldValue, depth + 1); + } + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + private boolean isItemClass(Class clazz) { + // Check if the class or any of its enclosing classes is Item + if (clazz.getName().equals("com.iridium.iridiumcore.Item")) { + return true; + } + + Class enclosingClass = clazz.getEnclosingClass(); + return enclosingClass != null && isItemClass(enclosingClass); + } + + private void invokeMigrateMethod(Object itemInstance) { + try { + // Get the migrate method from the Item class + Method migrateMethod = itemInstance.getClass().getMethod("migrateData"); + + // Invoke the migrate method on the instance + migrateMethod.invoke(itemInstance); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + + private void setMcVersion() { + int version = 13; + try { + // version example: 1.20.4-R0.1-SNAPSHOT (we need 20) + version = Integer.parseInt(Bukkit.getBukkitVersion().substring(2, 4)); + } catch (NumberFormatException ignored) { + } + this.mcVersion = version; + } + + private void setBlockPopulators() { + + // Overworld + if(IridiumSkyblock.getInstance().getConfiguration().generatorType.equalsIgnoreCase("ocean") + || IridiumSkyblock.getInstance().getConfiguration().generatorType.equalsIgnoreCase("ocean-legacy")) { + + IridiumSkyblock.getInstance().getBlockPopulatorList().put(World.Environment.NORMAL, Arrays.asList( + new KelpBlockPopulator() + //new MagmaBlockPopulator() + //new SeagrassBlockPopulator() + )); + } + } + + private void registerGenerators() { + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new VoidGenerator("skyblock", false, true)); + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new OceanGenerator("ocean", true, false)); + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new OceanGeneratorLegacy("ocean-legacy", true, false)); + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new FlatGenerator("superflat", true, true)); + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new FlatGeneratorLegacy("superflat-legacy", true, true)); + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new SkylandsGenerator("skylands", true, true)); + IridiumSkyblock.getInstance().getIridiumChunkGenerators().add(new SkylandsGeneratorLegacy("skylands-legacy", true, true)); + // Vanilla chunkGenerator = null + } + + private IridiumChunkGenerator validateGenerator(String name) { + + List generatorNames = IridiumSkyblock.getInstance().getIridiumChunkGenerators().stream().map(IridiumChunkGenerator::getName).collect(Collectors.toList()); + if(generatorNames.stream().noneMatch(generatorName -> generatorName.equalsIgnoreCase(name))) { + IridiumSkyblock.getInstance().getLogger().warning("Generator type \"" + + IridiumSkyblock.getInstance().getConfiguration().generatorType + + "\" is not a valid type."); + IridiumSkyblock.getInstance().getLogger().info("Generator options available: " + generatorNames); + IridiumSkyblock.getInstance().getLogger().warning("Defaulting to \"skyblock\"..."); + return IridiumSkyblock.getInstance().getIridiumChunkGenerators().get(0); + } else { + return IridiumSkyblock.getInstance().getIridiumChunkGenerators().stream() + .filter(generator -> generator.getName().equalsIgnoreCase(name)) + .findAny() + .get(); + } + } + + @Override + public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { + return this.chunkGenerator; + } + + public IslandManager getIslandManager() { + return teamManager; + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/api/IridiumSkyblockAPI.java b/src/main/java/com/iridium/iridiumskyblock/api/IridiumSkyblockAPI.java index 0b146866b..f71bf894f 100644 --- a/src/main/java/com/iridium/iridiumskyblock/api/IridiumSkyblockAPI.java +++ b/src/main/java/com/iridium/iridiumskyblock/api/IridiumSkyblockAPI.java @@ -1,285 +1,316 @@ -package com.iridium.iridiumskyblock.api; - -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.database.Island; -import com.iridium.iridiumskyblock.database.User; -import com.iridium.iridiumskyblock.managers.IslandManager; -import com.iridium.iridiumteams.Permission; -import com.iridium.iridiumteams.PermissionType; -import com.iridium.iridiumteams.bank.BankItem; -import com.iridium.iridiumteams.commands.Command; -import com.iridium.iridiumteams.enhancements.Enhancement; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Optional; - -/** - * General api for IridiumSkyblock. - * It is accessible via {@link IridiumSkyblockAPI#getInstance()}. - */ -public class IridiumSkyblockAPI { - - private static IridiumSkyblockAPI instance; - private final IridiumSkyblock iridiumSkyblock; - - /** - * Constructor for api initialization. - * - * @param iridiumSkyblock The instance of the {@link IridiumSkyblock} class - */ - private IridiumSkyblockAPI(@NotNull IridiumSkyblock iridiumSkyblock) { - this.iridiumSkyblock = iridiumSkyblock; - } - - /** - * Accesses the api instance. - * Might be null if this method is called when {@link IridiumSkyblock}'s startup method is still being executed. - * - * @return the instance of this api - * @since 3.0.0 - */ - public static @Nullable IridiumSkyblockAPI getInstance() { - if(instance == null && IridiumSkyblock.getInstance() != null) { - instance = new IridiumSkyblockAPI(IridiumSkyblock.getInstance()); - } - return instance; - } - - /** - * Adds an Island BankItem. - * - * @param bankItem The specified Bankitem - * @since 3.0.0 - */ - public void addBankItem(@NotNull BankItem bankItem) { - iridiumSkyblock.getBankItemList().add(bankItem); - } - - /** - * Adds an Island enhancement. - * - * @param enhancementName The name of the enhancement (used for storage purposes) - * @param enhancement the enhancement item - * @since 4.0.2 - */ - public void addEnhancement(@NotNull String enhancementName, @NotNull Enhancement enhancement) { - iridiumSkyblock.addEnhancement(enhancementName, enhancement); - } - - /** - * Adds an Island permission. - * - * @param permission The specified Permission - * @param key the unique key associated with this permission - * @since 3.0.0 - */ - public void addPermission(@NotNull Permission permission, @NotNull String key) { - iridiumSkyblock.getPermissionList().put(key, permission); - } - - /** - * Adds an IridiumSkyblock command. - * - * @param command The command that should be added - * @since 3.0.0 - */ - public void addCommand(@NotNull Command command) { - iridiumSkyblock.getCommandManager().registerCommand(command); - } - - /** - * Gets a {@link User}'s info. Creates one if they don't exist. - * - * @param offlinePlayer The player who's data should be fetched - * @return the user data - * @since 3.0.0 - */ - public @NotNull User getUser(@NotNull OfflinePlayer offlinePlayer) { - return iridiumSkyblock.getUserManager().getUser(offlinePlayer); - } - - /** - * Finds an Island by its id. - * - * @param id The id of the Island - * @return Optional with the Island, empty if there is none - * @since 3.0.0 - */ - public @NotNull Optional getIslandById(int id) { - return iridiumSkyblock.getIslandManager().getTeamViaID(id); - } - - /** - * Finds an Island by its name. - * - * @param name The name of the Island - * @return Optional with the Island, empty if there is none - * @since 3.0.0 - */ - public @NotNull Optional getIslandByName(@NotNull String name) { - return iridiumSkyblock.getIslandManager().getTeamViaName(name); - } - - /** - * Gets an {@link Island} from a location. - * - * @param location The location you are looking at - * @return Optional of the Island at the location, empty if there is none - * @since 3.0.0 - */ - public @NotNull Optional getIslandViaLocation(@NotNull Location location) { - return iridiumSkyblock.getIslandManager().getTeamViaLocation(location); - } - - /** - * Gets a permission object from name. - * - * @param permissionKey The permission key - * @return the permission - * @since 3.0.0 - */ - public @NotNull Optional getPermissions(@NotNull String permissionKey) { - return Optional.ofNullable(iridiumSkyblock.getPermissionList().get(permissionKey)); - } - - /** - * Gets a permission object from name. - * - * @param permissionType The permission key - * @return the permission - * @since 3.0.4 - */ - public @NotNull Optional getPermissions(@NotNull PermissionType permissionType) { - return getPermissions(permissionType.getPermissionKey()); - } - - /** - * Gets whether a permission is allowed or denied. - * - * @param island The specified Island - * @param user The Specified user - * @param permission The Specified permission - * @param key The permission key - * @return true if the permission is allowed - * @since 3.0.0 - */ - public boolean getIslandPermission(@NotNull Island island, @NotNull User user, @NotNull Permission permission, @NotNull String key) { - return iridiumSkyblock.getIslandManager().getTeamPermission(island, user, key); - } - - /** - * Gets whether a permission is allowed or denied. - * - * @param island The specified Island - * @param user The specified user - * @param permissionType The specified permission type - * @return true if the permission is allowed - * @since 3.0.4 - */ - public boolean getIslandPermission(@NotNull Island island, @NotNull User user, @NotNull PermissionType permissionType) { - return iridiumSkyblock.getIslandManager().getTeamPermission(island, user, permissionType); - } - - /** - * Gets a list of Islands sorted by SortType. - * - * @param sortType How we are sorting the Islands - * @return sorted list of all Islands - * @since 3.0.0 - */ - public @NotNull List getIslands(@NotNull IslandManager.SortType sortType) { - return iridiumSkyblock.getIslandManager().getTeams(sortType, false); - } - - /** - * Returns the overworld. - * - * @return the main Skyblock {@link World}, might be null if some third-party plugin deleted it - * @since 3.0.0 - */ - public @Nullable World getWorld() { - return iridiumSkyblock.getIslandManager().getWorld(World.Environment.NORMAL); - } - - /** - * Returns the nether world. - * - * @return the nether Skyblock {@link World}, might be null if some third-party plugin deleted it - * @since 3.0.0 - */ - public @Nullable World getNetherWorld() { - return iridiumSkyblock.getIslandManager().getWorld(World.Environment.NETHER); - } - - /** - * Returns the end world. - * - * @return the nether Skyblock {@link World}, might be null if some third-party plugin deleted it - * @since 3.0.0 - */ - public @Nullable World getEndWorld() { - return iridiumSkyblock.getIslandManager().getWorld(World.Environment.THE_END); - } - - /** - * Returns whether the specified world is from IridiumSkyblock. - * - * @param world The world that should be checked - * @return true if it is a world used by IridiumSkyblock - * @since 3.0.7 - */ - public boolean isIslandWorld(@NotNull World world) { - return iridiumSkyblock.getIslandManager().isInSkyblockWorld(world); - } - - /** - * Returns if this is the overworld of IridiumSkyblock. - * - * @param world The world that should be checked - * @return true if this is the overworld of IridiumSkyblock - * @since 3.1.3 - */ - public boolean isIslandOverWorld(@NotNull World world) { - return world.equals(getWorld()); - } - - /** - * Returns if this is the nether world of IridiumSkyblock. - * - * @param world The world that should be checked - * @return true if this is the nether world of IridiumSkyblock - * @since 3.1.3 - */ - public boolean isIslandNether(@NotNull World world) { - return world.equals(getNetherWorld()); - } - - /** - * Returns if this is the end world of IridiumSkyblock. - * - * @param world The world that should be checked - * @return true if this is the end world of IridiumSkyblock - * @since 3.1.3 - */ - public boolean isIslandEnd(@NotNull World world) { - return world.equals(getEndWorld()); - } - - /** - * Returns whether the specified player can visit the provided Island.

- * - * @param user the user - * @param island the Island - * @return true if the user can visit the Island - * @since 3.2.7 - */ - public boolean canVisitIsland(@NotNull User user, @NotNull Island island) { - return iridiumSkyblock.getIslandManager().canVisit(user.getPlayer(), island); - } - -} +package com.iridium.iridiumskyblock.api; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.database.Island; +import com.iridium.iridiumskyblock.database.User; +import com.iridium.iridiumskyblock.generators.IridiumChunkGenerator; +import com.iridium.iridiumskyblock.managers.IslandManager; +import com.iridium.iridiumteams.Permission; +import com.iridium.iridiumteams.PermissionType; +import com.iridium.iridiumteams.bank.BankItem; +import com.iridium.iridiumteams.commands.Command; +import com.iridium.iridiumteams.enhancements.Enhancement; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; + +/** + * General api for IridiumSkyblock. + * It is accessible via {@link IridiumSkyblockAPI#getInstance()}. + */ +public class IridiumSkyblockAPI { + + private static IridiumSkyblockAPI instance; + private final IridiumSkyblock iridiumSkyblock; + + /** + * Constructor for api initialization. + * + * @param iridiumSkyblock The instance of the {@link IridiumSkyblock} class + */ + private IridiumSkyblockAPI(@NotNull IridiumSkyblock iridiumSkyblock) { + this.iridiumSkyblock = iridiumSkyblock; + } + + /** + * Accesses the api instance. + * Might be null if this method is called when {@link IridiumSkyblock}'s startup method is still being executed. + * + * @return the instance of this api + * @since 3.0.0 + */ + public static @Nullable IridiumSkyblockAPI getInstance() { + if(instance == null && IridiumSkyblock.getInstance() != null) { + instance = new IridiumSkyblockAPI(IridiumSkyblock.getInstance()); + } + return instance; + } + + /** + * Adds an Island BankItem. + * + * @param bankItem The specified Bankitem + * @since 3.0.0 + */ + public void addBankItem(@NotNull BankItem bankItem) { + iridiumSkyblock.getBankItemList().add(bankItem); + } + + /** + * Adds an Island enhancement. + * + * @param enhancementName The name of the enhancement (used for storage purposes) + * @param enhancement the enhancement item + * @since 4.0.2 + */ + public void addEnhancement(@NotNull String enhancementName, @NotNull Enhancement enhancement) { + iridiumSkyblock.addEnhancement(enhancementName, enhancement); + } + + /** + * Adds an Island permission. + * + * @param permission The specified Permission + * @param key the unique key associated with this permission + * @since 3.0.0 + */ + public void addPermission(@NotNull Permission permission, @NotNull String key) { + iridiumSkyblock.getPermissionList().put(key, permission); + } + + /** + * Adds an IridiumSkyblock command. + * + * @param command The command that should be added + * @since 3.0.0 + */ + public void addCommand(@NotNull Command command) { + iridiumSkyblock.getCommandManager().registerCommand(command); + } + + /** + * Gets a {@link User}'s info. Creates one if they don't exist. + * + * @param offlinePlayer The player who's data should be fetched + * @return the user data + * @since 3.0.0 + */ + public @NotNull User getUser(@NotNull OfflinePlayer offlinePlayer) { + return iridiumSkyblock.getUserManager().getUser(offlinePlayer); + } + + /** + * Finds an Island by its id. + * + * @param id The id of the Island + * @return Optional with the Island, empty if there is none + * @since 3.0.0 + */ + public @NotNull Optional getIslandById(int id) { + return iridiumSkyblock.getIslandManager().getTeamViaID(id); + } + + /** + * Finds an Island by its name. + * + * @param name The name of the Island + * @return Optional with the Island, empty if there is none + * @since 3.0.0 + */ + public @NotNull Optional getIslandByName(@NotNull String name) { + return iridiumSkyblock.getIslandManager().getTeamViaName(name); + } + + /** + * Gets an {@link Island} from a location. + * + * @param location The location you are looking at + * @return Optional of the Island at the location, empty if there is none + * @since 3.0.0 + */ + public @NotNull Optional getIslandViaLocation(@NotNull Location location) { + return iridiumSkyblock.getIslandManager().getTeamViaLocation(location); + } + + /** + * Gets a permission object from name. + * + * @param permissionKey The permission key + * @return the permission + * @since 3.0.0 + */ + public @NotNull Optional getPermissions(@NotNull String permissionKey) { + return Optional.ofNullable(iridiumSkyblock.getPermissionList().get(permissionKey)); + } + + /** + * Gets a permission object from name. + * + * @param permissionType The permission key + * @return the permission + * @since 3.0.4 + */ + public @NotNull Optional getPermissions(@NotNull PermissionType permissionType) { + return getPermissions(permissionType.getPermissionKey()); + } + + /** + * Gets whether a permission is allowed or denied. + * + * @param island The specified Island + * @param user The Specified user + * @param permission The Specified permission + * @param key The permission key + * @return true if the permission is allowed + * @since 3.0.0 + */ + public boolean getIslandPermission(@NotNull Island island, @NotNull User user, @NotNull Permission permission, @NotNull String key) { + return iridiumSkyblock.getIslandManager().getTeamPermission(island, user, key); + } + + /** + * Gets whether a permission is allowed or denied. + * + * @param island The specified Island + * @param user The specified user + * @param permissionType The specified permission type + * @return true if the permission is allowed + * @since 3.0.4 + */ + public boolean getIslandPermission(@NotNull Island island, @NotNull User user, @NotNull PermissionType permissionType) { + return iridiumSkyblock.getIslandManager().getTeamPermission(island, user, permissionType); + } + + /** + * Gets a list of Islands sorted by SortType. + * + * @param sortType How we are sorting the Islands + * @return sorted list of all Islands + * @since 3.0.0 + */ + public @NotNull List getIslands(@NotNull IslandManager.SortType sortType) { + return iridiumSkyblock.getIslandManager().getTeams(sortType, false); + } + + /** + * Returns the overworld. + * + * @return the main Skyblock {@link World}, might be null if some third-party plugin deleted it + * @since 3.0.0 + */ + public @Nullable World getWorld() { + return iridiumSkyblock.getIslandManager().getWorld(World.Environment.NORMAL); + } + + /** + * Returns the nether world. + * + * @return the nether Skyblock {@link World}, might be null if some third-party plugin deleted it + * @since 3.0.0 + */ + public @Nullable World getNetherWorld() { + return iridiumSkyblock.getIslandManager().getWorld(World.Environment.NETHER); + } + + /** + * Returns the end world. + * + * @return the nether Skyblock {@link World}, might be null if some third-party plugin deleted it + * @since 3.0.0 + */ + public @Nullable World getEndWorld() { + return iridiumSkyblock.getIslandManager().getWorld(World.Environment.THE_END); + } + + /** + * Returns whether the specified world is from IridiumSkyblock. + * + * @param world The world that should be checked + * @return true if it is a world used by IridiumSkyblock + * @since 3.0.7 + */ + public boolean isIslandWorld(@NotNull World world) { + return iridiumSkyblock.getIslandManager().isInSkyblockWorld(world); + } + + /** + * Returns if this is the overworld of IridiumSkyblock. + * + * @param world The world that should be checked + * @return true if this is the overworld of IridiumSkyblock + * @since 3.1.3 + */ + public boolean isIslandOverWorld(@NotNull World world) { + return world.equals(getWorld()); + } + + /** + * Returns if this is the nether world of IridiumSkyblock. + * + * @param world The world that should be checked + * @return true if this is the nether world of IridiumSkyblock + * @since 3.1.3 + */ + public boolean isIslandNether(@NotNull World world) { + return world.equals(getNetherWorld()); + } + + /** + * Returns if this is the end world of IridiumSkyblock. + * + * @param world The world that should be checked + * @return true if this is the end world of IridiumSkyblock + * @since 3.1.3 + */ + public boolean isIslandEnd(@NotNull World world) { + return world.equals(getEndWorld()); + } + + /** + * Returns whether the specified player can visit the provided Island.

+ * + * @param user the user + * @param island the Island + * @return true if the user can visit the Island + * @since 3.2.7 + */ + public boolean canVisitIsland(@NotNull User user, @NotNull Island island) { + return iridiumSkyblock.getIslandManager().canVisit(user.getPlayer(), island); + } + + /** + * Adds a block populator to the plugin.

+ * + * @param environment the world type to apply to + * @param blockPopulator the blockPopulator to add + * @since 4.1.4 + */ + public void addBlockPopulator(@NotNull World.Environment environment, @NotNull BlockPopulator blockPopulator) { + iridiumSkyblock.getBlockPopulatorList().get(environment).add(blockPopulator); + } + + /** + * Adds a ChunkGenerator to the plugin.

+ * + * @param generator the ChunkGenerator object + * @param name the name of the generator for use in the config + * @param generatesTerrain determines if the generator will create regenWorlds + * @param lowerHorizon whether the horizon should be lowered in the overworld + * + * @since 4.1.4 + */ + public void addChunkGenerator(ChunkGenerator generator, String name, boolean generatesTerrain, boolean lowerHorizon) { + IridiumChunkGenerator iridiumChunkGenerator = (IridiumChunkGenerator) generator; + iridiumChunkGenerator.setName(name); + iridiumChunkGenerator.setGeneratesTerrain(generatesTerrain); + iridiumChunkGenerator.setLowerHorizon(lowerHorizon); + iridiumSkyblock.getIridiumChunkGenerators().add(iridiumChunkGenerator); + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/commands/RegenCommand.java b/src/main/java/com/iridium/iridiumskyblock/commands/RegenCommand.java index a3273ab90..095cdfd69 100644 --- a/src/main/java/com/iridium/iridiumskyblock/commands/RegenCommand.java +++ b/src/main/java/com/iridium/iridiumskyblock/commands/RegenCommand.java @@ -1,152 +1,170 @@ -package com.iridium.iridiumskyblock.commands; - -import com.iridium.iridiumcore.utils.Placeholder; -import com.iridium.iridiumcore.utils.StringUtils; -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.configs.Schematics; -import com.iridium.iridiumskyblock.database.Island; -import com.iridium.iridiumskyblock.database.User; -import com.iridium.iridiumskyblock.gui.RegenGUI; -import com.iridium.iridiumteams.IridiumTeams; -import com.iridium.iridiumteams.bank.BankItem; -import com.iridium.iridiumteams.commands.ConfirmableCommand; -import com.iridium.iridiumteams.database.TeamBank; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.*; -import java.util.stream.Collectors; - -public class RegenCommand extends ConfirmableCommand { - - public RegenCommand() { - super(Collections.singletonList("regen"), "Regenerate your Island", "%prefix% &7/is regen ", "", 300, true); - } - - @Override - protected void executeAfterConfirmation(User user, Island island, String[] args, IridiumTeams iridiumTeams) { - Player player = user.getPlayer(); - - if (args.length == 0 && IridiumSkyblock.getInstance().getSchematics().schematics.size() > 1) { - return; - } - - Optional schematic = IridiumSkyblock.getInstance().getSchematics().schematics.keySet().stream() - .filter(config -> IridiumSkyblock.getInstance().getSchematics().schematics.size() == 1 || config.equalsIgnoreCase(args[0])) - .findFirst(); - - if (!schematic.isPresent()) { - return; - } - - Schematics.SchematicConfig schematicConfig = IridiumSkyblock.getInstance().getSchematics().schematics.get(schematic.get()); - - if (schematicConfig.regenCost.money != 0 || !schematicConfig.regenCost.bankItems.isEmpty()) { - if (!IridiumSkyblock.getInstance().getSchematicManager().buy(player, schematicConfig)) { - return; - } - } - - List bankPlaceholders = IridiumSkyblock.getInstance().getBankItemList().stream() - .map(BankItem::getName) - .map(name -> new Placeholder(name + "_cost", formatPrice(getBankBalance(player, name)))) - .collect(Collectors.toList()); - - IridiumSkyblock.getInstance().getIslandManager().getTeamMembers(island).stream() - .map(User::getPlayer) - .filter(Objects::nonNull) - .forEach(member -> member.sendMessage(StringUtils.color(StringUtils.processMultiplePlaceholders(IridiumSkyblock.getInstance().getMessages().paidForRegen - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - .replace("%player%", player.getName()) - .replace("%schematic%", StringUtils.color(schematicConfig.item.displayName)) - .replace("%vault_cost%", formatPrice(schematicConfig.regenCost.money)), - bankPlaceholders) - ))); - - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().regeneratingIsland - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - )); - - IridiumSkyblock.getInstance().getIslandManager().clearTeamInventory(island); - - IridiumSkyblock.getInstance().getIslandManager().generateIsland(island, schematicConfig).thenRun(() -> Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> { - if (IridiumSkyblock.getInstance().getTeamManager().teleport(player, island.getHome(), island)) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().teleportingHome - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - )); - } - })); - } - - private double getBankBalance(Player player, String bankItem) { - User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); - return IridiumSkyblock.getInstance().getTeamManager().getTeamViaID(user.getTeamID()) - .map(team -> IridiumSkyblock.getInstance().getTeamManager().getTeamBank(team, bankItem)) - .map(TeamBank::getNumber) - .orElse(0.0); - } - - private double round(double value, int places) { - BigDecimal bigDecimal = BigDecimal.valueOf(value); - bigDecimal = bigDecimal.setScale(places, RoundingMode.HALF_UP); - return bigDecimal.doubleValue(); - } - - public String formatPrice(double value) { - value = round(value, 2); - if (IridiumSkyblock.getInstance().getSchematics().abbreviatePrices) { - return IridiumSkyblock.getInstance().getConfiguration().numberFormatter.format(value); - } - return String.valueOf(value); - } - - @Override - public List onTabComplete(CommandSender commandSender, String[] args, IridiumTeams iridiumTeams) { - return new ArrayList<>(IridiumSkyblock.getInstance().getSchematics().schematics.keySet()); - } - - @Override - protected boolean isCommandValid(User user, Island island, String[] args, IridiumTeams iridiumTeams) { - Player player = user.getPlayer(); - - if (!IridiumSkyblock.getInstance().getIslandManager().getTeamPermission(island, IridiumSkyblock.getInstance().getUserManager().getUser(player), "regen")) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().cannotRegenIsland - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - )); - return false; - } - - if (args.length == 0 && IridiumSkyblock.getInstance().getSchematics().schematics.size() > 1) { - player.openInventory(new RegenGUI(player).getInventory()); - return false; - } - - Optional schematic = IridiumSkyblock.getInstance().getSchematics().schematics.keySet().stream() - .filter(config -> IridiumSkyblock.getInstance().getSchematics().schematics.size() == 1 || config.equalsIgnoreCase(args[0])) - .findFirst(); - if (!schematic.isPresent()) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().unknownSchematic - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - )); - return false; - } - - Schematics.SchematicConfig schematicConfig = IridiumSkyblock.getInstance().getSchematics().schematics.get(schematic.get()); - - if (island.getLevel() < schematicConfig.minLevel) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().notHighEnoughLevel - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - .replace("%level%", String.valueOf(schematicConfig.minLevel)))); - return false; - } - - if (schematicConfig.regenCost.money != 0 || !schematicConfig.regenCost.bankItems.isEmpty()) { - return IridiumSkyblock.getInstance().getSchematicManager().buy(player, schematicConfig); - } - - return true; - } -} +package com.iridium.iridiumskyblock.commands; + +import com.iridium.iridiumcore.utils.Placeholder; +import com.iridium.iridiumcore.utils.StringUtils; +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Schematics; +import com.iridium.iridiumskyblock.database.Island; +import com.iridium.iridiumskyblock.database.User; +import com.iridium.iridiumskyblock.gui.RegenGUI; +import com.iridium.iridiumteams.IridiumTeams; +import com.iridium.iridiumteams.bank.BankItem; +import com.iridium.iridiumteams.commands.Command; +import com.iridium.iridiumteams.commands.ConfirmableCommand; +import com.iridium.iridiumteams.database.TeamBank; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; + +public class RegenCommand extends ConfirmableCommand { + + public RegenCommand() { + super(Collections.singletonList("regen"), "Regenerate your Island", "%prefix% &7/is regen ", "", 300, true); + } + + @Override + public void executeAfterConfirmation(User user, Island island, String[] args, IridiumTeams iridiumTeams) { + Player player = user.getPlayer(); + if (args.length == 0 && IridiumSkyblock.getInstance().getSchematics().schematics.entrySet().size() > 1) { + if (!IridiumSkyblock.getInstance().getIslandManager().getTeamPermission(island, IridiumSkyblock.getInstance().getUserManager().getUser(player), "regen")) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().cannotRegenIsland + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return; + } + + player.openInventory(new RegenGUI(player).getInventory()); + return; + } + + Optional schematic = IridiumSkyblock.getInstance().getSchematics().schematics.keySet().stream() + .filter(config -> IridiumSkyblock.getInstance().getSchematics().schematics.entrySet().size() == 1 || config.equalsIgnoreCase(args[0])) + .findFirst(); + if (!schematic.isPresent()) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().unknownSchematic + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return; + } + + Schematics.SchematicConfig schematicConfig = IridiumSkyblock.getInstance().getSchematics().schematics.get(schematic.get()); + + if(island.getLevel() < schematicConfig.minLevel) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().notHighEnoughLevel + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + .replace("%level%", String.valueOf(schematicConfig.minLevel)))); + return; + } + + if (schematicConfig.regenCost.money != 0 || !schematicConfig.regenCost.bankItems.isEmpty()) { + if (!IridiumSkyblock.getInstance().getSchematicManager().buy(player, schematicConfig)) { + return; + } + } + + List bankPlaceholders = IridiumSkyblock.getInstance().getBankItemList().stream() + .map(BankItem::getName) + .map(name -> new Placeholder(name + "_cost", formatPrice(getBankBalance(player, name)))) + .collect(Collectors.toList()); + + IridiumSkyblock.getInstance().getIslandManager().getTeamMembers(island).stream() + .map(User::getPlayer) + .filter(Objects::nonNull) + .forEach(member -> member.sendMessage(StringUtils.color(StringUtils.processMultiplePlaceholders(IridiumSkyblock.getInstance().getMessages().paidForRegen + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + .replace("%player%", player.getName()) + .replace("%schematic%", StringUtils.color(schematicConfig.item.displayName)) + .replace("%vault_cost%", formatPrice(schematicConfig.regenCost.money)), + bankPlaceholders) + ))); + + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().regeneratingIsland + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + + IridiumSkyblock.getInstance().getIslandManager().clearTeamInventory(island); + + IridiumSkyblock.getInstance().getIslandManager().generateIsland(island, schematicConfig).thenRun(() -> Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> { + + if (IridiumSkyblock.getInstance().getTeamManager().teleport(player, island.getHome(), island)) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().teleportingHome + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + } + })); + } + + private double getBankBalance(Player player, String bankItem) { + User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); + return IridiumSkyblock.getInstance().getTeamManager().getTeamViaID(user.getTeamID()) + .map(team -> IridiumSkyblock.getInstance().getTeamManager().getTeamBank(team, bankItem)) + .map(TeamBank::getNumber) + .orElse(0.0); + } + + private double round(double value, int places) { + BigDecimal bigDecimal = BigDecimal.valueOf(value); + bigDecimal = bigDecimal.setScale(places, RoundingMode.HALF_UP); + return bigDecimal.doubleValue(); + } + + public String formatPrice(double value) { + value = round(value, 2); + if (IridiumSkyblock.getInstance().getSchematics().abbreviatePrices) { + return IridiumSkyblock.getInstance().getConfiguration().numberFormatter.format(value); + } + return String.valueOf(value); + } + + @Override + public List onTabComplete(CommandSender commandSender, String[] args, IridiumTeams iridiumTeams) { + return new ArrayList<>(IridiumSkyblock.getInstance().getSchematics().schematics.keySet()); + } + + @Override + protected boolean isCommandValid(User user, Island island, String[] args, IridiumTeams iridiumTeams) { + Player player = user.getPlayer(); + + if (!IridiumSkyblock.getInstance().getIslandManager().getTeamPermission(island, IridiumSkyblock.getInstance().getUserManager().getUser(player), "regen")) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().cannotRegenIsland + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return false; + } + + if (args.length == 0 && IridiumSkyblock.getInstance().getSchematics().schematics.size() > 1) { + player.openInventory(new RegenGUI(player).getInventory()); + return false; + } + + Optional schematic = IridiumSkyblock.getInstance().getSchematics().schematics.keySet().stream() + .filter(config -> IridiumSkyblock.getInstance().getSchematics().schematics.size() == 1 || config.equalsIgnoreCase(args[0])) + .findFirst(); + if (!schematic.isPresent()) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().unknownSchematic + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return false; + } + + Schematics.SchematicConfig schematicConfig = IridiumSkyblock.getInstance().getSchematics().schematics.get(schematic.get()); + + if (island.getLevel() < schematicConfig.minLevel) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().notHighEnoughLevel + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + .replace("%level%", String.valueOf(schematicConfig.minLevel)))); + return false; + } + + if (schematicConfig.regenCost.money != 0 || !schematicConfig.regenCost.bankItems.isEmpty()) { + return IridiumSkyblock.getInstance().getSchematicManager().buy(player, schematicConfig); + } + + return true; + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/configs/Configuration.java b/src/main/java/com/iridium/iridiumskyblock/configs/Configuration.java index d4d61da47..86fe9f33a 100644 --- a/src/main/java/com/iridium/iridiumskyblock/configs/Configuration.java +++ b/src/main/java/com/iridium/iridiumskyblock/configs/Configuration.java @@ -1,90 +1,90 @@ -package com.iridium.iridiumskyblock.configs; - -import com.cryptomorin.xseries.XMaterial; -import com.cryptomorin.xseries.XSound; -import com.google.common.collect.ImmutableMap; -import com.iridium.iridiumcore.Color; -import com.iridium.iridiumcore.Item; -import com.iridium.iridiumskyblock.managers.GeneratorType; -import com.iridium.iridiumteams.Reward; -import org.bukkit.World; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; - -public class Configuration extends com.iridium.iridiumteams.configs.Configuration { - public Configuration() { - super("&9", "Island", "IridiumSkyblock"); - this.createRequiresName = false; - - - this.levelRewards = ImmutableMap.builder() - .put(1, new Reward(new Item(XMaterial.EXPERIENCE_BOTTLE, 1, "&9&lLevel %island_level% Reward", Arrays.asList( - "&7Island Level %island_level% Rewards:", - "&9&l* &91000 Money", - "&9&l* &95 Island Crystals", - "", - "&9&l[!] &9Left click to redeem" - )), Collections.emptyList(), 0, new ImmutableMap.Builder().put("Crystals", 5.00).build(), 200, 0, XSound.ENTITY_PLAYER_LEVELUP)) - - .put(5, new Reward(new Item(XMaterial.EXPERIENCE_BOTTLE, 1, "&9&lLevel %island_level% Reward", Arrays.asList( - "&7Island Level %island_level% Rewards:", - "&9&l* &910000 Money", - "&9&l* &910 Island Crystals", - "", - "&9&l[!] &9Left click to redeem" - )), Collections.emptyList(), 0, new ImmutableMap.Builder().put("Crystals", 10.00).build(), 2000, 0, XSound.ENTITY_PLAYER_LEVELUP)) - .build(); - } - - public String defaultIslandName = "%owner%'s Island"; - public String islandCreateTitle = "&9&lIsland Created"; - public String islandCreateSubTitle = "&7IridiumSkyblock by Peaches_MLG"; - public String defaultDescription = "Default island description :c"; - public String worldName = "IridiumSkyblock"; - public String spawnWorldName = "world"; - public GeneratorType generatorType = GeneratorType.VOID; - public String islandTitleTop = "&9%island_name%"; - public String islandTitleBottom = "&7%island_description%"; - public String paster = "worldedit"; - - - public boolean obsidianBucket = true; - public boolean netherOnlyGenerator = false; - public boolean endPortalPick = true; - public boolean removeIslandBlocksOnDelete = false; - public boolean clearInventoryOnRegen = false; - public boolean clearEnderChestOnRegen = false; - public boolean allowPvPOnIslands = false; - public boolean islandCreateOnJoin = false; - public boolean islandCreationCost = false; - public boolean spawnOnIsland = false; - public int distance = 151; - public int netherUnlockLevel = 10; - public int endUnlockLevel = 20; - public int pasterDelayInTick = 1; - public int pasterLimitPerTick = 10; - - public Item islandCrystal = new Item(XMaterial.NETHER_STAR, 1, "&9*** &9&lIsland Crystal &9***", Arrays.asList( - "", - "&9%amount% Island Crystals", - "&9&l[!] &9Right-Click to Redeem" - )); - - public Map enabledWorlds = new ImmutableMap.Builder() - .put(World.Environment.NORMAL, true) - .put(World.Environment.NETHER, true) - .put(World.Environment.THE_END, true) - .build(); - - - public Color defaultBorderColor = Color.BLUE; - public Map enabledBorders = new ImmutableMap.Builder() - .put(Color.BLUE, true) - .put(Color.RED, true) - .put(Color.GREEN, true) - .put(Color.OFF, true) - .build(); - -} +package com.iridium.iridiumskyblock.configs; + +import com.cryptomorin.xseries.XMaterial; +import com.cryptomorin.xseries.XSound; +import com.google.common.collect.ImmutableMap; +import com.iridium.iridiumcore.Color; +import com.iridium.iridiumcore.Item; +import com.iridium.iridiumteams.Reward; +import org.bukkit.World; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; + +public class Configuration extends com.iridium.iridiumteams.configs.Configuration { + public Configuration() { + super("&9", "Island", "IridiumSkyblock"); + this.createRequiresName = false; + + + this.levelRewards = ImmutableMap.builder() + .put(1, new Reward(new Item(XMaterial.EXPERIENCE_BOTTLE, 1, "&9&lLevel %island_level% Reward", Arrays.asList( + "&7Island Level %island_level% Rewards:", + "&9&l* &91000 Money", + "&9&l* &95 Island Crystals", + "", + "&9&l[!] &9Left click to redeem" + )), Collections.emptyList(), 0, new ImmutableMap.Builder().put("Crystals", 5.00).build(), 200, 0, XSound.ENTITY_PLAYER_LEVELUP)) + + .put(5, new Reward(new Item(XMaterial.EXPERIENCE_BOTTLE, 1, "&9&lLevel %island_level% Reward", Arrays.asList( + "&7Island Level %island_level% Rewards:", + "&9&l* &910000 Money", + "&9&l* &910 Island Crystals", + "", + "&9&l[!] &9Left click to redeem" + )), Collections.emptyList(), 0, new ImmutableMap.Builder().put("Crystals", 10.00).build(), 2000, 0, XSound.ENTITY_PLAYER_LEVELUP)) + .build(); + } + + public String defaultIslandName = "%owner%'s Island"; + public String islandCreateTitle = "&9&lIsland Created"; + public String islandCreateSubTitle = "&7IridiumSkyblock by Peaches_MLG"; + public String defaultDescription = "Default island description :c"; + public String worldName = "IridiumSkyblock"; + public String spawnWorldName = "world"; + public String generatorType = "IridiumSkyblock" ; + public boolean fixHorizon = true; + public String islandTitleTop = "&9%island_name%"; + public String islandTitleBottom = "&7%island_description%"; + public String paster = "worldedit"; + + + public boolean obsidianBucket = true; + public boolean netherOnlyGenerator = false; + public boolean endPortalPick = true; + public boolean removeIslandBlocksOnDelete = false; + public boolean clearInventoryOnRegen = false; + public boolean clearEnderChestOnRegen = false; + public boolean allowPvPOnIslands = false; + public boolean islandCreateOnJoin = false; + public boolean islandCreationCost = false; + public boolean spawnOnIsland = false; + public int distance = 151; + public int netherUnlockLevel = 10; + public int endUnlockLevel = 20; + public int pasterDelayInTick = 1; + public int pasterLimitPerTick = 10; + + public Item islandCrystal = new Item(XMaterial.NETHER_STAR, 1, "&9*** &9&lIsland Crystal &9***", Arrays.asList( + "", + "&9%amount% Island Crystals", + "&9&l[!] &9Right-Click to Redeem" + )); + + public Map enabledWorlds = new ImmutableMap.Builder() + .put(World.Environment.NORMAL, true) + .put(World.Environment.NETHER, true) + .put(World.Environment.THE_END, true) + .build(); + + + public Color defaultBorderColor = Color.BLUE; + public Map enabledBorders = new ImmutableMap.Builder() + .put(Color.BLUE, true) + .put(Color.RED, true) + .put(Color.GREEN, true) + .put(Color.OFF, true) + .build(); + +} diff --git a/src/main/java/com/iridium/iridiumskyblock/configs/Generators.java b/src/main/java/com/iridium/iridiumskyblock/configs/Generators.java index 18875b018..ff37fa417 100644 --- a/src/main/java/com/iridium/iridiumskyblock/configs/Generators.java +++ b/src/main/java/com/iridium/iridiumskyblock/configs/Generators.java @@ -1,160 +1,424 @@ -package com.iridium.iridiumskyblock.configs; - -import com.cryptomorin.xseries.XBiome; -import com.cryptomorin.xseries.XMaterial; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; - -@JsonIgnoreProperties(ignoreUnknown = true) -public class Generators { - - public Generators.SkyblockGeneratorConfig skyblockGenerator = new SkyblockGeneratorConfig( - new com.iridium.iridiumskyblock.configs.Generators.SkyblockGeneratorWorld( - XBiome.PLAINS, - true - ), - new com.iridium.iridiumskyblock.configs.Generators.SkyblockGeneratorWorld( - XBiome.NETHER_WASTES, - true - ), - new com.iridium.iridiumskyblock.configs.Generators.SkyblockGeneratorWorld( - XBiome.THE_END, - true - ) - ); - - public Generators.OceanGeneratorConfig oceanGenerator = new OceanGeneratorConfig( - new com.iridium.iridiumskyblock.configs.Generators.OceanGeneratorWorld( - XBiome.OCEAN, - XMaterial.SAND, - XMaterial.STONE, - XMaterial.WATER, - 63, 48, 53, - true, - true - ), - new com.iridium.iridiumskyblock.configs.Generators.OceanGeneratorWorld( - XBiome.NETHER_WASTES, - XMaterial.SOUL_SAND, - XMaterial.NETHERRACK, - XMaterial.LAVA, - 63, 48, 53, - true, - true - ), - new com.iridium.iridiumskyblock.configs.Generators.OceanGeneratorWorld( - XBiome.END_BARRENS, - XMaterial.END_STONE, - XMaterial.END_STONE, - XMaterial.VOID_AIR, - 63, 48, 53, - true, - true - )); - - public Generators.FlatGeneratorConfig flatGenerator = new FlatGeneratorConfig( - new com.iridium.iridiumskyblock.configs.Generators.FlatGeneratorWorld( - XBiome.PLAINS, - XMaterial.GRASS_BLOCK, - XMaterial.DIRT, - -59, - true, - true - ), - new com.iridium.iridiumskyblock.configs.Generators.FlatGeneratorWorld( - XBiome.NETHER_WASTES, - XMaterial.NETHERRACK, - XMaterial.NETHERRACK, - 5, - true, - true - ), - new com.iridium.iridiumskyblock.configs.Generators.FlatGeneratorWorld( - XBiome.END_BARRENS, - XMaterial.END_STONE, - XMaterial.END_STONE, - 5, - true, - true - )); - - @NoArgsConstructor - @AllArgsConstructor - public static class SkyblockGeneratorConfig { - public SkyblockGeneratorWorld overworld; - public SkyblockGeneratorWorld nether; - public SkyblockGeneratorWorld end; - } - - @NoArgsConstructor - @AllArgsConstructor - public static class OceanGeneratorConfig { - public OceanGeneratorWorld overworld; - public OceanGeneratorWorld nether; - public OceanGeneratorWorld end; - } - - @NoArgsConstructor - @AllArgsConstructor - public static class FlatGeneratorConfig { - public FlatGeneratorWorld overworld; - public FlatGeneratorWorld nether; - public FlatGeneratorWorld end; - } - - @NoArgsConstructor - public static class SkyblockGeneratorWorld { - public XBiome biome; - public boolean canSpawnEntities; - - public SkyblockGeneratorWorld(XBiome biome, boolean canSpawnEntities) { - this.biome = biome; - this.canSpawnEntities = canSpawnEntities; - } - } - - @NoArgsConstructor - public static class OceanGeneratorWorld { - public XBiome biome; - public XMaterial floor; - public XMaterial underFloor; - public XMaterial liquidType; - public int liquidHeight; - public int minFloorHeight; - public int maxFloorHeight; - public boolean decorate; - public boolean canSpawnEntities; - - public OceanGeneratorWorld(XBiome biome, XMaterial floor, XMaterial underFloor, XMaterial liquidType, int liquidHeight, int minFloorHeight, int maxFloorHeight, boolean decorate, boolean canSpawnEntities) { - this.biome = biome; - this.floor = floor; - this.underFloor = underFloor; - this.liquidType = liquidType; - this.liquidHeight = liquidHeight; - this.minFloorHeight = minFloorHeight; - this.maxFloorHeight = maxFloorHeight; - this.decorate = decorate; - this.canSpawnEntities = canSpawnEntities; - } - } - - @NoArgsConstructor - public static class FlatGeneratorWorld { - public XBiome biome; - public XMaterial floor; - public XMaterial underFloor; - public int floorHeight; - public boolean decorate; - public boolean canSpawnEntities; - - public FlatGeneratorWorld(XBiome biome, XMaterial floor, XMaterial underFloor, int floorHeight, boolean decorate, boolean canSpawnEntities) { - this.biome = biome; - this.floor = floor; - this.underFloor = underFloor; - this.floorHeight = floorHeight; - this.decorate = decorate; - this.canSpawnEntities = canSpawnEntities; - } - } -} +package com.iridium.iridiumskyblock.configs; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.cryptomorin.xseries.XBiome; +import com.cryptomorin.xseries.XMaterial; +import static com.google.common.collect.Lists.newArrayList; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import java.util.*; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class Generators { + + public double simplexTerrainScale = 0.005D; + public int simplexTerrainOctave = 8; + public boolean useLegacyPopulators = false; + public boolean generateSurface = false; + public long seed = 0; + + public double simplexBiomeScale = 0.01; + public int simplexBiomeOctave = 4; + public boolean biomeCurve = true; + public boolean increaseRandom = true; + public boolean biomeGradient = true; + public boolean inverseBiomeGradient = false; + + public Generators.SkyblockGeneratorConfig skyblockGenerator = new SkyblockGeneratorConfig( + new SkyblockGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.PLAINS, new BiomeData(0.8, 0.5, 1))), + true + ), + new com.iridium.iridiumskyblock.configs.Generators.SkyblockGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.NETHER_WASTES, new BiomeData(2, 0, 0))), + true + ), + new com.iridium.iridiumskyblock.configs.Generators.SkyblockGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.THE_END, new BiomeData(2, 0, 0))), + true + ) + ); + + public Generators.OceanGeneratorConfig oceanGenerator = new OceanGeneratorConfig( + new com.iridium.iridiumskyblock.configs.Generators.OceanGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.OCEAN, new BiomeData(0.5, 1, 0)), + new BiomeDataConfig(XBiome.COLD_OCEAN, new BiomeData(0.2, 1, 0)), + new BiomeDataConfig(XBiome.FROZEN_OCEAN, new BiomeData(-1, 1, 0)), + new BiomeDataConfig(XBiome.LUKEWARM_OCEAN, new BiomeData(0.6, 1, 0)), + new BiomeDataConfig(XBiome.WARM_OCEAN, new BiomeData(0.9, 1, 0)) + ), + XMaterial.SAND, + XMaterial.GRAVEL, + XMaterial.STONE, + XMaterial.WATER, + 63, 48, 53, + false, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.OceanGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.NETHER_WASTES, new BiomeData(2, 0, 0)), + new BiomeDataConfig(XBiome.CRIMSON_FOREST, new BiomeData(2, 0, 0)), + new BiomeDataConfig(XBiome.WARPED_FOREST, new BiomeData(2, 0, 0)) + ), + XMaterial.SOUL_SAND, + XMaterial.NETHERRACK, + XMaterial.NETHERRACK, + XMaterial.LAVA, + 63, 48, 53, + false, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.OceanGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.END_BARRENS, new BiomeData(-10, 0, 0)), + new BiomeDataConfig(XBiome.END_MIDLANDS, new BiomeData(-10, 0, 1)), + new BiomeDataConfig(XBiome.END_HIGHLANDS, new BiomeData(-10, 0, 3)) + ), + XMaterial.END_STONE, + XMaterial.END_STONE, + XMaterial.END_STONE, + XMaterial.VOID_AIR, + 63, 48, 53, + false, + true, + true + )); + + public Generators.FlatGeneratorConfig flatGenerator = new FlatGeneratorConfig( + new com.iridium.iridiumskyblock.configs.Generators.FlatGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.PLAINS, new BiomeData(0.8, 0.5, 1)) + ), + XMaterial.GRASS_BLOCK, + XMaterial.DIRT, + XMaterial.STONE, + -59, + false, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.FlatGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.NETHER_WASTES, new BiomeData(2.0, 0, 0)) + ), + XMaterial.NETHERRACK, + XMaterial.NETHERRACK, + XMaterial.NETHERRACK, + 5, + false, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.FlatGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.END_BARRENS, new BiomeData(-10, 0, 0)) + ), + XMaterial.END_STONE, + XMaterial.END_STONE, + XMaterial.END_STONE, + 5, + false, + true, + true + )); + + public Generators.MonoGeneratorConfig monoGenerator = new MonoGeneratorConfig( + new com.iridium.iridiumskyblock.configs.Generators.MonoGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.MEADOW, new BiomeData(0, 0, 3)), + new BiomeDataConfig(XBiome.FLOWER_FOREST, new BiomeData(1, 0, 0)), + new BiomeDataConfig(XBiome.CHERRY_GROVE, new BiomeData(2, 0, 1)) + ), + false, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.MonoGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.NETHER_WASTES, new BiomeData(2.0, 0, 0)) + ), + false, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.MonoGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.SMALL_END_ISLANDS, new BiomeData(-10, 0, 0)) + ), + false, + true, + true + )); + + public Generators.SkylandsGeneratorConfig skylandsGenerator = new SkylandsGeneratorConfig( + new com.iridium.iridiumskyblock.configs.Generators.SkylandsGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.PLAINS, new BiomeData(0.5, 1, 0)), + new BiomeDataConfig(XBiome.SNOWY_PLAINS, new BiomeData(0.2, 1, 0)), + new BiomeDataConfig(XBiome.FROZEN_OCEAN, new BiomeData(-1, 1, 0)), + new BiomeDataConfig(XBiome.LUKEWARM_OCEAN, new BiomeData(0.6, 1, 0)), + new BiomeDataConfig(XBiome.WARM_OCEAN, new BiomeData(0.9, 1, 0)) + ), + XMaterial.GRASS_BLOCK, + XMaterial.DIRT, + XMaterial.STONE, + 148, 32, 0.008D, 5, 1.5D, 1.8D, 0.5D, 0.8D, + true, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.SkylandsGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.NETHER_WASTES, new BiomeData(2, 0, 0)), + new BiomeDataConfig(XBiome.SOUL_SAND_VALLEY, new BiomeData(2, 0, 0)), + new BiomeDataConfig(XBiome.BASALT_DELTAS, new BiomeData(2, 0, 0)) + ), + XMaterial.SOUL_SAND, + XMaterial.NETHERRACK, + XMaterial.NETHERRACK, + 148, 32, 0.008D, 5, 1.5D, 1.8D, 0.5D, 0.8D, + true, + true, + true + ), + new com.iridium.iridiumskyblock.configs.Generators.SkylandsGeneratorWorld( + newArrayList( + new BiomeDataConfig(XBiome.END_BARRENS, new BiomeData(-10, 0, 0)), + new BiomeDataConfig(XBiome.END_MIDLANDS, new BiomeData(-10, 0, 1)), + new BiomeDataConfig(XBiome.END_HIGHLANDS, new BiomeData(-10, 0, 3)) + ), + XMaterial.END_STONE, + XMaterial.END_STONE, + XMaterial.END_STONE, + 148, 32, 0.008D, 5, 1.5D, 1.8D, 0.5D, 0.8D, + true, + true, + true + )); + + @AllArgsConstructor + @NoArgsConstructor + public static class BiomeDataConfig { + public XBiome biome; + public BiomeData biomeData; + } + + @AllArgsConstructor + @NoArgsConstructor + public static class BiomeData { + public double temperature; + public double humidity; + public double height; + } + + + @NoArgsConstructor + @AllArgsConstructor + public static class SkyblockGeneratorConfig { + public SkyblockGeneratorWorld overworld; + public SkyblockGeneratorWorld nether; + public SkyblockGeneratorWorld end; + } + + @NoArgsConstructor + @AllArgsConstructor + public static class OceanGeneratorConfig { + public OceanGeneratorWorld overworld; + public OceanGeneratorWorld nether; + public OceanGeneratorWorld end; + } + + @NoArgsConstructor + @AllArgsConstructor + public static class FlatGeneratorConfig { + public FlatGeneratorWorld overworld; + public FlatGeneratorWorld nether; + public FlatGeneratorWorld end; + } + + @NoArgsConstructor + @AllArgsConstructor + public static class MonoGeneratorConfig { + public MonoGeneratorWorld overworld; + public MonoGeneratorWorld nether; + public MonoGeneratorWorld end; + } + + @NoArgsConstructor + @AllArgsConstructor + public static class SkylandsGeneratorConfig { + public SkylandsGeneratorWorld overworld; + public SkylandsGeneratorWorld nether; + public SkylandsGeneratorWorld end; + } + + @NoArgsConstructor + public static class SkyblockGeneratorWorld { + public List biomeDataConfig; + public boolean spawnEntities; + + public SkyblockGeneratorWorld( + List biomeDataConfig, + boolean spawnEntities) { + + this.biomeDataConfig = biomeDataConfig; + this.spawnEntities = spawnEntities; + } + } + + @NoArgsConstructor + public static class OceanGeneratorWorld { + public List biomeDataConfig; + public XMaterial floor; + public XMaterial underFloor; + public XMaterial mantle; + public XMaterial liquidType; + public int liquidHeight; + public int minFloorHeight; + public int maxFloorHeight; + public boolean spawnCaves; + public boolean decorate; + public boolean spawnEntities; + + public OceanGeneratorWorld( + List biomeDataConfig, + XMaterial floor, + XMaterial underFloor, + XMaterial mantle, + XMaterial liquidType, + int liquidHeight, + int minFloorHeight, + int maxFloorHeight, + boolean spawnCaves, + boolean decorate, + boolean spawnEntities) { + + this.biomeDataConfig = biomeDataConfig; + this.floor = floor; + this.underFloor = underFloor; + this.mantle = mantle; + this.liquidType = liquidType; + this.liquidHeight = liquidHeight; + this.minFloorHeight = minFloorHeight; + this.maxFloorHeight = maxFloorHeight; + this.spawnCaves = spawnCaves; + this.decorate = decorate; + this.spawnEntities = spawnEntities; + } + } + + @NoArgsConstructor + public static class FlatGeneratorWorld { + public List biomeDataConfig; + public XMaterial floor; + public XMaterial underFloor; + public XMaterial mantle; + public int floorHeight; + public boolean spawnCaves; + public boolean decorate; + public boolean spawnEntities; + + public FlatGeneratorWorld( + List biomeDataConfig, + XMaterial floor, + XMaterial underFloor, + XMaterial mantle, + int floorHeight, + boolean spawnCaves, + boolean decorate, + boolean spawnEntities) { + + this.biomeDataConfig = biomeDataConfig; + this.floor = floor; + this.underFloor = underFloor; + this.mantle = mantle; + this.floorHeight = floorHeight; + this.spawnCaves = spawnCaves; + this.decorate = decorate; + this.spawnEntities = spawnEntities; + + } + } + + @NoArgsConstructor + public static class MonoGeneratorWorld { + public List biomeDataConfig; + public boolean spawnCaves; + public boolean decorate; + public boolean spawnEntities; + + public MonoGeneratorWorld( + List biomeDataConfig, + boolean spawnCaves, + boolean decorate, + boolean spawnEntities) { + + this.biomeDataConfig = biomeDataConfig; + this.spawnCaves = spawnCaves; + this.decorate = decorate; + this.spawnEntities = spawnEntities; + + } + } + + @NoArgsConstructor + public static class SkylandsGeneratorWorld { + public List biomeDataConfig; + public XMaterial floor; + public XMaterial underFloor; + public XMaterial mantle; + public int minFloorHeight; + public int maxFloorHeight; + public double secondSimplexTerrainScale; + public int secondSimplexTerrainOctave; + public double frequency; + public double frequency2; + public double amplitude; + public double amplitude2; + public boolean spawnCaves; + public boolean decorate; + public boolean spawnEntities; + + public SkylandsGeneratorWorld( + List biomeDataConfig, + XMaterial floor, XMaterial underFloor, + XMaterial mantle, + int minFloorHeight, + int maxFloorHeight, + double secondSimplexTerrainScale, + int secondSimplexTerrainOctave, + double frequency, + double frequency2, + double amplitude, + double amplitude2, + boolean spawnCaves, + boolean decorate, + boolean spawnEntities) { + + this.biomeDataConfig = biomeDataConfig; + this.floor = floor; + this.underFloor = underFloor; + this.mantle = mantle; + this.minFloorHeight = minFloorHeight; + this.maxFloorHeight = maxFloorHeight; + this.secondSimplexTerrainScale = secondSimplexTerrainScale; + this.secondSimplexTerrainOctave = secondSimplexTerrainOctave; + this.frequency = frequency; + this.frequency2 = frequency2; + this.amplitude = amplitude; + this.amplitude2 = amplitude2; + this.spawnCaves = spawnCaves; + this.decorate = decorate; + this.spawnEntities = spawnEntities; + } + + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/FlatGenerator.java b/src/main/java/com/iridium/iridiumskyblock/generators/FlatGenerator.java index 570ae1dc4..b1cfc3df8 100644 --- a/src/main/java/com/iridium/iridiumskyblock/generators/FlatGenerator.java +++ b/src/main/java/com/iridium/iridiumskyblock/generators/FlatGenerator.java @@ -1,134 +1,183 @@ -package com.iridium.iridiumskyblock.generators; - -import com.cryptomorin.xseries.XMaterial; -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.configs.Generators; -import com.iridium.iridiumskyblock.utils.LocationUtils; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.World.Environment; -import org.bukkit.block.Block; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.InventoryHolder; -import org.jetbrains.annotations.NotNull; -import org.bukkit.generator.WorldInfo; - -import java.util.*; - -public class FlatGenerator extends ChunkGenerator { - - @Override - public @NotNull ChunkData generateChunkData( - @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { - - final ChunkData chunkData = createChunkData(world); - int floorHeight = getFlatGenerator(world.getEnvironment()).floorHeight; - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - - // Generate layer of bedrock - chunkData.setBlock(x, LocationUtils.getMinHeight(world), z, - Objects.requireNonNull(XMaterial.BEDROCK.parseMaterial()) - ); - - // Generate dirt layer - for (int y = LocationUtils.getMinHeight(world) + 1; y < floorHeight; y++) { - chunkData.setBlock(x, y, z, - Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.parseMaterial()) - ); - } - - // Generate grass on top of dirt - chunkData.setBlock(x, floorHeight, z, - Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).floor.parseMaterial()) - ); - - biomeGrid.setBiome(x, z, Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).biome.getBiome())); - } - } - - return chunkData; - } - - public void generateFlatland(World world, int x, int z) { - - Random random = new Random((world.getSeed())); - - int floorHeight = getFlatGenerator(world.getEnvironment()).floorHeight; - int minFloorHeight = world.getMinHeight(); - - // Generate layer of bedrock - if (world.getBlockAt(x, minFloorHeight, z).getType() != XMaterial.BEDROCK.parseMaterial()) { - if (world.getBlockAt(x, minFloorHeight, z).getState() instanceof InventoryHolder) { - ((InventoryHolder) world.getBlockAt(x, minFloorHeight, z).getState()).getInventory().clear(); - } - world.getBlockAt(x, minFloorHeight, z).setType(Material.BEDROCK, false); - } - - // Generate dirt layer - for (int y = minFloorHeight + 1; y < floorHeight; y++) { - Block block = world.getBlockAt(x, y, z); - if (block.getType() != getFlatGenerator(world.getEnvironment()).underFloor.parseMaterial() - && getFlatGenerator(world.getEnvironment()).underFloor.parseMaterial() != null) { - - if (block.getState() instanceof InventoryHolder) { - ((InventoryHolder) block.getState()).getInventory().clear(); - } - block.setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.parseMaterial()), false); - } - } - - // Generate grass on top of dirt - if (world.getBlockAt(x, floorHeight, z).getType() != getFlatGenerator(world.getEnvironment()).floor.parseMaterial() - && getFlatGenerator(world.getEnvironment()).floor.parseMaterial() != null) { - - if (world.getBlockAt(x, floorHeight, z).getState() instanceof InventoryHolder) { - ((InventoryHolder) world.getBlockAt(x, floorHeight, z).getState()).getInventory().clear(); - } - - world.getBlockAt(x, floorHeight, z) - .setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).floor.parseMaterial()), false); - - } - - // Replace everything else with air - for (int y = floorHeight + 1; y < world.getMaxHeight(); y++) { - Block block = world.getBlockAt(x, y, z); - if (block.getType() != Material.AIR) { - if (block.getState() instanceof InventoryHolder) { - ((InventoryHolder) block.getState()).getInventory().clear(); - } - block.setType(Material.AIR, false); - } - } - - // Generate kelp, ores, and mineral deposits - // BREAKS BELOW 1.18 - //shouldGenerateDecorations(world, random , x, z); - } - - @Override - public boolean shouldGenerateDecorations(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { - return getFlatGenerator(worldInfo.getEnvironment()).decorate; - } - - @Override - public boolean canSpawn(@NotNull World world, int x, int z) { - return getFlatGenerator(world.getEnvironment()).canSpawnEntities; - } - - private Generators.FlatGeneratorWorld getFlatGenerator(Environment environment) { - switch (environment) { - case NETHER: { - return IridiumSkyblock.getInstance().getGenerators().flatGenerator.nether; - } - case THE_END: { - return IridiumSkyblock.getInstance().getGenerators().flatGenerator.end; - } - default: { - return IridiumSkyblock.getInstance().getGenerators().flatGenerator.overworld; - } - } - } +package com.iridium.iridiumskyblock.generators; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import com.iridium.iridiumskyblock.utils.LocationUtils; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.InventoryHolder; +import org.jetbrains.annotations.NotNull; +import org.bukkit.generator.WorldInfo; + +import java.util.*; +import java.util.stream.Collectors; + +public class FlatGenerator extends IridiumChunkGenerator { + + public FlatGenerator(String name, boolean generatesTerrain, boolean lowerHorizon) { + super(name, generatesTerrain, lowerHorizon); + } + + @Override + public @NotNull ChunkData generateChunkData( + @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { + + final ChunkData chunkData = createChunkData(world); + + int floorHeight = getFlatGenerator(world.getEnvironment()).floorHeight; + + List biomeList = getFlatGenerator(world.getEnvironment()).biomeDataConfig.stream() + .filter(biomeDataConfig -> biomeDataConfig.biome.get() != null) + .map(biomeDataConfig -> biomeDataConfig.biome.get()) + .collect(Collectors.toList()); + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + + // Generate layer of bedrock + generateBedrock(world, random, x, z, chunkData); + + // Generate stone layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < floorHeight - 4; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).mantle.get()) + ); + } + + // Generate dirt layer + for (int y = floorHeight - 4; y < floorHeight; y++) { + if(chunkData.getType(x, y, z) == Material.BEDROCK) continue; + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.get()) + ); + } + + // Generate grass on top of dirt + chunkData.setBlock(x, floorHeight, z, + Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).floor.get()) + ); + + // Generate biome + if(!IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeList.get(random.nextInt(biomeList.size())))); + } + } + } + + return chunkData; + } + + public void generateFlatland(World world, int x, int z) { + + Random random = new Random((world.getSeed())); + + int floorHeight = getFlatGenerator(world.getEnvironment()).floorHeight; + int minFloorHeight = world.getMinHeight(); + + // Generate stone layer + for (int y = minFloorHeight + 1; y < floorHeight - 4; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getFlatGenerator(world.getEnvironment()).mantle.get() + && getFlatGenerator(world.getEnvironment()).mantle.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).mantle.get()), false); + } + } + + // Generate dirt layer + for (int y = minFloorHeight + 1; y < floorHeight; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getFlatGenerator(world.getEnvironment()).underFloor.get() + && getFlatGenerator(world.getEnvironment()).underFloor.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.get()), false); + } + } + + // Generate grass on top of dirt + if (world.getBlockAt(x, floorHeight, z).getType() != getFlatGenerator(world.getEnvironment()).floor.get() + && getFlatGenerator(world.getEnvironment()).floor.get() != null) { + + if (world.getBlockAt(x, floorHeight, z).getState() instanceof InventoryHolder) { + ((InventoryHolder) world.getBlockAt(x, floorHeight, z).getState()).getInventory().clear(); + } + + world.getBlockAt(x, floorHeight, z) + .setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).floor.get()), false); + } + + // Replace everything else with air + for (int y = floorHeight + 1; y < world.getMaxHeight(); y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != Material.AIR) { + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Material.AIR, false); + } + } + + if(IridiumSkyblock.getInstance().getGenerators().useLegacyPopulators) { + + } else { + shouldGenerateCaves(world, random, x, z); + shouldGenerateDecorations(world, random , x, z); + shouldGenerateMobs(world, random, x, z); + } + } + + @Override + public void generateBedrock(@NotNull WorldInfo worldInfo, @NotNull Random random, int chunkX, int chunkZ, @NotNull ChunkGenerator.ChunkData chunkData) { + if (chunkData.getMinHeight() == worldInfo.getMinHeight()) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + chunkData.setBlock(x, chunkData.getMinHeight(), z, Material.BEDROCK); + } + } + } + } + + @Override + public boolean shouldGenerateCaves(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getFlatGenerator(worldInfo.getEnvironment()).spawnCaves; + } + + @Override + public boolean shouldGenerateDecorations(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getFlatGenerator(worldInfo.getEnvironment()).decorate; + } + + @Override + public boolean shouldGenerateMobs(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getFlatGenerator(worldInfo.getEnvironment()).spawnEntities; + } + + @Override + public boolean canSpawn(@NotNull World world, int x, int z) { + return getFlatGenerator(world.getEnvironment()).spawnEntities; + } + + private Generators.FlatGeneratorWorld getFlatGenerator(Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.overworld; + } + } + } } \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/FlatGeneratorLegacy.java b/src/main/java/com/iridium/iridiumskyblock/generators/FlatGeneratorLegacy.java new file mode 100644 index 000000000..6700ca2df --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/FlatGeneratorLegacy.java @@ -0,0 +1,176 @@ +package com.iridium.iridiumskyblock.generators; + +import com.cryptomorin.xseries.XMaterial; +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import com.iridium.iridiumskyblock.utils.LocationUtils; +import org.bukkit.*; +import org.bukkit.World.Environment; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.inventory.InventoryHolder; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.stream.Collectors; + +public class FlatGeneratorLegacy extends IridiumChunkGenerator { + + public FlatGeneratorLegacy(String name, boolean generatesTerrain, boolean lowerHorizon) { + super(name, generatesTerrain, lowerHorizon); + } + + @Override + public @NotNull ChunkData generateChunkData( + @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { + + final ChunkData chunkData = createChunkData(world); + + int floorHeight = getFlatGenerator(world.getEnvironment()).floorHeight; + + SkyblockBiomeProvider biomeProvider = new SkyblockBiomeProvider(); + List biomeList = getFlatGenerator(world.getEnvironment()).biomeDataConfig.stream() + .filter(biomeDataConfig -> biomeDataConfig.biome.get() != null) + .map(biomeDataConfig -> biomeDataConfig.biome.get()) + .collect(Collectors.toList()); + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + + // Generate layer of bedrock + chunkData.setBlock(x, LocationUtils.getMinHeight(world), z, + Objects.requireNonNull(XMaterial.BEDROCK.get()) + ); + + // Generate stone layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < floorHeight - 4; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.get()) + ); + } + + // Generate dirt layer + for (int y = floorHeight - 4; y < floorHeight; y++) { + if(chunkData.getType(x, y, z) == Material.BEDROCK) continue; + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.get()) + ); + } + + // Generate grass on top of dirt + chunkData.setBlock(x, floorHeight, z, + Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).floor.get()) + ); + + if(!IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeList.get(random.nextInt(biomeList.size())))); + } else { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeProvider.getBiome(world, x, 0 ,z))); + } + } + } + + return chunkData; + } + + public void generateFlatland(World world, int x, int z) { + + Random random = new Random((world.getSeed())); + + int floorHeight = getFlatGenerator(world.getEnvironment()).floorHeight; + int minFloorHeight = world.getMinHeight(); + + // Generate layer of bedrock + if (world.getBlockAt(x, minFloorHeight, z).getType() != XMaterial.BEDROCK.get()) { + if (world.getBlockAt(x, minFloorHeight, z).getState() instanceof InventoryHolder) { + ((InventoryHolder) world.getBlockAt(x, minFloorHeight, z).getState()).getInventory().clear(); + } + world.getBlockAt(x, minFloorHeight, z).setType(Material.BEDROCK, false); + } + + // Generate stone layer + for (int y = minFloorHeight + 1; y < floorHeight - 4; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getFlatGenerator(world.getEnvironment()).mantle.get() + && getFlatGenerator(world.getEnvironment()).mantle.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).mantle.get()), false); + } + } + + // Generate dirt layer + for (int y = floorHeight - 4; y < floorHeight; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getFlatGenerator(world.getEnvironment()).underFloor.get() + && getFlatGenerator(world.getEnvironment()).underFloor.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).underFloor.get()), false); + } + } + + // Generate grass on top of dirt + if (world.getBlockAt(x, floorHeight, z).getType() != getFlatGenerator(world.getEnvironment()).floor.get() + && getFlatGenerator(world.getEnvironment()).floor.get() != null) { + + if (world.getBlockAt(x, floorHeight, z).getState() instanceof InventoryHolder) { + ((InventoryHolder) world.getBlockAt(x, floorHeight, z).getState()).getInventory().clear(); + } + + world.getBlockAt(x, floorHeight, z) + .setType(Objects.requireNonNull(getFlatGenerator(world.getEnvironment()).floor.get()), false); + } + + // Replace everything else with air + for (int y = floorHeight + 1; y < world.getMaxHeight(); y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != Material.AIR) { + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Material.AIR, false); + } + } + + // Generate caves + if (getFlatGenerator(world.getEnvironment()).spawnCaves) { + + } + + // Generate lakes, trees, grass, mineral deposits, etc. + if (getFlatGenerator(world.getEnvironment()).decorate) { + + } + + // Spawn mobs + if (getFlatGenerator(world.getEnvironment()).spawnEntities) { + + } + } + + @Override + public boolean canSpawn(@NotNull World world, int x, int z) { + return getFlatGenerator(world.getEnvironment()).spawnEntities; + } + + public Generators.FlatGeneratorWorld getFlatGenerator(Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.overworld; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/IridiumChunkGenerator.java b/src/main/java/com/iridium/iridiumskyblock/generators/IridiumChunkGenerator.java new file mode 100644 index 000000000..0ee62c6d9 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/IridiumChunkGenerator.java @@ -0,0 +1,24 @@ +package com.iridium.iridiumskyblock.generators; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.generator.ChunkGenerator; + +public abstract class IridiumChunkGenerator extends ChunkGenerator { + + @Getter + @Setter + private String name; + @Getter + @Setter + private boolean generatesTerrain; + @Getter + @Setter + private boolean lowerHorizon; + + public IridiumChunkGenerator(String name, boolean generatesTerrain, boolean lowerHorizon) { + this.name = name; + this.generatesTerrain = generatesTerrain; + this.lowerHorizon = lowerHorizon; + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/OceanGenerator.java b/src/main/java/com/iridium/iridiumskyblock/generators/OceanGenerator.java index 482ebaa03..5ff872c5a 100644 --- a/src/main/java/com/iridium/iridiumskyblock/generators/OceanGenerator.java +++ b/src/main/java/com/iridium/iridiumskyblock/generators/OceanGenerator.java @@ -1,167 +1,217 @@ -package com.iridium.iridiumskyblock.generators; - -import com.cryptomorin.xseries.XMaterial; -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.configs.Generators; -import com.iridium.iridiumskyblock.utils.LocationUtils; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.World.Environment; -import org.bukkit.block.Block; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.util.noise.SimplexOctaveGenerator; -import org.jetbrains.annotations.NotNull; -import org.bukkit.generator.WorldInfo; - -import java.util.*; - -public class OceanGenerator extends ChunkGenerator { - - @Override - public @NotNull ChunkData generateChunkData( - @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { - - SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), 8); - final ChunkData chunkData = createChunkData(world); - generator.setScale(0.005D); - - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - int currentFloorHeight = (int) ((generator.noise( - chunkX * 16 + x, chunkZ * 16 + z, 1.5D, 0.5D, true) + 1) - * (getOceanGenerator(world.getEnvironment()).maxFloorHeight - getOceanGenerator(world.getEnvironment()).minFloorHeight) - + getOceanGenerator(world.getEnvironment()).minFloorHeight); - - // Generate layer of bedrock - chunkData.setBlock(x, LocationUtils.getMinHeight(world), z, - Objects.requireNonNull(XMaterial.BEDROCK.parseMaterial()) - ); - - // Generate gravel layer - for (int y = LocationUtils.getMinHeight(world) + 1; y < currentFloorHeight; y++) { - chunkData.setBlock(x, y, z, - Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).underFloor.parseMaterial()) - ); - } - - // Generate sand on top of gravel - chunkData.setBlock(x, currentFloorHeight, z, - Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).floor.parseMaterial()) - ); - - // Generate water or lava on top of the floor - for (int y = currentFloorHeight + 1; y <= getOceanGenerator(world.getEnvironment()).liquidHeight; y++) { - chunkData.setBlock(x, y, z, Objects.requireNonNull( - getOceanGenerator(world.getEnvironment()).liquidType.parseMaterial())); - } - - biomeGrid.setBiome(x, z, Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).biome.getBiome())); - } - } - - return chunkData; - } - - public void generateOcean(World world, int x, int z) { - - Random random = new Random((world.getSeed())); - - SimplexOctaveGenerator generator = new SimplexOctaveGenerator(random, 8); - generator.setScale(0.005D); - - int currentFloorHeight = (int) ((generator.noise( - x, z, 1.5D, 0.5D, true) + 1) - * (getOceanGenerator(world.getEnvironment()).maxFloorHeight - getOceanGenerator(world.getEnvironment()).minFloorHeight) - + getOceanGenerator(world.getEnvironment()).minFloorHeight); - - int minHeightWorld = LocationUtils.getMinHeight(world); - - // Generate layer of bedrock - if (world.getBlockAt(x, minHeightWorld, z).getType() != XMaterial.BEDROCK.parseMaterial()) { - if (world.getBlockAt(x, minHeightWorld, z).getState() instanceof InventoryHolder) { - ((InventoryHolder) world.getBlockAt(x, minHeightWorld, z).getState()).getInventory().clear(); - } - world.getBlockAt(x, minHeightWorld, z).setType(Material.BEDROCK, false); - } - - // Generate gravel layer - for (int y = minHeightWorld + 1; y < currentFloorHeight; y++) { - Block block = world.getBlockAt(x, y, z); - if (block.getType() != getOceanGenerator(world.getEnvironment()).underFloor.parseMaterial() - && getOceanGenerator(world.getEnvironment()).underFloor.parseMaterial() != null) { - - if (block.getState() instanceof InventoryHolder) { - ((InventoryHolder) block.getState()).getInventory().clear(); - } - block.setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).underFloor.parseMaterial()), false); - } - } - - // Generate sand on top of gravel - if (world.getBlockAt(x, currentFloorHeight, z).getType() != getOceanGenerator(world.getEnvironment()).floor.parseMaterial() - && getOceanGenerator(world.getEnvironment()).floor.parseMaterial() != null) { - - if (world.getBlockAt(x, currentFloorHeight, z).getState() instanceof InventoryHolder) { - ((InventoryHolder) world.getBlockAt(x, currentFloorHeight, z).getState()).getInventory().clear(); - } - - for(int y = currentFloorHeight; y < currentFloorHeight + 5; y++) { - world.getBlockAt(x, currentFloorHeight, z) - .setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).floor.parseMaterial()), false); - currentFloorHeight++; - } - - } - - // Generate water or lava on top of the floor - for (int y = currentFloorHeight + 1; y <= getOceanGenerator(world.getEnvironment()).liquidHeight; y++) { - Block block = world.getBlockAt(x, y, z); - if (block.getType() != getOceanGenerator(world.getEnvironment()).liquidType.parseMaterial() && getOceanGenerator(world.getEnvironment()).liquidType.parseMaterial() != null) { - if (block.getState() instanceof InventoryHolder) { - ((InventoryHolder) block.getState()).getInventory().clear(); - } - block.setType(getOceanGenerator(world.getEnvironment()).liquidType.parseMaterial(), false); - } - } - - // Replace everything else with air - for (int y = getOceanGenerator(world.getEnvironment()).liquidHeight + 1; y < world.getMaxHeight(); y++) { - Block block = world.getBlockAt(x, y, z); - if (block.getType() != Material.AIR) { - if (block.getState() instanceof InventoryHolder) { - ((InventoryHolder) block.getState()).getInventory().clear(); - } - block.setType(Material.AIR, false); - } - } - - // Generate kelp, ores, and mineral deposits - // BREAKS BELOW 1.18 - //shouldGenerateDecorations(world, random , x, z); - } - - @Override - public boolean shouldGenerateDecorations(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { - return getOceanGenerator(worldInfo.getEnvironment()).decorate; - } - - @Override - public boolean canSpawn(@NotNull World world, int x, int z) { - return getOceanGenerator(world.getEnvironment()).canSpawnEntities; - } - - private Generators.OceanGeneratorWorld getOceanGenerator(Environment environment) { - switch (environment) { - case NETHER: { - return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.nether; - } - case THE_END: { - return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.end; - } - default: { - return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.overworld; - } - } - } +package com.iridium.iridiumskyblock.generators; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import com.iridium.iridiumskyblock.utils.LocationUtils; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.util.noise.SimplexOctaveGenerator; +import org.jetbrains.annotations.NotNull; +import org.bukkit.generator.WorldInfo; + +import java.util.*; +import java.util.stream.Collectors; + +public class OceanGenerator extends IridiumChunkGenerator { + + public OceanGenerator(String name, boolean generatesTerrain, boolean lowerHorizon) { + super(name, generatesTerrain, lowerHorizon); + } + + @Override + public @NotNull ChunkData generateChunkData( + @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { + + SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), IridiumSkyblock.getInstance().getGenerators().simplexTerrainOctave); + generator.setScale(IridiumSkyblock.getInstance().getGenerators().simplexTerrainScale); + + final ChunkData chunkData = createChunkData(world); + + List biomeList = getOceanGenerator(world.getEnvironment()).biomeDataConfig.stream() + .filter(biomeDataConfig -> biomeDataConfig.biome.get() != null) + .map(biomeDataConfig -> biomeDataConfig.biome.get()) + .collect(Collectors.toList()); + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + int currentFloorHeight = (int) ((generator.noise( + chunkX * 16 + x, chunkZ * 16 + z, 1.5D, 0.5D, true) + 1) + * (getOceanGenerator(world.getEnvironment()).maxFloorHeight - getOceanGenerator(world.getEnvironment()).minFloorHeight) + + getOceanGenerator(world.getEnvironment()).minFloorHeight); + + //Generate bedrock + generateBedrock(world, random, x, z, chunkData); + + // Generate vanilla surface terrain + if(IridiumSkyblock.getInstance().getGenerators().generateSurface) { + generateSurface(world, random, x, z, chunkData); + + } else { + // Generate stone layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < currentFloorHeight - 4; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).mantle.get()) + ); + } + + // Generate gravel layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < currentFloorHeight; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).underFloor.get()) + ); + } + + // Generate sand on top of gravel + chunkData.setBlock(x, currentFloorHeight, z, + Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).floor.get()) + ); + + // Generate water or lava on top of the floor + for (int y = currentFloorHeight + 1; y <= getOceanGenerator(world.getEnvironment()).liquidHeight; y++) { + chunkData.setBlock(x, y, z, Objects.requireNonNull( + getOceanGenerator(world.getEnvironment()).liquidType.get())); + } + } + + if(!IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeList.get(random.nextInt(biomeList.size())))); + } + } + } + + return chunkData; + } + + public void generateOcean(World world, int x, int z) { + + Random random = new Random((world.getSeed())); + + SimplexOctaveGenerator generator = new SimplexOctaveGenerator(random, IridiumSkyblock.getInstance().getGenerators().simplexTerrainOctave); + generator.setScale(IridiumSkyblock.getInstance().getGenerators().simplexTerrainScale); + + int currentFloorHeight = (int) ((generator.noise( + x, z, 1.5D, 0.5D, true) + 1) + * (getOceanGenerator(world.getEnvironment()).maxFloorHeight - getOceanGenerator(world.getEnvironment()).minFloorHeight) + + getOceanGenerator(world.getEnvironment()).minFloorHeight); + + int minHeightWorld = LocationUtils.getMinHeight(world); + + if(!IridiumSkyblock.getInstance().getGenerators().generateSurface) { + // Generate stone layer + for (int y = minHeightWorld + 1; y < currentFloorHeight - 4; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getOceanGenerator(world.getEnvironment()).mantle.get() + && getOceanGenerator(world.getEnvironment()).mantle.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).mantle.get()), false); + } + } + + // Generate gravel layer + for (int y = minHeightWorld + 1; y < currentFloorHeight; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getOceanGenerator(world.getEnvironment()).underFloor.get() + && getOceanGenerator(world.getEnvironment()).underFloor.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).underFloor.get()), false); + } + } + + // Generate sand on top of gravel + if (world.getBlockAt(x, currentFloorHeight, z).getType() != getOceanGenerator(world.getEnvironment()).floor.get() + && getOceanGenerator(world.getEnvironment()).floor.get() != null) { + + if (world.getBlockAt(x, currentFloorHeight, z).getState() instanceof InventoryHolder) { + ((InventoryHolder) world.getBlockAt(x, currentFloorHeight, z).getState()).getInventory().clear(); + } + + for(int y = currentFloorHeight; y < currentFloorHeight + 4; y++) { + world.getBlockAt(x, currentFloorHeight, z) + .setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).floor.get()), false); + currentFloorHeight++; + } + } + + // Generate water or lava on top of the floor + for (int y = currentFloorHeight + 1; y <= getOceanGenerator(world.getEnvironment()).liquidHeight; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getOceanGenerator(world.getEnvironment()).liquidType.get() && getOceanGenerator(world.getEnvironment()).liquidType.parseMaterial() != null) { + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).liquidType.get()), true); + } + } + + // Replace everything else with air + for (int y = getOceanGenerator(world.getEnvironment()).liquidHeight + 1; y < world.getMaxHeight(); y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != Material.AIR) { + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Material.AIR, false); + } + } + } + + if(!IridiumSkyblock.getInstance().getGenerators().useLegacyPopulators) { + shouldGenerateCaves(world, random, x, z); + shouldGenerateDecorations(world, random , x, z); + shouldGenerateMobs(world, random, x, z); + } + } + + @Override + public @NotNull List getDefaultPopulators(World world) { + if(IridiumSkyblock.getInstance().getGenerators().useLegacyPopulators) { + return IridiumSkyblock.getInstance().getBlockPopulatorList().get(world.getEnvironment()); + } + return super.getDefaultPopulators(world); + } + + @Override + public boolean shouldGenerateCaves(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getOceanGenerator(worldInfo.getEnvironment()).spawnCaves; + } + + @Override + public boolean shouldGenerateDecorations(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getOceanGenerator(worldInfo.getEnvironment()).decorate; + } + + @Override + public boolean shouldGenerateMobs(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getOceanGenerator(worldInfo.getEnvironment()).spawnEntities; + } + + @Override + public boolean canSpawn(@NotNull World world, int x, int z) { + return getOceanGenerator(world.getEnvironment()).spawnEntities; + } + + private Generators.OceanGeneratorWorld getOceanGenerator(Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.overworld; + } + } + } } \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/OceanGeneratorLegacy.java b/src/main/java/com/iridium/iridiumskyblock/generators/OceanGeneratorLegacy.java new file mode 100644 index 000000000..006226142 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/OceanGeneratorLegacy.java @@ -0,0 +1,211 @@ +package com.iridium.iridiumskyblock.generators; + +import com.cryptomorin.xseries.XMaterial; +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import com.iridium.iridiumskyblock.utils.LocationUtils; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.util.noise.SimplexOctaveGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.stream.Collectors; + +public class OceanGeneratorLegacy extends IridiumChunkGenerator { + + public OceanGeneratorLegacy(String name, boolean generatesTerrain, boolean lowerHorizon) { + super(name, generatesTerrain, lowerHorizon); + } + + SkyblockBiomeProvider biomeProvider = new SkyblockBiomeProvider(); + + @Override + public @NotNull ChunkData generateChunkData( + @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { + + SimplexOctaveGenerator generator = new SimplexOctaveGenerator(new Random(world.getSeed()), + IridiumSkyblock.getInstance().getGenerators().simplexTerrainOctave); + generator.setScale(IridiumSkyblock.getInstance().getGenerators().simplexTerrainScale); + + final ChunkData chunkData = createChunkData(world); + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + int currentFloorHeight = (int) ((generator.noise( + chunkX * 16 + x, chunkZ * 16 + z, 1.5D, 0.5D, true) + 1) + * (getOceanGenerator(world.getEnvironment()).maxFloorHeight - getOceanGenerator(world.getEnvironment()).minFloorHeight) + + getOceanGenerator(world.getEnvironment()).minFloorHeight); + + // Generate layer of bedrock + chunkData.setBlock(x, LocationUtils.getMinHeight(world), z, + Objects.requireNonNull(XMaterial.BEDROCK.get()) + ); + + // Generate stone layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < currentFloorHeight - 5; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).mantle.get()) + ); + } + + // Generate gravel layer + for (int y = currentFloorHeight - 5; y < currentFloorHeight; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).underFloor.get()) + ); + } + + // Generate sand on top of gravel + chunkData.setBlock(x, currentFloorHeight, z, + Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).floor.get()) + ); + + // Generate water or lava on top of the floor + for (int y = currentFloorHeight + 1; y <= getOceanGenerator(world.getEnvironment()).liquidHeight; y++) { + chunkData.setBlock(x, y, z, Objects.requireNonNull( + getOceanGenerator(world.getEnvironment()).liquidType.get())); + } + + if(!IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeProvider.biomeList.get(random.nextInt(biomeProvider.biomeList.size())))); + } else { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeProvider.getBiome(world, x, 0 ,z))); + } + } + } + + return chunkData; + } + + public void generateOcean(World world, int x, int z) { + + Random random = new Random((world.getSeed())); + + SimplexOctaveGenerator generator = new SimplexOctaveGenerator(random, 8); + generator.setScale(0.005D); + + int currentFloorHeight = (int) ((generator.noise( + x, z, 1.5D, 0.5D, true) + 1) + * (getOceanGenerator(world.getEnvironment()).maxFloorHeight - getOceanGenerator(world.getEnvironment()).minFloorHeight) + + getOceanGenerator(world.getEnvironment()).minFloorHeight); + + int minHeightWorld = LocationUtils.getMinHeight(world); + + // Generate layer of bedrock + if (world.getBlockAt(x, minHeightWorld, z).getType() != XMaterial.BEDROCK.get()) { + if (world.getBlockAt(x, minHeightWorld, z).getState() instanceof InventoryHolder) { + ((InventoryHolder) world.getBlockAt(x, minHeightWorld, z).getState()).getInventory().clear(); + } + world.getBlockAt(x, minHeightWorld, z).setType(Material.BEDROCK, false); + } + + // Generate stone layer + for (int y = minHeightWorld + 1; y < currentFloorHeight - 5; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getOceanGenerator(world.getEnvironment()).mantle.get() + && getOceanGenerator(world.getEnvironment()).mantle.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).mantle.get()), false); + } + } + + // Generate gravel on top of stone + for (int y = currentFloorHeight -5; y < currentFloorHeight; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getOceanGenerator(world.getEnvironment()).underFloor.get() + && getOceanGenerator(world.getEnvironment()).underFloor.get() != null) { + + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).underFloor.get()), false); + } + } + + // Generate sand on top of gravel + if (world.getBlockAt(x, currentFloorHeight, z).getType() != getOceanGenerator(world.getEnvironment()).floor.get() + && getOceanGenerator(world.getEnvironment()).floor.get() != null) { + + if (world.getBlockAt(x, currentFloorHeight, z).getState() instanceof InventoryHolder) { + ((InventoryHolder) world.getBlockAt(x, currentFloorHeight, z).getState()).getInventory().clear(); + } + + for(int y = currentFloorHeight; y < currentFloorHeight + 5; y++) { + world.getBlockAt(x, currentFloorHeight, z) + .setType(Objects.requireNonNull(getOceanGenerator(world.getEnvironment()).floor.get()), false); + currentFloorHeight++; + } + + } + + // Generate water or lava on top of the floor + for (int y = currentFloorHeight + 1; y <= getOceanGenerator(world.getEnvironment()).liquidHeight; y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != getOceanGenerator(world.getEnvironment()).liquidType.get() && getOceanGenerator(world.getEnvironment()).liquidType.parseMaterial() != null) { + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(getOceanGenerator(world.getEnvironment()).liquidType.get(), false); + } + } + + // Replace everything else with air + for (int y = getOceanGenerator(world.getEnvironment()).liquidHeight + 1; y < world.getMaxHeight(); y++) { + Block block = world.getBlockAt(x, y, z); + if (block.getType() != Material.AIR) { + if (block.getState() instanceof InventoryHolder) { + ((InventoryHolder) block.getState()).getInventory().clear(); + } + block.setType(Material.AIR, false); + } + } + + // Generate caves + if (getOceanGenerator(world.getEnvironment()).spawnCaves) { + + } + + // Generate lakes, trees, grass, mineral deposits, etc. + if (getOceanGenerator(world.getEnvironment()).decorate) { + + } + + // Spawn mobs + if (getOceanGenerator(world.getEnvironment()).spawnEntities) { + + } + } + + @Override + public @NotNull List getDefaultPopulators(World world) { + if(IridiumSkyblock.getInstance().getBlockPopulatorList().get(world.getEnvironment()) == null) { + return super.getDefaultPopulators(world); + } + return IridiumSkyblock.getInstance().getBlockPopulatorList().get(world.getEnvironment()); + } + + private Generators.OceanGeneratorWorld getOceanGenerator(Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.overworld; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/SkyblockBiomeProvider.java b/src/main/java/com/iridium/iridiumskyblock/generators/SkyblockBiomeProvider.java new file mode 100644 index 000000000..3428687ab --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/SkyblockBiomeProvider.java @@ -0,0 +1,183 @@ +package com.iridium.iridiumskyblock.generators; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.generator.BiomeProvider; +import org.bukkit.generator.WorldInfo; +import org.bukkit.util.noise.SimplexOctaveGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +public class SkyblockBiomeProvider extends BiomeProvider { + + List biomeList = new ArrayList<>(); + + @Override + public @NotNull Biome getBiome(@NotNull WorldInfo worldInfo, int x, int y, int z) { + + // Apparently this can happen. + if(worldInfo == null) { return Biome.THE_VOID; } + + // APPARENTLY THIS CAN HAPPEN??? + if(biomeList.isEmpty()) { + getBiomes(worldInfo); + } + + if(biomeList.size() == 1) { + return biomeList.get(0); + } + + return getBiomeFromNoise(worldInfo, x, z); + } + + // This is a required override to tell the generator what biomes its allowed to use. + @Override + @NotNull + public List getBiomes(@NotNull WorldInfo worldInfo) { + + this.biomeList = sortBiomeData(validateList(getBiomeDataConfig(worldInfo.getEnvironment()))); + + IridiumSkyblock.getInstance().getLogger().info("Biomes for: " + worldInfo.getName()); + for(int i = 0; i < biomeList.size(); i++) { + IridiumSkyblock.getInstance().getLogger().info((i + 1) + " - " + biomeList.get(i).toString()); + } + + return biomeList; + } + + private List validateList(List biomeDataConfigList) { + + for(Generators.BiomeDataConfig biomeDataConfig : biomeDataConfigList) { + if(biomeDataConfig.biome.get() == null) { + IridiumSkyblock.getInstance().getLogger().warning("XBiome: \"" + biomeDataConfig.biome + "\" cannot be read."); + IridiumSkyblock.getInstance().getLogger().warning("Removing this entry from the list."); + } + } + + List listCopy = biomeDataConfigList.stream().filter( + biomeDataConfig -> biomeDataConfig.biome.get() != null).collect(Collectors.toList()); + + return listCopy; + } + + private List sortBiomeData(List biomeDataConfigList) { + + List sortedList = biomeDataConfigList.stream() + .sorted((entry1, entry2) -> { + Generators.BiomeData biome1 = entry1.biomeData; + Generators.BiomeData biome2 = entry2.biomeData; + + int temperatureCompare = Double.compare(biome1.temperature, biome2.temperature); + if (temperatureCompare != 0) return temperatureCompare; + + int humidityCompare = Double.compare(biome1.humidity, biome2.humidity - 1); + if (humidityCompare != 0) return humidityCompare; + + return Double.compare(biome1.height, biome2.height); + }).collect(Collectors.toList()); + + if(IridiumSkyblock.getInstance().getGenerators().inverseBiomeGradient) { + Collections.reverse(sortedList); + } + + // Not using a stream here because we need to ensure this stays in order. + List biomeList = new ArrayList<>(); + for(Generators.BiomeDataConfig biomeDataConfig : sortedList) { + biomeList.add(biomeDataConfig.biome.get()); + } + + return biomeList; + } + + private Biome getBiomeFromNoise(WorldInfo worldInfo, int x, int z) { + + Random random = new Random(worldInfo.getSeed()); + + // Noise is always a value between -1 and 1. + // Here, we're associating a noise value with an index value in the array. + + SimplexOctaveGenerator generator = new SimplexOctaveGenerator(random, IridiumSkyblock.getInstance().getGenerators().simplexBiomeOctave); + generator.setScale(IridiumSkyblock.getInstance().getGenerators().simplexBiomeScale); + + double noise = generator.noise(x, z, 1, 2, true); + int normalizedIndex; + + if(IridiumSkyblock.getInstance().getGenerators().biomeCurve) { + normalizedIndex = (int) (0.5 * Math.pow(((noise + 1) * 0.5 * biomeList.size()), 2)); + } else { + normalizedIndex = (int) ((noise + 1) * 0.5 * biomeList.size()); + } + + // Coin flip + if(IridiumSkyblock.getInstance().getGenerators().increaseRandom) { + if(random.nextBoolean()) { + normalizedIndex = random.nextBoolean() ? normalizedIndex + 1 : normalizedIndex - 1; + } + } + + // Checks + if(normalizedIndex >= biomeList.size()) normalizedIndex = biomeList.size() - 1; + if(normalizedIndex < 0) normalizedIndex = 0; + + return biomeList.get(normalizedIndex); + } + + private List getBiomeDataConfig(@NotNull World.Environment environment) { + switch(IridiumSkyblock.getInstance().getConfiguration().generatorType.toLowerCase()) { + case "superflat": {} + case "superflat-legacy": { return getFlatGenerator(environment).biomeDataConfig; } + case "ocean": {} + case "ocean-legacy": { return getOceanGenerator(environment).biomeDataConfig; } + default: { return getSkyblockGenerator(environment).biomeDataConfig; } + } + } + + private Generators.FlatGeneratorWorld getFlatGenerator(World.Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().flatGenerator.overworld; + } + } + } + + private Generators.OceanGeneratorWorld getOceanGenerator(World.Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().oceanGenerator.overworld; + } + } + } + + private Generators.SkyblockGeneratorWorld getSkyblockGenerator(World.Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.overworld; + } + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/SkylandsGenerator.java b/src/main/java/com/iridium/iridiumskyblock/generators/SkylandsGenerator.java new file mode 100644 index 000000000..2149cfb77 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/SkylandsGenerator.java @@ -0,0 +1,233 @@ +package com.iridium.iridiumskyblock.generators; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import com.iridium.iridiumskyblock.utils.LocationUtils; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.WorldInfo; +import org.bukkit.util.noise.SimplexOctaveGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.stream.Collectors; + +public class SkylandsGenerator extends IridiumChunkGenerator { + + public SkylandsGenerator(String name, boolean generatesTerrain, boolean lowerHorizon) { + super(name, generatesTerrain, lowerHorizon); + } + + @Override + public @NotNull ChunkData generateChunkData( + @NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { + + SimplexOctaveGenerator generatorX = new SimplexOctaveGenerator(new Random(world.getSeed()), IridiumSkyblock.getInstance().getGenerators().simplexTerrainOctave); + generatorX.setScale(IridiumSkyblock.getInstance().getGenerators().simplexTerrainScale); + + SimplexOctaveGenerator generatorY = new SimplexOctaveGenerator(new Random(world.getSeed()), IridiumSkyblock.getInstance().getGenerators().simplexTerrainOctave); + generatorY.setScale(IridiumSkyblock.getInstance().getGenerators().simplexTerrainScale); + + final ChunkData chunkData = createChunkData(world); + + List biomeList = getSkylandsGenerator(world.getEnvironment()).biomeDataConfig.stream() + .filter(biomeDataConfig -> biomeDataConfig.biome.get() != null) + .map(biomeDataConfig -> biomeDataConfig.biome.get()) + .collect(Collectors.toList()); + + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + int currentFloorHeight = (int) ((generatorX.noise( + chunkX * 16 + x, chunkZ * 16 + z, 1.5D, 0.5D, true) + 1) + * (getSkylandsGenerator(world.getEnvironment()).maxFloorHeight - getSkylandsGenerator(world.getEnvironment()).minFloorHeight) + + getSkylandsGenerator(world.getEnvironment()).minFloorHeight); + + currentFloorHeight = (int) (generatorX.noise( + (chunkX * 16 + xl | chunkZ * 8 + chunkX * 8 + X | baseX + X, + chunkZ * 16 + xz | chunkZ * 8 + chunkX * 8 + Z | baseZ + Z, + frequency, amplitude) + * 7D + 150); + + for (int y = currentHeight; y > 150 - (generatorX.noise( + chunkX * 16 + xl | chunkZ * 8 + chunkX * 8 + X | baseX + X, + chunkZ * 16 + xz | chunkZ * 8 + chunkX * 8 + Z | baseZ + Z, + frequency, amplitude) + * 7D - 13D); y--) { + + if (generatorX.noise( + chunkX * 16 + xl | chunkZ * 8 + chunkX * 8 + X | baseX + X, + chunkZ * 16 + xz | chunkZ * 8 + chunkX * 8 + Z | baseZ + Z, + frequency, amplitude) > spawnrate) { + + if (y == currentHeight) { + if (world.getBiome(chunkX * 16 + xl, chunkZ * 16 + xz).equals(Biome.DESERT) || world.getBiome(chunkX * 16 + xl, chunkZ * 16 + xz).equals(Biome.DESERT_HILLS) || world.getBiome(chunkX * 16 + xl, chunkZ * 16 + xz).equals(Biome.DESERT_MOUNTAINS)) { + chunk.setBlock(X, y, Z, Material.SAND); + } else { + chunk.setBlock(X, y, Z, Material.GRASS); + + } + } else { + if (y == currentHeight - 1) { + chunk.setBlock(X, y, Z, Material.DIRT); + + + } else { + chunk.setBlock(X, y, Z, new Random().nextBoolean() ? Material.COBBLESTONE : Material.STONE); + + } + } + } + + if (aplitudeether2 == true) { + currentHeight = (int) (generatorY.noise( + chunkX * 16 + X, + chunkZ * 16 + Z, + frequency2, aplitude2) * 7D + p100); + + for (int y = currentHeight; y > p100 - (generatorY.noise( + chunkX * 16 + X, + chunkZ * 16 + Z, + frequency2, aplitude2) * 7D - 13D); y--) { + + if (generatorY.noise( + chunkX * 16 + X, + chunkZ * 16 + Z, + frequency2, aplitude2) > spawnrate2) { + + if (y == currentHeight) { + if (world.getBiome( + chunkX * 16 + X, chunkZ * 16 + Z).equals(Biome.DESERT) + || world.getBiome(chunkX * 16 + X, chunkZ * 16 + Z).equals(Biome.DESERT_HILLS) + || world.getBiome(chunkX * 16 + X, chunkZ * 16 + Z).equals(Biome.DESERT_MOUNTAINS)) { + chunk.setBlock(X, y, Z, Material.SAND); + } else { + chunk.setBlock(X, y, Z, Material.GRASS); + } + } else { + if (y == currentHeight - 1) { + chunk.setBlock(X, y, Z, Material.DIRT); + + } else { + chunk.setBlock(X, y, Z, new Random().nextBoolean() ? Material.COBBLESTONE : Material.STONE); + } + } + } + } + + if (aplitudeether2 == true) { + currentHeight = (int) (generatorY.noise(chunkX * 16 + X, chunkZ * 16 + Z, frequency2, aplitude2) * 7D + p100); + for (int y = currentHeight; y > p100 - (generatorY.noise(chunkX * 16 + X, chunkZ * 16 + Z, frequency2, aplitude2) * 7D - 13D); y--) { + if (generatorY.noise(chunkX * 16 + X, chunkZ * 16 + Z, frequency2, aplitude2) > spawnrate2) { + if (y == currentHeight) { + if (world.getBiome(chunkX * 16 + X, chunkZ * 16 + Z).equals(Biome.DESERT) || world.getBiome(chunkX * 16 + X, chunkZ * 16 + Z).equals(Biome.DESERT_HILLS) || world.getBiome(chunkX * 16 + X, chunkZ * 16 + Z).equals(Biome.DESERT_MOUNTAINS)) { + chunk.setBlock(X, y, Z, Material.SAND); + } else { + chunk.setBlock(X, y, Z, Material.GRASS); + } + } else { + if (y == currentHeight - 1) { + chunk.setBlock(X, y, Z, Material.DIRT); + + } else { + chunk.setBlock(X, y, Z, new Random().nextBoolean() ? Material.COBBLESTONE : Material.STONE); + } + } + } + } + } + } + + //Generate bedrock + generateBedrock(world, random, x, z, chunkData); + + // Generate vanilla surface terrain + if (IridiumSkyblock.getInstance().getGenerators().generateSurface) { + generateSurface(world, random, x, z, chunkData); + + } else { + // Generate stone layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < currentFloorHeight - 4; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getSkylandsGenerator(world.getEnvironment()).mantle.get()) + ); + } + + // Generate gravel layer + for (int y = LocationUtils.getMinHeight(world) + 1; y < currentFloorHeight; y++) { + chunkData.setBlock(x, y, z, + Objects.requireNonNull(getSkylandsGenerator(world.getEnvironment()).underFloor.get()) + ); + } + + // Generate sand on top of gravel + chunkData.setBlock(x, currentFloorHeight, z, + Objects.requireNonNull(getSkylandsGenerator(world.getEnvironment()).floor.get()) + ); + + // Generate water or lava on top of the floor + for (int y = currentFloorHeight + 1; y <= getSkylandsGenerator(world.getEnvironment()).liquidHeight; y++) { + chunkData.setBlock(x, y, z, Objects.requireNonNull( + getSkylandsGenerator(world.getEnvironment()).liquidType.get())); + } + } + + if (!IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + biomeGrid.setBiome(x, z, Objects.requireNonNull(biomeList.get(random.nextInt(biomeList.size())))); + } + } + } + + return chunkData; + } + } + + @Override + public @NotNull List getDefaultPopulators(World world) { + if(IridiumSkyblock.getInstance().getGenerators().useLegacyPopulators) { + return IridiumSkyblock.getInstance().getBlockPopulatorList().get(world.getEnvironment()); + } + return super.getDefaultPopulators(world); + } + + @Override + public boolean shouldGenerateCaves(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getSkylandsGenerator(worldInfo.getEnvironment()).spawnCaves; + } + + @Override + public boolean shouldGenerateDecorations(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getSkylandsGenerator(worldInfo.getEnvironment()).decorate; + } + + @Override + public boolean shouldGenerateMobs(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z) { + return getSkylandsGenerator(worldInfo.getEnvironment()).spawnEntities; + } + + @Override + public boolean canSpawn(@NotNull World world, int x, int z) { + return getSkylandsGenerator(world.getEnvironment()).spawnEntities; + } + + private Generators.SkylandsGeneratorWorld getSkylandsGenerator(World.Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().skylandsGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().skylandsGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().skylandsGenerator.overworld; + } + } + } +} + + +// Modified version of AetherGen from +// https://github.com/LoganTheOverlord/AetherGen/blob/master/src/me/Logaaan/wg/CustomGen.java \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/VoidGenerator.java b/src/main/java/com/iridium/iridiumskyblock/generators/VoidGenerator.java index 554032dea..223d18ec8 100644 --- a/src/main/java/com/iridium/iridiumskyblock/generators/VoidGenerator.java +++ b/src/main/java/com/iridium/iridiumskyblock/generators/VoidGenerator.java @@ -1,60 +1,62 @@ -package com.iridium.iridiumskyblock.generators; - -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.configs.Generators; -import org.bukkit.World; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.generator.ChunkGenerator; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Random; - -public class VoidGenerator extends ChunkGenerator { - - public byte[][] blockSections; - - @Override - public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { - final ChunkData chunkData = createChunkData(world); - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - biomeGrid.setBiome(x, z, Objects.requireNonNull(getSkyblockGenerator(world.getEnvironment()).biome.getBiome())); - } - } - return chunkData; - } - - public byte[][] generateBlockSections(World world, Random random, int x, int z, BiomeGrid biomeGrid) { - if (blockSections == null) { - blockSections = new byte[world.getMaxHeight() / 16][]; - } - return blockSections; - } - - @Override - public boolean canSpawn(@NotNull World world, int x, int z) { - return getSkyblockGenerator(world.getEnvironment()).canSpawnEntities; - } - - @Override - public @NotNull List getDefaultPopulators(@NotNull World world) { - return Collections.emptyList(); - } - - private Generators.SkyblockGeneratorWorld getSkyblockGenerator(World.Environment environment) { - switch (environment) { - case NETHER: { - return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.nether; - } - case THE_END: { - return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.end; - } - default: { - return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.overworld; - } - } - } -} +package com.iridium.iridiumskyblock.generators; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Generators; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class VoidGenerator extends IridiumChunkGenerator { + + public VoidGenerator(String name, boolean generatesTerrain, boolean lowerHorizon) { + super(name, generatesTerrain, lowerHorizon); + } + + public byte[][] blockSections; + + @Override + public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biomeGrid) { + final ChunkData chunkData = createChunkData(world); + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + biomeGrid.setBiome(x, z, getSkyblockGenerator(world.getEnvironment()).biomeDataConfig.stream().findFirst().get().biome.get()); + } + } + return chunkData; + } + + public byte[][] generateBlockSections(World world, Random random, int x, int z, BiomeGrid biomeGrid) { + if (blockSections == null) { + blockSections = new byte[world.getMaxHeight() / 16][]; + } + return blockSections; + } + + @Override + public boolean canSpawn(@NotNull World world, int x, int z) { + return getSkyblockGenerator(world.getEnvironment()).spawnEntities; + } + + @Override + public @NotNull List getDefaultPopulators(@NotNull World world) { + return Collections.emptyList(); + } + + private Generators.SkyblockGeneratorWorld getSkyblockGenerator(World.Environment environment) { + switch (environment) { + case NETHER: { + return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.nether; + } + case THE_END: { + return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.end; + } + default: { + return IridiumSkyblock.getInstance().getGenerators().skyblockGenerator.overworld; + } + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/KelpBlockPopulator.java b/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/KelpBlockPopulator.java new file mode 100644 index 000000000..80135e895 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/KelpBlockPopulator.java @@ -0,0 +1,108 @@ +package com.iridium.iridiumskyblock.generators.blockPopulators; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import org.bukkit.*; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.generator.BlockPopulator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +public class KelpBlockPopulator extends BlockPopulator { + + List greenBiomes = Arrays.asList( + Biome.OCEAN, + Biome.DEEP_OCEAN, + Biome.LUKEWARM_OCEAN, + Biome.DEEP_LUKEWARM_OCEAN, + Biome.COLD_OCEAN, + Biome.DEEP_COLD_OCEAN + ); + + List greenBlocks = Arrays.asList( + Material.GRAVEL, + Material.SAND, + Material.DIRT + ); + + @Override + public void populate(World world, Random random, Chunk chunk) { + + // If biome isn't in chunk, skip chunk + //for(Biome biome: greenBiomes) { + // if(!chunk.contains(biome)) return; + //} + + // minHeight() does not exist pre-1.17 + int minHeight = 0; + try { + minHeight = world.getMinHeight(); + } catch(NoSuchMethodError ignored) {} + + // Build x and z coordinates + int xHits = random.nextInt(16); + int zHits = random.nextInt(16); + + List xCoords = new ArrayList<>(); + List zCoords = new ArrayList<>(); + + for(int i = 0; i < xHits; i++) { + int coord = random.nextInt(16); + xCoords.add(coord); + } + + for(int i = 0; i < zHits; i++) { + int coord = random.nextInt(16); + zCoords.add(coord); + } + + // Chunksnapshots are generally safer to work on + ChunkSnapshot chunkSnapshot = chunk.getChunkSnapshot(); + + for(Integer x: xCoords) { + for(Integer z: zCoords) { + for(int y = world.getMaxHeight() - 1; y > minHeight; y--) { + + Block block = chunk.getBlock(x, y, z); + + // If NOT in biome, skip column + // Since biomes have a Y value now, too + if(greenBiomes.stream().noneMatch(biomeType -> biomeType == block.getBiome())) { break; } + + BlockData blockData = chunkSnapshot.getBlockData(x, y, z); + + // If NOT in water, skip block + if (blockData.getMaterial() != Material.WATER) { continue; } + + // If NOT above block, skip block + Material underBlock = chunkSnapshot.getBlockData(x, y - 1, z).getMaterial(); + if (greenBlocks.stream().noneMatch(blockType -> blockType == underBlock)) { continue; } + + // Set kelp + block.setType(Material.KELP_PLANT, true); + + // Grow kelp + int count = 1; + for(int age = random.nextInt(2, 25); age < 25; age++) { + Material overBlock = chunkSnapshot.getBlockData(x, y + count, z).getMaterial(); + Material overBlock2 = chunkSnapshot.getBlockData(x, y + count + 1, z).getMaterial(); + if(overBlock != Material.WATER + || (overBlock == Material.WATER && overBlock2 != Material.WATER)) { + break; + } + chunk.getBlock(x, y + count, z).setType(Material.KELP_PLANT, true); + count++; + } + + // Skip rest of column + break; + } + } + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/MagmaBlockPopulator.java b/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/MagmaBlockPopulator.java new file mode 100644 index 000000000..d02c97fec --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/MagmaBlockPopulator.java @@ -0,0 +1,74 @@ +package com.iridium.iridiumskyblock.generators.blockPopulators; + +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.util.noise.SimplexNoiseGenerator; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +public class MagmaBlockPopulator extends BlockPopulator { + + @Override + public void populate(World world, Random random, Chunk chunk) { + SimplexNoiseGenerator generator = new SimplexNoiseGenerator(random); + + int minHeight = 0; + + List air = Arrays.asList( + Material.AIR, + Material.CAVE_AIR, + Material.VOID_AIR + ); + + List greenBlocks = Arrays.asList( + Material.GRAVEL, + Material.DIRT, + Material.STONE + ); + + List greenBiomes = Arrays.asList( + Biome.OCEAN, + Biome.DEEP_OCEAN, + Biome.LUKEWARM_OCEAN, + Biome.DEEP_LUKEWARM_OCEAN, + Biome.WARM_OCEAN, + Biome.COLD_OCEAN, + Biome.DEEP_COLD_OCEAN, + Biome.FROZEN_OCEAN, + Biome.DEEP_FROZEN_OCEAN + ); + + try { + minHeight = world.getMinHeight(); + } catch(NoSuchMethodError ignored) {} + + for(int x=0; x<16; x++) { + for(int z = 0; z < 16; z++) { + for(int y = minHeight; y < world.getMaxHeight(); y++) { + + Block block = chunk.getBlock(x, y, z); + if (air.stream().noneMatch(blockType -> blockType == block.getType())) { continue; } + + Biome biome = block.getBiome(); + if(greenBiomes.stream().noneMatch(biomeType -> biomeType == biome)) { continue; } + + if (block.getType() != Material.WATER) { continue; } + + Material underBlock = chunk.getBlock(x, y - 1, z).getType(); + if (greenBlocks.stream().noneMatch(blockType -> blockType == underBlock)) { continue; } + + // Range is from -1 to 1. + if (generator.getNoise(x, z) > 0.82) { continue; } + + chunk.getBlock(x, y - 1, z).setType(Material.MAGMA_BLOCK, true); + } + } + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/SeagrassBlockPopulator.java b/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/SeagrassBlockPopulator.java new file mode 100644 index 000000000..71cd7c9c5 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/generators/blockPopulators/SeagrassBlockPopulator.java @@ -0,0 +1,77 @@ +package com.iridium.iridiumskyblock.generators.blockPopulators; + +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.util.noise.SimplexNoiseGenerator; + +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +public class SeagrassBlockPopulator extends BlockPopulator { + + @Override + public void populate(World world, Random random, Chunk chunk) { + SimplexNoiseGenerator generator = new SimplexNoiseGenerator(random); + + int minHeight = 0; + + List air = Arrays.asList( + Material.AIR, + Material.CAVE_AIR, + Material.VOID_AIR + ); + + List greenBlocks = Arrays.asList( + Material.GRAVEL, + Material.SAND, + Material.DIRT + ); + + List greenBiomes = Arrays.asList( + Biome.OCEAN, + Biome.DEEP_OCEAN, + Biome.LUKEWARM_OCEAN, + Biome.DEEP_LUKEWARM_OCEAN, + Biome.WARM_OCEAN, + Biome.COLD_OCEAN, + Biome.DEEP_COLD_OCEAN + ); + + try { + minHeight = world.getMinHeight(); + } catch(NoSuchMethodError ignored) {} + + for(int x=0; x<16; x++) { + for(int z = 0; z < 16; z++) { + for(int y = minHeight; y < world.getMaxHeight(); y++) { + + Block block = chunk.getBlock(x, y, z); + if (air.stream().noneMatch(blockType -> blockType == block.getType())) { continue; } + + Biome biome = block.getBiome(); + + if(greenBiomes.stream().noneMatch(biomeType -> biomeType == biome)) { continue; } + + if (block.getType() != Material.WATER) { continue; } + + Material underBlock = chunk.getBlock(x, y - 1, z).getType(); + if (greenBlocks.stream().noneMatch(blockType -> blockType == underBlock)) { continue; } + + // Range is from -1 to 1. + if (generator.getNoise(x, z) > 0.079) { continue; } + + if(random.nextBoolean()) { + chunk.getBlock(x, y, z).setType(Material.SEAGRASS, true); + } else if (chunk.getBlock(x, y + 1, z).getType() == Material.WATER) { + chunk.getBlock(x, y, z).setType(Material.TALL_SEAGRASS, true); + } + } + } + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/listeners/ProtocolLibPacketListener.java b/src/main/java/com/iridium/iridiumskyblock/listeners/ProtocolLibPacketListener.java new file mode 100644 index 000000000..3aacebb0f --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/listeners/ProtocolLibPacketListener.java @@ -0,0 +1,21 @@ +package com.iridium.iridiumskyblock.listeners; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.ListenerPriority; +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.utils.ProtocolLibUtils.IridiumPacketAdapter; + +public class ProtocolLibPacketListener { + + public void registerListeners() { + try { + ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + protocolManager.addPacketListener(new IridiumPacketAdapter(IridiumSkyblock.getInstance(), ListenerPriority.HIGH, PacketType.Play.Server.LOGIN)); + protocolManager.addPacketListener(new IridiumPacketAdapter(IridiumSkyblock.getInstance(), ListenerPriority.HIGH, PacketType.Play.Server.RESPAWN)); + } catch (NoClassDefFoundError e) { + IridiumSkyblock.getInstance().getLogger().severe(e.getMessage()); + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/managers/BiomeManager.java b/src/main/java/com/iridium/iridiumskyblock/managers/BiomeManager.java index 23752f012..e6e68f750 100644 --- a/src/main/java/com/iridium/iridiumskyblock/managers/BiomeManager.java +++ b/src/main/java/com/iridium/iridiumskyblock/managers/BiomeManager.java @@ -1,122 +1,130 @@ -package com.iridium.iridiumskyblock.managers; - -import com.cryptomorin.xseries.XBiome; -import com.iridium.iridiumcore.utils.StringUtils; -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.configs.Biomes; -import com.iridium.iridiumskyblock.database.Island; -import com.iridium.iridiumskyblock.database.User; -import com.iridium.iridiumteams.database.IridiumUser; -import com.iridium.iridiumteams.database.TeamBank; -import net.milkbowl.vault.economy.Economy; -import org.apache.commons.lang.WordUtils; -import org.bukkit.entity.Player; - -import java.util.Optional; - -public class BiomeManager { - - public void buy(Player player, Biomes.BiomeItem biomeItem) { - XBiome biome = biomeItem.biome; - User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); - Optional island = user.getIsland(); - - if (!canPurchase(player, biomeItem)) { - IridiumSkyblock.getInstance().getBiomes().failSound.play(player); - return; - } - - if (!island.isPresent()) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().dontHaveTeam - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - )); - return; - } - - purchase(player, biomeItem); - - IridiumSkyblock.getInstance().getCommands().biomeCommand.getCooldownProvider().applyCooldown(player); - - IridiumSkyblock.getInstance().getIslandManager().setIslandBiome(island.get(), biome); - IridiumSkyblock.getInstance().getTeamManager().getTeamMembers(island.get()).stream().map(IridiumUser::getPlayer).forEach((teamMember) -> { - if (teamMember != null) { - teamMember.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().changedBiome - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - .replace("%player%", player.getName()) - .replace("%biome%", WordUtils.capitalizeFully(biome.friendlyName())) - )); - } - }); - IridiumSkyblock.getInstance().getBiomes().successSound.play(player); - - } - - private double getBankBalance(Player player, String bankItem) { - User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); - return IridiumSkyblock.getInstance().getTeamManager().getTeamViaID(user.getTeamID()) - .map(team -> IridiumSkyblock.getInstance().getTeamManager().getTeamBank(team, bankItem)) - .map(TeamBank::getNumber) - .orElse(0.0); - } - - private void setBankBalance(Player player, String bankItem, double amount) { - User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); - Optional team = IridiumSkyblock.getInstance().getTeamManager().getTeamViaID(user.getTeamID()); - if (!team.isPresent()) return; - IridiumSkyblock.getInstance().getTeamManager().getTeamBank(team.get(), bankItem).setNumber(amount); - } - - private boolean canPurchase(Player player, Biomes.BiomeItem biomeItem) { - - if (biomeItem.minLevel > 1) { - User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); - Optional island = IridiumSkyblock.getInstance().getIslandManager().getTeamViaID(user.getTeamID()); - - if (!island.isPresent()) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().dontHaveTeam - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix))); - return false; - } - - if (island.get().getLevel() < biomeItem.minLevel) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().notHighEnoughLevel - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - .replace("%level%", String.valueOf(biomeItem.minLevel)))); - return false; - } - } - - double moneyCost = biomeItem.buyCost.money; - Economy economy = IridiumSkyblock.getInstance().getEconomy(); - for (String bankItem : biomeItem.buyCost.bankItems.keySet()) { - double cost = biomeItem.buyCost.bankItems.get(bankItem); - if (getBankBalance(player, bankItem) < cost) return false; - } - - if (!(moneyCost == 0 || economy != null && economy.getBalance(player) >= moneyCost)) { - player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().cannotAfford - .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) - )); - return false; - } - - return true; - } - - private void purchase(Player player, Biomes.BiomeItem biomeItem) { - double moneyCost = biomeItem.buyCost.money; - IridiumSkyblock.getInstance().getEconomy().withdrawPlayer(player, moneyCost); - - for (String bankItem : biomeItem.buyCost.bankItems.keySet()) { - double cost = biomeItem.buyCost.bankItems.get(bankItem); - setBankBalance(player, bankItem, getBankBalance(player, bankItem) - cost); - } - } - - public String formatPrice(double value) { - if (IridiumSkyblock.getInstance().getBiomes().abbreviatePrices) { - return IridiumSkyblock.getInstance().getConfiguration().numberFormatter.format(value); - } - return String.valueOf(value); - } -} +package com.iridium.iridiumskyblock.managers; + +import com.cryptomorin.xseries.XBiome; +import com.iridium.iridiumcore.utils.StringUtils; +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.Biomes; +import com.iridium.iridiumskyblock.database.Island; +import com.iridium.iridiumskyblock.database.User; +import com.iridium.iridiumteams.database.IridiumUser; +import com.iridium.iridiumteams.database.TeamBank; +import net.milkbowl.vault.economy.Economy; +import org.apache.commons.lang.WordUtils; +import org.bukkit.entity.Player; + +import java.util.Optional; + +public class BiomeManager { + + public void buy(Player player, Biomes.BiomeItem biomeItem) { + XBiome biome = biomeItem.biome; + User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); + Optional island = user.getIsland(); + Optional biomeOptional = XBiome.of(biomeItem.biome.toString()); + + if (!canPurchase(player, biomeItem)) { + IridiumSkyblock.getInstance().getBiomes().failSound.play(player); + return; + } + + if (!biomeOptional.isPresent()) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().noBiome + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return; + } + + if (!island.isPresent()) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().dontHaveTeam + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return; + } + + purchase(player, biomeItem); + + IridiumSkyblock.getInstance().getCommands().biomeCommand.getCooldownProvider().applyCooldown(player); + + IridiumSkyblock.getInstance().getIslandManager().setIslandBiome(island.get(), biomeOptional.get()); + IridiumSkyblock.getInstance().getTeamManager().getTeamMembers(island.get()).stream().map(IridiumUser::getPlayer).forEach((teamMember) -> { + if (teamMember != null) { + teamMember.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().changedBiome + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + .replace("%player%", player.getName()) + .replace("%biome%", WordUtils.capitalizeFully(biome.toString().toLowerCase().replace("_", " "))) + )); + } + }); + IridiumSkyblock.getInstance().getBiomes().successSound.play(player); + + } + + private double getBankBalance(Player player, String bankItem) { + User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); + return IridiumSkyblock.getInstance().getTeamManager().getTeamViaID(user.getTeamID()) + .map(team -> IridiumSkyblock.getInstance().getTeamManager().getTeamBank(team, bankItem)) + .map(TeamBank::getNumber) + .orElse(0.0); + } + + private void setBankBalance(Player player, String bankItem, double amount) { + User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); + Optional team = IridiumSkyblock.getInstance().getTeamManager().getTeamViaID(user.getTeamID()); + if (!team.isPresent()) return; + IridiumSkyblock.getInstance().getTeamManager().getTeamBank(team.get(), bankItem).setNumber(amount); + } + + private boolean canPurchase(Player player, Biomes.BiomeItem biomeItem) { + + if(biomeItem.minLevel > 1) { + User user = IridiumSkyblock.getInstance().getUserManager().getUser(player); + Optional island = IridiumSkyblock.getInstance().getIslandManager().getTeamViaID(user.getTeamID()); + + if(!island.isPresent()) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().dontHaveTeam + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix))); + return false; + } + + if(island.get().getLevel() < biomeItem.minLevel) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().notHighEnoughLevel + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + .replace("%level%", String.valueOf(biomeItem.minLevel)))); + return false; + } + } + + double moneyCost = biomeItem.buyCost.money; + Economy economy = IridiumSkyblock.getInstance().getEconomy(); + for (String bankItem : biomeItem.buyCost.bankItems.keySet()) { + double cost = biomeItem.buyCost.bankItems.get(bankItem); + if (getBankBalance(player, bankItem) < cost) return false; + } + + if(!(moneyCost == 0 || economy != null && economy.getBalance(player) >= moneyCost)) { + player.sendMessage(StringUtils.color(IridiumSkyblock.getInstance().getMessages().cannotAfford + .replace("%prefix%", IridiumSkyblock.getInstance().getConfiguration().prefix) + )); + return false; + } + + return true; + } + + private void purchase(Player player, Biomes.BiomeItem biomeItem) { + double moneyCost = biomeItem.buyCost.money; + IridiumSkyblock.getInstance().getEconomy().withdrawPlayer(player, moneyCost); + + for (String bankItem : biomeItem.buyCost.bankItems.keySet()) { + double cost = biomeItem.buyCost.bankItems.get(bankItem); + setBankBalance(player, bankItem, getBankBalance(player, bankItem) - cost); + } + } + + public String formatPrice(double value) { + if (IridiumSkyblock.getInstance().getBiomes().abbreviatePrices) { + return IridiumSkyblock.getInstance().getConfiguration().numberFormatter.format(value); + } + return String.valueOf(value); + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/managers/DatabaseManager.java b/src/main/java/com/iridium/iridiumskyblock/managers/DatabaseManager.java index 182b3b09d..8259398a0 100644 --- a/src/main/java/com/iridium/iridiumskyblock/managers/DatabaseManager.java +++ b/src/main/java/com/iridium/iridiumskyblock/managers/DatabaseManager.java @@ -1,126 +1,136 @@ -package com.iridium.iridiumskyblock.managers; - -import com.iridium.iridiumskyblock.IridiumSkyblock; -import com.iridium.iridiumskyblock.configs.SQL; -import com.iridium.iridiumskyblock.database.Island; -import com.iridium.iridiumskyblock.database.LostItems; -import com.iridium.iridiumskyblock.managers.tablemanagers.*; -import com.iridium.iridiumteams.database.*; -import com.iridium.iridiumteams.database.types.*; -import com.j256.ormlite.field.DataPersisterManager; -import com.j256.ormlite.jdbc.JdbcConnectionSource; -import com.j256.ormlite.jdbc.db.DatabaseTypeUtils; -import com.j256.ormlite.logger.LoggerFactory; -import com.j256.ormlite.logger.NullLogBackend; -import com.j256.ormlite.support.ConnectionSource; -import lombok.AccessLevel; -import lombok.Getter; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.sql.SQLException; -import java.util.concurrent.CompletableFuture; - -@Getter -public class DatabaseManager { - - @Getter(AccessLevel.NONE) - private ConnectionSource connectionSource; - - private UserTableManager userTableManager; - private IslandTableManager islandTableManager; - private LostItemsTableManager lostItemsTableManager; - private TableManager teamMissionDataTableManager; - private ForeignIslandTableManager invitesTableManager; - private ForeignIslandTableManager trustTableManager; - private ForeignIslandTableManager permissionsTableManager; - private ForeignIslandTableManager bankTableManager; - private ForeignIslandTableManager enhancementTableManager; - private ForeignIslandTableManager teamBlockTableManager; - private ForeignIslandTableManager teamSpawnerTableManager; - private ForeignIslandTableManager teamWarpTableManager; - private ForeignIslandTableManager teamMissionTableManager; - private ForeignIslandTableManager teamRewardsTableManager; - private ForeignIslandTableManager teamSettingsTableManager; - private SqlTableManager teamLogsTableManager; - - public void init() throws SQLException { - LoggerFactory.setLogBackendFactory(new NullLogBackend.NullLogBackendFactory()); - - SQL sqlConfig = IridiumSkyblock.getInstance().getSql(); - String databaseURL = getDatabaseURL(sqlConfig); - - DataPersisterManager.registerDataPersisters(XMaterialType.getSingleton()); - DataPersisterManager.registerDataPersisters(XEntityTypeType.getSingleton()); - DataPersisterManager.registerDataPersisters(XPotionType.getSingleton()); - DataPersisterManager.registerDataPersisters(XEnchantmentType.getSingleton()); - DataPersisterManager.registerDataPersisters(XBiomeType.getSingleton()); - - DataPersisterManager.registerDataPersisters(LocationType.getSingleton()); - DataPersisterManager.registerDataPersisters(InventoryType.getSingleton()); - DataPersisterManager.registerDataPersisters(LocalDateTimeType.getSingleton()); - DataPersisterManager.registerDataPersisters(RewardType.getSingleton(IridiumSkyblock.getInstance())); - - this.connectionSource = new JdbcConnectionSource( - databaseURL, - sqlConfig.username, - sqlConfig.password, - DatabaseTypeUtils.createDatabaseType(databaseURL) - ); - - this.userTableManager = new UserTableManager(connectionSource); - this.islandTableManager = new IslandTableManager(connectionSource); - this.lostItemsTableManager = new LostItemsTableManager(connectionSource, LostItems.class); - this.teamMissionDataTableManager = new TableManager<>(teamMissionData -> getDatabaseKey(teamMissionData.getMissionID(), teamMissionData.getMissionIndex()), connectionSource, TeamMissionData.class); - this.invitesTableManager = new ForeignIslandTableManager<>(teamInvite -> getDatabaseKey(teamInvite.getTeamID(), teamInvite.getUser()), connectionSource, TeamInvite.class); - this.trustTableManager = new ForeignIslandTableManager<>(teamTrust -> getDatabaseKey(teamTrust.getTeamID(), teamTrust.getUser()), connectionSource, TeamTrust.class); - this.permissionsTableManager = new ForeignIslandTableManager<>(teamPermission -> getDatabaseKey(teamPermission.getTeamID(), teamPermission.getPermission(), teamPermission.getRank()), connectionSource, TeamPermission.class); - this.bankTableManager = new ForeignIslandTableManager<>(teamBank -> getDatabaseKey(teamBank.getTeamID(), teamBank.getBankItem()), connectionSource, TeamBank.class); - this.enhancementTableManager = new ForeignIslandTableManager<>(teamEnhancement -> getDatabaseKey(teamEnhancement.getTeamID(), teamEnhancement.getEnhancementName()), connectionSource, TeamEnhancement.class); - this.teamBlockTableManager = new ForeignIslandTableManager<>(teamBlock -> getDatabaseKey(teamBlock.getTeamID(), teamBlock.getXMaterial().name()), connectionSource, TeamBlock.class); - this.teamSpawnerTableManager = new ForeignIslandTableManager<>(teamSpawner -> getDatabaseKey(teamSpawner.getTeamID(), teamSpawner.getEntityType().name()), connectionSource, TeamSpawners.class); - this.teamWarpTableManager = new ForeignIslandTableManager<>(teamWarp -> getDatabaseKey(teamWarp.getTeamID(), teamWarp.getName()), connectionSource, TeamWarp.class); - this.teamMissionTableManager = new ForeignIslandTableManager<>(teamMission -> getDatabaseKey(teamMission.getTeamID(), teamMission.getMissionName()), connectionSource, TeamMission.class); - this.teamRewardsTableManager = new ForeignIslandTableManager<>(teamRewards -> getDatabaseKey(teamRewards.getId()), connectionSource, TeamReward.class); - this.teamSettingsTableManager = new ForeignIslandTableManager<>(teamSetting -> getDatabaseKey(teamSetting.getTeamID(), teamSetting.getSetting()), connectionSource, TeamSetting.class); - this.teamLogsTableManager = new SqlTableManager<>(connectionSource, TeamLog.class); - } - - private String getDatabaseKey(Object... params) { - StringBuilder stringBuilder = new StringBuilder(); - - for (Object obj : params) { - stringBuilder.append(obj); - stringBuilder.append("-"); - } - - return stringBuilder.toString(); - } - - - /** - * Database connection String used for establishing a connection. - * - * @return The database URL String - */ - private @NotNull String getDatabaseURL(SQL sqlConfig) { - switch (sqlConfig.driver) { - case MYSQL: - return "jdbc:" + sqlConfig.driver.name().toLowerCase() + "://" + sqlConfig.host + ":" + sqlConfig.port + "/" + sqlConfig.database + "?useSSL=" + sqlConfig.useSSL; - case SQLITE: - return "jdbc:sqlite:" + new File(IridiumSkyblock.getInstance().getDataFolder(), sqlConfig.database + ".db"); - default: - throw new UnsupportedOperationException("Unsupported driver (how did we get here?): " + sqlConfig.driver.name()); - } - } - - public CompletableFuture registerIsland(Island island) { - return CompletableFuture.runAsync(() -> { - // Saving the object will also assign the Island's ID - islandTableManager.save(island); - - islandTableManager.addEntry(island); - }); - } - -} +package com.iridium.iridiumskyblock.managers; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.configs.SQL; +import com.iridium.iridiumskyblock.database.Island; +import com.iridium.iridiumskyblock.database.LostItems; +import com.iridium.iridiumskyblock.managers.tablemanagers.*; +import com.iridium.iridiumteams.database.*; +import com.iridium.iridiumteams.database.types.*; +import com.j256.ormlite.field.DataPersisterManager; +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.jdbc.db.DatabaseTypeUtils; +import com.j256.ormlite.logger.LoggerFactory; +import com.j256.ormlite.logger.NullLogBackend; +import com.j256.ormlite.support.ConnectionSource; +import lombok.AccessLevel; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.sql.SQLException; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +@Getter +public class DatabaseManager { + + @Getter(AccessLevel.NONE) + private ConnectionSource connectionSource; + + private UserTableManager userTableManager; + private IslandTableManager islandTableManager; + private LostItemsTableManager lostItemsTableManager; + private TableManager teamMissionDataTableManager; + private ForeignIslandTableManager invitesTableManager; + private ForeignIslandTableManager trustTableManager; + private ForeignIslandTableManager permissionsTableManager; + private ForeignIslandTableManager bankTableManager; + private ForeignIslandTableManager enhancementTableManager; + private ForeignIslandTableManager teamBlockTableManager; + private ForeignIslandTableManager teamSpawnerTableManager; + private ForeignIslandTableManager teamWarpTableManager; + private ForeignIslandTableManager teamMissionTableManager; + private ForeignIslandTableManager teamRewardsTableManager; + private ForeignIslandTableManager teamSettingsTableManager; + private SqlTableManager teamLogsTableManager; + + public void init() throws SQLException { + LoggerFactory.setLogBackendFactory(new NullLogBackend.NullLogBackendFactory()); + + SQL sqlConfig = IridiumSkyblock.getInstance().getSql(); + String databaseURL = getDatabaseURL(sqlConfig); + + DataPersisterManager.registerDataPersisters(XMaterialType.getSingleton()); + DataPersisterManager.registerDataPersisters(XEntityTypeType.getSingleton()); + DataPersisterManager.registerDataPersisters(XPotionType.getSingleton()); + DataPersisterManager.registerDataPersisters(XEnchantmentType.getSingleton()); + DataPersisterManager.registerDataPersisters(XBiomeType.getSingleton()); + + DataPersisterManager.registerDataPersisters(LocationType.getSingleton()); + DataPersisterManager.registerDataPersisters(InventoryType.getSingleton()); + DataPersisterManager.registerDataPersisters(LocalDateTimeType.getSingleton()); + DataPersisterManager.registerDataPersisters(RewardType.getSingleton(IridiumSkyblock.getInstance())); + + this.connectionSource = new JdbcConnectionSource( + databaseURL, + sqlConfig.username, + sqlConfig.password, + DatabaseTypeUtils.createDatabaseType(databaseURL) + ); + + this.userTableManager = new UserTableManager(connectionSource); + this.islandTableManager = new IslandTableManager(connectionSource); + this.lostItemsTableManager = new LostItemsTableManager(connectionSource, LostItems.class); + this.teamMissionDataTableManager = new TableManager<>(teamMissionData -> getDatabaseKey(teamMissionData.getMissionID(), teamMissionData.getMissionIndex()), connectionSource, TeamMissionData.class); + this.invitesTableManager = new ForeignIslandTableManager<>(teamInvite -> getDatabaseKey(teamInvite.getTeamID(), teamInvite.getUser()), connectionSource, TeamInvite.class); + this.trustTableManager = new ForeignIslandTableManager<>(teamTrust -> getDatabaseKey(teamTrust.getTeamID(), teamTrust.getUser()), connectionSource, TeamTrust.class); + this.permissionsTableManager = new ForeignIslandTableManager<>(teamPermission -> getDatabaseKey(teamPermission.getTeamID(), teamPermission.getPermission(), teamPermission.getRank()), connectionSource, TeamPermission.class); + this.bankTableManager = new ForeignIslandTableManager<>(teamBank -> getDatabaseKey(teamBank.getTeamID(), teamBank.getBankItem()), connectionSource, TeamBank.class); + this.enhancementTableManager = new ForeignIslandTableManager<>(teamEnhancement -> getDatabaseKey(teamEnhancement.getTeamID(), teamEnhancement.getEnhancementName()), connectionSource, TeamEnhancement.class); + this.teamBlockTableManager = new ForeignIslandTableManager<>(teamBlock -> getDatabaseKey(teamBlock.getTeamID(), teamBlock.getXMaterial().name()), connectionSource, TeamBlock.class); + this.teamSpawnerTableManager = new ForeignIslandTableManager<>(teamSpawner -> getDatabaseKey(teamSpawner.getTeamID(), teamSpawner.getEntityType().name()), connectionSource, TeamSpawners.class); + this.teamWarpTableManager = new ForeignIslandTableManager<>(teamWarp -> getDatabaseKey(teamWarp.getTeamID(), teamWarp.getName()), connectionSource, TeamWarp.class); + this.teamMissionTableManager = new ForeignIslandTableManager<>(teamMission -> getDatabaseKey(teamMission.getTeamID(), teamMission.getMissionName()), connectionSource, TeamMission.class); + this.teamRewardsTableManager = new ForeignIslandTableManager<>(teamRewards -> getDatabaseKey(teamRewards.getId()), connectionSource, TeamReward.class); + this.teamSettingsTableManager = new ForeignIslandTableManager<>(teamSetting -> getDatabaseKey(teamSetting.getTeamID(), teamSetting.getSetting()), connectionSource, TeamSetting.class); + this.teamLogsTableManager = new SqlTableManager<>(connectionSource, TeamLog.class); + + // We need to clear out null values + for(TeamBlock teamBlock : teamBlockTableManager.getEntries()) { + if(teamBlock.getXMaterial() == null) teamBlockTableManager.delete(teamBlock); + } + for(TeamSpawners teamSpawners : teamSpawnerTableManager.getEntries()) { + if(teamSpawners.getEntityType() == null) teamSpawnerTableManager.delete(teamSpawners); + } + } + + private String getDatabaseKey(Object... params) { + StringBuilder stringBuilder = new StringBuilder(); + + for (Object obj : params) { + stringBuilder.append(obj); + stringBuilder.append("-"); + } + + return stringBuilder.toString(); + } + + + /** + * Database connection String used for establishing a connection. + * + * @return The database URL String + */ + private @NotNull String getDatabaseURL(SQL sqlConfig) { + switch (sqlConfig.driver) { + case MYSQL: + return "jdbc:" + sqlConfig.driver.name().toLowerCase() + "://" + sqlConfig.host + ":" + sqlConfig.port + "/" + sqlConfig.database + "?useSSL=" + sqlConfig.useSSL; + case SQLITE: + return "jdbc:sqlite:" + new File(IridiumSkyblock.getInstance().getDataFolder(), sqlConfig.database + ".db"); + default: + throw new UnsupportedOperationException("Unsupported driver (how did we get here?): " + sqlConfig.driver.name()); + } + } + + public CompletableFuture registerIsland(Island island) { + return CompletableFuture.runAsync(() -> { + // Saving the object will also assign the Island's ID + islandTableManager.save(island); + + islandTableManager.addEntry(island); + }); + } + +} diff --git a/src/main/java/com/iridium/iridiumskyblock/managers/IslandManager.java b/src/main/java/com/iridium/iridiumskyblock/managers/IslandManager.java index e04375358..dcf07d64d 100644 --- a/src/main/java/com/iridium/iridiumskyblock/managers/IslandManager.java +++ b/src/main/java/com/iridium/iridiumskyblock/managers/IslandManager.java @@ -25,6 +25,8 @@ import com.iridium.iridiumteams.missions.MissionData; import com.iridium.iridiumteams.missions.MissionType; import com.iridium.iridiumteams.support.StackerSupport; +import com.iridium.iridiumskyblock.generators.IridiumChunkGenerator; +import com.iridium.iridiumskyblock.generators.SkyblockBiomeProvider; import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.stmt.Where; import de.tr7zw.changeme.nbtapi.NBT; @@ -83,9 +85,37 @@ public String getCacheWorldName(World world) { public void createWorld(World.Environment environment, String name) { if (!IridiumSkyblock.getInstance().getConfiguration().enabledWorlds.getOrDefault(environment, true)) return; - WorldCreator worldCreator = new WorldCreator(name) - .generator(IridiumSkyblock.getInstance().getDefaultWorldGenerator(name, null)) - .environment(environment); + WorldCreator worldCreator; + + long seed = IridiumSkyblock.getInstance().getGenerators().seed; + + if(seed != 0) { + if(IridiumSkyblock.getInstance().getConfiguration().generatorType.contains("legacy") + || !IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + worldCreator = new WorldCreator(name) + .generator(IridiumSkyblock.getInstance().getDefaultWorldGenerator(name, null)) + .seed(seed) + .environment(environment); + } else { + worldCreator = new WorldCreator(name) + .generator(IridiumSkyblock.getInstance().getDefaultWorldGenerator(name, null)) + .seed(seed) + .environment(environment) + .biomeProvider(new SkyblockBiomeProvider()); + } + } else { + if(IridiumSkyblock.getInstance().getConfiguration().generatorType.contains("legacy") + || !IridiumSkyblock.getInstance().getGenerators().biomeGradient) { + worldCreator = new WorldCreator(name) + .generator(IridiumSkyblock.getInstance().getDefaultWorldGenerator(name, null)) + .environment(environment); + } else { + worldCreator = new WorldCreator(name) + .generator(IridiumSkyblock.getInstance().getDefaultWorldGenerator(name, null)) + .environment(environment) + .biomeProvider(new SkyblockBiomeProvider()); + } + }; World world = Bukkit.createWorld(worldCreator); @@ -118,11 +148,12 @@ public void createWorld(World.Environment environment, String name) { // For the regenerateTerrain() method to work correctly, we need to access the cached world, which we create here. public void createCacheWorld(World world) { - if (!IridiumSkyblock.getInstance().getConfiguration().generatorType.isTerrainGenerator()) return; + if(!(IridiumSkyblock.getInstance().getChunkGenerator() instanceof IridiumChunkGenerator)) return; + if(!((IridiumChunkGenerator) IridiumSkyblock.getInstance().getChunkGenerator()).isGeneratesTerrain()) return; if (Bukkit.getWorld(getCacheWorldName(world)) == null) { - WorldCreator worldCreator = new WorldCreator(getCacheWorldName(world)).copy(world); - worldCreator.createWorld(); + WorldCreator worldCreator = new WorldCreator(getCacheWorldName(world)); + worldCreator.copy(world).createWorld(); } if (Bukkit.getWorld(getCacheWorldName(world)).getSeed() != Bukkit.getWorld(world.getName()).getSeed()) { @@ -301,8 +332,11 @@ public CompletableFuture generateIsland(Island island, Schematics.Schemati setHome(island, schematicConfig); clearEntities(island); deleteIslandBlocks(island).join(); - if (IridiumSkyblock.getInstance().getConfiguration().generatorType.isTerrainGenerator()) + + if((IridiumSkyblock.getInstance().getChunkGenerator() instanceof IridiumChunkGenerator)) { regenerateTerrain(island).join(); + } + IridiumSkyblock.getInstance().getSchematicManager().pasteSchematic(island, schematicConfig).join(); setIslandBiome(island, schematicConfig); }); @@ -370,6 +404,13 @@ private CompletableFuture deleteIslandBlocks(Island island, World world) { } else { Bukkit.getScheduler().runTask(IridiumSkyblock.getInstance(), () -> deleteIslandBlocks(island, world, world.getMaxHeight(), completableFuture, 0)); } + + if(IridiumSkyblock.getInstance().getChunkGenerator() instanceof IridiumChunkGenerator) { + if (((IridiumChunkGenerator) IridiumSkyblock.getInstance().getChunkGenerator()).isGeneratesTerrain()) { + regenerateTerrain(island).join(); + } + } + return completableFuture; } @@ -458,8 +499,11 @@ public boolean deleteTeam(Island island, User user) { if (IridiumSkyblock.getInstance().getConfiguration().removeIslandBlocksOnDelete) { deleteIslandBlocks(island); - if (IridiumSkyblock.getInstance().getConfiguration().generatorType.isTerrainGenerator()) - regenerateTerrain(island).join(); + if(IridiumSkyblock.getInstance().getChunkGenerator() instanceof IridiumChunkGenerator) { + if (((IridiumChunkGenerator) IridiumSkyblock.getInstance().getChunkGenerator()).isGeneratesTerrain()) { + regenerateTerrain(island).join(); + } + } } IridiumSkyblock.getInstance().getDatabaseManager().getIslandTableManager().delete(island); diff --git a/src/main/java/com/iridium/iridiumskyblock/managers/tablemanagers/TableManager.java b/src/main/java/com/iridium/iridiumskyblock/managers/tablemanagers/TableManager.java index 463b4ba9b..c004924e1 100644 --- a/src/main/java/com/iridium/iridiumskyblock/managers/tablemanagers/TableManager.java +++ b/src/main/java/com/iridium/iridiumskyblock/managers/tablemanagers/TableManager.java @@ -59,8 +59,11 @@ public void save() { } finally { lock.unlock(); } - } catch (Exception e) { + } catch (InterruptedException | SQLException e) { + IridiumSkyblock.getInstance().getLogger().severe("FAILED TO SAVE DATA."); e.printStackTrace(); + } catch (Exception er) { + er.printStackTrace(); } } @@ -77,8 +80,11 @@ public void save(Value value) { } finally { lock.unlock(); } - } catch (Exception e) { + } catch (InterruptedException | SQLException e) { + IridiumSkyblock.getInstance().getLogger().severe("FAILED TO SAVE DATA."); e.printStackTrace(); + } catch (Exception er) { + er.printStackTrace(); } } @@ -95,8 +101,11 @@ public CompletableFuture delete(Value value) { } finally { lock.unlock(); } - } catch (Exception e) { + } catch (InterruptedException | SQLException e) { + IridiumSkyblock.getInstance().getLogger().severe("FAILED TO SAVE DATA."); e.printStackTrace(); + } catch (Exception er) { + er.printStackTrace(); } }); } @@ -114,8 +123,11 @@ public CompletableFuture delete(Collection values) { } finally { lock.unlock(); } - } catch (Exception e) { + } catch (InterruptedException | SQLException e) { + IridiumSkyblock.getInstance().getLogger().severe("FAILED TO SAVE DATA."); e.printStackTrace(); + } catch (Exception er) { + er.printStackTrace(); } }); } @@ -152,7 +164,6 @@ public List getEntries() { } public Optional getEntry(Key key) { - if(key == null) return Optional.empty(); return Optional.ofNullable(entries.get(key)); } diff --git a/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/AbstractPacket.java b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/AbstractPacket.java new file mode 100644 index 000000000..335c552fc --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/AbstractPacket.java @@ -0,0 +1,115 @@ +/** + * PacketWrapper - ProtocolLib wrappers for Minecraft packets + * Copyright (C) dmulloy2 + * Copyright (C) Kristian S. Strangeland + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.iridium.iridiumskyblock.utils.ProtocolLibUtils; + +import java.lang.reflect.InvocationTargetException; + +import com.iridium.iridiumskyblock.IridiumSkyblock; +import org.bukkit.entity.Player; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import com.google.common.base.Objects; + +public abstract class AbstractPacket { + // The packet we will be modifying + protected PacketContainer handle; + + /** + * Constructs a new strongly typed wrapper for the given packet. + * + * @param handle - handle to the raw packet data. + * @param type - the packet type. + */ + protected AbstractPacket(PacketContainer handle, PacketType type) { + // Make sure we're given a valid packet + if (handle == null) + throw new IllegalArgumentException("Packet handle cannot be NULL."); + if (!Objects.equal(handle.getType(), type)) + throw new IllegalArgumentException(handle.getHandle() + + " is not a packet of type " + type); + + this.handle = handle; + } + + /** + * Retrieve a handle to the raw packet data. + * + * @return Raw packet data. + */ + public PacketContainer getHandle() { + return handle; + } + + /** + * Send the current packet to the given receiver. + * + * @param receiver - the receiver. + * @throws RuntimeException If the packet cannot be sent. + */ + public void sendPacket(Player receiver) { + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(receiver, + getHandle()); + } catch (RuntimeException e) { + IridiumSkyblock.getInstance().getLogger().warning("[ProtcolLib] Cannot send packet: " + e); + } + } + + /** + * Send the current packet to all online players. + */ + public void broadcastPacket() { + ProtocolLibrary.getProtocolManager().broadcastServerPacket(getHandle()); + } + + /** + * Simulate receiving the current packet from the given sender. + * + * @param sender - the sender. + * @throws RuntimeException If the packet cannot be received. + * @deprecated Misspelled. recieve to receive + * @see #receivePacket(Player) + */ + @Deprecated + public void recievePacket(Player sender) { + try { + ProtocolLibrary.getProtocolManager().receiveClientPacket(sender, + getHandle()); + } catch (Exception e) { + throw new RuntimeException("Cannot recieve packet.", e); + } + } + + /** + * Simulate receiving the current packet from the given sender. + * + * @param sender - the sender. + * @throws RuntimeException if the packet cannot be received. + */ + public void receivePacket(Player sender) { + try { + ProtocolLibrary.getProtocolManager().receiveClientPacket(sender, + getHandle()); + } catch (Exception e) { + throw new RuntimeException("Cannot receive packet.", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/IridiumPacketAdapter.java b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/IridiumPacketAdapter.java new file mode 100644 index 000000000..f47514414 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/IridiumPacketAdapter.java @@ -0,0 +1,119 @@ +package com.iridium.iridiumskyblock.utils.ProtocolLibUtils; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.iridium.iridiumskyblock.IridiumSkyblock; +import com.iridium.iridiumskyblock.generators.IridiumChunkGenerator; +import org.bukkit.World; +import org.bukkit.WorldType; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.Field; + +public class IridiumPacketAdapter extends PacketAdapter { + + public IridiumPacketAdapter(Plugin plugin, ListenerPriority listenerPriority, PacketType... types) { + super(plugin, listenerPriority, types); + } + + @Override + public void onPacketSending(PacketEvent packetEvent) { + + if(IridiumSkyblock.getInstance().getConfiguration().fixHorizon + && (IridiumSkyblock.getInstance().getChunkGenerator() instanceof IridiumChunkGenerator)) { + if (((IridiumChunkGenerator) IridiumSkyblock.getInstance().getChunkGenerator()).isLowerHorizon()) { + sendLowerHorizon(packetEvent); + } + } + } + + private void sendLowerHorizon(PacketEvent event) { + Player player = event.getPlayer(); + if (player == null) return; + + World world = event.getPlayer().getWorld(); + if (!IridiumSkyblock.getInstance().getIslandManager().isInSkyblockWorld(world) && world.getEnvironment() != World.Environment.NORMAL) return; + + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] " + IridiumSkyblock.getInstance().getMcVersion()); + editPacketForHorizon(event, IridiumSkyblock.getInstance().getMcVersion() < 16); + } + + private void editPacketForHorizon(PacketEvent packetEvent, boolean fallback) { + + PacketContainer packet = packetEvent.getPacket(); //packetEvent.getPacket().deepClone(); + PacketType packetType = packet.getType(); + + if (!fallback) { + + // login + // to get all | StructureModifier modifier = packet.getModifier(); + // BOOLEANS | StructureModifier booleans = packet.getBooleans(); + // b - [0] hardcore (false) + // g - + // h - + // i - + // ENTITY | StructureModifier entity = packet.getEntityModifier(packetEvent); + // a - + // d - + // e - + // f - + // PLAYER INFO DATA | StructureModifier> playerData = packet.getPlayerInfoDataLists(); + // c - + + // MISSING + // j - + + // Packet Capture + // a=331 // ??? entity type? + // b=false // hardcore mode + // c=[ResourceKey[minecraft:dimension / minecraft:overworld], ResourceKey[minecraft:dimension / minecraft:the_nether], ResourceKey[minecraft:dimension / minecraft:the_end], ResourceKey[minecraft:dimension / minecraft:iridiumskyblock], ResourceKey[minecraft:dimension / minecraft:plugins/iridiumskyblock/regenworlds/iridiumskyblock_regen], ResourceKey[minecraft:dimension / minecraft:iridiumskyblock_nether], ResourceKey[minecraft:dimension / minecraft:plugins/iridiumskyblock/regenworlds/iridiumskyblock_nether_regen], ResourceKey[minecraft:dimension / minecraft:plugins/iridiumskyblock/regenworlds/iridiumskyblock_the_end_regen], ResourceKey[minecraft:dimension / minecraft:iridiumskyblock_the_end]] + // d=20 // probably the amount of health the player has + // e=10 + // f=10 + // g=false + // h=true + // i=false + // j=CommonPlayerSpawnInfo[dimensionType=ResourceKey[minecraft:dimension_type / minecraft:overworld], dimension=ResourceKey[minecraft:dimension / minecraft:iridiumskyblock], seed=8029251825143012118, gameType=CREATIVE, previousGameType=SURVIVAL, isDebug=false, isFlat=false, lastDeathLocation=Optional[ResourceKey[minecraft:dimension / minecraft:iridiumskyblock] BlockPosition{x=1, y=82, z=2}], portalCooldown=0] + + int flatWorldIndex = 0; + + if(packetType == PacketType.Play.Server.LOGIN) flatWorldIndex = 4; + if(packetType == PacketType.Play.Server.RESPAWN) flatWorldIndex = 1; + + Field commonPlayerSpawnInfo = packet.getModifier().getField(9); + + int getCommonPlayerSpawnInfoIndex = 0; + if(packetType == PacketType.Play.Server.LOGIN) getCommonPlayerSpawnInfoIndex = 9; + if(packetType == PacketType.Play.Server.RESPAWN) getCommonPlayerSpawnInfoIndex = 0; + + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] =+=+=+=+=+=+=+=+=+=+=+=+="); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] PACKET TYPE: " + packetType); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] PACKET STRUCTURES: " + packet.getStructures()); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] PACKET FIELDS: " + packet.getStructures().getFields()); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] PACKET WORLD TYPE: " + packet.getWorldTypeModifier().getField(WorldType.FLAT.ordinal())); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] =+=+=+=+=+=+=+=+=+=+=+=+="); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] PACKET OBJECT: " + commonPlayerSpawnInfo); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] PRE-MUTATION VALUES: " + commonPlayerSpawnInfo.toString()); + IridiumSkyblock.getInstance().getLogger().info("[DEBUG] =+=+=+=+=+=+=+=+=+=+=+=+="); + + //booleans.write(flatWorldIndex, true); + packet.getWorldTypeModifier().getField(WorldType.FLAT.ordinal()); + + } else { + + if (packetType == WrapperPlayServerLogin.TYPE) { + WrapperPlayServerLogin wrapperPlayServerLogin = new WrapperPlayServerLogin(packet); + wrapperPlayServerLogin.setLevelType(WorldType.FLAT); + wrapperPlayServerLogin.sendPacket(packetEvent.getPlayer()); + } else if (packetType == WrapperPlayServerRespawn.TYPE) { + WrapperPlayServerRespawn wrapperPlayServerRespawn = new WrapperPlayServerRespawn(packet); + wrapperPlayServerRespawn.setLevelType(WorldType.FLAT); + wrapperPlayServerRespawn.sendPacket(packetEvent.getPlayer()); + } + } + } +} diff --git a/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/WrapperPlayServerLogin.java b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/WrapperPlayServerLogin.java new file mode 100644 index 000000000..4ca1a2b83 --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/WrapperPlayServerLogin.java @@ -0,0 +1,204 @@ +/** + * PacketWrapper - ProtocolLib wrappers for Minecraft packets + * Copyright (C) dmulloy2 + * Copyright (C) Kristian S. Strangeland + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.iridium.iridiumskyblock.utils.ProtocolLibUtils; + +import com.iridium.iridiumskyblock.utils.ProtocolLibUtils.AbstractPacket; +import org.bukkit.World; +import org.bukkit.WorldType; +import org.bukkit.entity.Entity; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.wrappers.EnumWrappers.Difficulty; +import com.comphenix.protocol.wrappers.EnumWrappers.NativeGameMode; + +public class WrapperPlayServerLogin extends AbstractPacket { + public static final PacketType TYPE = PacketType.Play.Server.LOGIN; + + public WrapperPlayServerLogin() { + super(new PacketContainer(TYPE), TYPE); + handle.getModifier().writeDefaults(); + } + + public WrapperPlayServerLogin(PacketContainer packet) { + super(packet, TYPE); + } + + /** + * Retrieve Entity ID. + *

+ * Notes: entity's ID + * + * @return The current Entity ID + */ + public int getEntityID() { + return handle.getIntegers().read(0); + } + + /** + * Set Entity ID. + * + * @param value - new value. + */ + public void setEntityID(int value) { + handle.getIntegers().write(0, value); + } + + /** + * Retrieve the entity of the painting that will be spawned. + * + * @param world - the current world of the entity. + * @return The spawned entity. + */ + public Entity getEntity(World world) { + return handle.getEntityModifier(world).read(0); + } + + /** + * Retrieve the entity of the painting that will be spawned. + * + * @param event - the packet event. + * @return The spawned entity. + */ + public Entity getEntity(PacketEvent event) { + return getEntity(event.getPlayer().getWorld()); + } + + /** + * Retrieve Gamemode. + *

+ * Notes: 0: survival, 1: creative, 2: adventure. Bit 3 (0x8) is the + * hardcore flag + * + * @return The current Gamemode + */ + public NativeGameMode getGamemode() { + return handle.getGameModes().read(0); + } + + /** + * Set Gamemode. + * + * @param value - new value. + */ + public void setGamemode(NativeGameMode value) { + handle.getGameModes().write(0, value); + } + + /** + * Retrieve Dimension. + *

+ * Notes: -1: nether, 0: overworld, 1: end + * + * @return The current Dimension + */ + public int getDimension() { + return handle.getIntegers().read(0); + } + + /** + * Set Dimension. + * + * @param value - new value. + */ + public void setDimension(int value) { + handle.getIntegers().write(0, value); + } + + /** + * Retrieve Difficulty. + *

+ * Notes: 0 thru 3 for Peaceful, Easy, Normal, Hard + * + * @return The current Difficulty + */ + @Deprecated + public Difficulty getDifficulty() { + return handle.getDifficulties().read(0); + } + + /** + * Set Difficulty. + * + * @param value - new value. + */ + @Deprecated + public void setDifficulty(Difficulty value) { + handle.getDifficulties().write(0, value); + } + + /** + * Retrieve Max Players. + *

+ * Notes: used by the client to draw the player list + * + * @return The current Max Players + */ + public int getMaxPlayers() { + return handle.getIntegers().read(1); + } + + /** + * Set Max Players. + * + * @param value - new value. + */ + public void setMaxPlayers(int value) { + handle.getIntegers().write(0, value); + } + + /** + * Retrieve Level Type. + *

+ * Notes: default, flat, largeBiomes, amplified, default_1_1 + * + * @return The current Level Type + */ + public WorldType getLevelType() { + return handle.getWorldTypeModifier().read(0); + } + + /** + * Set Level Type. + * + * @param value - new value. + */ + public void setLevelType(WorldType value) { + handle.getWorldTypeModifier().write(0, value); + } + + /** + * Retrieve Reduced Debug Info. + * + * @return The current Reduced Debug Info + */ + public boolean getReducedDebugInfo() { + return handle.getBooleans().read(0); + } + + /** + * Set Reduced Debug Info. + * + * @param value - new value. + */ + public void setReducedDebugInfo(boolean value) { + handle.getBooleans().write(0, value); + } +} \ No newline at end of file diff --git a/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/WrapperPlayServerRespawn.java b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/WrapperPlayServerRespawn.java new file mode 100644 index 000000000..52ccbc73d --- /dev/null +++ b/src/main/java/com/iridium/iridiumskyblock/utils/ProtocolLibUtils/WrapperPlayServerRespawn.java @@ -0,0 +1,124 @@ +/** + * PacketWrapper - ProtocolLib wrappers for Minecraft packets + * Copyright (C) dmulloy2 + * Copyright (C) Kristian S. Strangeland + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.iridium.iridiumskyblock.utils.ProtocolLibUtils; + +import com.iridium.iridiumskyblock.utils.ProtocolLibUtils.AbstractPacket; +import org.bukkit.WorldType; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.EnumWrappers.Difficulty; +import com.comphenix.protocol.wrappers.EnumWrappers.NativeGameMode; + +public class WrapperPlayServerRespawn extends AbstractPacket { + public static final PacketType TYPE = PacketType.Play.Server.RESPAWN; + + public WrapperPlayServerRespawn() { + super(new PacketContainer(TYPE), TYPE); + handle.getModifier().writeDefaults(); + } + + public WrapperPlayServerRespawn(PacketContainer packet) { + super(packet, TYPE); + } + + /** + * Retrieve Dimension. + *

+ * Notes: -1: The Nether, 0: The Overworld, 1: The End + * + * @return The current Dimension + */ + public int getDimension() { + return handle.getDimensions().optionRead(0).orElse(0); + } + + /** + * Set Dimension. + * + * @param value - new value. + */ + public void setDimension(int value) { + handle.getDimensions().write(0, value); + } + + /** + * Retrieve Difficulty. + *

+ * Notes: 0 thru 3 for Peaceful, Easy, Normal, Hard. + * + * @return The current Difficulty + */ + @Deprecated + public Difficulty getDifficulty() { + return handle.getDifficulties().read(0); + } + + /** + * Set Difficulty. + * + * @param value - new value. + */ + @Deprecated + public void setDifficulty(Difficulty value) { + handle.getDifficulties().write(0, value); + } + + /** + * Retrieve Gamemode. + *

+ * Notes: 0: survival, 1: creative, 2: adventure. The hardcore flag is not + * included + * + * @return The current Gamemode + */ + public NativeGameMode getGamemode() { + return handle.getGameModes().read(0); + } + + /** + * Set Gamemode. + * + * @param value - new value. + */ + public void setGamemode(NativeGameMode value) { + handle.getGameModes().write(0, value); + } + + /** + * Retrieve Level Type. + *

+ * Notes: same as Join Game + * + * @return The current Level Type + */ + public WorldType getLevelType() { + return handle.getWorldTypeModifier().read(0); + } + + /** + * Set Level Type. + * + * @param value - new value. + */ + public void setLevelType(WorldType value) { + handle.getWorldTypeModifier().write(0, value); + } + +} \ No newline at end of file